我刚刚开始使用Word2vec,我想知道如何才能找到最接近向量的单词。 我有这个向量,它是一组向量的平均向量:
array([-0.00449447, -0.00310097, 0.02421786, ...], dtype=float32)
是否有直接的方法可以在训练数据中找到与此向量最相似的单词?
或唯一的解决方案是计算此向量与训练数据中每个单词的向量之间的余弦相似度,然后选择最接近的一个?
感谢。
答案 0 :(得分:35)
对于{2}实现word2vec,有most_similar()
函数可以让您找到语义上接近给定单词的单词:
>>> model.most_similar(positive=['woman', 'king'], negative=['man'])
[('queen', 0.50882536), ...]
或它的矢量表示:
>>> your_word_vector = array([-0.00449447, -0.00310097, 0.02421786, ...], dtype=float32)
>>> model.most_similar(positive=[your_word_vector], topn=1))
其中topn
定义了所需的返回结果数。
然而,我的直觉是,函数与你提出的完全相同,即计算给定向量和字典中每个其他向量的余弦相似性(这是非常低效的......)
答案 1 :(得分:6)
不要忘记在 most_similar 函数中添加带有否定词的空数组:
import numpy as np
model_word_vector = np.array( my_vector, dtype='f')
topn = 20;
most_similar_words = model.most_similar( [ model_word_vector ], [], topn)
答案 2 :(得分:4)
或者,gensim
包中也提供了model.wv。similar_by_vector(vector, topn=10, restrict_vocab=None)。
通过向量查找前N个最相似的词。
参数:
向量 (numpy.array) –要从中计算相似性的向量。
topn ({int,False},可选) –返回的前N个相似单词的数量。如果topn为False,则same_by_vector返回的向量 相似度得分。
restrict_vocab (int,可选) –可选整数,它限制了搜索相似度最高的向量的范围。对于 例如,restrict_vocab = 10000只会检查前10000个单词 向量按词汇顺序排列。 (如果您已经 按降序对词汇进行排序。)
返回 :(单词,相似性)的顺序。
返回类型:(字符串,浮点)的列表