将GloVe向量导入gensim。 UnicodeDecodeError:'utf-8'编解码器无法解码位置0的字节0xe6:无效的连续字节

时间:2019-10-29 15:35:10

标签: python gensim word2vec glove

我使用自己的语料库,使用https://github.com/stanfordnlp/GloVe/blob/master/demo.sh提供的代码生成了GloVe向量。因此,我同时具有.bin文件和.txt文件向量。我正在尝试将这些文件导入gensim,以便可以像word2vec矢量一样使用它们。

我尝试更改为同时使用二进制格式和文本文件格式进行加载,但最终导致出现酸洗错误:

models = gensim.models.Word2Vec.load(file)

我尝试忽略unicode错误,该错误不起作用。我仍然收到unicode错误。

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

这就是我现在的代码:

from gensim.models import KeyedVectors
import gensim
from gensim.models import word2vec

file = 'vectors.bin'
model = KeyedVectors.load_word2vec_format(file, binary=True, unicode_errors='ignore')  
model.wv.most_similar(positive=['woman', 'king'], negative=['man'])

这是我不断收到的错误消息:

Traceback (most recent call last):
  File "glove_to_word2vec.py", line 6, in <module>
    model = KeyedVectors.load_word2vec_format(file, binary=True)  # C  binary format
  File "/home/users/epair/.local/lib/python3.6/site- packages/gensim/models/keyedvectors.py", line 1498, in load_word2vec_format
    limit=limit, datatype=datatype)
  File "/home/users/epair/.local/lib/python3.6/site-packages/gensim/models/utils_any2vec.py", line 343, in _load_word2vec_format
    header = utils.to_unicode(fin.readline(), encoding=encoding)
  File "/home/users/epair/.local/lib/python3.6/site-packages/gensim/utils.py", line 359, in any2unicode
    return unicode(text, encoding, errors=errors)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe6 in position 0:  invalid continuation byte

酸洗错误是这样的:Unpickling Error while using Word2Vec.load()

Text file format

1 个答案:

答案 0 :(得分:0)

没有期望简单的.load()会起作用–只能与gensim自己的模型一起工作,并用匹配的.save()方法保存。

但是,.load_word2vec_format()应该使用正确格式的文件。

您确定文件格式兼容吗? (是否将其加载到原始的Google word2vec.c兄弟姐妹工具中,例如distanceword-analogy可执行文件?)

您还提到了.txt格式–您是否尝试过使用binary=False加载该文件?

utils_any2vec.py的第343行(在您可能使用的gensim版本中),它似乎正在读取文件的第一行,该行仅应有2个空白-分隔的数字:单词数和尺寸数。 (也就是说,甚至不涉及与您的实际单词标记有关的编码问题。)

如果您使用head -1 vectors.txt查看文件,那么您看到的就是全部吗? (否则,您的GLoVe代码未编写正确的兼容格式。)