logo

[text-mining] 유사도와 거리

 

유사도 similarity

  • 두 텍스트(단어, 문서 등)가 내용, 의미, 형태 등에서 얼마나 '비슷한가'를 정량적으로 나타내는 척도
  • 비슷할 수록 커짐(보통 0 - 1이나 -1 - +1 범위로 사용)
  • 중요성:
    • 텍스트 데이터 간의 관계 및 패턴 파악의 핵심
    • 정보 검색, 추천, 분류, 군집화 등 다양한 텍스트 분석 작업의 기반 기술
  • 유사도의 종류:
    • 어휘적/표면적 유사성 (lexical similarity): 사용된 단어 자체가 얼마나 겹치는지 측정.
      • 예시: "오늘 날씨 좋다" vs "오늘 날씨 맑다" (단어 '오늘', '날씨' 공유)
    • 의미적 유사성 (semantic similarity): 단어의 의미나 문맥, 내포된 뜻이 얼마나 유사한지 측정.
      • 예시: "차량 속도가 높다" vs "자동차가 빠르게 달린다" (단어는 다르지만 의미는 매우 유사)
 

유사도 측정의 응용

  • 정보 검색 (Information Retrieval): 사용자의 검색어와 가장 유사한 문서를 웹/DB에서 찾아 제시
    • 예: 검색 엔진
  • 문서 군집화 (Document Clustering): 유사한 주제나 내용을 가진 문서들을 자동으로 그룹핑
    • 예: 뉴스 기사 분류
  • 추천 시스템 (Recommendation Systems): 사용자가 선호한 항목과 유사한 다른 항목을 추천
    • 예: 영화, 상품, 뉴스 등 추천
  • 표절 탐지 (Plagiarism Detection): 제출된 문서와 기존 문서 간의 유사도를 계산하여 표절 판단
  • 기계 번역 (Machine Translation) 평가: 생성된 번역문과 정답 번역문 간의 유사도 측정
 

거리 distance

  • 거리 : 두 사례 의 차이 표현
  • 거리는 다음의 성질을 만족해야 함
    • : 두 사례가 같으면 0, 이외에는 항상 양수
    • : 에서 의 거리는 에서 의 거리와 같음
    • : 에서 를 거쳐 로 가는 것은 바로 가는 것보다 길거나 같음
  • 위의 성질을 만족하는 한, 다양한 방식으로 거리를 정의할 수 있음
  • 유사도는 흔히 거리와 역의 관계로 정의
    • 유사도 (증가) = 거리 (감소)
    • Similarity = 1 / (1 + Distance)
    • Similarity = max(Possible Distance) - Distance
 

민코우스키 거리 Minkowski distance

  • n차원 공간에서 두 점(벡터)의 거리를 측정하는 일반적인 방법
  • 벡터의 길이 개념인 Lp-norm을 거리에 적용한 것
  • 종류:
    • 유클리드(Euclidean) 거리: p = 2인 경우. L2 거리(흔히 생각하는 '직선 거리')
    • 맨하탄(Manhattan) 거리: p = 1인 경우. L1 거리(격자 위에서 이동 거리)
    • 체비셰프(Chebychev) 거리: p 인 경우. L∞ 거리.
      • (각 차원별 차이 중 가장 큰 값)
  • p별 단위원(unit circle: 원점에서 거리가 1인 점들의 집합):
 

L1 및 L2 거리

  • j번째 단어의 단어 벡터와 다른 모든 단어 벡터의 거리를 L2 방식으로 구함
from sklearn.metrics.pairwise import pairwise_distances
dist = pairwise_distances(word_vectors[j], word_vectors, metric='l2').flatten()
  • L1 거리: l1 (엘 원) 또는 manhattan
  • L2 거리: l2 (엘 투) 또는 euclidean

비슷한 단어 찾기

import numpy as np
rank = np.argsort(dist) # 거리 가까운 순으로 단어 번호를 정렬
[words[i] for i in rank[:10]] # 가장 가까운 단어 10개
 

비슷한 문서 찾기

  • i번째 문서의 벡터와 다른 모든 문서 벡터의 거리를 L2 방식으로 구함
i = 0
dist = pairwise_distances(dtm[i], dtm, metric='l2').flatten()
rank = np.argsort(dist) # 거리 가까운 순으로 문서 번호를 정렬
df.iloc[rank[:10]] # 가장 가까운 문서 10개
Previous
문서 벡터와 단어 벡터