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

use*_*983 10 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
Run Code Online (Sandbox Code Playgroud)

我发现了类似的问题.但我无法解决问题.我的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"
Run Code Online (Sandbox Code Playgroud)

我试图在这里使用代码生成模型.该程序生成模型大约需要半小时.因此,我无法多次运行它来调试它.

bat*_*irl 12

您没有正确加载文件.您应该使用load()而不是load_word2vec_format().当您使用C代码训练模型时使用后者,并以二进制格式保存模型.但是,您不是以二进制格式保存模型,而是使用python进行训练.所以你可以简单地使用以下代码,它应该工作:

models = gensim.models.Word2Vec.load('300features_40minwords_10context.txt')
Run Code Online (Sandbox Code Playgroud)


Kee*_*asa 6

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

import gensim  

model = gensim.models.KeyedVectors.load_word2vec_format(file_path, binary=True, unicode_errors='ignore')   
Run Code Online (Sandbox Code Playgroud)

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

根据文档,以下给出了为什么会发生此类错误。

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

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

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


Mos*_*afa 5

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

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


Ami*_*mir 5

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

model.wv.save(OUTPUT_FILE_PATH + 'word2vec.bin')
Run Code Online (Sandbox Code Playgroud)

然后用load_word2vec_format方法加载word2vec 会导致此问题。要使其正常工作,您应该使用:

wiki_model = KeyedVectors.load(OUTPUT_FILE_PATH + 'word2vec.bin')
Run Code Online (Sandbox Code Playgroud)

使用以下方法保存模型时,也会发生同样的事情:

 model.wv.save_word2vec_format(OUTPUT_FILE_PATH + 'word2vec.txt', binary=False)
Run Code Online (Sandbox Code Playgroud)

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

wiki_model = KeyedVectors.load_word2vec_format(OUTPUT_FILE_PATH + 'word2vec.bin', binary=False)
Run Code Online (Sandbox Code Playgroud)