본문 바로가기
Machine Learning

[파이썬 머신러닝 완벽가이드(위키북스)] : 텍스트 분석 part6 문서 유사도

by Coding Dang dang 2022. 1. 2.

  문서와 문서 간의 유사도 비교는 일반적으로 코사인 유사도를 사용한다. 코사인 유사도는 벡터와 벡터 간의 유사도를 비교할 때 벡터의 크기보다는 벡터의 상호 방향성이 얼마나 유사한지에 기반한다. 즉, 코사인 유사도는 두 벡터 사이의 사잇각을 구해서 얼마나 유사한지 수치로 적용한 것이다. 

출처: http://matrix.skku.ac.kr/math4ai-intro/W3/

  두 벡터의 사잇각이 작으면 작을수록 유사도는 올라간다. 이 때 이 각도가 수직에 가까우면 관련성이 없는 벡터들이라고 생각할 수 있다. 추가로 90도가 넘어가서 180도에 가까워지면 두 벡터는 반대 관계에 있는 벡터들이라고 할 수 있다. 두 벡터 A와 B의 내적 값은 두 벡터의 크기를 곱한 값의 코사인 각도 값을 곱한 것이다.

출처: http://matrix.skku.ac.kr/math4ai-intro/W3/

  코사인 유사도가 문서의 유사도 비교에 가장 많이 사용되는 이유가 있다. 먼저 문서를 피처 벡터화 변환하면 차원이 매우 많은 희소 행렬이 되기 쉽다. 이러한 희소 행렬 기반에서 문서와 문서 벡터간의 크기에 기반한 유사도 지표는 정확도가 떨어지기 쉽다. 또한 문서가 매우 긴 경우 단어의 빈도수도 더 많을 것이기 때문에 이러한 빈도수에만 기반해서는 공정한 비교를 할 수 없다. 

 

  반환된 행렬은 희소 행렬이므로 앞에서 작성한 cos_similarity() 함수의 인자인 array로 만들기 위해 밀집 행렬로 변환한 뒤 다시 각각을 배열로 변환한다. feature_vect_dense[0]은 doc_list 첫 번째 문서의 피처 벡터화이며, feature_vect_dense[1]은 doc_list 두 번째 문서의 피처 벡터화이다. 앞서 작성한 cos_similaity() 함수를 이용해 두 개의 문서의 유사도를 측정해 보았다.

  사이킷런은 코사인 유사도를 측정하기 위해 sklearn.metrics.pairwise.cosine_similarity API를 제공한다. 이번에는 이를 이용해 앞 예제의 문서 유사도를 측정해 보았다. 함수는 두 개의 입력 파라미터를 받는다. 첫 번째 파라미터는 비교 기준이 되는 문서의 피처 행렬, 두 번째 파라미터는 비교되는 문서의 피처 행렬이다. cosine_similarity()는 희소 행렬, 밀집 행렬 모두가 가능하며, 행렬 또는 배열 모두 가능하다. 따라서 앞에서 만든 cos_similarity() 함수와 같이 별도의 변환 작업이 필요 없다.

  cosine_similarity()의 반환 값은 (3,3) 형태의 ndarray이다. 첫 번째 로우는 1번 문서와 2,3 번째 문서의 코사인 유사도, 두 번째 로우는 2번 문서와 1, 3번째 문서의 코사인 유사도, 세 번째 로우는 3번 문서와 1, 2번째 문서의 코사인 유사도를 나타낸다. 

 

Opinion Review 데이터 세트를 이용한 문서 유사도 측정

  앞서서 군집화에서 사용한 Opinion Review 데이터 세트를 이용해 이들 문서 간의 유사도를 측정해 보았다. 

  3개의 군집 중에서 호텔을 주제로 군집화된 문서를 이용해 특정 문서와 다른 문서 간의 유사도를 알아보았다.

  단순히 숫자로만 표시해서는 직관적으로 문서가 어느 정도 유사도를 가지는지 이해하기 어려울 수 있으므로 첫 번째 문서와 다른 문서 간에 유사도가 높은 순으로 이를 정렬하고 시각화를 해보았다. cosine_similarity()는 쌍 형태의 ndarray를 반환하므로 이를 판다스 인덱스로 이용하기 위해 reshape(-1)로 차원을 변경해보았다.

  첫 번째 문서인 샌프란시스코 베스트 웨스턴 호텔 화장실 리뷰인 bathroom_bestwestern_hotel_sfo와 가장 비슷한 문서는 room_holiday_inn_london 이다. 약 0.572의 코사인 유사도 값을 나타내고 있다. 

댓글