슬기로운 연구생활

Classification - [6] One-Hot Encoding, Bag Of Word 본문

슬기로운 NLP 생활

Classification - [6] One-Hot Encoding, Bag Of Word

vhrehfdl 2020. 8. 23. 16:26

이전 글

[1] 자연어처리란?

[2] Classification Task

[3] POS Tagging

[4] Stemming, Lemmatizing

[5] 형태소 분석기

 

들어가며

이전 글에서는 Pre Processing 방법들에 대해 살펴보았습니다.

이번 글부터는 자연어처리의 핵심인 Text To Vector의 대해 하나 하나 알아보도록 하겠습니다.

Word Representation의 제일 기초부터 최신 내용까지 살펴보겠습니다.

 

Word Representation

이미지를 다루는 Vision에서는 이미지가 0~256 사이의 fixel 값으로 변환될 수 있습니다. 이미지는 이와 같이 직관적으로 수치적인 데이터로 변환 가능합니다. 반면 텍스트는 이와 같이 변환이 어렵기 때문에 Word Representation을 이용해 강제적으로 변환하고 있습니다.

NLP에서는 Sentence 혹은 Document를 변환하는 적절한 방법론에 대한 연구과 과거부터 지금까지 계속 연구되었습니다.

 

Word Representation의 다양한 방법론은 크게 세가지로 분류할 수 있습니다.

첫째, 단어의 출현 빈도수를 기반으로 하는 Count-Based Word Representation입니다.

Bag of Words와 TF-IDF과 같은 방법이 Count-Based Word Representation에 속합니다.

 

둘째, 단어를 고정된 Dense Vector로 표현한 Word Embedding입니다.

Word2vec, Fasttext, Glove와 같은 방법들이 Word Embedding에 속합니다.

 

셋째, 주변에 문맥에 따라 단어의 Vector가 바뀌는 Contextuazlied Word Embedding입니다.

Contextuazlied Word Embedding에 속하는 GPT, ELMo, BERT, GPT2, RoBERTa와 같은 최신 기법들이 많이 발표되고 있습니다.

 

One-Hot Encoding 이란?

One Hot Encoding은 표현하고 싶은 단어를 1로 표현하고 그 외 단어를 0으로 채우 Count-Based Word Representation 방법입니다. One Hot Encoding을 이용해 표현한 벡터를 One Hot Vector라고 합니다.

sentence_list = ['오늘은 즐거운 하루입니다', '오늘은 비가 올 것 같군요', '내일도 비가 올 것 같아요' ]

위의 세개의 문장에 One Hot Encoding을 적용해보겠습니다.

(1) 띄어쓰기 기준으로 단어를 분리했을 때, 세 문장의 전체 단어수는 9개입니다.

( 오늘은 / 즐거운 / 하루입니다 / 비가 / 올 / 것 / 같군요 / 내일도 / 같아요 )

(2) 세 문장의 단어로 사전을 만들면 아래와 같이 됩니다.

[ 오늘은 : 1 / 즐거운 : 2 / 하루입니다 : 3 / 비가 : 4 / 올 : 5 / 것 : 6 / 같군요 : 7 / 내일도 : 8 / 같아요 : 9 ]

(3) '오늘은 즐거운 하루입니다' 문장을 One Hot Vector로 만들면 다음과 같이 Matrix로 표현됩니다.

1 0 0 0 0 0 0 0 0

0 1 0 0 0 0 0 0 0

0 0 1 0 0 0 0 0 0

'오늘은 비가 올 것 같군요' 문장을 One Hot Vector로 만들면 다음과 같이 표현됩니다..

1 0 0 0 0 0 0 0 0

0 0 0 1 0 0 0 0 0

0 0 0 0 1 0 0 0 0

0 0 0 0 0 1 0 0 0

0 0 0 0 0 0 1 0 0

위와 같이 표현하고 싶은 단어의 index 위치에 1을 부여하고, 다른 단어의 인덱스의 위치에는 0을 부여하는 방법으로 표현하는 것이 One-Hot Encoding입니다.

One Hot Encoding은 두가지 문제가 있습니다.

첫째, 단어의 수가 많아지면 Vector의 차원이 계속해서 증가하는 문제가 발생합니다.

 

