2016-12-29 41 views
1

sparkのword2vecアルゴリズムを使ってテキストの文書ベクトルを計算しました。word2vecのコサイン類似度1以上

次に、モデルオブジェクトの関数findSynonymsを使用して、数語の同義語を取得しました。

私はこのような何かを参照してください。(服用0および1またはMAX -1と+1の間でなければなりませんコサイン類似度を超える1コサイン類似度として計算されている理由を私は理解していない

w2vmodel.findSynonyms('science',4).show(5) 
+------------+------------------+ 
|  word|  similarity| 
+------------+------------------+ 
|  physics| 1.714908638833209| 
|  fiction|1.5189824643358183| 
|neuroscience|1.4968051528391833| 
| psychology| 1.458865636374223| 
+------------+------------------+ 

を負の角度)。

なぜここで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

あなたは完全に正しいです。私はあなたがコサインの類似性をどのように計算しているかを確認する必要があると信じています!ライブラリやパッケージを使用している場合は、期待どおりに類似度が計算されていることを確認する必要があります。それ以外は、私はあなたの理解に何の問題も見ません。 –

関連する問題