【问题标题】:Error: 'utf8' codec can't decode byte 0x80 in position 0: invalid start byte错误:“utf8”编解码器无法解码位置 0 中的字节 0x80:起始字节无效
【发布时间】:2015-02-23 22:25:31
【问题描述】:

我正在尝试执行以下操作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 生成模型。该程序大约需要半个小时来生成模型。因此我无法多次运行它来调试它。

【问题讨论】:

    标签: python character-encoding gensim word2vec kaggle


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        如果你保存你的模型:

        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)
        

        【讨论】:

          【解决方案4】:

          根据其他答案,了解保存文件的方式很重要,因为也有特定的加载方式。但是,您可以简单地使用标志 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 错误,我发现上面的标志是有帮助和方便的。

          【讨论】:

            猜你喜欢
            • 2016-11-25
            • 1970-01-01
            • 1970-01-01
            • 2020-09-20
            • 1970-01-01
            • 2020-09-22
            • 1970-01-01
            • 2017-05-19
            • 2014-07-09
            相关资源
            最近更新 更多