데이터 분석/자연어처리

3. 자연어 처리 - 텍스트 유사도(n-gram, 코사인 유사도)

Jerry Jun 2021. 1. 18. 19:08
728x90

각 문장 간의 의미가 유사한지 컴퓨터는 어떻게 계산할까요?

여기에서 사용되는 개념은 "텍스트 유사도"라고 합니다.

 

n-gram 유사도

n-gram 유사도에서 "n-gram" 이란 기존 문장이 있을 때 n 개의 연속적인 단어 나열을 의미합니다. n 개의 토큰들이 있다는 의미와 같습니다. 이전 게시물인 Subword Segmentation 과 비슷한 양상이라고 볼 수 있습니다. pair 별 빈도를 이용하여 유사도를 계산합니다. 만약 "12월 철수는 패딩을 구입하러 상점으로 이동했다" 라는 문장과 "12월 철수는 패딩을 환불하러 백화점으로 이동했다" 라는 문장의 유사도를 알고 싶다면 단어별로 분절하여 pair 별로 빈도를 확인합니다. 그리고 비교하고자 하는 문장과 같은 pair 가 있는지 확인하고 그 개수를 알아내 유사도를 계산하면 위와 같은 예시 같이 66% 유사하다는 결과값을 얻을 수 있습니다.

n-gram 은 모든 단어의 빈도를 확인하는 것이 아니기 때문에 정확도가 떨어질 수 있다는 점을 유의해야 합니다.

 

 

코사인 유사도

코사인 유사도는 문장 내의 각 단어들의 벡터를 구하고 벡터 간의 코사인 각도를 이용해 유사도를 판단합니다(크기는 고려하지 않음). 일반적으로 코사인 값은 -1 ~ 1 사이의 값을 가집니다. 즉, 두 벡터의 방향이 같을 수록(비슷할수록 1에 가까움) 유사하다고 볼 수 있습니다. 각도가 수직인 경우 0을 반환하고, 완전히 다를 경우 -1을 반환합니다. 이미지 분야에서는 이미지를 행렬 또는 벡터로 나타내며 지금 공부하는 자연어 분야에서는 문장이나 단어를 벡터로 나타낸다고 볼 수 있습니다.

 

이전과 같은 예시로 들어도 같은 유사도가 나오는 것을 확인할 수 있었습니다. 

300x250