问题描述
我正在尝试查找与我提供代码的单词相似的单词。但不知何故,一切都很顺利,直到最后,它说这个词不存在。有人可以帮我吗?
from gensim.test.utils import datapath,get_tmpfile
from gensim.models import KeyedVectors
from gensim.scripts.glove2word2vec import glove2word2vec
glove_file = datapath('/content/drive/MyDrive/Colab Notebooks/glove.6B.300d.txt')
tmp_file = get_tmpfile('/content/drive/MyDrive/Colab Notebooks/word2vec-glove.6B.300d.txt')
_ = glove2word2vec(glove_file,tmp_file)
model = KeyedVectors.load_word2vec_format(tmp_file)
model.most_similar(positive=["new"],topn=10)
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
<ipython-input-32-0752cfe838d7> in <module>()
10 model = KeyedVectors.load_word2vec_format(tmp_file)
11
---> 12 model.most_similar(positive=["new"],topn=10)
1 frames
/usr/local/lib/python3.7/dist-packages/gensim/models/keyedvectors.py in word_vec(self,word,use_norm)
450 return result
451 else:
--> 452 raise KeyError("word '%s' not in vocabulary" % word)
453
454 def get_vector(self,word):
KeyError: "word 'new' not in vocabulary"
解决方法
如果您收到错误 KeyError: "word 'new' not in vocabulary"
,则单词 'new'
可能不在模型的词汇表中 - 即使您预期/打算这样做。
您是否检查过源 GLoVe 文件 /content/drive/MyDrive/Colab Notebooks/glove.6B.300d.txt
,以确认它具有预期的长度/内容?
您是否检查过输出文本 word2vec 格式的文件 /content/drive/MyDrive/Colab Notebooks/word2vec-glove.6B.300d.txt
?
您是否检查过 model
加载后是否包含预期的字数 (len(model)
),或者它的第 1 个字 (model.index_to_key[20]
) 看起来是否正确?
这些检查可能会显示一些比 KeyError
期间您遇到的 most_similar()
更基础的问题 - 因此重复 GLoVe 向量下载/转换/加载并确保每个步骤都成功而没有错误可能会解决问题。
还要注意:
glove2word2vec()
函数/脚本现已弃用,从 Gensim 4.0 版(2021 年)开始。如果您使用它,您应该会看到一条警告消息:
KeyedVectors.load_word2vec_format(..,binary=False,no_header=True) 加载 GLoVE 文本向量。
所以你可以跳过显式转换,直接使用它:
glove_vecs = KeyedVectors.load_word2vec_format(glove_file,no_header=True)
(此读取将需要一次额外的初始传递,以计算包含的单词数,因此如果您将多次重复此加载,您可能仍希望将 glove_vecs
重新保存到新的单独的文件,使用 .save_word2vec_format()
,如果加载速度是一个问题。)