使用 w2v 时 python 中的编码问题

Encoding issue in python while using w2v

我正在 python 中编写我的第一个应用程序以使用 word2vec 模型。 这是我的简单代码

import gensim, logging
import sys
import warnings
from gensim.models import Word2Vec

logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)

def main(): 
    ####LOAD MODEL
    model = Word2Vec.load_word2vec_format('models/vec-cbow.txt', binary=False)  
    model.similarity('man', 'women')

if __name__ == '__main__':
    with warnings.catch_warnings():
        warnings.simplefilter("error")
        #warnings.simplefilter("ignore")
    main()

我收到以下错误:

UnicodeDecodeError: 'utf8' codec can't decode bytes in position 96-97: invalid continuation byte 

我尝试通过添加这两行来解决它,但我仍然遇到错误。

reload(sys)  # Reload does the trick!
sys.setdefaultencoding('UTF8') #UTF8 #latin-1

w2v 模型是针对英语句子进行训练的。

编辑:这是完整的堆栈:

**%run "...\getSimilarity.py"**
---------------------------------------------------------------------------
UnicodeDecodeError                        Traceback (most recent call last)
**...\getSimilarity.py in <module>()**
     64         warnings.simplefilter("error")
     65         #warnings.simplefilter("ignore")
---> 66     main()

**...\getSimilarity.py in main()**
     30     ####LOAD MODEL
---> 31     model = Word2Vec.load_word2vec_format('models/vec-cbow.txt', binary=False)  # C binary format
     32     model.similarity('man', 'women')

**...\AppData\Local\Enthought\Canopy\User\lib\site-packages\gensim-0.12.4-py2.7-win-amd64.egg\gensim\models\word2vec.pyc in load_word2vec_format(cls, fname, fvocab, binary, encoding, unicode_errors)**
   1090             else:
   1091                 for line_no, line in enumerate(fin):
-> 1092                     parts = utils.to_unicode(line.rstrip(), encoding=encoding, errors=unicode_errors).split(" ")
   1093                     if len(parts) != vector_size + 1:
   1094                         raise ValueError("invalid vector on line %s (is this really the text format?)" % (line_no))

**...\AppData\Local\Enthought\Canopy\User\lib\site-packages\gensim-0.12.4-py2.7-win-amd64.egg\gensim\utils.pyc in any2unicode(text, encoding, errors)**
    215     if isinstance(text, unicode):
    216         return text
--> 217     return unicode(text, encoding, errors=errors)
    218 to_unicode = any2unicode
    219 

**...\AppData\Local\Enthought\Canopy\App\appdata\canopy-1.6.2.3262.win-x86_64\lib\encodings\utf_8.pyc in decode(input, errors)**
     14 
     15 def decode(input, errors='strict'):
---> 16     return codecs.utf_8_decode(input, errors, True)
     17 
     18 class IncrementalEncoder(codecs.IncrementalEncoder):

**UnicodeDecodeError: 'utf8' codec can't decode bytes in position 96-97: invalid continuation byte** 

任何解决问题的提示? 提前致谢。

我通过阅读此 FAQ 页面找到了解决方案。 "The strings (words) stored in your model are not valid utf8. By default, gensim decodes the words using the strict encoding settings, which results in the above exception whenever an invalid utf8 sequence is encountered."

修复 就在你这边,它是:

a) 使用理解 unicode 和 utf8 的程序(例如 gensim)存储您的模型。已知某些 C 和 Java word2vec 工具会在字节边界截断字符串,这可能导致将多字节 utf8 字符切成两半,使其成为无效的 utf8,从而导致此错误。

b) 当 运行 load_word2vec_model 时设置 unicode_errors 标志,例如load_word2vec_model(..., unicode_errors='ignore').请注意,这会消除错误,但 utf8 问题仍然存在——在这种情况下,无效的 utf8 字符将被忽略。

原因:

您模型中存储的字符串(单词)不是有效的 utf8。默认情况下,gensim 使用严格的编码设置对单词进行解码,每当遇到无效的 utf8 序列时,就会导致上述异常。

--摘自gensim's FAQ

从 gensim 常见问题解答中,您可以选择将 unicode_errors 设置为 'ignore' 或 'replace',这似乎在某些情况下有效,但并非全部。

但是你看函数的具体帮助的话,还有这个:

binary is a boolean indicating whether the data is in binary word2vec format

这是因为 word2vec 模型保存为二进制而不是任何编码字符串。因此,在所有这些情况下,只需设置 binary = True 即可。

例如,如果您尝试使用来自 here 的 google 预训练模型,这应该有效:

google_model = gensim.models.KeyedVectors.load_word2vec_format('./GoogleNews-vectors-negative300.bin', binary = True)

希望对您有所帮助!