13

我正在尝试执行以下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"

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

4

4 回答 4

12

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

models = gensim.models.Word2Vec.load('300features_40minwords_10context.txt')
于 2015-05-12T21:52:06.967 回答
9

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

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

然后使用方法加载 word2vecload_word2vec_format会导致问题。为了使它工作,你应该使用:

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)
于 2018-01-06T20:13:54.333 回答
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”,是适合作为errors 参数传递给 unicode() (Python 2.x) 或 str() (Python 3.x) 函数的字符串。如果您的源文件可能包含在多字节 unicode 字符中间被截断的单词标记(这在原始 word2vec.c 工具中很常见),“忽略”或“替换”可能会有所帮助。

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

我自己也经历过使用原始模型训练多个模型的情况word2vec.c file,但是当我尝试将其加载到gensim中时,有些模型会成功加载,有些模型会出现 unicode 错误,我发现上面的标志很有帮助和方便。

于 2018-12-03T06:21:07.763 回答
4

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

load_word2vec_format 是针对google生成的模型,不是针对gensim生成的模型

于 2015-01-20T18:43:12.397 回答