사람은 문장에서 단어가 어떤 의미로 사용되었는지 문맥을 통해 바로 구분할 수 있지만 기계는 그렇게 할 수 없다. 그렇기 때문에 단어를 수치로 표현해서 기계가 이해할 수 있도록 해야 한다. 텍스트를 숫자로 표현하는 방법이고 벡터화한다고 한다.
주요 키워드 : NLP, vector, One-hot encoding, Word-Embedding, BOW, Counter Vector, TF-IDF, Word2Vec, CBOW, Skip-gram, Sparse, Dense
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차원의 벡터를 구현해야 한다. → 공간적 낭비
희소표현과 반대되는 표현으로, 벡터의 차원이 단어 집합의 크기가 아닌 모든 단어의 벡터표현을 사용자가 설정한 벡터의 차원으로 맞춘다. 값은 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보다 결과가 더 좋다고 확인됐다.
python에서 워드클라우드 만드는 방법 정리 (1) | 2020.01.30 |
---|---|
실전 데이터 분석#2 - 제네시스 GV80 대중 반응 센티멘트 분석(1/3) (0) | 2020.01.26 |
실전 데이터 분석#1 - 서울시 장애인 콜택시 이용 만족도 분석(2/2) (0) | 2019.12.31 |
실전 데이터 분석#1 - 서울시 장애인 콜택시 이용 만족도 분석(1/2) (0) | 2019.07.21 |
딥러닝 #1 - 개요: 인공지능과 딥러닝, 인공신경망, 활성화함수 용어정리 (0) | 2019.07.16 |