반응형
문서를 유사도를 기준으로 분류 혹은 그룹핑을 할 때 유용하게 사용할 수 있는 코사인 거리(Cosine Distance) 입니다.
코사인 유사도(Cosine Similarity)는 특징 벡터 X, Y 에 대해서
벡터의 곱(X*Y)을 두 벡터의 L2 norm (즉, 유클리드 거리) 의 곱으로 나눈 값입니다.
벡터의 곱(X*Y) ------------------- 벡터의 L2 norm (즉, 유클리드 거리) |
Cosine Similarity (d1, d2) = Dot product(d1, d2) / ||d1|| * ||d2||
Dot product (d1,d2) = d1[0] * d2[0] + d1[1] * d2[1] * … * d1[n] * d2[n]
||d1|| = square root(d1[0]2 + d1[1]2 + ... + d1[n]2)
||d2|| = square root(d2[0]2 + d2[1]2 + ... + d2[n]2)
예시를 들어보겠습니다.
a = np.array([3, 45, 7, 2])
b = np.array([2, 54, 13, 15])
import numpy as np
from math import*
def square_rooted(x):
return round(sqrt(sum([a*a for a in x])),3)
def cosine_similarity(x,y):
numerator = sum(a*b for a,b in zip(x,y))
denominator = square_rooted(x)*square_rooted(y)
return round(numerator/float(denominator),3)
print(cosine_similarity(a, b))
0.972
def cosine_similarity(a, b):
return np.dot(a, b) / (np.linalg.norm(a) * (np.linalg.norm(b)))
print(cosine_similarity(a, b))
0.9722842517123499
* np.linalg.norm
Norm이란 무엇일까?
Norm은 선형대수에서 벡터공간에서 벡터의 크기 또는 길이를 측정할 때 사용되는 개념
벡터에 절대값을 취한뒤 다 더해준다. 이것은 양수가 나오며 길이나 크기를 측정하게 된다.
import scipy.linalg as linalg
#np.linalg와 scipy.linalg에서 선형대수를 수행할 수 있다.
norm1 = linalg.norm(x,1) # L1 norm == sum(np.abs(x))
norm2 = linalg.norm(x) # L2 norm == np.sqrt(sum(x*x))
normp = linalg.norm(x,p) # p norm
normMax = linalg.norm(x,np.inf) # max norm == np.max(abs(x))
from scipy.spatial.distance import cosine
print(cosine(a, b)) #0.2525906813163403 #코사인 거리
print(1 - cosine(a, b)) #0.7474093186836597 #코사인 유사도
0.02771574828765
0.97228425171235
그리고 코사인 거리(Cosine Distance)는 '1 - 코사인 유사도(Cosine Similarity)' 로 계산합니다.
janav.wordpress.com/2013/10/27/tf-idf-and-cosine-similarity/
반응형
'딥러닝 > 자연어처리' 카테고리의 다른 글
[word2vec] 카카오 댓글데이터로 word2vec 임베딩 해보기 (0) | 2020.11.10 |
---|---|
자연어 처리 보면 좋을 자료 모음 (0) | 2020.11.10 |
[Keras] Attention 을 이용해 자연어 감성 분석 해보기 : Hierarchical Attention Networks for Document Classification 구현 (0) | 2020.11.10 |
댓글