텍스트 유사도

SungMin·2023년 1월 9일
0

Sesac-NLP

목록 보기
2/2

교재 : 텐서플로 2와 머신러닝으로 시작하는 자연어처리, 위키북스

텍스트 유사도

  • 각 문장들의 유사한 정도를 측정하는 방법들

코사인 유사도

  • 두 개의 벡터값에서 코사인 각도를 구하는 방법
  • 벡터 간의 각도를 기준으로 유사도를 측정함
# 코사인 유사도(Cosine similarity)
def cos_sim(A, B):
    return dot(A, B)/(norm(A)*norm(B)) # = cos(theta)
doc1 = np.array([1,1,0,1])
doc2 = np.array([1,0,1,1])
doc3 = np.array([2,0,2,2])
print(cos_sim(doc1, doc2))
print(cos_sim(doc1, doc3))
print(cos_sim(doc2, doc3))
0.6666666666666667
0.6666666666666667
1.0000000000000002

유클리디언 유사도

  • 문장 간의 거리를 측정하는 방법
  • 다른 방법들보다 문장 간의 길이 차이에 민감하게 반응했다.
# 유클리디언 유사도(euclidian distance)
def eu_dist(A, B):
    return np.sqrt(np.sum((A-B)**2))
from sklearn.metrics.pairwise import euclidean_distances

print(euclidean_distances([doc1], [doc2]))
print(euclidean_distances([doc1], [doc3]))
print(euclidean_distances([doc2], [doc3]))
[[1.41421356]]
[[2.64575131]]
[[1.73205081]]

맨해튼 유사도

  • 문장과의 거리를 사각형 격자 도로처럼 가정하고 거리를 측정
  • 유클리디언은 최단거리 대각선으로, 맨해튼은 ㄱ자 모양으로 이동.
# 맨해튼 유사도(manhattan similarity)
from sklearn.metrics.pairwise import manhattan_distances

print(manhattan_distances([doc1], [doc2]))
print(manhattan_distances([doc1], [doc3]))
print(manhattan_distances([doc2], [doc3]))
[[2.]]
[[5.]]
[[3.]]

자카드 유사도

  • 두 문장간의 단어 합집합을 분모로, 교집합을 분자로 해서 유사도를 측정
token_doc1 = doc1.split()
token_doc2 = doc2.split()
token_doc3 = doc3.split()
#합집합과 교집합
union = set(token_doc1).union(set(token_doc2))
inter = set(token_doc1).intersection(set(token_doc2))
len(inter)/len(union)
0.5
print(len(set(token_doc1).intersection(set(token_doc2))) / len(set(token_doc1).union(set(token_doc2))))
print(len(set(token_doc1).intersection(set(token_doc3))) / len(set(token_doc1).union(set(token_doc3))))
print(len(set(token_doc2).intersection(set(token_doc3))) / len(set(token_doc2).union(set(token_doc3))))
0.5
0.5
1.0
profile
초보 개발자의 학습 저장용 블로그

0개의 댓글