본문 바로가기

카테고리 없음

Word2Vec & FastText 임베딩 실습 및 개념 요약(2)

 

✅ 1. Word2Vec 실습

  • NLTK의 abc 말뭉치를 불러와 문장 단위로 토큰화된 데이터를 Word2Vec에 입력합니다.
  • Word2Vec 클래스는 단어를 벡터로 임베딩하는 모델이며, 아래 설정은 CBOW 방식(sg=0)을 사용합니다.
  • 학습 후 most_similar() 함수를 통해 특정 단어와 의미적으로 유사한 단어들을 확인할 수 있습니다.
import nltk
nltk.download('abc')
nltk.download('punkt')

from nltk.corpus import abc
corpus = abc.sents()

from gensim.models import Word2Vec
model = Word2Vec(sentences=corpus, vector_size=100, window=5, min_count=5, workers=4, sg=0)
model.wv.most_similar("man")

✅ 2. FastText 실습 (OOV 단어 대응)

  • FastText는 Word2Vec과 달리 단어를 문자 n-gram 단위로 분해하여 학습하므로, OOV(사전에 없던 단어)에 대해 벡터 추정이 가능합니다.
  • sg=1로 설정하여 Skip-Gram 방식으로 학습하며, 오타나 신조어 같은 단어도 유사도 탐색이 가능합니다.
from gensim.models import FastText
fasttext_model = FastText(sentences=corpus, window=5, min_count=5, workers=4, sg=1)  # FastText 모델 학습
# - sentences: 학습할 말뭉치 (문장 단위 토큰 리스트)
# - window: 주변 단어를 고려하는 크기 (좌우 N개)
# - min_count: 최소 등장 빈도가 이보다 낮은 단어는 제외
# - workers: 병렬 처리를 위한 CPU 스레드 수
# - sg=1: Skip-Gram 방식 사용 (sg=0이면 CBOW 방식)
fasttext_model.wv.most_similar('overacting')  # 'overacting'이 훈련 코퍼스에 없더라도 유사한 단어를 예측 가능
fasttext_model.wv.most_similar('memorry')  # 'memory'의 오타인 'memorry'도 subword 기반으로 유사 단어 추정 가능

✅ 3. 사전 학습된 GloVe 모델 실습

  • gensim.downloader를 통해 미리 학습된 GloVe 벡터를 불러올 수 있습니다.
  • glove-wiki-gigaword-50은 50차원으로 축소된 GloVe 벡터이며, 위키백과와 Gigaword 뉴스 데이터를 기반으로 학습되었습니다.
  • 불러온 모델에서 most_similar() 메서드를 사용해 특정 단어의 유사 단어를 확인합니다.
import gensim.downloader as api
glove_model = api.load("glove-wiki-gigaword-50")
glove_model.most_similar("dog")

✅ 4. 개념 정리

🔹 SGNS

  • SGNS (Skip-Gram with Negative Sampling): 주변 단어를 확률적으로 예측
  • Negative Sampling: 모든 단어를 softmax로 예측하는 대신, 실제 주변 단어는 positive로, 무작위 단어들은 negative로 구성하여 이진 분류로 간단화 → 연산 비용 절감
  • Skip-Gram with Negative Sampling: 주변 단어를 확률적으로 예측

🔹 GloVe

  • Co-occurrence 기반 의미 표현 학습
  • PMI 기반 손실 함수 최적화

🔸 윈도우 기반 동시 등장 행렬

  • 단어 i와 주변 단어 k의 등장 횟수를 행렬에 기록
  • 양방향 윈도우 사용 시 대칭 행렬이 됨

🔸 동시 등장 확률 P(k|i)

  • 조건부 확률: P(k|i) = Count(i, k) / Σ Count(i, k’)
  • 중심 단어가 주어졌을 때 특정 단어가 주변에 등장할 확률

🔸 GloVe 논문 예시 (ice vs steam)

x (context) P(x|ice) P(x|steam) P(x|ice) / P(x|steam)

solid large small large
gas small large small
water large large ~1
random small small ~1
  • solid는 ice와 더 자주 등장 → 확률비 큼
  • GloVe는 이러한 확률비를 내재화하여 의미 차이를 학습

🔹 PCA / SVD / LSA

  • PCA: 분산 최대화 기준 투영
  • SVD: U Σ Vᵗ 분해 기반 의미 압축
  • LSA: DTM + SVD

방식 복원성 특징

Full SVD ✅ 완전 복원 모든 특이값 사용
Thin SVD ✅ 완전 복원 rank만큼만 사용
Truncated SVD ⚠️ 근사 복원 주요 성분만 보존

🔹 OOV 문제 & FastText 특징

  • OOV(Out-Of-Vocabulary) 문제: 훈련에 사용되지 않은 단어는 벡터가 없어 예측 불가 (예: GloVe, Word2Vec)
  • FastText는 단어를 subword(n-gram) 단위로 분해하여 벡터를 생성하므로 OOV 문제에 강함
  • 예: 'memorry'처럼 사전에 없는 오타도 의미 있는 벡터 생성 가능

🔹 한국어 FastText

  • 음절 기반, 자소 기반 subword 표현 가능
  • 자소 예: 텐 → ㅌ,ㅔ,ㄴ → [“ㅌㅔ”, “ㅔㄴ”, …]
  • 띄어쓰기 오류 및 신조어 대응에 강함