fasttext
fasttext는 word2vec이후 페이스북에서 개발한 모델입니다. 두 방법이 크게 다르지는 않지만 관점의 차이가 있습니다.
word2vec에서는 말 그대로 "단어"를 최소단위로 생각했습니다. 하지만 fasttext같은 경우 단어를 더 작은 단위로 쪼개어 봅니다.
즉, n-gram의 구성으로 취급합니다.
예를 들어 kitty라는 단어가 있다고 합시다. fasttext에서는 이 단어의 시작과 끝에 <,>를 붙여 <kitty>를 만들어주고, n-gram이 2일때, 아래와 같이 쪼개줍니다. 이를 내부 단어(subword)라고 합니다.
<k
ki
it
tt
ty
y>
<kitty>
word2vec였으면 kitty자체를 하나의 단어로 취급했지만, fasttext같은 경우 위의 7개를 단어로 취급합니다. 즉, 위의 7개의 토근을 벡터화합니다.
위와 같이 단어를 표현하게 되면 크게 두 가지 장점이 있습니다.
첫 번째는 OOV(Out Of Vocabulary)에 대한 대응입니다.
위에서 보시다시피 하나의 단어가 여러 단어로 쪼개집니다. grandmother이라는 모르는 단어가 들어왔다고 가정해 봅시다. 하지만 다른 단어로부터 추출된 내부 단어로부터 이 의미를 유추할 수 있는데요. 예를 들어 grandpiano 또는 grandcayon이라는 단어에서 내부 단어인 grand를 얻고, mother에서 내부 단어를 얻는다면 grandmother에 대한 벡터를 얻을 수 있습니다.
물론! 어느 정도 데이터셋이 충분히 있어야 하겠지만요.
이 장점은 word2vec와는 굉장히 다른 점입니다. word2vec는 모르는 단어가 있으면 임베딩 하지 못합니다. 즉 <UNK>토큰으로 처리하게됩니다.
두 번째는 빈도수가 적은 단어에 대한 대응입니다.
word2vec은 단어 단위로 자르기 때문에 빈도수가 적은 단어에 대해서는 임베딩의 정확도가 높지 않습니다. 단어를 추론하는데 이용하던, 추론을 하던 간에 참고할 수 있는 경우가 적기 때문인데요.
fasttext는 n-gram단위로 학습을 하기 때문에 다른 단어의 n-gram에서도 유사한 단어가 있다면 학습이 됩니다. 잘 생각해 보시면 너무 당연한 결과겠지요! 더 잘게 쪼갬으로써 공통된 부분을 많이 늘려주니까요.
이때문에 fasttext는 오타에 더 강하다고 합니다.
한국어 vs 영어
하지만 여기서 다소 안타까운 부분이 있죠. 영어는 공백 기준으로 토큰 하나가 한가지 품사에 대응이 됩니다. 따라서 fasttext를 이용하기 굉장히 간단하죠. 반면 한국어 같은 경우에는 토큰 하나에도 여러 품사가 있을 수 있습니다.
그렇다면 한국어에는 쓸 수 없는것일까요?
물론 영어에서 더 좋은 성능을 보이지만, 한국어에서도 쓸 수 있습니다.
한국어에서는 크게 음절 단위, 자모 단위 두 가지 방법이 있습니다.
1. 음절 단위
음절 단위는 위에서 말했던 것과 같습니다.
<고양이>라는 단어가 n-gram=2로 설정이 되었다면, 아래와 같이 얻을 수 있습니다.
<고
고양
양이
이>
<고양이>
2. 자모 단위
자모 단위는 초성, 중성, 종성 단위로 임베딩하는 방법이며, 위와 같은 예로 진행해보면 아래와 같습니다.
만약 종성이 없다면 임의의 문자로 대체한다고 합니다. 여기서는 -로 대체되었습니다.
<ㄱㅗ
ㄱㅗ-
ㅗ_ㅇ
_ㅇㅑ
ㅇㅑㅇ
ㅑㅇㅣ
ㅇㅣ-
ㅣ->
<고양이>
자모로 분리하는 경우 더 강한 임베딩이 된다고 합니다.
데이터를 더 잘게 쪼갤수록 임베딩이 강해지는 것 같네요!
fasttext 학습 방법
학습 방법 자체는 CBOW, Skip-Gram등 word2vec에서와 동일합니다.
1. gensim 라이브러리 사용
from gensim.models import FastText
# 학습 시키는 부분
# sg = 1이면 skip-gram, 0이면 CBOW
fasttext = FastText(sentences, size=300, window=5, min_count=5, workers=4, sg=1)
# 모델 저장
fasttext.save("model_name.model")
# 모델 불러오기
fasttext = FastText.load("model_name.model")
2. fasttext 라이브러리 사용
import fasttext
# GPU를 사용하기 위해 thread와 epoch 파라미터를 추가
model = fasttext.train_unsupervised(train_file, model='skipgram', thread=16, epoch=50)
# 모델 저장
model.save_model(model_path)
# 모델 불러오기
model = fasttext.load_model(model_path)
'인공지능공부 > 자연어처리' 카테고리의 다른 글
Self-Attentive Sentence Embedding(SASE) 구현해보기 (0) | 2023.03.22 |
---|---|
Self-Attentive Sentence Embedding(SASE)의 모든 것 (1) | 2023.03.21 |
word2vec의 모든 것 (0) | 2023.03.18 |
[huggingface🤗] 3.Trainer사용해보기 (0) | 2023.03.14 |
[huggingface🤗] 2.Auto Class사용해보기 (2) | 2023.03.13 |