我使用了spark的word2vec算法来计算文本的文档向量。
然后我使用模型对象的findSynonyms
函数来获取几个单词的同义词。
我看到这样的事情:
w2vmodel.findSynonyms('science',4).show(5)
+------------+------------------+
| word| similarity|
+------------+------------------+
| physics| 1.714908638833209|
| fiction|1.5189824643358183|
|neuroscience|1.4968051528391833|
| psychology| 1.458865636374223|
+------------+------------------+
我不明白为什么余弦相似度的计算值大于1.余弦相似度应介于0和1或最大-1和+1之间(取负角度)。
为什么它在这里超过1?这里出了什么问题?
答案 0 :(得分:1)
您应该对从word2vec
获得的单词向量进行标准化,否则您将得到无界点积或余弦相似度值。
来自Levy et al., 2015(实际上,大多数有关单词嵌入的文献):
矢量在用于相似度计算之前被归一化为单位长度,使得余弦相似性和点积相当。
如何进行规范化?
您可以执行以下操作。
import numpy as np
def normalize(word_vec):
norm=np.linalg.norm(word_vec)
if norm == 0:
return word_vec
return word_vec/norm
<强>参考强>
更新:为什么word2vec的余弦相似度大于1?
根据这个answer,在word2vec的spark实现中,findSynonyms
实际上并不返回余弦距离,而是余弦距离乘以查询向量的范数。
排序和相对值与真正的余弦距离一致,但实际值都是缩放的。