加载 word2vec 模块时出现“utf-8”解码错误

问题描述 投票:0回答:3

我必须使用包含大量汉字的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中加载该模块呢?谢谢。

python nlp gensim word2vec
3个回答
6
投票

该模块是由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')

但我不知道忽略编码错误是否重要。


2
投票

我已经尝试过旗帜

unicode_errors='ignore'

但是它并没有解决unicode问题。

我检查将文件从 filename.bin.gz 重命名为 filename.gz 后是否出现了 unicode 错误。

我的解决方案是提取压缩文件,而不是重命名它。

然后我使用带有上面标志的文件,并且没有 unicode 错误。

请注意,我使用 Mac (Sierra) 和 python 2.7。


0
投票

您可以使用以下 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();
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.