티스토리 뷰

2021.2.6 00:55

안녕하세요

프로그래밍을 배우는 빛나는 샤트입니다.

 

 

이번 페이지에서 알아볼 내용은 아래와 같습니다.

1. 자연어 처리에서 단어 유사도 의미

2. 단어 벡터 유사도 구하는 방법 소개

3. 코사인 유사도 유도 (1) - 코사인 제 1법칙

4. 코사인 유사도 유도 (2) - 코사인 제 2법칙

5. 코사인 유사도 유도 (3) - 벡터 내적과 코사인 유사도

6. 코사인 유사도 계산 (1) - 계산기를 통해 구하기

7. 코사인 유사도 계산 (2) - 파이썬을 통해 구하기

 

 

1. 자연어 처리에서 단어 유사도 의미

이 장에서는 너무 자세한 설명이 아닌 컨셉정도만 설명하고 넘어가겠습니다.

 

자연어 처리란?

- 사람이 사용하는 언어인 '자연어'를 컴퓨터가 이해할 수 있도록 수치화하는 것

   한 마디로 컴퓨터에게 '사랑해', '싫어' 두 가지의 의미를 알려주기 위해선 컴퓨터가 알아들을 수 있도록 처리해줘야 한다.

 

2. 단어 벡터 유사도 구하는 방법 소개

 

단어 벡터 유사도란?

- 단어의 의미는 주변 단어에 의해 결정(형성)된다는 '분포가설'에 의해 나온 것으로 문장의 단어별로 앞뒤의 문맥(context)에 의해 단어가 결정하기 위해 각 단어별로 얼마나 유사한 지 측정하는 것

 

예시) '나는 오늘 아침 8시에 일어나 빵과 커피를 마셨다.'

위의 빨간 박스에 어떤 것이 오면 자연스러울까?

1) 밥 2) 핸드폰 3) 물 4) 커피

 

정답은3) 또는 4)가 될 것이다. 왜냐하면 뒤에 마셨다는 내용이 나오기 때문이다.

즉, 문맥에 맞게 자연스러운 단어를 선택해야한다.

그러기위해 컴퓨터는  '마셨다'와 가장 유사도가 비슷한 단어를 선택한다. (물론 바로 앞의 '빵과'도 비교한다.)

 

그럼 이런 벡터간 유사도를 구하는 방법은 어떻게 해야할까?

그전에 자연어 처리를 하기 위해선 전처리를 해야하는데 컴퓨터가 더욱 잘 알아듣게 하기 위해 정리한다고 생각하면 된다.

(여러분도 정리된 문장을 보고 듣는것이 이해가 빠르듯이 컴퓨터도 똑같다)

이를 위해선 정규화가 필요하다.

 

⭐정규화: 데이터의 종류가 여러 개 있는데 모두 범위가 다를때 동일한 범위로 맞춰주는 것

(몸무게는 대략 40~100kg의 분포라고 할 때 키는 150~200cm의 분포를 가진다고 할 때 이대로 학습하면 키를 좀 더 큰 비중으로 학습하게 되므로 동일한 범위로 맞춰야 한다. -1~1사이로 동일한 비율로 맞춰야 한다.)

 

 

3. 코사인 유사도 유도 (1) - 코사인 제 1법칙

코사인 제 1법칙은 코사인 정의로부터 구할 수 있다.

 

출처: 위키백과
코사인 제 1법칙 유도

총 3가지 식 중 하나의 식만 유도했는데 나머지 2개의 식도 동일한 방법으로 하면 가능하다(지면상 유도는 생략)

 

4. 코사인 유사도 유도 (1) - 코사인 제 2법칙

참고! 식 번호가 리셋되었습니다. 위 사진에 있는 식 번호는 아래에서는 사용하지 않고 1번 식부터 다시 할당했습니다.

코사인 제2법칙

>> 코사인 제 1법칙으로부터 코사인 제2법칙을 유도할 수 있다. 여기서도 하나의 식만 유도했다. 

     위 사진에 있는 삼각형 그림과 이어지는 설명입니다.

 

 

5. 코사인 유사도 유도 (1) - 벡터 내적과 코사인 유사도

참고! 식 번호가 리셋되었습니다. 위 사진에 있는 식 번호는 아래에서는 사용하지 않고 1번 식부터 다시 할당했습니다.

 

