logo

[text-mining] 다양한 유사도

 

다양한 유사도

 

자카드 유사도 Jaccard similarity

  • 두 집합(Set) 간의 유사도를 측정하는 가장 기본적인 방법
  • 교집합의 크기 / 합집합의 크기
  • IOU(Intersection Over Union)라고도 함
  • 문서 유사도를 측정할 때는, 두 문서의 단어 집합을 이용하여 계산
  • 단어의 빈도 수는 무시, 등장 유무(0=없음, 1=있음)만 고려
 

자카드 유사도의 장단점

  • 장점:
    • 개념이 매우 직관적이고 계산이 간단함.
    • 단어의 존재 유무가 중요한 경우 유용 (예: 문서 내 특정 키워드 포함 여부)
  • 단점:
    • 단어 빈도 정보 무시: 중요한 단어가 여러 번 등장해도 반영되지 않음.
    • 문서 크기(단어 수)에 민감: 문서 길이가 크게 다르면 유사도가 낮게 나올 경향. (합집합 크기가 커지므로)
    • 전체 어휘 집합의 크기가 매우 크면 비효율적일 수 있음 (Sparse한 데이터에는 비효율)
 

자카드 유사도로 비슷한 문서 찾기

import numpy as np
binary_dtm = (dtm > 0).astype(int).toarray() # 단어의 출현 여부만 남긴 행렬
i = 0 # 0번 문서
target = binary_dtm[i].reshape(1, -1) # 0번 문서의 벡터
dist = pairwise_distances(target, binary_dtm, metric='jaccard').flatten() # 거리 계산
rank = np.argsort(dist) # 거리 가까운 순으로 단어 번호를 정렬
df.iloc[rank[:10]] # 가장 가까운 문서 10개
 

코사인 유사도 cosine similarity

  • (: 원점에서 보았을 때 두 좌표의 각도)
  • 문서 유사도를 계산할 때 흔히 사용
  • 벡터의 크기(Magnitude)가 아니라 방향(Direction)이 얼마나 유사한지에 초점.
  • 문서 길이가 달라도(벡터 크기가 달라도), 사용된 단어의 주제나 내용(벡터 방향)이 유사하다면 높은 유사도를 가질 수 있음.
  • 값의 범위: -1 ~ 1
    • 1: 두 벡터의 방향이 완전히 동일 (가장 유사)
    • 0: 두 벡터가 직교 (관련성 없음)
    • -1: 두 벡터의 방향이 정확히 반대 (매우 상이)
  • TF-IDF 벡터는 보통 음수 값을 가지지 않으므로, 실제로는 0 ~ 1 사이 값을 가짐.
 

점곱 dot product

  • 벡터 가 있을 때 점곱은
  • 또한
  • 두 벡터의 점곱 = 벡터의 길이 벡터의 길이 두 벡터의 코사인 유사도
 

Normalization

  • Normalization: 통계에서 크기를 맞춰주는 종류의 계산들
  • L2 Normalization 모든 문서의 원점에서 거리를 1로 맞춤
  • 두 문서의 점곱과 코사인 유사도가 같아짐
  • 두 벡터의 점곱 = 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]] # 가장 가까운 단어 10개
Previous
스코어링과 TF-IDF