인공지능/nlp

[자연어 처리]유사도

100050 2024. 3. 30. 18:41

 1 코사인 유사도

 코사인 유사도는 두 벡터가 얼마나 비슷하냐를 알기 위해 사용된다. 벡터 a, b가 있을 때 a와 b의 내적을 a의 놈과 b의 놈을 곱한 값으로 나누어 계산한다. 기존의 내적을 구할 때 쓰는 공식에서 a의 놈과 b의 놈을 우측으로 옮긴 것이다.

 

$$a \cdot b = \parallel a \parallel \parallel b \parallel \cos(\theta)$$

$$ \cos(\theta) = \frac{a \cdot b}{ \parallel a \parallel \parallel b \parallel}$$

 

내적과 놈(Norm)

$$a \cdot b = \sum_{k=1}^N a_k \cdot b_k $$

$$\parallel a \parallel = \sqrt{\sum_{k=1}^N (a_k)^2} $$

 

 유사도가 높다면 1에 가깝고 낮다면 0에 가까워 진다.

2 유클리드 거리

 유클리드 거리또한 두 벡터의 유사도를 구하기 위해 자주 사용되는데, 사실 그냥 두 점 사이의 거리를 구하는 공식이다. 벡터 a, b가 있을 때 각 벡터의 성분의 차를 제곱하여 더한 것의 제곱근을 구하면 유클리드 거리가 나온다.

 

$$ \sqrt{\sum_{k=1}^N (a_k - b_k)^2} $$

 

 유사도가 높다면 0에 가깝고 낮으면 낮을수록 계속 값이 높아진다.

3 비교

 특수한 경우 한 가지를 보겠다. 

그림 1

 

 이 두 벡터의 코사인 유사도를 구하면 유사하다고 나올 것이고, 유클리드 거리를 구하면 코사인 유사도에 비해서는 덜 유사하다고 나올 것이다.

 

 이런 경우에 대해 예시를 들어보자면 어떤 블로그 글 2개가 있는데 하나는 수학이라는 단어가 1번만 나오고 또 다른 하나는 수학이란 단어가 10번은 나온다. 그리고 다른 단어에 대해서는 별로 빈도의 차이가 없다하면 그림 1과 같이 벡터가 나올 것이다. 

 

 이 예시의 경우에는 유클리드 거리가 좀 더 유리하게 적용될 수 있다. 그러나 내가 어떤 문제를 푸는냐에 따라서 이러한 경우일지라도 코사인 거리가 더 유리할 수도 있다.

 

 일반적으로는 벡터의 성분의 갯수가 어느정도 된다면 코사인 유사도를 많이 사용한다.

4 사용 예시

 자연어 처리 분야에서 두 단어나 문장의 유사도를 구하고 싶을 때 사용한다. 특히 TF-IDF에서 문서 간의 유사도를 구할 때 많이 사용된다. 또 딥러닝 분야에서 언어 모델을 만들 때 평가 지표로서 코사인 유사도를 사용하기도 한다.

 

'인공지능 > nlp' 카테고리의 다른 글

[자연어 처리] TF-IDF  (0) 2024.04.10