다양한 유사도
자카드 유사도 Jaccard similarity
- 두 집합(Set) 간의 유사도를 측정하는 가장 기본적인 방법
- 교집합의 크기 / 합집합의 크기
- IOU(Intersection Over Union)라고도 함
- 문서 유사도를 측정할 때는, 두 문서의 단어 집합을 이용하여 계산
- 단어의 빈도 수는 무시, 등장 유무(0=없음, 1=있음)만 고려
자카드 유사도의 장단점
- 장점:
- 개념이 매우 직관적이고 계산이 간단함.
- 단어의 존재 유무가 중요한 경우 유용 (예: 문서 내 특정 키워드 포함 여부)
- 단점:
- 단어 빈도 정보 무시: 중요한 단어가 여러 번 등장해도 반영되지 않음.
- 문서 크기(단어 수)에 민감: 문서 길이가 크게 다르면 유사도가 낮게 나올 경향. (합집합 크기가 커지므로)
- 전체 어휘 집합의 크기가 매우 크면 비효율적일 수 있음 (Sparse한 데이터에는 비효율)
자카드 유사도로 비슷한 문서 찾기
import numpy as np
binary_dtm = (dtm > 0).astype(int).toarray()
i = 0
target = binary_dtm[i].reshape(1, -1)
dist = pairwise_distances(target, binary_dtm, metric='jaccard').flatten()
rank = np.argsort(dist)
df.iloc[rank[:10]]
코사인 유사도 cosine similarity
- cosθ (θ: 원점에서 보았을 때 두 좌표의 각도)
- 문서 유사도를 계산할 때 흔히 사용
- 벡터의 크기(Magnitude)가 아니라 방향(Direction)이 얼마나 유사한지에 초점.
- 문서 길이가 달라도(벡터 크기가 달라도), 사용된 단어의 주제나 내용(벡터 방향)이 유사하다면 높은 유사도를 가질 수 있음.
- 값의 범위: -1 ~ 1
- 1: 두 벡터의 방향이 완전히 동일 (가장 유사)
- 0: 두 벡터가 직교 (관련성 없음)
- -1: 두 벡터의 방향이 정확히 반대 (매우 상이)
- TF-IDF 벡터는 보통 음수 값을 가지지 않으므로, 실제로는 0 ~ 1 사이 값을 가짐.
점곱 dot product
- 벡터 a=(a1,a2,…)와 b=(b1,b2,…) 가 있을 때 점곱은 a⋅b=a1b1+a2b2+…
- 또한 a⋅b=∥a∥∥b∥cosθ
- a,b 두 벡터의 점곱 = a 벡터의 길이 ×b 벡터의 길이 × 두 벡터의 코사인 유사도
Normalization
- Normalization: 통계에서 크기를 맞춰주는 종류의 계산들
- L2 Normalization → 모든 문서의 원점에서 거리를 1로 맞춤
- 두 문서의 점곱과 코사인 유사도가 같아짐
- a,b 두 벡터의 점곱 = 1 × 1 × 두 벡터의 코사인 유사도
코사인 유사도 계산
from sklearn.metrics.pairwise import cosine_similarity
word_similarity = cosine_similarity(word_vectors)
word_similarity.shape
rank = np.argsort(word_similarity[j])
rank = rank[::-1]
[words[i] for i in rank[:10]]