크게 생각하고, 목표를 높게 잡고, 대담하게 행동하라.

“언젠가는 목표에 이를지도 모르는 단계를 밟는 것으로는 언제나 실패한다. 모든 단계가 그 자체로 목표인 동시에 목표로 이르는 단계여야한다.” - 괴테

AI/자연어 처리

[자연어 처리] 코사인 유사도(Cosine Similarity)

o_onn5 2023. 2. 9. 03:22
728x90

문장의 유사도를 구하기 위해서 다양한 유사도 기법을 사용한다.

그 중 코사인 유사도에 대해 알아보자.

코사인 유사도

코사인 유사도는 두 벡터의 코사인 각도로 구할 수 있다.

 

두 벡터의 각도가 0°인 경우는 1

90°인 경우는 0

180°로 반대의 방향을 가지면 -1

 

코사인 유사도는 -1과 1사이의 값을 갖게 되며 1에 가까울수록 유사도가 높다고 말할 수 있다.

https://wikidocs.net/24603

아래 식은 코사인 유사도를 식으로 표현한 것이다.

https://wikidocs.net/24603


활용

코사인 유사도 구하기

# overview열에 대한 TF-IDF 행렬 구하기
tfidf = TfidfVectorizer(stop_words='english')
tfidf_matrix = tfidf.fit_transform(data['overview'])
print('TF-IDF 행렬의 크기(shape) :',tfidf_matrix.shape)
#TF-IDF 행렬의 크기(shape) : (20000, 47487)
# 20000개의 영화와 47487개의 단어가 사용됨

# 20,000개의 문서 벡터에 대한 상호 간 코사인 유사도
cosine_sim = cosine_similarity(tfidf_matrix, tfidf_matrix)
print('코사인 유사도 연산 결과 :',cosine_sim.shape)
#코사인 유사도 연산 결과 : (20000, 20000)

영화 다크 나이트 라이즈와 overview가 유사한 영화들을 찾기

# title_to_index: 영화의 타이틀을 key, 영화의 인덱스를 value로 하는 딕셔너리

title = 'The Dark Knight Rises'
# 선택한 영화의 타이틀로부터 해당 영화의 인덱스를 받아온다.
idx = title_to_index[title]

# 해당 영화와 모든 영화와의 유사도를 가져온다.
sim_scores = list(enumerate(cosine_sim[idx]))

# 유사도에 따라 영화들을 정렬한다.
sim_scores = sorted(sim_scores, key=lambda x: x[1], reverse=True)

# 가장 유사한 10개의 영화를 받아온다.
# 자기 자신은 제외
sim_scores = sim_scores[1:11]

# 가장 유사한 10개의 영화의 인덱스를 얻는다.
movie_indices = [idx[0] for idx in sim_scores]

# 가장 유사한 10개의 영화의 제목을 리턴한다.
print(data['title'].iloc[movie_indices])

 

 

출처: https://wikidocs.net/book/2155

 

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

많은 분들의 피드백으로 수년간 보완된 입문자를 위한 딥 러닝 자연어 처리 교재 E-book입니다. 오프라인 출판물 기준으로 코드 포함 **약 1,000 페이지 이상의 분량*…

wikidocs.net

 

728x90