티스토리 뷰
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법칙은 코사인 정의로부터 구할 수 있다.
총 3가지 식 중 하나의 식만 유도했는데 나머지 2개의 식도 동일한 방법으로 하면 가능하다(지면상 유도는 생략)
4. 코사인 유사도 유도 (1) - 코사인 제 2법칙
참고! 식 번호가 리셋되었습니다. 위 사진에 있는 식 번호는 아래에서는 사용하지 않고 1번 식부터 다시 할당했습니다.
>> 코사인 제 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
출처2 - koos808.tistory.com/22
'교육 > AIFFEL(대전)1기' 카테고리의 다른 글
[AIFFEL Hackathon 1st] 2. 전처리 그리고 모델링 (0) | 2022.02.16 |
---|---|
[AIFFEL Hackathon 1st] 1. 대회 준비 (0) | 2022.02.16 |
[풀잎스쿨][수학] AIFFEL 풀잎스쿨 week2. 행렬 (0) | 2022.02.15 |
[풀잎스쿨][수학] AIFFEL 풀잎스쿨 week1. 벡터, 선형 연립 방정식 (0) | 2022.02.15 |
[풀잎스쿨]end-to-end machine learning (0) | 2022.02.15 |
- Total
- Today
- Yesterday
- 양정연SLAM
- SLAM공부
- 광주인공지능사관학교
- ros
- 해커톤
- 광주AI
- AIFFEL교육
- 광주
- 인공지능
- IT
- 인공지능교육
- 자율주행기술
- AIFFEL후기
- SLAM강의
- 대전 인공지능
- 멘탈관리
- 배달로봇
- AIFFEL인공지능과정
- 실내자율주행
- 인공지능 교육
- Slam
- AIFFEL
- 멋쟁이사자처럼
- 자율주행로봇
- 서빙로봇
- 모두의연구소
- 모두의 연구소
- Python
- 아이펠
- 도전
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |