2016-12-29 609 views
1

我用一个word2vec算法的spark来计算文本的文本向量。word2vec的余弦相似度大于1

然后,我使用模型对象的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

您应该对从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的,findSynonyms实际上并不返回余弦距离,而是余弦距离次查询向量的常态。

排序和相对值与实际余弦距离一致,但实际值全部缩放。

+0

谢谢。但问题很快。如果我对矢量进行归一化,然后取余弦相似性,那么它就类似于仅使用点积。如果我没有进行归一化,然后采用余弦相似性,那么在余弦相似性的公式中,我们将点积乘以每个向量的范数。所以在计算余弦相似性时会发生标准化。所以我不确定为什么会特别要求对其进行标准化。 这将是相同的公式,最后计算应该是相同的 – Baktaawar

+0

谢谢我知道标准化部分。但我的问题为什么会改变余弦相似性。如果你正常化或者没有 – Baktaawar

+0

你完全正确,公式保持不变。那么我相信你应该检查你如何计算余弦相似度!如果您正在使用任何库或包,则应确保按照您的预期计算相似度。除此之外,我认为你的理解没有任何问题。 –