Tensorflow 2 NLP(자연어처리)/단어 임베딩

[3-3] FastText란?

Suhd 2021. 11. 13. 11:47

FastText (Boganowski eta al., 2017)은 페이스북에서 개발해 공개한 단어 임베딩 기법이다.

기본적으로 Word2Vec과 같지만 FastText의 특징은 각 단어를 문자단위 n-gram으로 표현하여 학습한다는 것이다.

즉, Word2Vec은 단어들만으로 학습했다고 한다면, FastText는 더 나아가 단어 내에 들어있는 단어들까지 학습한다는 것이다.

예를들어 abcd라는 단어가 있다면 이를 n=3으로 표현한다고 하자.

우리는 abcd를 => <ab,abc,bcd,cd>,<abcd> 5개의 문자 단위 n-gram 벡터를 합해 표현한다.

그래서 기존 Word2Vec의 확률계산에 <ab,abc,bcd,cd> 까지 벡터로써 업데이트 하는 것이다.

 

 

그렇다면 이점이 무엇일까?

 

바로 미등록 단어(+오타) 에도 강해진다는 것이다. 또한 조사나 어미가 발달한 한국어에 좋은 성능을 낸다.

 

 


코드를 통해 구현해보자

먼저 네이버 영화 리뷰 말뭉치만 이용하여 결과를 구현해 보았지만 성능이 너무 떨어져 한국어 위키백과,KorQuaD 말뭉치까지 활용하여 학습하였다.

먼저 도커 컨테이너 상에서 cat을 이용해 3개의 말뭉치를 합쳐 corpus_mecab.txt 에 저장했다.

이후 또한 컨테이너 상에서

 

$ mkdir -p data/word-embeddings/fasttext

$ models/fastText/fasttext skipgram -input data/tokenized/corpus_mecab.txt -output

data/word-embeddings/fasttext/fasttext

1. 디렉토리를 만들고

2. fsatText Skip-gram 모델 학습을 진행하였다.

(학습은 cpu 도커로 40분이 걸렸다.)

 

 

 

이제 코사인 유사도 상위 단어 목록을 확인해보자.

코드는 Word2Vec때와 같다.

'희망' 과 유사한 단어로 '행복', '희망찬' ,'소망','나눠요', '꿈'이 출력되었다. 임베딩 품질이 좋다.

그리고 FastText는 용언과 어미가 벡터 공간상 가깝게 임베딩 된다.(유사하다) 이를 확인해보자.

'하였다' 와 유사한 단어로, '하','다','했','였으며','했으며' 가 유사하다고 한다. 이 또한 결과가 좋다.

그렇다면 미등록 단어(+오타) 를 확인해보자.

'서울특별시'를 => '서울틀벌시' 라는 오타로 입력해보자.

없는 단어임에도 불구하고, '서울' 이라는 작은 문자를 인식해 이에 유사한 단어들을 출력한 것이다. 결과가 좋다.


++ FastText는 문자단위 n-gram을 쓰기 때문에 한글과 궁합이 잘 맞다.

한글은 자소 단위로 분해 할 수 있고, 이 자소 각각을 하나의 문자로 보고 FastText를 실행 할 수 있다.

즉, '안녕하세요' 를 입력받으면 => "ㅇ ㅏ ㄴ ㄴ ㅕ ㅇ ㅎ ㅏ - ㅅ ㅔ - ㅇ ㅛ -" 로 분해하여 각각 벡터 임베딩을 한다. 이를 통해 얻는 이점이 무엇일까?

유사도가 증가하는 경우가 발생한다.

각각 자소들이 모두 임베딩이 되기 때문에 비슷한 형태의 단어들이 서로 유사해진다.

즉, '희망' 의 유사한 단어들을 찾는다면

'희망찬' '행복', '희망특강', '희망자', '소망' 등 비슷한 모음,자음을 쓴 단어들이 더욱 유사해지고

이를 목표로 하는 프로그램에는 큰 이득이 될 수 있다.