자연어 처리란
- 자연어 : 우리가 평소에 쓰는 말(부드러운 언어)
- 인공어: 프로그래밍 언어, 마크업 언어 등(딱딱한 언어)
- 자연어 처리 : 우리가 평소에 쓰는 말(자연어)을 컴퓨터에게 이해시키기 위한 기술
단어의 의미
- 단어 : 의미의 최소 단위
- 자연어를 컴퓨터에게 이해시키는 데는 무엇보다 '단어의 의미'를 이해시키는 게 중요
1. 시소러스를 활용한 기법
2. 통계 기반 기법
3. 추론 기반 기법
시소러스
- 자연어 처리에서 일반적인 사전 아니라 시소러스 형태의 사전 애용 (WordNet이 가장 유명)
- 시소러스: 유의어 사전으로, '뜻이 같은 단어(동의어)' 나 '뜻이 비슷한 단어(유의어)'가 한 그룹으로 분류
- 또한, 자연어 처리에 이용되는 시소러스는 단어 사이의 '상위와 하위' 혹은 '전체와 부분' 등 더 세세한 관계까지 정의
- 이처럼 모든 단어에 대한 유의어 집합을 만든 후 단어들의 관계를 그래프로 표현하여 단어 사이 연결(단어 네트워크)
- 이를 이용하여 컴퓨터에게 단어 사이의 관계를 가르칠 수 있음
시소러스의 문제점
사람이 수작업으로 레이블링하는 방식에는 크나큰 결점 존재
1) 시대 변화에 대응하기 어렵다
- 때때로 새로운 단어가 생겨나고, 구닥다리 옛말은 언젠가 잊혀짐 ex) 신조어 "크라우드 펀딩"
- 시대에 따라 언어의 의미가 변함 ex) "heavy" -> '심각하다'는 뜻 추가
2) 사람을 쓰는 비용이 크다
- 시소러스를 만드는 데는 엄청난 인적 비용 발생
- 현존하는 영어 단어 수는 1,000만 개가 넘음(WordNet에 등록된 단어는 20만 개)
- 따라서, 이성적으로는 이 방대한 단어들 모두에 대해 단어 사이의 관계 정의해줘야 함
3) 단어의 미묘한 차이를 표현할 수 없다
- 시소러스에서는 뜻이 비슷한 단어들을 묶음
- 그러나 실제로 비슷한 단어들이라도 미묘한 차이가 있는 법
=> 이 문제를 피하기 위한 '통계 기반 기법' 과 신경망을 사용한 '추론 기반 기법'
두 기법은 대량으 텍스트 데이터로부터 '단어의 의미'를 자동으로 추출하여 사람은 수작업에서 해방
통계 기반 기법
- 말뭉치(대량의 텍스트 데이터) 이용
- 말뭉치 안에는 담긴 문장들은 사람이 쓴 글
- 즉, 자연어에 대한 사람의 '지식'이 충분이 담겨 있다고 볼 수 있음
- 이 기법을 사용해 단어를 벡터로 표현
[단어의 분산 표현]
- RGB 같은 벡터 표현이 색을 더 정확하게 명시 ex) '비색' (R,G,B) = (170,33,22) -> 빨강 계열
- 즉, 우리가 원하는 것은 '단어의 의미'를 정확하게 파악할 수 있는 벡터 표현(밀집벡터로 표현)
[분포 가설]
- 단어를 벡터로 표현하는 연구에서의 아이디어 뿌리
- 단어의 의미는 주변 단어에 의해 형성
- 단어 자체에는 의미가 없고, 그 단어가 사용된 '맥락'이 의미를 형성
- '맥락'이란 특정 단어를 중심에 둔 그 주변 단어
- 맥락의 크기(주변 단어를 몇 개나 포함할 지) = '윈도우 크기'
[동시발생 행렬]
- 주변에 어떤 단어가 몇 번이나 등장하는지를 세어 집계하는 방법(=통계 기반 기법)
- 윈도우 크기를 1로 하고, 단어 "you"의 맥락은 "say" 단어 하나 뿐
- "you" = [0,1,0,0,0,0,0]
[벡터 간 유사도]
- 단어 벡터의 유사도를 나타날 때는 코사인 유사도 자주 이용
- 분자에는 벡터의 내적
- 분모에는 각 벡터의 L2 노름
[유사 단어의 랭킹 표시]
- 말뭉치의 크기가 너무 작아 납득이 안되는 결과 도출
통계 기반 기법 개선하기
[상호정보량]
- 동시발생 행렬의 원소는 두 단어가 동시에 발생한 횟수를 나타냄
- But, '발생' 횟수라는 것은 사실 그리 좋은 특징 X ex) 'the car' > 'drive car' 문제 발생
- 문제 해결을 위해 점별 상호정보량(PMI) 척도 사용
- P(x)는 x가 일어날 확률, P(y)는 y가 일어날 확률, P(x,y)는 x와 y가 동시에 일어날 확률
- PMI 값이 높을수록 관련성이 높다는 의미
- PMI를 동시발생 행렬에 적용
- C는 동시발생 행렬, C(x,y)는 단어 x와 단어 y 동시발생 횟수, C(x)와 C(y)는 각각 단어 x와 y 등장 횟수
- PMI 이용하면 "car"는 "the"보다 "drive"와의 관련성이 강함(우리가 원하던 결과)
- 이러한 결과가 나온 이유는 단어가 단독으로 출현하는 횟수를 고려했기 때문
- 두 단어의 동시발생 횟수가 0이면 log0 = -무한대
- 해당 문제를 피하기 위해 양의 상호정보량(PPMI) 사용
[차원 감소]
- '중요한 정보'는 최대한 유지하면서 벡터의 차원을 줄임
특이값분해(SVD) 이용
- 임의의 행렬 X를 U,S,V 세 행렬의 곱으로 분해
- U와 V는 직교행렬이고, 그 열벡터는 서로 직교
- 또한, S는 대각행렬
- U(직교행렬)은 어떠한 공간의 축(기저)를 형성 -> '단어 공간'
- S(대각행렬) 대각성분에는 '해당 축'의 중요도라고 간주할 수 있는 '특잇값'이 큰 순서로 나열
- 행렬 S에서 특잇값이 작다면 중요도가 낮다는 뜻이므로, 행렬 U에서 여분의 열벡터를 깎아내어 원래 행렬에 근사
- 행렬 X의 각 행에는 해당 단어의 ID의 단어 벡터가 저장, 그 단어 벡터가 행렬 U'라는 차원 감소된 벡터로 표현
[PTB 데이터셋] - Peen Treebank
- 너무 크지도 않고 적당한 말뭉치
PTB 데이터셋 평가
- PTB 데이터셋을 이용한 통계 기반 기법 적용
- 말뭉치를 사용해 맥락에 속한 단어의 등장 횟수
- PPMI 행렬로 변환
- SVD를 이용해 차원 감소
=> 더 좋은 단어 벡터를 얻음. 이것이 단어의 분산 표현이고, 각 단어는 고정 길이의 밀집벡터로 표현
'Study > DL' 카테고리의 다른 글
[밑시딥2] Chapter 3~4. word2vec & 속도 개선 (0) | 2024.01.24 |
---|---|
[모두를 위한 딥러닝 시즌2] lab 10-5. Advanced CNN(VGG) (0) | 2024.01.21 |
[파이썬 딥러닝 파이토치] PART 4. 컴퓨터 비전 (0) | 2024.01.19 |
[밑시딥1] Chapter 8. 딥러닝 (0) | 2024.01.18 |
[모두를 위한 딥러닝 시즌2] lab 10-2. MNIST CNN (0) | 2024.01.15 |