수달이네 기술 블로그

4. FastText 본문

AI공부/자연어처리

4. FastText

슬픈 수달이 2026. 2. 21. 23:13

FastText

Facebook AI Research(FAIR)에서 개발한 단어 임베딩 및 텍스트 분류 모델

  • Word2Vec과 유사하나, 서브워드(subword)정보를 활용하여 더 강한 성능 발휘
  • 단어 단위가 아닌, 단어를 여러개의 n-gram 문자 조각으로 분해 학습한다.
    • 이때문에 희귀 단어(Out-of-Vocabulary)처리와 형태소 기반 언어에서 뛰어난 성능을 보임
  • 텍스트 분류에도 활용 가능

예시(3-gram)

  • 영어: playing > pl, pla, lay, ayi, yin, ing, ng
    • 여기서 play, played등은 많은 서브워드를 공유하므로 의미가 가까운 벡터로 처리
  • 한국어: 어미, 조사가 붙어 형태가 다양하게 나타난다.
    • 그러나, 토큰화를 MeCab등으로 형태소 분석기를 이용해 조사를 분리하면 품사, 어미등을 더 잘 반영한다.
    • NFC(일반 표기): U+AC15 = “한국어” = 3개문자
    • NFD(정규화): “ㅎ ㅏ ㄴ ㄱ ㅜ ㄱ ㅇ ㅓ” = 자모 8개
    • 최소 2~3 최대 4~6 정도의 길이가 적당함.

FastText 해보기

loaded_model = KeyedVectors.load_word2vec_format("kor_w2v") # Word2Vec 모델 로드
  • 만든 word2Vec모델을 로드해온다.
model_result = loaded_model.most_similar("한국")
print(model_result)
# [('일본', 0.7266947627067566), ('중국', 0.7214913368225098), ('외국', 0.6808579564094543), ('미국', 0.6744703054428101), ('계', 0.6672414541244507), ('국내', 0.6502709984779358), ('대한민국', 0.629600465297699), ('국산', 0.6115814447402954), ('홍콩', 0.6070912480354309), ('재난', 0.5950663685798645)]
  • 단어사전에 있는 텍스트면 가장 관련있는 단어리스트를 뽑아준다.
model_result = loaded_model.most_similar("슬픈수달")
print(model_result)

# KeyError: "Key '슬픈수달' not present in vocabulary"
  • 없다면 위와 같은 에러
from gensim.models import FastText
fasttext_model = FastText(tokenized_data, vector_size=100, window=5, min_count=5, workers=4, sg=1)
  • FastText모델을 불러와서 학습 시킬 것임.
    • vector_size: 생성할 단어 벡터의 차원 수
    • window: 컨텍스트 윈도우 크기를 설정. 현재 단어를 기준으로 좌우 몇 개의 단어를 고려할지 정하는 값
    • min_count: 코퍼스에서 등장 횟수가 min_count 미만인 단어를 무시
    • workers: 병렬 처리를 위한 CPU 코어 개수를 설정
    • sg: 학습 알고리즘을 결정하는 Skip-gram(1) / CBOW(0) 선택 옵션
    • tokenized_data는 이전에 뽑아낸 토큰들

FastText모델이 실행 완료되면

fasttext_model.wv.most_similar('슬픈수달')
# [('슬픈', 0.944154679775238),
#  ('슬픈데', 0.9154887199401855),
#  ('슬픈지', 0.8784722089767456),
#  ('슬프', 0.840110182762146),
#  ('아린', 0.8381637930870056),
#  ('아픈데', 0.8134650588035583),
#  ('어슬프', 0.8062575459480286),
#  ('먹먹하', 0.8058263659477234),
#  ('눈물나', 0.7971489429473877),
#  ('눈물겹', 0.7945569753646851)]
  • 이전엔 뽑아내지 못하던 비슷한 단어를 뽑아낸 것을 확인 가능하다
fasttext_model.wv.most_similar('한국')
# [('우리나라', 0.7421770691871643),
#  ('한국사', 0.7245447635650635),
#  ('조폭', 0.7051274180412292),
#  ('미국', 0.6853338479995728),
#  ('국산', 0.6824985146522522),
#  ('암흑기', 0.6741575002670288),
#  ('외국', 0.6723015308380127),
#  ('후진국', 0.6595128178596497),
#  ('중국', 0.6578665375709534),
#  ('나라', 0.6563915610313416)]
  • 있는 단어도 물론 잘 된다.

'AI공부 > 자연어처리' 카테고리의 다른 글

6. RNN활용 KOSPI예측(시퀀스데이터)  (0) 2026.02.23
5. RNN(Recurrent Neural Network)기초  (1) 2026.02.22
3. NSMC를 활용한 단어 분류  (1) 2026.02.20
2. 자연어 처리(벡터화)  (1) 2026.02.16
1. 자연어처리  (0) 2026.02.16