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

时间:2014-12-26 17:25:45

标签: python character-encoding gensim word2vec kaggle

我正在尝试执行以下kaggle assignmnet。我使用gensim包来使用word2vec。我能够创建模型并将其存储到磁盘。但是,当我尝试加载文件时,我收到以下错误。

    -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"

我正在尝试使用code here生成模型。该程序生成模型大约需要半小时。因此,我无法多次运行它来调试它。

4 个答案:

答案 0 :(得分:11)

您没有正确加载文件。您应该使用load()而不是load_word2vec_format()。 当您使用C代码训练模型时使用后者,并以二进制格式保存模型。但是,您不是以二进制格式保存模型,而是使用python进行训练。因此,您只需使用以下代码即可:

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

答案 1 :(得分:4)

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

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

然后使用load_word2vec_format方法加载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)

答案 2 :(得分:3)

如果使用save()保存模型,则必须使用load()

load_word2vec_format适用于Google生成的模型,不适用于gensim生成的模型

答案 3 :(得分:3)

根据其他答案,知道保存文件的方式很重要,因为还有特定的加载方式。但是,您只需使用标志unicode_errors='ignore'即可跳过此问题并根据需要加载模型。

import gensim  

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

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

根据文档,给出以下有关发生此类错误的原因。

  

unicode_errors :str,可选               默认的“ strict”是适合作为errors传递的字符串               unicode()(Python 2.x)或str()(Python 3.x)函数的参数。如果您的来源               文件中可能包含在多字节unicode字符中间被截断的单词标记               (在原始的word2vec.c工具中很常见),“忽略”或“替换”可能会有所帮助。

如果我们确实可以跟踪每个模型的保存方式,那么以上所有答案都是有帮助的。但是,如果我们有一堆模型需要加载并为其创建通用方法,该怎么办?我们可以使用上面的标志来做到这一点。

我本人经历过使用原始word2vec.c file训练多个模型的实例,但是当我尝试将其加载到gensim时,某些模型将成功加载,而某些模型会出现unicode错误,我发现上面的标志是有用和方便的。