슬기로운 연구생활

Classification - [9] Fasttext 본문

슬기로운 NLP 생활

Classification - [9] Fasttext

vhrehfdl 2020. 9. 2. 19:36

이전 글

[1] 자연어처리란?

[2] Classification Task

[3] POS Tagging

[4] Stemming, Lemmatizing

[5] 형태소 분석기

[6] One-Hot Encoding, Bag Of Word

[7] TF-IDF

[8] Word2vec

 

들어가며

이전 글에서는 Word Embedding 방법 중 하나인 Word2vec에 대해 알아보았습니다.

Word2vec을 사용하면 단어를 Dense Vector로 표현할 수 있으며 단어간의 의미를 파악할 수 있습니다.

Fasttext는 Word2vec 기반이며 부분단어들을 임베딩하는 기법입니다.

 

Fasttext

Fasttext는 페이스북에서 개발한 Word Embedding 방법이며 Word2vec과 같이 Shallow Neural Network로 구성되어져 있습니다.

Fasttext와 Word2vec의 가장 큰 차이점은 부분 단어(Sub Words)를 사용한다는 것입니다.

 

Subwords를 사용함으로써 Fasttext는 Out Of Vocabulary(OOV) 문제를 해결할 수 있습니다. 

Word2vec 에서 단어는 더 이상 쪼갤질 수 없는 최소 단위입니다.

그렇기 때문에 Vocabulary에 등록되지 않은 단어가 많이 생길 수 있습니다.

 

이러한 문제를 해결하기 위해 Fasttext에서는 하나의 단어에서도 Subwords를 나누어 OOV 문제를 해결하려 했습니다. 

Fasttext는 단어를 Bag of character n-grams로 표현합니다.

먼저 단어의 시작과 끝부분에 <, >을 추가합니다.

 

예를 들어, character 3 grams를 이용한다면 "hello"라는 단어는 다음과 같이 Subwoards를 구성합니다.

"hello" => "<he", "hel", "ell", "llo", "lo>"

 

그리고 실제 단어를 나타낼 때에는 3~7grams를 모두 이용합니다.

"hello" => "<he", "hel", "ell", "llo", "lo>"

               "<hel", "hell", "ello", "llo>"

               "<hell", "hello", "ello>"

               "<hello", "hello>"

               "<hello>"

 

단어 "hello"의 벡터는 subword vectors의 합으로 표현됩니다.

v(hello) = v(<he) + v(hel) + v(ell) + ... + v(hello>) + v(<hello>)

 

이렇게 단어를 subwords로 표현하면 OOV 에러가 발생활 확률이 적어집니다.

Word2vec에서는 단어의 Vector를 생성한다면 Fasttext는 Subwords의 Vector를 생성합니다.

 

이 과정을 통해 학습 때 포함되지 않은 단어들에 대해서도, subwords의 vector 값을 이용하면 의미적으로 유사한 단어끼리 공간상에 근접한 위치 값을 가지게 됩니다.

아래는 논문에서 공개한 Result이며 <you와 문맥적인 의미가 비슷한 young과 adole, adoles, doles 는 높은 similarity 를 지닙니다.

빨간색일수록 두 subword vectors 간의 Cosine similarity가 크다는 뜻입니다.

 

Fasttext 한국어 적용

한국어는 글자 단위와 자모 단위로 나누어 적용할 수 있습니다.

 

글자 단위는 영어와 유사합니다.

"안녕하세요" -> "<안녕", "안녕하", "녕하세" ... "하세요", "세요>"

 

자모 단위는 초성, 중성, 종성 단위로 임베딩하는 방법입니다.

"안녕하세요" -> "<ㅇㅏ", "ㅇㅏㄴ", ... "ㅇㅛ>"

 

한국어의 오탈자는 초/중/종성에서 한군데 정도가 틀리기 때문에 자음/모음 풀어서 학습하는 것이 좋습니다.

위와 같이 subwords를 분리하여 Fasttext 학습을 진행할 수 있습니다.

 

Fasttext 구현

Fasttext 구현은 Word2vec 구현과 매우 유사합니다.

마지막 훈련 부분에서 Gensim 라이브러리의 모듈만 바꾸어주면 됩니다.

 

첫번째, Han.txt파일을 문장 단위로 잘라줍니다,

 

두번째, Konlpy를 사용해 문장을 Token 단위로 분리합니다.

 

마지막, Gensim 라이브러리를 사용해 Fasttext를 학습합니다.

"서울"이란 단어를 입력하면 "서울광장", "서울역", "서울지검" 등 서울이란 단어가 들어간 단어를 위주로 출력해주는 것을 확인할 수 있습니다. 

Word2vec과는 다른 결과물을 확인할 수 있습니다.

 

마무리

이번 글에서는 Fasttext에 대해 알아보았습니다.

Fasttext는 Word2vec과 같은 네트워크 구조로 되어있으며 Subword를 사용한다는 것만 다릅니다.

Fasttext는 OOV 문제가 자주 발생하는 한국어와 오탈자 단어를 처리하는데 용이합니다.

다음글에서는 Word Embedding 방법 중 하나인 Glove에 대해 알아보겠습니다.

 

 

'슬기로운 NLP 생활' 카테고리의 다른 글

Classification - [11] ELMo  (0) 2020.09.24
Classification - [10] GloVe  (0) 2020.09.13
Classification - [8] Word2vec  (2) 2020.08.24
Classification - [7] TF-IDF  (1) 2020.08.23
Classification - [6] One-Hot Encoding, Bag Of Word  (0) 2020.08.23
Comments