我必须使用包含大量汉字的word2vec模块。该模块由我的同事使用 Java 进行训练,并保存为 bin 文件。
我安装了gensim并尝试加载模块,但出现以下错误:
In [1]: import gensim
In [2]: model = gensim.models.Word2Vec.load_word2vec_format('/data5/momo-projects/user_interest_classification/code/word2vec/vectors_groups_1105.bin', binary=True)
UnicodeDecodeError: 'utf-8' codec can't decode bytes in position 96-97: unexpected end of data
我尝试在 python 2.7 和 3.5 中加载模块,但以同样的方式失败。那么如何在gensim中加载该模块呢?谢谢。
该模块是由Java训练的大量汉字。我无法弄清楚原始语料库的编码格式。该错误可以按照gensim FAQ,
中的描述解决使用带有标志的 load_word2vec_format 来忽略字符解码错误:
In [1]: import gensim
In [2]: model = gensim.models.Word2Vec.load_word2vec_format('/data5/momo-projects/user_interest_classification/code/word2vec/vectors_groups_1105.bin', binary=True, unicode_errors='ignore')
但我不知道忽略编码错误是否重要。
我已经尝试过旗帜
unicode_errors='ignore'
但是它并没有解决unicode问题。
我检查将文件从 filename.bin.gz 重命名为 filename.gz 后是否出现了 unicode 错误。
我的解决方案是提取压缩文件,而不是重命名它。
然后我使用带有上面标志的文件,并且没有 unicode 错误。
请注意,我使用 Mac (Sierra) 和 python 2.7。
您可以使用以下 Java 代码重新格式化 word2vec 文件:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
class ReformatW2V {
public static void main(String[] args) {
if (args.length < 3) {
System.err.println("Usage: ReformatW2V inputFileName outputFileName");
return;
}
String inputFileName = args[1];
String outputFileName = args[2];
try (
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(new File(inputFileName)), "utf-8"));
PrintWriter pw = new PrintWriter(new OutputStreamWriter(new FileOutputStream(new File(outputFileName)), "utf-8"))
) {
String line = null;
while ((line = br.readLine()) != null) {
String[] segs = line.split(" ");
pw.println(String.join(" ", segs));
}
} catch (IOException e) {
e.printStackTrace();
}
}
}