본문 바로가기

딥러닝/[딥 러닝을 이용한 자연어 처리 입문]딥러닝

여러가지 유사도 기법

자연어 처리에서 사용되는 여러 가지 유사도 기법:
  1. 코사인 유사도 (Cosine Similarity): 문서나 단어들을 벡터로 변환하여 두 벡터 사이의 코사인 각도를 계산하여 유사도를 측정하는 방법입니다.
  2. 자카드 유사도 (Jaccard Similarity): 두 집합 사이의 유사도를 측정하는 방법으로, 두 집합에서 공통으로 포함된 원소의 개수를 전체 원소의 개수로 나눈 값입니다.
  3. 유클리디안 거리 (Euclidean Distance): 두 점 사이의 직선 거리를 계산하여 유사도를 측정하는 방법입니다.
  4. 맨하탄 거리 (Manhattan Distance): 두 점 사이의 맨하탄 거리를 계산하여 유사도를 측정하는 방법으로, 좌표축에 수직으로 이동하는 거리의 합입니다.
  5. 편집 거리 (Edit Distance): 두 문자열 사이의 차이를 측정하여 유사도를 측정하는 방법으로, 두 문자열 사이에 필요한 삽입, 삭제, 대체 등의 편집 연산의 수를 계산합니다.
  6. 링거스틴 거리 (Levenshtein Distance): 두 문자열 사이의 편집 거리를 계산하여 유사도를 측정하는 방법입니다.
  7. 코사인 유사도를 기반으로 하는 Doc2Vec 등의 방법: 문서나 문장을 벡터로 변환하여 코사인 유사도 등의 방법으로 유사도를 측정하는 방법입니다.

 

1. 유클리드 거리(Euclidean distance)

 

다차원 공간에서 두개의 점 p와 q가 각각 p=(p1,p2,p3,...,pn)과 q=(q1,q2,q3,...,qn)의 좌표를 가질 때 두 점 사이의 거리를 계산하는 유클리드 거리 공식은 다음과 같습니다.

(q1−p1)2+(q2−p2)2+ ... +(qn−pn)2=∑i=1n(qi−pi)2

2차원 좌표 평면에서 두 점 사이의 유클리드 거리 공식은 피타고라스의 정리를 통해 두 점 사이의 거리를 구하는 것과 동일합니다.

np.sqrt(np.sum((x-y)**2))
두 개의 벡터 x와 y 사이의 유클리드 거리(Euclidean distance)를 계산하는 코드입니다.
벡터 x와 y의 차이를 제곱하고 모두 더한 후 제곱근을 취한 값이 두 벡터 사이의 거리가 됩니다.

 

유클리드 거리의 값이 가장 작다는 것은 문서 간 거리가 가장 가깝다는 것을 의미합니다.

 

2. 자카드 유사도(Jaccard similarity)

 

A와 B 두개의 집합이 있다고 합시다. 이때 교집합은 두 개의 집합에서 공통으로 가지고 있는 원소들의 집합을 말합니다.

즉, 합집합에서 교집합의 비율을 구한다면 두 집합 A와 B의 유사도를 구할 수 있다

자카드 유사도는 0과 1사이의 값을 가지며, 만약 두 집합이 동일하다면 1의 값을 가지고, 두 집합의 공통 원소가 없다면 0의 값을 갖습니다.

자카드 유사도를 구하는 함수를 J라고 하였을 때, 자카드 유사도 함수 J는 아래와 같습니다.

J(A,B)=|A∩B||A∪B|=|A∩B||A|+|B|−|A∩B|

 

문서1과 문서2의 합집합을 구해보겠습니다.

set()
중복된 값을 허용하지 않는다는 특징을 가지며, 순서가 없는(unordered) 자료형입니다
비어있는 집합을 만들 때도 사용할 수 있습니다.

union
은 파이썬에서 set(집합) 자료형에서 사용되는 메소드로, 두 개 이상의 집합을 합치는 기능을 합니다.

문서1과 문서2의 합집합의 단어의 총 개수는 12개입니다.

 

이제 문서1과 문서2의 교집합을 구해보겠습니다.

intersection은 두 개의 집합(set)에서 공통된 요소들을 추출하는 메서드입니다

교집합의 크기를 합집합의 크기로 나누면 자카드 유사도가 계산됩니다.