2016-12-29 619 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

你完全正確,公式保持不變。那麼我相信你應該檢查你如何計算餘弦相似度!如果您正在使用任何庫或包,則應確保按照您的預期計算相似度。除此之外,我認爲你的理解沒有任何問題。 –