>>  위 유도를 통해 백터 내적 공식과 코사인 제2법칙을 이용해 코사인 유사도 공식을 유도할 수 있다!

>> ⭐ 또한 코사인의 범위는 -1 ~ 1 이므로 벡터 정규화도 된다!

 

6. 코사인 유사도 계산 (1) - 계산기를 통해 구하기

 

A = [1,2,3,4]

B = [3,4,5,6]

C = [6,7,8,9]

 

1) A와 B의 코사인 유사도 구하기

분자: (1*3) + (2*4) + (3*5) + (4*6) = 50

분모: {(1^2 + 2^2 + 3^2 + 4^2)}^0.5 * {(3^2 + 4^2 + 5^2 + 6^2)}^0.5 = 50.79 (소수점 아래 둘째짜리까지만 표현)

코사인 유사도 = 50 / 50.79 = 0.9843740387

 

2) B와 C의 코사인 유사도 구하기

분자: (3*6) + (4*7) + (5*8) + (6*9) = 140

분모: {(3^2 + 4^2 + 5^2 + 6^2)}^0.5 *{(6^2 + 7^2 + 8^2 + 9^2)}^0.5 = 140.64 (소수점 아래 둘째짜리까지만 표현)

코사인 유사도 = 140 / 140.64 = 0.9954395506

 

3) A와 C의 코사인 유사도 구하기

분자: (1*6) + (2*7) + (3*8) + (4*9) = 80

분모: {(1^2 + 2^2 + 3^2 + 4^2)}^0.5 *{(6^2 + 7^2 + 8^2 + 9^2)}^0.5 = 83.06 (소수점 아래 둘째짜리까지만 표현)

코사인 유사도: 80 / 83.06 =0.9630868247

 

 

7. 코사인 유사도 계산 (2) - 파이썬을 통해 구하기

from numpy import dot
from numpy.linalg import norm
import numpy as np

# 코사인 유사도 함수 
def cos_sim(A, B):
       return dot(A, B)/(norm(A)*norm(B))

A=np.array([1,2,3,4])
B=np.array([3,4,5,6])
C=np.array([6,7,8,9])

print('A와 B의 내적: ', dot(A, B))
print('B와 C의 내적: ', dot(B, C))
print('A와 C의 내적: ', dot(A, C))
# A와 B의 내적:  50
# B와 C의 내적:  140
# A와 C의 내적:  80
print('-------------------------------------------')
print('A와 B의 코사인 유사도 분모: ', norm(A)*norm(B))
print('B와 C의 코사인 유사도 분모: ', norm(B)*norm(C))
print('A와 C의 코사인 유사도 분모: ', norm(A)*norm(C))
# A와 B의 코사인 유사도 분모:  50.79370039680118
# B와 C의 코사인 유사도 분모:  140.64138793399331
# A와 C의 코사인 유사도 분모:  83.06623862918075
print('-------------------------------------------')
print('A와 B의 코사인 유사도: ',cos_sim(A, B))
print('B와 C의 코사인 유사도: ',cos_sim(B, C))
print('A와 C의 코사인 유사도: ',cos_sim(A, C))
# A와 B의 코사인 유사도:  0.9843740386976972
# B와 C의 코사인 유사도:  0.9954395505944926
# A와 C의 코사인 유사도:  0.9630868246861537

 

출처1 - sonagi87174.tistory.com/18
 

벡터의 내적 공식 유도하기

벡터의 내적이란? 두 벡터의 내적 결과 값은 스칼라 값이 나오며 세타 값은 두 벡터 사이의 각을 뜻 합니다. 그래픽스에서는 이 세타 값이 0인지 아닌지만 기억하시면 됩니다. [0이면 두 벡터는

sonagi87174.tistory.com

출처2 - koos808.tistory.com/22
 

코사인 유사도(cosine similarity) + python 코드

* 벡터간의 유사도를 측정할 수 있는 대표적인 방법은 유클리디안 거리와 같은 거리 계산 방법말고도 코사인 유사도가 있습니다. 추천시스템에서 많이 쓰이는 코사인 유사도의 수식과 구현 코

koos808.tistory.com

 

LIST
댓글