파이썬(Python)

코사인 유사도 (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단순한 단어 빈도 기반 비교빠르고 직관적의미적 관계를 반영하지 못함

🚀 활용 예시

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

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

zerg96

Recent Posts

충격! 코스피 8% 폭락에 SK텔레콤 AI 차단까지 – 한국의 AI 도박이 터졌다

코스피 8% 폭락, 서킷브레이커 발동, SK텔레콤 Claude AI 차단까지. 한국의 AI 레버리지 버블이 단 하루…

2주 ago

당신 얼굴이 이미 쓰이고 있다… AI 딥페이크 범죄, 생각보다 훨씬 심각합니다

SNS 사진 1장으로 30초 만에 딥페이크 영상이 완성됩니다. 당신의 얼굴이 이미 범죄에 악용되고 있을 수…

3주 ago

당신 얼굴이 이미 쓰이고 있다 — AI 딥페이크 범죄, 생각보다 훨씬 심각합니다

SNS 사진 1장으로 30초 만에 딥페이크 영상이 완성됩니다. 당신의 얼굴이 이미 범죄에 악용되고 있을 수…

3주 ago

달러·원 환율 급등, 지금 당신이 꼭 알아야 할 것들

달러/원 환율이 급등하는 이유와 실생활 영향을 정리했습니다. 지금 당장 활용할 수 있는 환전·투자 대응 전략까지…

3주 ago

미래에셋·미래에셋벤처투자·미래에셋생명 동반 급등, 스페이스X와 무슨 관계?

미래에셋·미래에셋벤처투자·미래에셋생명이 동반 급등한 이유는 스페이스X 상장 기대감입니다. 세 회사가 스페이스X와 어떻게 연결되어 있는지 상세히 분석했습니다.

3주 ago

스페이스X 상장 D-데이? 일론 머스크가 절대 말 안 하는 진짜 이유

스페이스X 상장이 계속 미뤄지는 진짜 이유를 파헤쳤습니다. 화성 계획, 스타링크 분리, 국방 계약... 머스크가 절대…

3주 ago