둘째, One Hot Vector로는 의미적으로 유사한 단어 관계를 파악할 수 없습니다.

ex) 멍멍이의 vector는 [ 0 1 0 ] / 강아지의 vector는 [ 0 0 1 ] 으로 표현되어 있다고 가정해보겠습니다.

​위의 vector만으로는 두 단어가 의미적으로 유사한지 알 수 없습니다.

 

Bag of Words

Bag of Words란 단어들의 순서는 전혀 고려하지 않고, 단어들의 출현 빈도에만 집중해 Word Representation 하는 방법입니다. Bag of Words를 직역하면 단어들의 가방이라는 의미입니다. 가방에 무수한 단어들 중 임의로 단어를 하나 꺼내 몇개 있는지 확인하는 방법이라 Bag of Words라고 이름 붙여졌습니다.

 

Bag of Words 과정에 대해 알아보겠습니다.

sentence_list = ['오늘은 즐거운 하루입니다', '오늘은 비가 올 것 같은데 내일은 비가 안 왔으면 좋겠네요.', '내일도 비가 올 것 같아요' ]

위의 세개의 문장이 있다고 가정하고 위의 문장을 Bag of Words로 표현하면 다음과 같습니다.

(1) 세 문장의 전체 단어수는 14개입니다.

( 오늘은 / 즐거운 / 하루입니다 / 비가 / 올 / 것 / 같은데 / 내일은 / 안 / 왔으면 / 좋겠네요 / 내일도 / 것 / 같아요 )

(2) 세 문장의 단어 사전은 아래와 같습니다.

[ 오늘은 : 1 / 즐거운 : 2 / 하루입니다 : 3 / 비가 : 4 / 올 : 5 / 것 : 6 / 같은데 : 7 / 내일은 : 8 / 안 : 9 / 왔으면 : 10 / 좋겠네요 : 11 / 내일도 : 12 / 것 : 13 / 같아요 : 14 ]

(3) 위의 세 문장을 Vector로 표현하면 다음과 같습니다.

1 1 1 0 0 0 0 0 0 0 0 0 0 0

1 0 0 2 1 1 1 1 1 1 1 0 0 0

0 0 0 1 1 0 0 0 0 0 0 1 1 1

 

한 문장내에서 중복되는 단어는 카운트하여 표시해줍니다.

 

코드로 구현하면 다음과 같습니다.

from sklearn.feature_extraction.text import CountVectorizer

sentence_list = ['오늘은 즐거운 하루입니다', '오늘은 비가 올 것 같군요', '내일도 비가 올 것 같아요' ]

vect = CountVectorizer()
vect.fit(sentence_list)

print(vect.vocabulary_)
print(vect.transform(sentence_list).toarray())

Bag of Words는 One-Hot Encoding과 유사한 Word Representation 방법입니다.

 

두 방법의 차이는 

One Hot Encoding은 단어와 같은 독립적인 데이터의 표현 방법이고

Bag of Words는 문장이나 단락과 같은 Sequence한 데이터의 표현 방법이라는 것입니다.

 

물론, One-Hot Encoding으로도 문장을 표현할 수 있지만 Bag of Words 처럼 1차원의 형태로 Vector Representation을 할 수 없습니다.

 

Bag of Words도 One-Hot Encoding과 마찬가지로 단어간의 의미적 관계를 파악할 수 없습니다. 또한, 단어의 수가 많아질 수록 Vector의 차원이 계속해서 증가합니다. 이렇게 대부분의 값이 0으로 표현된 Vector 형태를 Sparse Vector라고 하며 위의 두가지 문제점은 Sparse Vector의 공통적인 한계입니다.

 

마무리

이번 글에서는 Count Based Word Representation의 방법 중 하나인 Bag of Words에 대해 알아보았습니다.

Bag of Words는 문장에서 등장한 모든 단어에 대해 1로 카운팅을 하기 때문에 중요한 단어에 대해 가중치를 부여할 수 없습니다.

 

그렇다면 중요한 단어에 가중치를 부여하기 위해서는 어떻게 할까요?

이 질문에 대한 답을 다음글에서 설명하겠습니다.

Comments