错误:'utf8'编解码器无法解码字节0x80,位于位置0:起始字节无效。

13
我正在尝试完成以下kaggle任务。我使用gensim包来使用word2vec。我能够创建模型并将其存储到磁盘中。但是,当我尝试加载文件时,出现以下错误。请注意保留HTML标签。
    -HP-dx2280-MT-GR541AV:~$ python prog_w2v.py 
Traceback (most recent call last):
  File "prog_w2v.py", line 7, in <module>
    models = gensim.models.Word2Vec.load_word2vec_format('300features_40minwords_10context.txt', binary=True)
  File "/usr/local/lib/python2.7/dist-packages/gensim/models/word2vec.py", line 579, in load_word2vec_format
    header = utils.to_unicode(fin.readline())
  File "/usr/local/lib/python2.7/dist-packages/gensim/utils.py", line 190, in any2unicode
    return unicode(text, encoding, errors=errors)
  File "/usr/lib/python2.7/encodings/utf_8.py", line 16, in decode
    return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode byte 0x80 in position 0: invalid start byte

我发现有类似的问题,但是我无法解决这个问题。我的prog_w2v.py代码如下:

import gensim
import time
start = time.time()    
models = gensim.models.Word2Vec.load_word2vec_format('300features_40minwords_10context.txt', binary=True) 
end = time.time()   
print end-start,"   seconds"

我正在尝试使用此处的代码生成模型。该程序需要大约半个小时才能生成模型。因此,我无法多次运行它进行调试。

4个回答

12

您没有正确加载文件。您应该使用load()而不是load_word2vec_format()。后者是在使用C代码训练模型并以二进制格式保存模型时使用的。但是,您没有以二进制格式保存模型,并且正在使用Python进行训练。因此,您可以简单地使用以下代码,它应该可以正常工作:

models = gensim.models.Word2Vec.load('300features_40minwords_10context.txt')

10

如果您使用以下方式保存模型:

model.wv.save(OUTPUT_FILE_PATH + 'word2vec.bin')

如果使用load_word2vec_format方法加载word2vec会导致问题。为使其正常工作,您应该使用:

然后使用load方法加载word2vec。


wiki_model = KeyedVectors.load(OUTPUT_FILE_PATH + 'word2vec.bin')

使用以下方法保存模型时也会发生相同的情况:

 model.wv.save_word2vec_format(OUTPUT_FILE_PATH + 'word2vec.txt', binary=False)

然后,想要使用KeyedVectors.load方法加载。在这种情况下,请使用:

wiki_model = KeyedVectors.load_word2vec_format(OUTPUT_FILE_PATH + 'word2vec.bin', binary=False)

9

如其他答案所述,了解你保存文件的方式很重要,因为加载文件也有特定的方式。但是,你可以简单地使用标志 unicode_errors='ignore' 来跳过这个问题,并按照你想要的方式加载模型。

import gensim  

model = gensim.models.KeyedVectors.load_word2vec_format(file_path, binary=True, unicode_errors='ignore')   

默认情况下,此标志设置为'strict':unicode_errors='strict'

根据文档,以下是发生此类错误的原因。

unicode_errors : str, 可选 默认值为'strict',是一个字符串,适合作为 unicode()(Python 2.x)或 str()(Python 3.x)函数的 errors 参数传递。如果您的源文件可能包含截断在多字节 Unicode 字符中间的单词标记(如 word2vec.c 工具中常见),则可以使用“ignore”或“replace”进行修改。

所有以上答案都很有帮助,但如果我们真的可以跟踪每个模型是如何保存的呢?但如果我们有一堆需要加载并创建通用方法的模型怎么办?我们可以使用上述标志来实现。

我自己曾经遇到过这样的情况,使用原始的word2vec.c文件训练了多个模型,但当我尝试将其加载到gensim中时,一些模型会成功加载,而一些模型会出现Unicode错误,我发现上述标志非常有帮助和方便。


4

如果您使用save()保存了模型,那么必须使用load()进行加载。

load_word2vec_format是用于谷歌生成的模型,而不是gensim生成的模型。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接