khann's IT와 경제 블로그

반응형

 

자연어처리(NLP) - 컴퓨터가 자연어를 이해하는방법(벡터화)

사람은 문장에서 단어가 어떤 의미로 사용되었는지 문맥을 통해 바로 구분할 수 있지만 기계는 그렇게 할 수 없다. 그렇기 때문에 단어를 수치로 표현해서 기계가 이해할 수 있도록 해야 한다. 텍스트를 숫자로 표현하는 방법이고 벡터화한다고 한다.

 

주요 키워드 : NLP, vector, One-hot encoding, Word-Embedding, BOW, Counter Vector, TF-IDF, Word2Vec, CBOW, Skip-gram, Sparse, Dense


 

벡터화 표현 방법 - 희소표현(Sparse Representation)과 밀집표현(Dense Representation)

 

1. 희소표현(Sparse Representation)

Sparse는 '희박한'이라는 의미를 가지고 있는데, 수학에선 원소 대부분이 0을 나타내는 행렬을 희소 행렬(Sparse matrix)이라고 한다. 즉 데이터가 공간에 밀집한게 아닌 널리 분포된 표현방식이다.

 

 

One-Hot Encoding

문장의 토큰 하나의 값만 1이고 나머지는 0으로 표현하여 만든 벡터

 

예시 :

ex) I have an apple → [I, have, an, apple]

Terms Index
I [1,0,0,0]
have [0,1,0,0]
an [0,0,1,0]
apple [0,0,0,1]

한계 : 말뭉치(Corpus)에 단어가 10,000개가 있다면 10,000차원의 벡터를 구현해야 한다. → 공간적 낭비

 

 

 

 


2. 밀집표현(Dense Representation)

희소표현과 반대되는 표현으로, 벡터의 차원이 단어 집합의 크기가 아닌 모든 단어의 벡터표현을 사용자가 설정한 벡터의 차원으로 맞춘다. 값은 0과 1이 아니라 실수 값을 가지게 된다.

 

 

Word Embedding

Word Embedding은 Frequency Based Embedding과 Prediction Based Embedding 두 종류로 나뉜다.

 

1. Frequency Based Embedding

횟수 기반 임베딩

 

(BOW)Bag of Words

단어들의 출연 빈도만으로 단어 사전(주머니) 만들기

 

예시:

ex) I have an apple. and I want to eat an apple. → [I, have, an, apple, and, want, to, eat]

Terms Index Count
I 0 2
have 1 1
an 2 2
apple 3 2
and 4 1
want 5 1
to 6 1
eat 7 1

 

 

Count Vector

모든 문서에서 어휘를 학습한 다음 문서마다의 어휘 횟수 세는 방법

 

예시 :

ex) D1 : I am going to bed. good bye.

    D2 : I am a good person in bed.

 

 

단점 : 각 문서의 단어를 수치화하여 벡터로 표현할 수 있으나 각각의 문서와 단어를 세기 때문에 큰 매트릭스를 만들어 비효율적인 연산을 한다.(Sparse에 가까움)

Terms D1 D2
I 1 1
am 1 1
going 1 0
to 1 0
bed 1 1
good 1 1
bye 1 0
a 0 1
person 0 1
in 0 1

 

 

 

(TF-IDF)Term Frequency - inverse Document Frequency

전체 말뭉치(corpus)에서 단어의 개수도 함께 세기=

특정 단어가 문서 내에 얼마나 자주 등장하는지(TF:단어빈도) * 어떤 단어가 문서 전체 집합에서 얼마나 많이 나오는지(IDF:역문서빈도)

 

예시 : 

ex) D1 : I am talking of you. you are talking of me

    D2 : I am talking of them.

 

빈도수(D1)

Terms Count
I 1
am 1
talking 2
of 2
you 2
are 1

 

빈도수(D2)

Terms Count
I 1
am 1
talking 2
of 2
them 1

 

TF = 특정 문서에서 단어가 나타난 수 / 특정 문서에 있는 전체 단어의 개수

D1에서 talking 's TF = 2/9

D2에서 talking 's TF = 1/9

D1에서 you 's TF = 2/9

 

 

IDF = log(말뭉치에서의 전체 문서의 수 / 말뭉치에서 해당 단어가 나타난 문서의 수)

talking 's IDF = log(2/2) = 0

you 's IDF = log(2/1) = 0.301

 

 

TF-IDF = TF * IDF

D1에서 talking 's TF-IDF = (2/9) * 0 = 0

D2에서 you 's TF-IDF = (2/9) * 0.301 = 0.06

 

따라서 you는 D2에서 중요한 의미로 나타난다.(특정문서에서 해당 단어가 얼마나 중요한지의 척도)

 

 


 

2. Prediction Based Embedding

예측 기반 벡터

 

 

Word2Vec

CBOW와 Skip-gram방식의 알고리즘을 이용한 word-embedding

MAN과 WOMAN의 거리는 KING과 QUEEN의 거리와 유사하다

 

CBOW(Continuous Bag of Words)

문장에서 한 단어 앞뒤로 붙어있는 단어들을 통해서 해당 단어 유추하는 방법

예시 :

"나는 추운 겨울보다 ___ 여름이 좋아" 에서 "겨울보다" 와 "여름이"를 통해 ___을 "따뜻한"이라고 유추

 

Input layer : ["겨울보다", "여름이"]  → Hidden layer(가중치:w) → Output layer : ["따뜻한"] (One-hot-encoding)

 

 

단점 : "따뜻한 여름이" 에서의 "따뜻한"과 "마음이 따뜻한"에서의 "따뜻한"이 같이 쓰일경우 문제가 발생

 

 

Skip-gram

CBOW와 Input Output의 Layout구조만 반대. 손실함수는 CBOW와 같다

 

Input layer : ["따뜻한"] → Hidden layer(가중치:w) → Output layer : ["겨울보다", "여름이"]

 

장점 : 한 단어와 연관된 두 가지 이상의 의미론적 벡터를 찾을 수 있다. → CBOW보다 결과가 더 좋다고 확인됐다.

 

 

 

 

 

반응형

이 글을 공유합시다

facebook twitter googleplus kakaostory naver