코사인 유사도 (Cosine Similarity)

📌 코사인 유사도 (Cosine Similarity)

코사인 유사도는 두 벡터 간의 각도를 기반으로 두 값이 얼마나 비슷한지 유사도를 측정하는 방법입니다. 값의 범위는 -1 ≤ cosine similarity ≤ 1이며, 값이 1에 가까울수록 두 벡터가 유사하고, 0이면 서로 독립적이며, -1에 가까울수록 반대 방향을 의미합니다.

수식:

  • A⋅B: 두 벡터의 내적
  • ||A||, ||B|| : 벡터의 크기(유클리드 노름)

🛠 Python 구현 (NLTK + Scikit-learn 활용)

1️⃣ 문장 간 유사도 측정

(1) TF-IDF를 활용한 코사인 유사도 계산

TF-IDF(Term Frequency-Inverse Document Frequency)를 이용하여 단어 가중치를 반영한 후, 벡터 간의 코사인 유사도를 계산합니다.

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity

# 비교할 문장 2개
text1 = "Natural Language Processing is interesting."
text2 = "I love learning about NLP."

# TF-IDF 벡터화
vectorizer = TfidfVectorizer()
tfidf_matrix = vectorizer.fit_transform([text1, text2])

# 코사인 유사도 계산
cos_sim = cosine_similarity(tfidf_matrix[0:1], tfidf_matrix[1:2])
print("코사인 유사도:", cos_sim[0][0])

TF-IDF 방식의 장점: 단순한 단어 빈도가 아니라, 문서 전체에서 상대적인 중요도를 반영하여 유사도를 측정.

2️⃣ 단어 임베딩(W2V, GloVe, BERT) 활용

보다 정교한 의미 기반 유사도를 측정하려면 Word2Vec, GloVe, BERT 같은 사전 훈련된 모델을 사용하여 단어를 벡터화한 후 코사인 유사도를 계산할 수 있습니다.

(2) Word2Vec을 이용한 코사인 유사도

import gensim.downloader as api
from numpy import dot
from numpy.linalg import norm

# Word2Vec 모델 로드 (Google News Pretrained Model)
model = api.load("word2vec-google-news-300")

# 단어 벡터 변환
vec1 = model["king"]
vec2 = model["queen"]

# 코사인 유사도 계산
cos_sim = dot(vec1, vec2) / (norm(vec1) * norm(vec2))
print("Word2Vec 코사인 유사도:", cos_sim)

Word2Vec 방식의 장점: 단어 간의 의미적 유사도를 학습한 사전 훈련된 모델을 사용.

3️⃣ 문서 간 유사도 (CountVectorizer)

단순한 단어 빈도를 기반으로 문서 유사도를 계산할 수도 있습니다.

(3) CountVectorizer를 이용한 코사인 유사도

from sklearn.feature_extraction.text import CountVectorizer

# 문서 리스트
docs = ["I love NLP and deep learning",
"NLP is amazing and deep learning is powerful",
"Artificial Intelligence is the future of technology"]

# 단어 빈도 벡터화
vectorizer = CountVectorizer()
count_matrix = vectorizer.fit_transform(docs)

# 코사인 유사도 계산
cos_sim = cosine_similarity(count_matrix)
print("문서 간 코사인 유사도:\n", cos_sim)

CountVectorizer 방식의 장점: 단어의 빈도를 기반으로 비교하여 단순한 문서 유사도를 빠르게 측정 가능.

📌 정리

방법특징장점단점
TF-IDF단어의 중요도를 반영하여 벡터화가볍고 효과적문맥 정보를 반영하지 못함
Word2Vec/GloVe단어의 의미를 벡터로 변환단어 간 의미적 관계 반영 가능사전 훈련된 모델 필요
BERT (Transformer 기반)문맥을 고려한 임베딩 제공문장 수준에서 가장 정밀학습된 모델이 무거움
CountVectorizer단순한 단어 빈도 기반 비교빠르고 직관적의미적 관계를 반영하지 못함

🚀 활용 예시

  • 🔍 검색 엔진: 사용자의 쿼리와 문서 간 유사도를 측정하여 관련 문서 추천
  • 🤖 챗봇: 사용자 질문과 기존 데이터셋 간 유사도 비교로 적절한 응답 제공
  • 📚 문서 분류: 문서 간 유사도 기반으로 자동 분류 및 클러스터링 수행

어떤 방식이 필요하든, 코사인 유사도를 적용하면 문장, 단어, 문서 간의 유사도를 효과적으로 측정할 수 있습니다! 🚀

Leave a Comment