파이썬(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

재택근무 종말이 온다? AI 감시 소프트웨어가 사무실을 부활시키는 진짜 이유

AI 감시 소프트웨어가 재택근무 시대를 끝내고 있다. 직원의 키스트로크·화면·표정까지 추적하는 기술의 실체와, 한국 직장인이 알아야…

2시간 ago

정보보안기사 실기 합격을 가르는 10문제, 로그 분석부터 RSA 계산까지 풀이 포함

정보보안기사 실기는 개념을 아는 것보다 로그를 읽고, 규칙을 쓰고, 계산하는 힘에서 점수가 갈립니다. 이번 글은…

3시간 ago

호르무즈에서 2주간 선박 24척 피격, 원유 수송은 전쟁 전보다 43% 줄었다

호르무즈 해협 뉴스는 이제 '또 공격이 있었다'보다 '얼마나 늘었나'를 봐야 합니다. 이투데이가 FT와 영국해사무역기구(UKMTO) 등을…

3시간 ago

추석 연휴에 뚫린 은행들, 해외 법인 보안망까지 다시 짜는 이유

이번 추석 연휴, 은행들은 쉬지 못했습니다. 연휴 기간 금융권에서 대규모 개인정보 유출 사고가 터졌기 때문입니다.…

6시간 ago

서울 집값은 11% 올랐는데 거래는 17% 줄었다, 토허제 1년의 역설

"집 못 팔게 막으면 값이 내려가겠지." 서울 전역이 토지거래허가구역으로 묶이던 1년 전, 이런 기대가 있었습니다.…

6시간 ago

코스피 5연속 급락 뒤 2% 반등, 외국인·기관이 받쳤고 코스닥은 제자리

다섯 거래일 연속 밀린 코스피가 오늘 아침 크게 반등했습니다. 오전 9시 12분 기준 6,165.02로 전…

6시간 ago