머신러닝/자연어처리

코사인 유사도 cosine similarity

Olivia-BlackCherry 2022. 7. 29. 10:40

백터 사이의 유사도를 측정하는 방법을 배우겠습니다. 

다양한 방법이 있겠지만, 자주 이용하는 코사인 유사도에 대해 알아보기로 합시다.

 

1. 코사인 유사도 cosine similarity

앞서, 단어를 벡터화시켰는데요. 

단어와 단어, 즉 벡터와 벡터 사이에 얼마나 관련성이 있는가를 측정하는 것입니다. 

만약 코사인 유사도 값이 높다면

이 두 벡터 간의 관련이 높다는 뜻입니다.

 

2. 구하는 방법

코사인유사도를 구하는 방법은 

벡터를 L2노름으로 정규화하고, 내적을 구하는 것입니다.

 

식은 다음과 같습니다.

분자에는 벡터의 내적이

분모에는 각 벡터의 노름(벡터의 크기)이 등장합니다. 

여기에서는 L2노름(벡터의 각 원소를 제곱해 더한 후, 다시 제곱근)을 계산합니다. 

두 벡터가 가리키는 방향이 완전히 같다면 코사인 유사도는 1, 완전히 반대라면 -1이 됩니다.

 

코드로 표현해봅시다.

x,y, 중 원소가 0인 벡터가 있다면 0으로 나누기 문제가 있기 때문에

작은 값을 뜻하는 입실론epsilon을 더해주도록 합니다. 

1e-8=-.00000001

def cos_similarity(x,y, eps=1e-8):
  nx = x / (np.sqrt(np.sum(x**2)) + eps)
  ny = y / (np.sqrt(np.sum(y**2)) + eps)
  return np.dot(nx, ny)

※ 하단의 재생버튼▶을 눌러보시면 출력 화면을 볼 수 있습니다.

 

 

3.유사 단어 랭킹 표시

<순서>

1. 검색어를 꺼낸다

2. 코사인 유사도를 계산한다

3. argsort() 메소드를 이용해 내림차순으로 출력한다.

파란 화살표의 argsort()메소드는 넘파이 배열의 원소를 오름차순으로 정렬합니다. 

그러면 낮은 값부터 순서대로 정렬이 되는데, 

우리가 구하고 싶은 것은 top5이기 때문에 -1을 곱해주는 것입니다. 

 

argsort()메소드에서 주의할 점은 반환값이 배열의 index 인덱스라는 점입니다. 

※ 하단의 재생버튼▶을 눌러보시면 출력 화면을 볼 수 있습니다.