2016-12-29 4 views
1

텍스트의 문서 벡터를 계산하기 위해 spark의 word2vec 알고리즘을 사용했습니다.word2vec의 코사인 유사도 1보다

그런 다음 모델 개체의 findSynonyms 함수를 사용하여 몇 단어의 동의어를 가져 왔습니다.

나는 이런 식으로 뭔가를 참조하십시오

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

내가 코사인 유사도가 0과 1 또는 최대 -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

감사합니다. 그러나 빠른 질문. 벡터를 정규화하고 코사인 유사성을 취하는 경우에는 내적 (dot) 제품 만 사용하는 것과 유사합니다. 정규화하지 않고 코사인 유사성을 취하는 경우 코사인 유사성의 공식에서 각 벡터의 표준으로 내적을 나눕니다. 따라서 코사인 유사성을 계산하는 동안 정규화가 발생합니다. 그래서 왜 사람들이 왜 그것을 정상화해야하는지 확실하지 않습니다. 결국 동일한 수식이되며 계산은 동일해야합니다 – Baktaawar

+0

정규화 부분을 알고 있습니다. 하지만 왜 내 질문 코사인 유사점을 변경합니다. 정규화하거나 – Baktaawar

+0

을 완전히 입력해도 수식은 동일하게 유지됩니다. 그럼 당신은 코사인 유사점을 계산하는 방법을 확인해야한다고 생각합니다! 라이브러리 나 패키지를 사용하는 경우 예상대로 유사성이 계산되었는지 확인해야합니다.그것 이외에, 나는 너의 이해에 어떤 ​​문제도 보지 않는다. –

관련 문제