주요 개념
- 자연어 처리
- 코사인 유사도(Cosine Similarity)
- 유클리드 거리(Euclidean distance)
코사인 유사도(Cosine Similarity)는 내적 공간의 두 벡터 간 각도의 코사인 값을 이용하여 측정된 벡터 간의 유사한 정도를 의미한다. 각도가 0°일 때의 코사인 값은 1이고 이외 다른 모든 각도의 코사인 값은 1보다 작다. 이 값은 벡터의 크기가 아닌 방향의 유사도를 판단하는 목적으로 사용되며, 두 벡터의 방향이 완전히 같을 경우 1, 90°의 각을 이룰 경우 0, 180°로 완전히 반대 방향인 경우 -1의 값을 갖는다. 이때 벡터의 크기는 값에 아무런 영향을 미치지 않는다.
코사인 유사도는 어떤 개수의 차원에도 적용이 가능하지만 특히 결과값이 [0,1]의 범위로 떨어지는 다차원의 양수 공간에서 사용된다.
예를 들어 정보 검색 및 텍스트 마이닝 분야에서, 단어 하나 하나는 각각의 차원을 구성하고 문서는 각 단어가 문서에 나타나는 횟수로 표현되는 벡터 값을 가진다. 이러한 다차원 공간에서 코사인 유사도는 두 문서의 유사를 측정하는 매우 유용한 방법이다. 코사인 유사도는 데이터 마이닝 분야에서 클러스터들 간의 응집도를 측정하는 방법으로도 사용된다.
두 벡터 사이 코사인 값은 아래와 같이 구할 수 있다.
$$ a \cdot b = \left||{a}\right|| \left||{b}\right|| cos \theta $$
아래는 코사인 유사도를 도출하는 방법이다.
이렇게 계산된 유사도는 -1에서 1까지의 값을 가지며 위에서 서술했듯 아래 3가지로 나뉜다.
- -1은 서로 완전히 반대되는 경우
- 0은 서로 독립적인 경우
- 1은 서로 완전히 같은 경우
만약 텍스트 매칭에 코사인 유사도가 적용되는 경우, A, B의 벡터로는 일반적으로 해당 문서에서의 단어 빈도가 사용된다. 코사인 유사도는 문서들간의 유사도를 비교할 때 문서의 길이를 정규화하는 방법의 하나라고 볼 수도 있다.
정보 검색의 경우, 문서의 단어 빈도(tf-idf 가중치)가 음의 값이 되는 것이 불가능하므로 두 문서 사이의 코사인 유사도는 0에서 1까지의 값으로 표현되며, 두 단어 빈도 간의 각도는 90°를 넘을 수 없다.
아래와 같은 문장 3가지가 있다고 가정한다.
- sentence 1: 나는 빨간색 딸기 좋아한다.
- sentence 2: 나는 빨간색 체리 좋아한다.
- sentence 3: 나는 빨간색 딸기 빨간색 딸기 좋아한다.
나는 | 빨간색 | 딸기 | 체리 | 좋아한다. | |
sentence 1 | 1 | 1 | 1 | 0 | 1 |
sentence 2 | 1 | 1 | 0 | 1 | 1 |
sentence 3 | 1 | 2 | 2 | 0 | 1 |
아래는 해당 내용을 python 소스 코드로 구현한 것이다.
import numpy as np
def cos_sim(A, B):
return np.dot(A, B)/(np.linalg.norm(A)*np.linalg.norm(B))
sentence1 = np.array([1, 1, 1, 0, 1])
sentence2 = np.array([1, 1, 0, 1, 1])
sentence3 = np.array([1, 2, 2, 0, 1])
print('문장1-문장2 코사인 유사도 :', cos_sim(sentence1, sentence2))
print('문장1-문장3 코사인 유사도 :', cos_sim(sentence1, sentence3))
print('문장2-문장3 코사인 유사도 :', cos_sim(sentence2, sentence3))
# 문장1-문장2 코사인 유사도 : 0.75
# 문장1-문장3 코사인 유사도 : 0.9486832980505138
# 문장2-문장3 코사인 유사도 : 0.6324555320336759
유클리드 거리(Euclidean distance)로만 유사도를 판별하게 되면 비슷한 내용의 어떤 문장 A, B가 있고 C는 다른 주제의 문장일 때, B가 A보다 문장 길이가 더 길고 A와 C는 길이가 유사할 때 A-B간의 유사도보다 A-C의 유사도가 더 높아질 수 있다. 이런 상황에서 코사인 유사도가 패턴에 해당하는 벡터의 방향에 초점을 두기 때문에 문서의 길이가 다른 상황에서 유클리드 거리보다 더 납득이 가는 비교가 가능하다.
소스 코드