首页 > 解决方案 > 将 GloVe 向量导入 gensim。UnicodeDecodeError:“utf-8”编解码器无法解码位置 0 的字节 0xe6:无效的继续字节

问题描述

我使用我自己的语料库使用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()

文本文件格式

标签: pythongensimword2vecglove

解决方案


没有期望一个plain.load()会起作用——它只适用于gensim自己的模型,用匹配.save()方法保存。

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

您确定文件格式兼容吗?(它是否会加载到原始的 Googleword2vec.c同级工具中,例如distanceorword-analogy可执行文件?)

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

查看(在您可能使用utils_any2vec.py的版本中)的第 343 行,这似乎正在读取文件的第一行,该文件上应该只有 2 个纯空格分隔的数字:单词数和gensim维数。(也就是说,甚至不应该涉及与您的实际单词令牌有关的编码问题。)

如果你用 来查看你的文件head -1 vectors.txt,你看到的就是这些吗?(如果不是,您的GLoVe代码没有编写正确的兼容格式。)


推荐阅读