✅ 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 표현 가능
- 자소 예: 텐 → ㅌ,ㅔ,ㄴ → [“ㅌㅔ”, “ㅔㄴ”, …]
- 띄어쓰기 오류 및 신조어 대응에 강함