使用word2vec和gensim查找相似词,抛出错误

问题描述

我正在尝试查找与我提供代码的单词相似的单词。但不知何故,一切都很顺利,直到最后,它说这个词不存在。有人可以帮我吗?

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(),如果加载速度是一个问题。)