본문 바로가기

딥러닝/딥러닝을 이용한 자연어처리 입문

[딥러닝 NLP] 05. 벡터의 유사도(코사인, 유클리드, 자카드)

문서의 유사도 : 문서들 간에 동일하거나 비슷한 단어가 공통적으로 사용된 정도

성능: 단어 표현 방법(DTM, Word2Vec 등) 과 유사도 기법(유클리드 거리, 코사인 유사도 등) 에 따라 달라짐

# 05-01 코사인 유사도(Cosine Similarity)

1. 코사인 유사도란?

-두 벡터가 가리키는 방향이 유사한 정도를 코사인 각도로  구하는 기법

-동일 = 1, 90° = 0, 180° = -1 이므로, -1 이상 1 이하이며  1에 가까울수록 유사

-특징: 문서의 길이가 다른 상황에서 비교적 공정한 비교 가능

  Ex) 문서A, 문서B는 내용 비슷한데 길이는 2배 차이 / 문서A, 문서C는 다른 내용인데 길이는 비슷한 경우

        유클리드 거리는 길이의 영향 받아 A와 C의 유사도가 더 높게 나와버리지만,

        코사인 유사도는 내용(벡터방향)에 영향 받으므로 A와 B의 유사도가 더 높게 나옴

코사인 유사도
코사인 유사도 식

2. 코사인 유사도 구하기

-1단계: 문서를 벡터화 (DTM, TF-IDF 등)

-2단계: 넘파이로 코사인 유사도 함수 구현해 계산

 

3. TF-IDF와 코사인유사도로 영화추천시스템 구현

-캐글 영화 데이터셋 링크: https://www.kaggle.com/rounakbanik/the-movies-dataset

-1단계: TF-IDF 연산시 결측값 존재하면 에러 발생하므로 결측값 처리

-2단계: overview 컬럼에 대한 TF-IDF 구하기

tfidf = TfidfVectorizer(stop_words='english')
tfidf_matrix = tfidf.fit_transform(data['overview'])

-3단계: 코사인 유사도 구하기

cosine_sim = cosine_similarity(tfidf_matrix, tfidf_matrix)

-4단계: title을 key, 인덱스를 value로 하는 딕셔너리 생성후 overview의 코사인 유사도가 높은 순서대로 정렬하는 함수 생성

# 05-02 여러가지 유사도 기법

1. 유클리드 거리(Euclidean distance)

유클리드 거리 식

-2차원에서의 피타고라스 정리를 다차원(총 단어개수)으로 확장하여 계산. 값 작을수록 가깝다(=문서가 유사하다)

 Ex. 문서 1,2,3의 DTM을 구했더니 단어 4개 ->  비교기준인 문서Q도 4차원 공간에 배치해 각 문서에 대한 거리 구함

 

2. 자카드 유사도(Jaccard similarity)

자카드 유사도 함수 식

-합집합 중의 교집합의 비율. 0~1 사이 값 가짐(동일하면 1, 공통원소 없다면 0)

Ex)

문서1 : ['apple', 'banana', 'everyone', 'like', 'likey', 'watch', 'card', 'holder']
문서2 : ['apple', 'banana', 'coupon', 'passport', 'love', 'you']

합집합 단어 개수: 12, 교집합 단어 개수: 2, 자카드 유사도= 2/12 = 0.16666666666