如何使用 word2vec 找到最接近向量的单词

Posted

技术标签:

【中文标题】如何使用 word2vec 找到最接近向量的单词【英文标题】:How to find the closest word to a vector using word2vec 【发布时间】:2015-12-21 23:02:19 【问题描述】:

我刚刚开始使用 Word2vec,我想知道我们如何才能找到最接近向量假设的单词。 我有这个向量,它是一组向量的平均向量:

array([-0.00449447, -0.00310097, 0.02421786, ...], dtype=float32)

有没有一种直接的方法可以在我的训练数据中找到与这个向量最相似的词?

或者唯一的解决方案是计算这个向量和我训练数据中每个单词的向量的余弦相似度,然后选择最接近的那个?

谢谢。

【问题讨论】:

【参考方案1】:

或者,model.wv.similar_by_vector(vector, topn=10, restrict_vocab=None) 也可以在gensim 包中使用。

按向量查找前 N 个最相似的词。

参数:

vector (numpy.array) – 计算相似度的向量。

topn (int, False, optional) – 要返回的前 N ​​个相似词的数量。如果 topn 为 False,similar_by_vector 返回 相似度得分。

restrict_vocab (int, optional) – 可选整数,用于限制搜索最相似值的向量范围。为了 例如,restrict_vocab=10000 只会检查前 10000 个单词 词汇表中的向量。 (如果你已经 按频率降序对词汇进行排序。)

返回:(单词、相似度)的序列。

返回类型: (str, float)列表

【讨论】:

【参考方案2】:

对于 word2vec 的 gensim 实现,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 定义了所需的返回结果数。

但是,我的直觉是,该函数的功能与您提出的完全相同,即计算给定向量和字典中每个其他向量的余弦相似度(效率非常低...)

【讨论】:

你能解释一下most_similar()方法的positivenegative参数是什么吗?我刚开始使用 word2vec。 positive param 表示那些应该与您正在查找的单词相似的单词。 negative - 应该与您的单词不同的单词。 most_similar() 函数将返回最符合这些条件的单词。根据the docs,word2vec 的作者已经证明词向量捕获了一些语言规律,例如向量操作vector('king') - vector('man') + vector('woman') 接近vector('queen')。这就是上面示例的动机。 这只是对模型中的向量执行线性扫描吗?如果是这样,为什么不自己迭代呢?【参考方案3】:

不要忘记在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)

【讨论】:

如果不在那里添加空数组会怎样?

以上是关于如何使用 word2vec 找到最接近向量的单词的主要内容,如果未能解决你的问题,请参考以下文章

如何使用单词的向量表示(从 Word2Vec 等获得)作为分类器的特征?

如何使用单词的向量表示(从Word2Vec等获得)作为分类器的特征?

k-means 使用 word2vec :找到离质心最近的词

word2vec是如何得到词向量的?

Glove词向量

如何同时使用 word2vec 和 RNN?