1

정보 검색을 위해 Manning 서적을 검토 중입니다. 현재 코사인 유사성에 대한 부분입니다. 한 가지는 명확하지 않습니다.
내가 쿼리와 문서에 대한 tf-idf 벡터가 있다고 가정 해 보겠습니다. 두 벡터 사이의 코사인 유사성을 계산하고 싶습니다. 문서 벡터의 크기를 계산할 때 벡터에있는 모든 용어의 제곱 또는 전체 쿼리의 용어의 합을 계산합니까?검색 엔진에서 쿼리와 문서 간의 코사인 유사도

다음은 예입니다. 사용자 쿼리 "cat food beef"가 있습니다. 해당 벡터가 (0,1,0,1,1)이라고합시다. (쿼리 및 문서의 각 고유 단어에 대해 벡터 방향이 하나만 있다고 가정하십시오) "Beef is delicious" 벡터는 (1,1,1,0,0)입니다. 우리는 질의와 문서 벡터 사이의 코사인 유사성을 찾고자합니다.

+0

크로스 사이트 중복 : [크로스 인증 됨에 (https://stats.stackexchange.com/q/311983/183808), [데이터 과학에 (https : //로 datascience. stackexchange.com/q/24370/323) – unor

답변

0

코사인 유사도는 단순히

  • 분자 2 개 벡터
  • 분모가 2 개 벡터
    • 즉 유클리드 길이, 즉의 크기의 제품과의 내적이 일부인 벡터 자체 내적의 제곱근
분자에 대해

, 예 : numpy에서 :

>>> import numpy as np 
>>> y = [1.0, 1.0, 1.0, 0.0, 0.0] 
>>> x = [0.0, 1.0, 0.0, 1.0, 1.0] 
>>> np.dot(x,y) 
1.0 

우리 곱셈 x_i로부터 및 y_i과 합산 개별 소자 내적 계산 마찬가지로 경우 :

>>> x_dot_y = sum([(1.0 * 0.0) + (1.0 * 1.0) + (1.0 * 0.0) + (0.0 * 1.0) + (0.0 * 1.0)]) 
>>> x_dot_y 
1.0 

분모를 들어, 우리는 numpy의 크기를 계산할 수있다 :

>>> from numpy.linalg import norm 
>>> y = [1.0, 1.0, 1.0, 0.0, 0.0] 
>>> x = [0.0, 1.0, 0.0, 1.0, 1.0] 
>>> norm(x) * norm(y) 
2.9999999999999996 

마찬가지로 numpy없이 유클리드 길이를 계산하면

>>> import math 
# with np.dot 
>>> math.sqrt(np.dot(x,x)) * math.sqrt(np.dot(y,y)) 
2.9999999999999996 

그래서 코사인 유사성은 다음과 같습니다

>>> cos_x_y = np.dot(x,y)/(norm(x) * norm(y)) 
>>> cos_x_y 
0.33333333333333337 

당신은 또한 scipy에서 직접 코사인 거리 함수를 사용할 수 있습니다

>>> from scipy import spatial 
>>> 1 - spatial.distance.cosine(x,y) 
0.33333333333333337 

도 참조