Hey Tech

[NLP] 문서 유사도 분석: (1) 코사인 유사도(Cosine Similarity) 본문

AI & 빅데이터/자연어처리(NLP)

[NLP] 문서 유사도 분석: (1) 코사인 유사도(Cosine Similarity)

Tony Park (토니) 2022. 4. 18. 10:50
728x90
반응형

 

 

 

📌 Text 빅데이터분석 플랫폼 베타테스트 참가자 모집 중!(네이버페이 4만 원 전원 지급)

 

👋 안녕하세요, 코딩이 필요 없는 AI/빅데이터 분석 All in One 플랫폼 <DATA101> 개발팀입니다.
😊 저희 서비스를 사용해 보시고 경험담을 들려주세요 :)
💸 참여해 주신 "모든" 분들께 네이버페이 4만 원 쿠폰을 지급해 드립니다.

👨‍💻 참여 희망 시 카톡플러스친구 1:1 채팅 or 인스타그램 DM 부탁드립니다 :)

📆 참여기간 : 11/25(월)~11/29(금) 11:00~21:00 중 택1 (1시간 1타임)
👉 참여장소 : 강남역 인근 스터디카페 미팅Room
📍 소요시간 : 총 40분 내외(서비스 체험 및 인터뷰 포함)
✅ 참가조건 : Text 빅데이터 분석 업무 경험자

👉 참가 가능일정 조회하기 : https://url.kr/n8k8gu
- 카톡플친 : http://pf.kakao.com/_SxltHG/chat
- 인스타그램 : https://www.instagram.com/data101.official/


📚 목차

1.  코사인 유사도 개념
2.  코사인 유사도 실습

1.  코사인 유사도 개념

코사인 유사도(Cosine Similarity)란 두 벡터 사이의 각도를 계산하여 두 벡터가 얼마나 유사한지 측정하는 척도입니다. 즉, DTM, TF-IDF, Word2Vec 등과 같이 단어를 수치화하여 표현할 수 있다면 코사인 유사도를 활용하여 문서 간 유사도를 비교하는 게 가능합니다. 코사인 유사도는 \(1\)에 가까울수록 두 벡터가 유사하다고 해석하며, 문서의 길이가 다른 경우에도 비교적 공정하게 비교할 수 있다는 장점이 있습니다. 아래 그림 1과 같이 두 벡터가 같은 방향을 가리키는, 즉 두 벡터 사이의 각도가 \(0^\circ\)일 때 코사인 유사도가 최댓값인 1을 갖습니다.

그림 1. 코사인 유사도

 

\(A\), \(B\)라는 두 벡터가 있을 때 코사인 유사도 수식은 아래와 같습니다.

 

$$ cos\theta = \frac{A \cdot B}{||A||||B||} = \frac{\sum_{i=1}^{n}A_i \times B_i}{\sqrt{\sum_{i=1}^{n}(A_i)^2} \times \sqrt{\sum_{i=1}^{i}(B_i)^2}} $$ 

2.  코사인 유사도 실습

문서 예시

아래와 같은 3가지 문서가 있다고 해보겠습니다. 파이썬을 활용하여 코사인 유사도를 계산하고 문서 간 유사도를 비교해 보겠습니다.

구분 문장
문서1 나는 아침보다 저녁이 좋다
문서2 사과는 아침보다 저녁이 좋다
문서3 사과는 점심 간식으로 좋다

띄어쓰기를 기준으로 토큰화를 진행한다고 가정해 보겠습니다. 문서-단어 행렬(Document Term Matirx, DTM)을 표현하면 아래 표와 같습니다.

  나는 아침보다 저녁이 좋다 사과는 점심 간식으로
문서1 1 1 1 1 0 0 0
문서2 0 1 1 1 1 0 0
문서3 0 0 0 1 1 1 1

파이썬 코드

Step 1. 패키지 불러오기

import numpy as np
from numpy import dot
from numpy.linalg import norm

필요한 패키지를 import합니다. numpy 패키지를 활용하면 벡터 표현, 연산을 쉽게 할 수 있습니다.

Step 2. 코사인 유사도 계산 함수

def cosine_similarity(A, B):
    return dot(A, B)/(norm(A)*norm(B))

수식을 고려하여 코사인 유사도를 계산하는 함수를 작성합니다.

Step 3. 문서-단어 행렬(DTM) 세팅

doc1 = np.array([1,1,1,1,0,0,0])
doc2 = np.array([0,1,1,1,1,0,0])
doc3 = np.array([0,0,0,1,1,1,1])

문서 예시를 DTM으로 표현한 대로 준비합니다. 물론, 워드임베딩 기법을 사용하실 수 있다면 위와 같이 수기로 작성하실 필요는 없습니다. 간단한 예제이므로 수기로 작성해 봤습니다.

Step 4. 문서 간 유사도 확인

print(f"1. 문서1-문서2 간 유사도: {cosine_similarity(doc1, doc2)}")
print(f"2. 문서1-문서3 간 유사도: {cosine_similarity(doc1, doc3)}")
print(f"3. 문서2-문서3 간 유사도: {cosine_similarity(doc2, doc3)}")

문서 간 유사도를 비교해 보면 아래와 같은 결과를 얻을 수 있습니다.

1. 문서1-문서2 간 유사도: 0.75
2. 문서1-문서3 간 유사도: 0.25
3. 문서2-문서3 간 유사도: 0.5

실제 텍스트를 통해 문서를 비교해봐도 이렇게 계산한 유사도 값이 어느 정도 타당하다는 것을 아실 수 있습니다.

📚 참고할 만한 포스팅

1. [NLP] Bag of Words(BoW) 개념 및 실습
2. [NLP] 문서 단어 행렬(DTM) 개념 이해
3. [NLP] TF-IDF 개념 및 계산 방법
4. [NLP] Word Embedding의 이해: (1) 희소표현 및 밀집표현
5. [NLP] 언어모델(Language Model)의 개념 및 특징
6. [NLP] N-gram 언어 모델의 개념, 종류, 한계점
7. [NLP] 언어모델의 평가지표 'Perplexity' 개념 및 계산방법
8. [NLP] Word2Vec: (1) 개념
9. [NLP] Word2Vec: (2) CBOW 개념 및 원리
10. [NLP] Word2Vec: (3) Skip-gram
11. [NLP] Word2Vec: (4) Negative Sampling
12. [NLP] 문서 유사도 분석: (1) 코사인 유사도(Cosine Similarity)
13.  [NLP] 문서 유사도 분석: (2) 유클리디안 거리(Euclidean Distance)
14.  [NLP] 문서 유사도 분석: (3) 자카드 유사도(Jaccard Similarity)


오늘은 코사인 유사도의 개념을 알아보고, 간단한 파이썬 실습을 진행해 봤습니다.

포스팅 내용에 오류가 있거나 보완할 점이 있다면 아래에 👇👇👇 댓글 남겨주시면 감사드리겠습니다 :) 

그럼 오늘도 즐겁고 건강한 하루 보내시길 바랍니다. 

고맙습니다😊

728x90
반응형