๋ฐ์ํ
1. Word Embedding?
Word Embedding, ์๋์๋ฒ ๋ฉ ์ด๋? ํ ์คํธ ๋ฐ์ดํฐ๋ฅผ ์์นํ ๋ฒกํฐ๋ก ๋ณํํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
- ๋ค๋ฅธ ์๋ฏธ๋ก ๋งํ๋ฉด Text๋ด์ ๋จ์ด๋ค์ ์ปดํจํฐ๊ฐ ์ดํดํ ์ ์๋ Vector์ ํํ๋ก ๋ณํํ๋๊ฒ์ ๋งํฉ๋๋ค. ์ฆ, ๋จ์ด๋ฅผ ๊ณ ์ฐจ์ ๊ณต๊ฐ์ ์ ์ฐจ์ ๋ฒกํฐ๋ก ๋ณํํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
- Word Embedding ๊ณผ์ ์ ๊ฑฐ์น Vector๋ ๋จ์ด์ ์๋ฏธ(mean), ๋ฌธ๋งฅ(context), ์ ์ฌ์ฑ(similar) ๋ฑ์ ์์นํ ํด์ ํํํ ์ ์์ต๋๋ค.
- ์๋ ์๋ฒ ๋ฉ์ ๊ณผ์ ์ ํฌ๊ฒ ๋ณด๋ฉด 2๊ฐ์ง์ ๋ฐฉ๋ฒ์ผ๋ก ์ด๋ฃจ์ด์ง๋๋ค.
2. Word Embedding์ ๋ฐฉ๋ฒ
- Word Embedding์ ๋ฐฉ๋ฒ์ ํฌ๊ฒ ๋ณด๋ฉด 2๊ฐ์ง์ ๋ฐฉ๋ฒ์ผ๋ก ์ด๋ฃจ์ด ์ง๋ค๊ณ ํ์ต๋๋ค.
- ํ๋๋ Count๊ธฐ๋ฐ ๋ฐฉ๋ฒ, ๋ค๋ฅธ ํ๋๋ ์์ธก ๊ธฐ๋ฐ์ ๋ฐฉ๋ฒ์ ๋๋ค. ์ฐ์ ์นด์ดํธ ๊ธฐ๋ฐ์ ๋ฐฉ๋ฒ๋ถํฐ ์ค๋ช ํด ๋ณด๊ฒ ์ต๋๋ค.
2-1. Count๊ธฐ๋ฐ ๋ฐฉ๋ฒ
Count๊ธฐ๋ฐ ๋ฐฉ๋ฒ์ ๋จ์ด(Word)์ ๋ฌธ๋งฅ(Context) ์ ๋ณด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ์ฌ, ๋จ์ด๋ฅผ Vector๋ก ํํํฉ๋๋ค.
- ํน์ ๋จ์ด์ ์ฃผ๋ณ ๋จ์ด๋ค์ ๋น๋๋ฅผ ์นด์ดํธํด์ Vector๋ฅผ ์์ฑํ๋ ๋ฐฉ์์ ๋๋ค.
- ๋ํ์ ์ผ๋ก TF-IDF, Co-occurence Matrix๋ฑ์ด ์์ต๋๋ค.
TF-IDF (Tern Frequency-Inverse Document Frequency)
TF-IDF๋ Text Data์์ ๋จ์ด์ ์ค์์ฑ์ ํ๊ฐ(Weight(๊ฐ์ค์น)๋ฅผ ๊ณ์ฐ)ํ๋ ํต๊ณ์ ๋ฐฉ๋ฒ์ ๋๋ค. ๋ณดํต ๋ฌธ์ ๋ด์์ ํน์ ๋จ์ด๊ฐ ์ผ๋ง๋ ์ค์ํ์ง๋ฅผ ๋ํ๋ผ๋ ์ฌ์ฉํฉ๋๋ค.
- TF-IDF๋ ๋ ๋ถ๋ถ์ผ๋ก ๋๋์ด์ ธ์ ๊ณ์ฐ๋ฉ๋๋ค. TF, IDF 2๊ฐ๋ก ๋๋์ด์ ธ ์์ต๋๋ค.
- 'TF'๋ ๋ฌธ์ ๋ด์์ ํน์ ๋จ์ด๊ฐ ๋ํ๋๋ ๋น๋์(๋ฑ์ฅ ํ์)๋ฅผ ๋งํฉ๋๋ค.
- ์ผ๋ฐ์ ์ธ 'TF'๋ ๋จ์ด ๋ฑ์ฅ ํ์๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ๊ฑฐ๋, Normalization(์ ๊ทํ)ํ์ฌ ์๋์ ์ธ ๋น๋๋ก ๋ํ๋ผ ์ ์์ต๋๋ค.
- TF(t, d) ๊ณ์ฐ: ํน์ ๋จ์ด t๊ฐ ๋ฌธ์ d ๋ด์ ๋ฑ์ฅํ๋ ํ์๋ฅผ ๋ฌธ์ d์ ์ ์ฒด ๋จ์ด ์๋ก ๋๋๋๋ค.
- 'IDF'๋ ์ ์ฒด ๋ฌธ์ ์งํฉ์์ ํน์ ๋จ์ด๊ฐ ๋ค์ด์๋ ๋ฌธ์๋ค์ ๋น์จ์ ๊ธฐ๋ฐํ ์์น์ ๋๋ค.
- ์ฝ๊ฒ ๋งํ๋ฉด ์ ์ฒด ๋ฌธ์ ์งํฉ์์ ํน์ ๋จ์ด๊ฐ ์ผ๋ง๋ ํฌ๊ทํ์ง๋ฅผ ๋ํ๋ ๋๋ค.
- ์ฌ๊ธฐ์ ํํ๊ฒ ๋ํ๋๋ ๋จ์ด๋ Weight(๊ฐ์ค์น)๊ฐ ์ ๊ณ , ํฌ๊ทํ๊ฒ ๋ํ๋๋ ๋จ์ด๋ Weight(๊ฐ์ค์น)๊ฐ ํฝ๋๋ค.
- IDF(t, D) ๊ณ์ฐ, ๋ก๊ทธ ์ค์ผ์ผ์ ์ฌ์ฉํ์ฌ ์ ์ฒด ๋ฌธ์์ ์๋ฅผ ํน์ ๋จ์ด t๊ฐ ํฌํจ๋ ๋ฌธ์์ ์๋ก ๋๋๋๋ค.
- TF-IDF(t, d, D) ๊ณ์ฐ: TF์ IDF๋ฅผ ๊ณฑํ์ฌ ์ป์ต๋๋ค.
- TF-IDF(t, d, D) = TF(t, d) * IDF(t, D)
- TF-IDF์์ ์ค์ํ๊ฒ ๋ด์ผ ํ๋๊ฑด TF-IDF๊ฐ์ด ํด์๋ก ์ด๋ค ๋จ์ด๊ฐ ํด๋น ๋ฌธ์์ ๋ ์ค์ํ๋ค๋๊ฒ์ ๊ณ ๋ คํฉ๋๋ค.
- ๊ทธ๋์ ํน์ฑ ๋ฌธ์์์ ๋์ฃผ ๋ํ๋๋ ๋จ์ด์๋ ๋์ Weight(๊ฐ์ค์น)๊ฐ ๋ถ์ฌ๋์ง๋ง, ์ ์ฒด ๋ฌธ์ ์งํฉ์์ ์์ฃผ ๋ํ๋๋ ๋จ์ด๋ ๋ฎ์ ๊ฐ์ค์น๋ฅผ ๊ฐ๊ฒ ๋ฉ๋๋ค.
- ๊ทธ๋ฆฌ๊ณ TF-IDF๋ ์ ๋ณด ๊ฒ์์ ํ๋ฉด์ ๊ทธ ๋ฌธ์์ ๊ด๋ จ์ฑ์ ํ๋จํ๋ ๊ฒฝ์ฐ์ ์ฌ์ฉ๋๊ธฐ๋ ํฉ๋๋ค.
Example Code - TF-IDF
- Python์ sklearn ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ์ฉํด์ TF-IDF๋ฅผ ๊ณ์ฐํ๋ ์ฝ๋๋ฅผ ํ๋ฒ ๋ณด๊ฒ ์ต๋๋ค.
- ์ด ์ฝ๋๋ ๋ฌธ์ list๋ฅผ input์ผ๋ก ๋ฐ์์ ๊ฐ ๋ฌธ์์ TF-IDF Vector๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
- ์ด ์ฝ๋๋ ํ๊ตญ์ด Text์ ๋ํ TF-IDF ๊ณ์ฐ์ ํ๊ธฐ ์ํ์ฌ ๋ถ์ฉ์ด ์ ๊ฑฐ, ํ ํฐํ, ์ด๊ฐ ์ถ์ถ๋ฑ์ ์ ์ฒ๋ฆฌ ๊ณผ์ ๋ฐ ํ๊ตญ์ด Text ์ฒ๋ฆฌ๋ฅผ ํ๊ธฐ ์ํด์ KoNLPy ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ Okt ํํ์ ๋ถ์๊ธฐ๋ฅผ ํฌํจํ์์ต๋๋ค.
from sklearn.feature_extraction.text import TfidfVectorizer
from konlpy.tag import Okt
import re
# ์์ ๋ฌธ์ ๋ฆฌ์คํธ
documents = [
'์ด๊ฒ์ ์ฒซ ๋ฒ์งธ ๋ฌธ์์
๋๋ค.', # ์ฌ๊ธฐ์ document ํ์ผ์ ๋ฃ์ผ๋ฉด ๋ฉ๋๋ค.
'์ด๊ฒ์ ๋ ๋ฒ์งธ ๋ฌธ์์
๋๋ค.', # ์ฌ๊ธฐ์ document ํ์ผ์ ๋ฃ์ผ๋ฉด ๋ฉ๋๋ค.
'์ด๊ฒ์ ์ธ ๋ฒ์งธ ๋ฌธ์์
๋๋ค.', # ์ฌ๊ธฐ์ document ํ์ผ์ ๋ฃ์ผ๋ฉด ๋ฉ๋๋ค.
]
# ํ๊ตญ์ด ๋ถ์ฉ์ด ๋ฆฌ์คํธ - ๋ถ์ฉ์ด ๋ฆฌ์คํธ๋ ์์๋ก ๋ฃ์ด๋์์ต๋๋ค. ์ฌ์ฉ์๊ฐ ์ถ๊ฐํด์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
stopwords = ['์ด๊ฒ', '์
๋๋ค', '๋ฌธ์', '๋ฒ์งธ']
# Okt ํํ์ ๋ถ์๊ธฐ ์ธ์คํด์ค ์์ฑ
okt = Okt()
# ๋ฌธ์ ์ ์ฒ๋ฆฌ ํจ์
def preprocessing(document):
# ํน์ ๋ฌธ์ ์ ๊ฑฐ
document = re.sub('[^๊ฐ-ํฃใฑ-ใ
ใ
-ใ
ฃa-zA-Z]', ' ', document)
# ํํ์ ๋ถ์๊ธฐ๋ฅผ ์ด์ฉํ์ฌ ํ ํฐํ ๋ฐ ์ด๊ฐ ์ถ์ถ
tokens = okt.morphs(document, stem=True)
# ๋ถ์ฉ์ด ์ ๊ฑฐ
tokens = [token for token in tokens if token not in stopwords]
return tokens
# TF-IDF ๋ฒกํฐ๋ผ์ด์ ์์ฑ
vectorizer = TfidfVectorizer(tokenizer=preprocessing)
# ๋ฌธ์๋ฅผ ์ด์ฉํ์ฌ ๋ฒกํฐ๋ผ์ด์ ๋ฅผ ํ์ต์ํค๊ณ TF-IDF ๋ฒกํฐ ์์ฑ
tfidf_matrix = vectorizer.fit_transform(documents)
# ๊ฐ ๋จ์ด์ idf๊ฐ ์ถ๋ ฅ
print('๋จ์ด๋ณ idf ๊ฐ: ', dict(zip(vectorizer.get_feature_names(), vectorizer.idf_)))
# TF-IDF ๋ฒกํฐ ์ถ๋ ฅ
print('TF-IDF ๋ฒกํฐ: ', tfidf_matrix.toarray())
๋จ์ด ๋์ ์ถํ ํ๋ ฌ (Co-occurence Matrix)
๋จ์ด ๋์ ์ถํ ํ๋ ฌ (Co-occurence Matrix)์ ๋จ์ด๊ฐ์ ๊ด๊ณ๋ฅผ ํ์ ํ๋๋ฐ ์ฌ์ฉ๋๋ ํํ ๋ฐฉ๋ฒ์ค ํ๋์ ๋๋ค.
- ์ด ํ๋ ฌ์ ์ฃผ์ด์ง ๋ฌธ์ or ๋ง๋ญ์น(Corpus)์์ ๋จ์ด ์์ด ํจ๊ป ๋ฑ์ฅํ ํ์๋ฅผ ๋ํ๋ด๋ ํ๋ ฌ์ ๋๋ค.
- ์ฌ๊ธฐ์ "๋์์ถํ" ์ด๋ผ๋ ๋ง์, ๋ ๋จ์ด๊ฐ ์ฃผ์ด์ง ๋งฅ๋ต(Context)์์ ํจ๊ป ๋ํ๋๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
- ํ๋ฒ ์๋ฅผ ๋ค์ด์ ๋ณด๋ฉด, "๋ฌด๊ธฐ" ์ด๋ "์ ์"์ด๋ผ๋ ๋จ์ด๊ฐ ๋ง์ด ๋ํ๋๋ค๋ฉด, ์ด ๋ ๋จ์ด๊ฐ์๋ ์๋ฏธ์ ์ธ ๊ด๊ณ๊ฐ ์์์๋ ์์ต๋๋ค. ๊ทธ๋ฌ๋ฉด ํ๋ฒ ๋จ์ด ๋์ ์ถํ ํ๋ ฌ (Co-occurence Matrix)๋ฅผ ๋ง๋ค๋ ค๋ฉด ์ด๋ฌํ ๋จ๊ณ๋ก ์งํ๋ฉ๋๋ค.
- Corpus(๋ง๋ญ์น, ๋จ์ด์งํฉ) ๊ตฌ์ถ: ๋ถ์ํ๊ณ ์ ํ๋ ๋์ ๋ฌธ์๋ค๋ก ์ด๋ฃจ์ด์ง Corpus๋ฅผ ๊ตฌ์ถํฉ๋๋ค.
- Window ๊ตฌ์ถ: ๋ฌธ์๋ฅผ Tokenํํ, ๋จ์ด์ Window๋ฅผ ์ ์ํฉ๋๋ค. Window๋ ๋จ์ด๊ฐ์ ๊ด๊ณ๋ฅผ ์ ์ํ๋๋ฐ ์ฌ์ฉ๋๋ฉฐ, ์ฃผ๋ณ ๋จ์ด๋ฅผ ๋ช๊ฐ๊น์ง ํฌํจ์ํฌ์ง๋ฅผ ๊ฒฐ์ ํฉ๋๋ค. ์์ธํ ๋ด์ฉ์ Word2Vec์ ๊ด๋ จํด์ ์ด ๊ธ์ ์ฐธ๊ณ ํด์ฃผ์ธ์.
- ๋จ์ด ๋์ ์ถํ ํ๋ ฌ (Co-occurence Matrix): ๊ฐ Window์์ ๋ฑ์ฅํ ๋จ์ด์์ ๋น๋๋ฅผ ํ๋ ฌ์ ๊ธฐ๋กํฉ๋๋ค. ํ๋ ฌ์ ํ & ์ด์ ๋จ์ด๋ฅผ ์๋ฏธํ๋ฉฐ, ๊ฐ ์ ์ ํด๋น ๋จ์ด๋ค์ ๋์ ์ถํ ํ์๋ฅผ ๋ํ๋ ๋๋ค.
- "๋ฌด๊ธฐ" ๋ "์ ์"์ด๋ผ๋ ๋จ์ด๊ฐ ์ฃผ์ด์ง Window์์ ๋ฑ์ฅํ๋ฉด, ํด๋น ํ๋ ฌ์ "๋ฌด๊ธฐ" ๋ "์ ์"์ด์ ํด๋นํ๋ ์ ์ ๊ฐ์ ์ฆ๊ฐ์ํค๋ ๋ฐฉ์์ผ๋ก ์งํ๋ฉ๋๋ค.
- ๋จ์ด ๋์ ์ถํ ํ๋ ฌ (Co-occurence Matrix)๋ ๋์นญ์ฑ์ ๊ฐ์ง๋ฉฐ, ํ๋ ฌ์ ๊ฐ ์์๋ ํด๋น ๋จ์ด ์์ ๋์ ์ถํ ๋น๋๋ฅผ ๋ํ๋
๋๋ค.
- ๊ทธ๋ฆฌ๊ณ , ์ด ํ๋ ฌ์ ์ฃผ๋ก ์ ์ฌ ์๋ฏธ ๋ถ์(Latent Semantic Analysis, LSA) ์ ํ์ฉ๋์ด์ ๋จ์ด๊ฐ์ ์๋ฏธ์ ์ ์ฌ์ฑ์ ํ์ ํ๋๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
2-2. ์์ธก ๊ธฐ๋ฐ ๋ฐฉ๋ฒ
์์ธก ๊ธฐ๋ฐ ๋ฐฉ๋ฒ์ ํน์ ๋จ์ด๋ฅผ ์์ธกํ๋ ๋ฐฉ์์ผ๋ก ๋จ์ด๋ฅผ Vector๋ฅผ ํํํฉ๋๋ค.
- ์ฃผ์ด์ง Context(๋ฌธ๋งฅ) ์์ ํน์ ๋จ์ด๋ฅผ ์์ธกํ๊ฑฐ๋, ํน์ ๋จ์ด๋ฅผ ๊ฐ์ง๊ณ ์ฃผ๋ณ Context(๋ฌธ๋งฅ)์ ์์ธกํ๋ ๋ฐฉ์์ ๋๋ค.
- ๋ํ์ ์ผ๋ก Word2Vec, Glove, FastText๊ฐ ์์ต๋๋ค. Word2Vec์ ๋ํด์๋ ์์ธํ๊ฒ ์ค๋ช ํ ๊ธ์ด ์์ผ๋ ์ด๋ฒ์๋ ํจ์คํ๊ณ Glove, FastText ๋ ๋ฐฉ๋ฒ์ ๋ฐํ์ฌ ์ค๋ช ํ๊ฒ ์ต๋๋ค.
Glove (Global Vectors for Word Representation)
Glove๋ Word Embedding์ ํ์ต ํ๋๋ฐ ์ฌ์ฉ๋๋ ์๊ณ ๋ฆฌ์ฆ์ค ํ๋์ ๋๋ค.
- Glove๋ Count ๊ธฐ๋ฐ, ์์ธก ๊ธฐ๋ฐ์ ์ฌ์ฉํ๋ ์๊ณ ๋ฆฌ์ฆ ์ ๋๋ค.
- ๊ทธ๋ฆฌ๊ณ ๋จ์ด ๊ฐ์ ์ ์ญ์ ์ธ ์๋ฏธ ๊ด๊ณ๋ฅผ ํฌ์ฐฉํ๊ธฐ ์ํด ์ค๊ณ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ฉฐ, Word2Vec๊ณผ ๋ค๋ฅธ ์๋ฒ ๋ฉ ๊ธฐ๋ฒ๊ณผ๋ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ์๋ํฉ๋๋ค.
- Glove๋ ์ ์ฒด Corpus(๋ง๋ญ์น)์ ํต๊ณ ์ ๋ณด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํด์ ๋จ์ด๋ฅผ Vector๋ก ํํํฉ๋๋ค.
- ์ฃผ์ ํน์ง์ ๋จ์ด ๋์ ์ถํ ํ๋ ฌ (Co-occurence Matrix)๋ฅผ ํ์ฉํด์ ๋จ์ด๊ฐ์ ๊ด๊ณ๋ฅผ Modelingํฉ๋๋ค.
- ์ด Modelingํ ํ๋ ฌ์ ์ ์ฒด Corpus(๋ง๋ญ์น)์์ ๋จ์ด๊ฐ ํจ๊ป ๋ฑ์ฅํ ๋น๋๋ฅผ ๋ํ๋ ๋๋ค.
- ๋น์ ํ ๊ด๊ณ Modeling: Glove๋ ๋จ์ด Vector๊ฐ์ ์ ํ ๊ด๊ณ ๋ฐ ๋น์ ํ ๊ด๊ณ๋ ์บก์ฒํฉ๋๋ค. ์ด๋ฅผ ํตํด์ ๋จ์ด๊ฐ์ ์๋ฏธ์ ์ ์ฌ์ฑ์ ์ ๋ฐ์ํ ์ ์์ต๋๋ค.
- ์๋ฒ ๋ฉ ํ์ต ๋ชฉ์ ํจ์ (์์ค ํจ์ - loss Function): Glove๋ ์๋ฒ ๋ฉ ํ์ต์ ์ํ ๋ชฉ์ ํจ์(์์ค ํจ์)๋ฅผ ์ ์ํฉ๋๋ค.
- ์ด ๋ชฉ์ ํจ์(์์ค ํจ์)๋ ๋จ์ด Vector๊ฐ์ ๋ด์ ์ด ํด๋น ๋จ์ด ์์ ๋์ ์ถํ ํ๋ฅ ์ log๋ก ์๋ ดํ๋๋ก ํฉ๋๋ค. ์ฆ, ๋ ๋จ์ด Vector์ ๋ด์ ์ด ๋ ๋จ์ด๊ฐ ํจ๊ป ๋ฑ์ฅํ ํ๋ฅ ๊ณผ ๋น๋กํ๊ฒ ๋๋๋ก ํ์ต๋ฉ๋๋ค.
- ํ๋ฒ ๊ทธ๋ฌ๋ฉด ํจ์์ ๋ฐํ์ฌ ์ค๋ช ํ๊ธฐ ์ ์ ๊ฐ ์ฉ์ด๋ฅผ ํ๋ฒ ๋ณด๊ฒ ์ต๋๋ค.
Glove ๊ฐ๋ ๋ฐ ์์ ์ค๋ช
- Glove๋ Embedding ๋ ์ค์ฌ ๋จ์ด์ ์ฃผ๋ณ ๋จ์ด Vector์ ๋ด์ ์ด ์ ์ฒด Corpus(๋ง๋ญ์น)์์ ๋์ ๋ฑ์ฅ ํ๋ฅ ์ด ๋๊ฒ ๋ง๋ญ๋๋ค.
- ์๋ ์์ผ๋ก ํํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์๋ ์์ ๋ชฉ์ ํจ์(์์ค ํจ์)๋ก ์ฌ์ฉํ ์ ์์ผ๋ฏ๋ก, ์๋ฒ ๋ฉ๋ ๋ฒกํฐ์ ํน์ฑ์ ๋ฐ์ํ ์ ์๊ฒ ์์์ ๋ง๋ค์ด ์ค์ผ ํฉ๋๋ค.
- ์ผ๋จ, ๋จ์ด๊ฐ์ ๊ด๊ณ๋ฅผ ์ ํํํด ์ฃผ์ด์ผ ํฉ๋๋ค. ๊ทธ๋ฌ๋ฉด ์ด๋ค ๋จ์ด๊ฐ ๋ฑ์ฅํ์๋ ๋ค๋ฅธ ์ด๋ ํ ๋จ์ด๊ฐ ๋ฑ์ฅํ ํ๋ฅ ์ ๋ํ๋ผ์ ์๋ ์์ ์ฌ์ฉํด์ผํฉ๋๋ค.
- Glove๋ Vector wi, wj, wk๋ฅผ ๊ฐ์ง๊ณ ์ด๋ค ํจ์ F๋ฅผ ์ํํ๋ฉด, Pik / Pjk๊ฐ ๋์จ๋ค๋ ์ด๊ธฐ ์์ผ๋ก ์ ๊ฐ๋ฅผ ํฉ๋๋ค.
- ์ผ๋จ F๋ผ๋ ํจ์๊ฐ ์ด๋ ํ ์์ ๊ฐ์ง๊ณ ์๋์ง ์์ ์์ต๋๋ค. ๊ทธ๋์ ์ผ๋จ F์์ ์ง์ด๋ฃ์ wi, wj, wk์ ๊ด๊ณ๋ฅผ ์์๋ณด๊ธฐ ์ํด์ wi, wj๋ฅผ ๋บ ๋ฒกํฐ๋ฅผ wk๋ฅผ ๋ด์ ํฉ๋๋ค.
- ์ด์ ๋ ํจ์ F๋ ๋ ๋จ์ด ์ฌ์ด์ ๋์ ๋ฑ์ฅ ํ๋ฅ ์ ํฌ๊ธฐ ๊ด๊ณ์ ratio(๋น) ์ ๋ณด๋ฅผ Vector ๊ณต๊ฐ์ Encoding ํ๋๊ฒ์ด Glove ์๊ณ ๋ฆฌ์ฆ์ ๋ชฉ์ ์ ๋๋ค.
- ๊ทธ๋์ wi, wj ๋ Vector์ ์ฐจ์ด๋ฅผ ํจ์ F์ input์ผ๋ก ์ฌ์ฉํฉ๋๋ค. ๊ทผ๋ฐ ์ฐ๋ณ์ ์ค์นผ๋ผ ๊ฐ์ด๊ณ ์ข๋ณ์ ๋ฒกํฐ ๊ฐ์ ๋๋ค. ์ด๋ฅผ ์ฑ๋ฆฝํ๊ฒ ํด์ฃผ๊ธฐ ์ํด์๋ ํจ์ F์ ๋ ์ ๋ ฅ์ ๋ด์ (Dot Product)๋ฅผ ์ํํฉ๋๋ค.
- ๊ทผ๋ฐ, ์ด๋ ํจ์ F๊ฐ ๋ง์กฑํด์ผ ํ ์กฐ๊ฑด์ด ์์ต๋๋ค. ์ค์ฌ๋จ์ด w, ์ฃผ๋ฒ๋จ์ด ~w์ ์ ํ ๊ธฐ์ค์ ๋ฌด์์ ์ ํ์ด๋ฏ๋ก, ์ด ๋์ ๊ด๊ณ๋ ์์ ๋กญ๊ฒ ๊ตํ์ด ๋๋๋ก ํด์ผํฉ๋๋ค.
- ์ด๊ฒ ์ฑ๋ฆฝ์ด ๋๊ฒ ํ๋ ค๋ฉด ํจ์ F๊ฐ ์ค์์ ๋ง์ & ์์์ ๊ณฑ์ ์ ๋ํด์ ์ค๋ํ(Homomorphism)์ ๋ง์กฑํ๋๋ก ํด์ผํฉ๋๋ค.
์ค๋ํ(Homomorphism)์ ๋ฐํ์ฌ ๊ฐ๋จํ ์ค๋ช ํด๋ณด๋ฉด a์ b์ ๋ํด์ ํจ์ F๊ฐ F(a+b)๊ฐ F(a)F(b)๊ฐ ๊ฐ๋๋ก ๋ง์กฑ์์ผ์ผ ํ๋ค๋ ์๋ฏธ์ ๋๋ค. ์์ผ๋ก ๋ํ๋ด๋ฉด -> F(a+b) = F(a)F(b) ์ ๋๋ค.
- ๊ด๋ จํ ์์ ๊ฐ์ ธ์ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์ด๋ ๊ฒ ํ์ฌ์ ์์ ์ค๋ํ ์์ผ๋ก ๋ปด์ ์ ๋ํ ์ค๋ํ์์ผ๋ก ๋ณ๊ฒฝ์ ํฉ๋๋ค. ๊ทธ๋ฌ๋ฉด ์๋ ๊ณฑ์ ์ ๋ํ ์๋ ๋๋์ ์ผ๋ก ๋ด๋๋๋ค.
- ๊ทธ๋ฌ๋ฉด ์ด ์ค๋ํ์์ ์ฐ๋ณ์ ์์ Pik / Pjk ์ด๋ฏ๋ก, ๊ฒฐ๊ณผ์ ์ผ๋ก ์๋์ ์๊ณผ ๊ฐ์ด ์ ๋ฆฌ๊ฐ ๋ฉ๋๋ค.
- ์ด ์ค๋ํ(Homomorphism)์ ์๋ ์์ ์ข๋ณ์ผ๋ก ํ์ด์ ์ฐ๋ฉด ์๋์ ์์ผ๋ก ์ ๋ฆฌ๊ฐ ๋ฉ๋๋ค.
- ์ด ์ ๋ฆฌํ ์์ ๋ปด์ ์ ๋ํ ์ค๋ํ(Homomorphism)์ ์ ํํ๊ฐ ์ ํํ ์ผ์นํฉ๋๋ค.
- ๊ทธ๋ฌ๋ฉด ์ด์ ์ด๋ฅผ ๋ง์กฑํ๋ ํจ์ F๋ฅผ ์ฐพ์์ผํฉ๋๋ค. ์ด ํจ์ F๋ฅผ ๋ง์กฑ์ํค๋ ํจ์๋ฅผ ์ง์ ํจ์(Exponential Function)์ด๋ผ๊ณ ํฉ๋๋ค. ์๋์ ์์์ F๋ฅผ ์ง์ํจ์ exp๋ผ๊ณ ํ๊ณ ์นํํด์ ๋ณด๊ฒ ์ต๋๋ค.
- ์์ ๋๋ฒ์งธ ์์์ ๋ค์๊ณผ ๊ฐ์ ์์ ์ป์์ ์์ต๋๋ค.
- ๊ทผ๋ฐ, ์ฐ๋ฆฌ๊ฐ ๋ด์ผํ๋ ์ค์ํ ์ฌ์ค์ด ์์ต๋๋ค. ์ค์ฌ๋จ์ด w, ์ฃผ๋ฒ๋จ์ด ~w๋ ๋๊ฐ์ ์์น๋ฅผ ๋ด๊พธ์ด๋ ์์ด ์ฑ๋ฆฝํด์ผ ํฉ๋๋ค.
- ์ด๋ง์ ๋จ์ด๊ฐ์ ๊ต์ฒด๊ฐ ๊ฐ๋ฅํ๋ค๋ ๋ง์ธ๋ฐ, ๊ทธ๋ด๋ ค๋ฉด ์์ ์์์ log Xi ํญ์ด ๊ฑธ๋ฆผ๋ ์ ๋๋ค.
- ์ด๋ถ๋ถ๋ง ์๋ค๋ฉด ์ด ์์์ ์ฑ๋ฆฝ ์ํฌ์ ์์ต๋๋ค. ์ด๋์ ํด๊ฒฐ์ฑ ์ log Xiํญ์ wi์ ๋ํ ํธํฅ (bi,bk) ์์ํญ์ผ๋ก ๋์ฒดํฉ๋๋ค.
- ๊ฐ์ ์ด์ ๋ก ์ฃผ๋ณ๋จ์ด ~w์ ๋ํ ํธํฅ ~b๋ ์ถ๊ฐํฉ๋๋ค. ๊ทธ๋ฌ๋ฉด ํธํฅ(bias)์ฒ๋ผ ์์ํญ์ผ๋ก ๋ณผ ์ ์์ผ๋ฏ๋ก ๋์ ๋์ผํ ์์์ผ๋ก ํ๋จํ ์ ์์ต๋๋ค.
- Word(๋จ์ด)๊ฐ ๋ฌ๋ผ์ง๊ฒ ๋๋ฉด Bias(ํธํฅ)๋ i, k์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ ์์ํญ์ด๋ผ๊ณ ์๋ฉด ๋ฉ๋๋ค.
- ์์ 2๋ฒ์งธ ์์ด ๋ชฉ์ ํจ์(์์ค ํจ์)์ ํต์ฌ์ด ๋๋ ์์ ๋๋ค.
- ์์์ ํ์ต๋์ด์ผ ํ๋ Embedding๋ ๋จ์ด๋ค์ด ์ข๋ณ์ชฝ ์ผ๋ก ๋ชฐ๋ ค์๊ณ , ์ฐ๋ณ์๋ log(Xik)๋ฅผ ํตํด Window ์ฌ์ด์ฆ๋ฅผ ๋๊ณ Corpus(๋ง๋ญ์น) ์ ์ฒด์์ ๋จ์ด๋ณ ๋ฑ์ฅ ๋น๋๋ฅผ ๊ตฌํ ๋์ ์ถํ ํ๋ ฌ (Co-occurence Matrix)์์ ๋ก๊ทธ๋ฅผ ์ทจํด์ค ํ๋ ฌ์ด ์์ต๋๋ค.
- ์ข๋ณ์ 4๊ฐ ํญ์ Training์ ํตํด์ ๊ฐ์ด ๋ด๋๋ ๋ณ์๊ฐ ์๊ณ , ์ฐ๋ณ์ ๊ฐ์ ์ข๋ณ์ ๊ฐ๊ณผ์ ์ฐจ์ด๋ฅผ ์ต์ํ ํ๋ ๋ฐฉํฅ์ผ๋ก ์งํ๋ฉ๋๋ค.
- ์ด ์์ ๊ตฌํ๋ ค๊ณ ํ๋ ๋ชฉ์ ํจ์ J๋ก ๋ํ๋๋ฉด ์๋์ ๊ฐ์ต๋๋ค, ๊ทธ๋ฆฌ๊ณ ๋ชฉ์ ํจ์J ์์ V๋ ๋จ์ด ์งํฉ์ ํฌ๊ธฐ๋ฅผ ์๋ฏธํฉ๋๋ค.
- ๋ณํ์ ํด์ฃผ๋ ์ด์ ๋ ๋์ ๋จ์ด ์์ด ๋ฑ์ฅํด์ Embedding ๊ฒฐ๊ณผ๊ณผ ์ธ๊ณก๋์ง ์๊ฒ ํ๊ธฐ ์ํ ๋ชฉ์ ์ ๋๋ค.
- ์๋ฅผ ๋ค์ด์ "I", "is" ๋ผ๋ ๋จ์ด๋ค์ ์๋ฏธ๊ฐ ํฌ์ง๋ ์์ง๋ง ์ผ๋ฐ์ ์ผ๋ก ์๋ฌธ ๋ฌธ์ฅ์์ ๋ง์ด ๋ฑ์ฅํ๋ ๋จ์ด ์ด๋ฏ๋ก, ์ด ๋จ์ด๋ค์ ๋ฑ์ฅ ๋น๋์ ๋ฐ๋ผ์ Embedding ๊ฒฐ๊ณผ๊ณผ ์ธ๊ณก๋ ์ ์๊ธฐ ๋๋ฌธ์ Weight(๊ฐ์ค์น)ํจ์ f(x)๋ฅผ ๋ชฉ์ ํจ์(์์ค ํจ์)์ ์์์ ์ถ๊ฐํด์ ๊ณ์ฐํฉ๋๋ค.
- ๋ชฉ์ ํจ์(์์ค ํจ์)์ ์ฌ์ฉํ๋ Weight(๊ฐ์ค์น)ํจ์๋ ๋์ ์ถํ ๋น๋๊ฐ ๋์ ๋จ์ด ์์ ๋ฎ์ Weight(๊ฐ์ค์น)๋ฅผ ๋ถ์ฌํ๊ณ , ๋ฐ๋๋ก ์ถํ๋น๋๊ฐ ๋์ ๋จ์ด ์์๋ ๋์ Weight(๊ฐ์ค์น)๋ฅผ ๋ถ์ฌํฉ๋๋ค.
- ์ด์ ๋ ๊ณ ๋ฐ๋ ๋จ์ด์์ด Model์ ์ง๋ฐฐํ๋๊ฒ์ ๋ฐฉ์งํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ์๋ฅผ ๋ค๋ฉด ๋ถ์ฉ์ด('the', 'is', 'are')๋ ๋น๋ฒํ๊ฒ ๋ํ๋์ง๋ง, ๋ถ์ฉ์ด๋ค๋ผ๋ฆฌ ์๋ก ์๋ฏธ์ ์ผ๋ก ๋ณด๋ฉด ๊ฐ๊น๋ค๋๊ฑธ ์๋ฏธํ์ง ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
- ๊ทธ๋์ ๋ถ์ฉ์ด์ ๊ฐ์ ๋จ์ด์์ ๋ํ Weight(๊ฐ์ค์น)๋ฅผ ์ค์ด๋๊ฒ์ Model์ ํ์ต์ ๋์์ด ๋ ๋ฟ๋๋ฌ ํฌ๊ท & ํ์์ฑ์ด ์๋ ๋จ์ด ์์ ์ ๋ณด๋ฅผ ๋ณด์กดํ๋๋ฐ ๋์์ ์ค๋๋ค.
- ๊ทธ๋ฆฌ๊ณ Weight(๊ฐ์ค์น)ํจ์๋ Model์ด ๋จ์ํ ๋์ ์ถํ ๋น๋๊ฐ ๋์ ๋จ์ด์๋ง์ ๊ณ ๋ คํ๋๊ฒ์ด ์๋, ๋ค์ํ ๋จ์ด์ ๊ฐ์ ๊ด๊ณ๋ฅผ ํ์ตํ์ฌ ์ ํํ๊ณ ๋ค์ํ ๋จ์ด ์๋ฏธ๋ฅผ ํฌ์ฐฉํ๋๋ฐ ๋์์ ์ค๋๋ค.
- ๋ํ f(x) ํจ์๋ 1๋ณด๋ค ํฐ ๊ฐ์ ๋ฐํํ์ง ์์ผ๋ฉฐ, Weight๋ 0~1 ์ฌ์ด์ ๊ฐ์ ๊ฐ์ง๋๋ค.
- ์ด ๋ฐฉ์์ ๋์ ์ถํ(Co-occurence)์ด ์์ ๊ทธ๋ํ Xmax ๋ผ๋ ๋ณ์๊ฐ ๊ฐ์ฅ ๋์ ๋์ ์ถํ(Co-occurence)๋ฅผ ์ด๊ณผํ๋ ๋จ์ด์์ ๋ฐํ์ฌ Weight(๊ฐ์ค์น)๋ฅผ ์ ํํจ์ผ๋ก, ๋์ ๋์ ์ถํ(Co-occurence) ํ์๋ฅผ ๊ฐ์ง ๋จ์ด์์ด ํ์ต์ ๊ณผ๋ํ ์ํฅ์ ์ฃผ๋๊ฒ์ ๋ฐฉ์งํฉ๋๋ค.
- ์ด f(x) ํจ์์ ์์ ์๋์ ์ผ์ชฝ์ ์๊ณผ ๊ฐ์ด ์ ์๋๊ณ , ์ต์ข ์ ์ผ๋ก ์์คํจ์์ ์์ ์๋์ ์ค๋ฅธ์ชฝ์ ์๊ณผ ๊ฐ์ด ์ ์๋ฉ๋๋ค.
Example Code - Glove
- Glove๋ฅผ ์ฌ์ฉํ์ฌ๋ ค๋ฉด Glove ํจํค์ง๋ฅผ ์ค์นํด ์ค์ผ ํฉ๋๋ค.
- ์๋๋ 'glove-python' ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํด์ ํด์ผํ์ง๋ง, ํ์ฌ ํจํค์ง ์ค์น ๊ณผ์ ์์ ์ค๋ฅ๊ฐ ์๋๊ฑฐ ๊ฐ์์ 'gensim' ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด์ ๋์ฒดํ๊ฒ ์ต๋๋ค.
pip install gensim
- ์ด ์ฝ๋๋ Glove์ ์ฌ์ ํ์ต์ด๋ ๋ชจ๋ธ ํ์ผ 'glove.6B.100d.txt'๋ฅผ ๋ถ๋ฌ์์ ์ฌ์ฉํ์ต๋๋ค. ์ด ๋ชจ๋ธ ํ์ผ์ด ์๋ Github๋ฅผ ์๋ ๋งํฌ ๋ฌ์๋์ํ ๋๊น ๊ผญ ๋ค์ด๋ก๋ ํ๊ณ , ๊ฒฝ๋ก ์ง์ ํด์ฃผ์ ์ ์ฝ๋ ๋๋ ค๋ณด์ ์ผ ํด์!
- ์ด Github ReadMe Page์ 'Download Pre-Trained Word Vector' ์น์ ์์ ๋ค์ด๋ก๋ ํ์๋ฉด ๋ฉ๋๋ค.
from gensim.scripts.glove2word2vec import glove2word2vec
from gensim.models import KeyedVectors
from sklearn.metrics.pairwise import cosine_similarity
import numpy as np
# GloVe ๋ชจ๋ธ์ word2vec ํ์์ผ๋ก ๋ณํ
glove_input_file = 'glove.6B.100d.txt' # ์ค์ GloVe ํ์ผ์ ๊ฒฝ๋ก๋ฅผ ์
๋ ฅํ์ธ์.
word2vec_output_file = 'glove.6B.100d.txt.word2vec'
glove2word2vec(glove_input_file, word2vec_output_file)
# ๋ณํ๋ ๋ชจ๋ธ ๋ถ๋ฌ์ค๊ธฐ
model = KeyedVectors.load_word2vec_format(word2vec_output_file, binary=False)
# ํ
์คํธ ํ์ผ์์ ๋ฌธ์ ์ฝ์ด์ค๊ธฐ
with open('your_text_file.txt', 'r', encoding='utf-8') as file:
documents = [line.strip().split() for line in file]
# ๋ฌธ์์ ๋ฑ์ฅํ๋ ๋จ์ด๋ค์ ๋ฒกํฐ๋ฅผ ์ถ์ถํ์ฌ ๋์ ๋ฑ์ฅ ํ๋ ฌ ์์ฑ
word_vectors = [model[word] for document in documents for word in document]
co_occurrence_matrix = cosine_similarity(word_vectors)
# ์
๋ ฅ ๋จ์ด์ ๋ํด ๊ฐ์ฅ ์ ์ฌํ ๋จ์ด๋ค์ ๋ฆฌ์คํธ ๋ฐํ
def most_similar_words(input_word, top_n=5):
if input_word in model:
input_vector = model[input_word]
similarity_scores = cosine_similarity([input_vector], word_vectors)[0]
most_similar_indices = np.argsort(similarity_scores)[::-1][:top_n]
most_similar_words = [model.index2word[index] for index in most_similar_indices]
return most_similar_words
else:
return []
# ๋จ์ด ์
๋ ฅ ๋ฐ ๊ฒฐ๊ณผ ์ถ๋ ฅ
input_word = 'hamburger'
similar_words = most_similar_words(input_word)
print(f"{input_word}์(๊ณผ) ์ ์ฌํ ๋จ์ด๋ค: {similar_words}")
- ์ฌ๊ธฐ์ "input_text_file"์๋ ์ฌ์ฉํ ํ๋ จ ๋ฐ์ดํฐ ํ์ผ์ ๋ฃ๊ณ , input_word์๋ ์๋ฌด๋ฐ ๋จ์ด๋ฅผ ๋ฃ์ผ๋ฉด "most_similar_words" ํจ์์์ ๋ฃ์ ๋จ์ด์ ๊ฐ์ฅ ์ ์ฌํ ๋จ์ด๋ค์ ๋ฆฌ์คํธ๋ฅผ ๋ฆฌํดํด์ค๋๋ค.
- ๋ํ top_n Parameter์์ ๋ฐํํ ์ ์ฌํ ๋จ์ด์ ๊ฐ์๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค.
FastText
- FastText๋ Facebook(ํ Meta)์์ ๊ฐ๋ฐํ ์คํ์์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก Word Embedding (๋จ์ด ์๋ฒ ๋ฉ)์ ์์ฑํ๊ณ ํจ๊ณผ์ ์ผ๋ก ํ ์คํธ ๋ถ๋ฅ ์์ ์ ํ ์ ์๋๋ก ๊ฐ๋ฐ๋์์ต๋๋ค.
- FastText์ ํน์ง์ ๋งค์ปค๋์ฆ ์์ฒด๋ Word2Vec์ ํ์ฅํ ๊ฐ๋ ์ด์ง๋ง, ์ฐจ์ด์ ์ FastText๋ Word2Vec๊ณผ ๋ฌ๋ฆฌ ํ๋์ ๋จ์ด ์์๋ ์ฌ๋ฌ ๋จ์ด๋ค์ด ์กด์ฌํ๋๊ฒ์ผ๋ก ๊ฐ์ฃผํฉ๋๋ค. ์ฆ, subword๋ฅผ ๊ณ ๋ คํ์ฌ ํ์ตํฉ๋๋ค.
N-gram
- FastText์์ ๊ฐ ๋จ์ด๋ ๊ธ์ ๋จ์ N-gram ๊ตฌ์ฑ์ผ๋ก ์ด๋ฃจ์ด์ ธ ์์ต๋๋ค.
- ์ฌ๊ธฐ์ N-gram์ ์ธ์ดํ, ํต๊ณํ์ ๊ฐ๋ ์์ ๊ฐ์ ธ์จ๊ฒ์ผ๋ก, ์ฐ์๋ n๊ฐ์ ํญ๋ชฉ(์ฌ๊ธฐ์๋ ๋จ์ด์ ๋๋ค)๋ฅผ ๋ํ๋ ๋๋ค.
- ์ฌ๊ธฐ์ "n"์ ์ฐ์๋ ํญ๋ชฉ์ ๊ฐ์๋ก ๋ํ๋ด๋๋ฐ, 1-gram์ ์ ๋๊ทธ๋จ(Unigram), 2-gram์ ๋ฐ์ด๊ทธ๋จ(Bigram), 3-gram์ ํธ๋ผ์ด๊ทธ๋จ(Trigram)์ผ๋ก ๋ถ๋ฆ ๋๋ค.
- N-gram์ Text์์ ์ด๋ค ํจํด์ด๋ ๋ฌธ๋งฅ์ ํ์ ํ๋ ๋ฐ์ ์ฌ์ฉ๋ฉ๋๋ค. ์ฃผ๋ก ์์ฐ์ด์ฒ๋ฆฌ(NLP)์์ Text๋ฅผ ํน์ ํฌ๊ธฐ์ n-gram์ผ๋ก ๋๋์ด ์ฌ์ฉํ๋ฉด, ๋ฌธ์ฅ์ด๋ ๋ฌธ์์ ๊ตฌ์กฐ, ์๋ฏธ, ๋ฌธ๋งฅ ๋ฑ์ ํ์ ํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
- ์๋ฅผ ๋ค์ด์ "house"๋ผ๋ ๋ฌธ์ฅ์ 3-gram์ธ ํธ๋ผ์ด๊ทธ๋จ(Trigram)์ผ๋ก Vectorํ ํด์ 5๊ฐ์ ๋ด๋ถ ๋จ์ด(subword) Token์ Vector๋ก ๋ง๋ญ๋๋ค.
# n = 3์ธ ๊ฒฝ์ฐ
<ho, hou, ous, use, se>
- ๊ทธ๋ฆฌ๊ณ ์ถ๊ฐ์ ์ผ๋ก ๊ธฐ์กด ๋จ์ด์ธ ์ <, ์ >๋ฅผ ๋ถ์ธ ํ ํฐ์ ํ๋๋ ๋ฒกํฐํ ํด์ค๋๋ค.
# ์ถ๊ฐ ํ ํฐ
<house>
- ์ค์ ์ฌ์ฉํ ๋ n์ ์ต์, ์ต๋ ๊ฐ์ผ๋ก ๋ฒ์๋ฅผ ์ค์ ํ ์ ์๋๋ฐ, ๊ธฐ๋ณธ์ผ๋ก ์ต์๋ 3, ์ต๋๋ 6์ผ๋ก ์ค์ ๋์ด ์์ต๋๋ค.
- ์ด ๋จ์ด๋ค์ ๋ํด์ FastText๋ ๋ด๋ถ ๋จ์ด๋ค์ Vectorํ ํฉ๋๋ค.
# n = 3 ~ 6์ธ ๊ฒฝ์ฐ
<ho, hou, ous, use, se>, <hou, hous, ouse, use>, ..., <house>
- ์ฌ๊ธฐ์ ๋ด๋ถ ๋จ์ด๋ค์ Vectorํ ํ๋ค๋๊ฑด ์ด ๋ด๋ถ๋จ์ด๋ค์ ๋ํ์ฌ Word2Vec์ ์ํํ๋ค๋ ์๋ฏธ์ ๋๋ค.
- ์ด๋ ๊ฒ ์ํํด์ ๋ด๋ถ ๋จ์ด๋ค์ Vector๊ฐ๋ค์ ์ป์์ผ๋ฉด, ๋จ์ด house์ Vector๊ฐ๋ค์ ๋ฒกํฐ๊ฐ๋ค์ ์ด ํฉ์ ๋๋ค.
house = <ho + hou + ous + use + se>, <hou + hous + ouse + use>, ..., + <house>
๋ชจ๋ฅด๋ ๋จ์ด
- FastText์ ์ธ๊ณต ์ ๊ฒฝ๋ง์ ํ์ตํ ํ์๋ ๋ฐ์ดํฐ์ ์ ๋ชจ๋ ๊ฐ n-gram์ ๋ํด์ Word Embedding์ด ๋ฉ๋๋ค.
- ์ด๋ ๊ฒ ๋๋ฉด ๋ฐ์ดํฐ์ ๋ง ์ถฉ๋ถํ๋ค๋ฉด ์์ ๊ฐ์ ๋ด๋ถ ๋จ์ด(subword)๋ฅผ ํตํด ๋ชจ๋ฅด๋ ๋จ์ด(Out of Vocabulary, OOV)์ ๋ํด์๋ ๋ค๋ฅธ ๋จ์ด์์ ์ ์ฌ๋๋ฅผ ๊ณ์ฐํ ์ ์์ต๋๋ค.
- ์๋ฅผ ๋ค์ด์ FastText์์ "dancestudio"๋ผ๋ ๋จ์ด๊ฐ ํ์ต์ด ์๋์ด ์์ง๋ง, ๋ค๋ฅธ ๋จ์ด์์ "dance"์ "studio" ๋ด๋ถ ๋จ์ด๊ฐ ์์ผ๋ฉด FastText๋ "dancestudio"์ Vector๋ฅผ ์ป์ ์ ์์ต๋๋ค.
- Word2Vec, Glove๋ ๋ชจ๋ฅด๋ ๋จ์ด์ ๋ฐํ์ฌ ๋์ฒํ ์ ์๋๊ฒ ๊ณผ๋ ๋ค๋ฅธ์ ์ ๋๋ค.
๋น๋์๊ฐ ์ ์ ๋จ์ด
- ๋ฑ์ฅ ๋น๋์๊ฐ ์ ์(rate word)์ ๋ํด์ Word2Vec์ Embedding์ ์ ํ๋๊ฐ ๋์ง ์์๋ค๋ ๋จ์ ์ด ์์ต๋๋ค. ์ฐธ๊ณ ํ ์ ์๋ ์๊ฐ ์ ๊ธฐ ๋๋ฌธ์ ๋๋ค.
- ๊ทผ๋ฐ, FastText๋ ๋จ์ด๊ฐ ์ ์(rate word) ํ๊ท ๋จ์ด๋ผ๋, ๊ทธ ๋จ์ด์ N-gram์ด ๋ค๋ฅธ ๋จ์ด์ N-gram์ด ๊ฒน์น๋ ๊ฒฝ์ฐ์๋ ๋์ Embedding Vector๊ฐ์ ์ป์ต๋๋ค.
- FastText๊ฐ Noise๊ฐ ๋ง์ ์ฝํผ์ค์์ ๊ฐ์ ์ ๊ฐ์ง๋ ๊ฒ์ ์ด์ ์ ๋๋ค.
- ๋ชจ๋ ํ๋ จ ์ฝํผ์ค์ ์คํ, ๋ง์ถค๋ฒ์ด ํ๋ฆฐ ๋จ์ด๊ฐ ์์ผ๋ฉด ์ข๊ฒ ์ง๋ง, ์ค์ ๋ง์ ๋น์ ํ ๋ฐ์ดํฐ์๋ ์คํ๊ฐ ์์ฌ์์ต๋๋ค.
- ๊ทธ๋ฆฌ๊ณ ์คํ๊ฐ ์์ธ ๋จ์ด๋ ๋น์ฐํ ๋ฑ์ฅ ๋น๋์๊ฐ ๋งค์ฐ ์ ์ผ๋ฏ๋ก ์ผ์ข ์ ํฌ๊ท ๋จ์ด๊ฐ ๋ฉ๋๋ค.
- Word2Vec์์๋ ์คํ๊ฐ ์์ธ ๋จ์ด๋ Embedding์ด ์ ๋๋ก ์๋์ง๋ง FastText๋ ๊ทธ๋๋ ์ผ์ ์์ค์ ์ฑ๋ฅ์ ๋ณด์ ๋๋ค.
- ์๋ฅผ ๋ค์ด ๋จ์ด apple๊ณผ ์คํ๋ก p๋ฅผ ํ ๋ฒ ๋ ์ ๋ ฅํ appple์ ๊ฒฝ์ฐ์๋ ์ค์ ๋ก ๋ง์ ๊ฐ์์ ๋์ผํ n-gram์ ๊ฐ์ง ๊ฒ์ ๋๋ค.
Example Code - FastText
- FastText๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด 'gensim' ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด์ผ ํ๋ฏ๋ก ์ค์นํ๊ฒ ์ต๋๋ค.
pip install gensim
from gensim.models import FastText
from sklearn.metrics.pairwise import cosine_similarity
import numpy as np
# ํ
์คํธ ํ์ผ์์ ๋ฌธ์ ์ฝ์ด์ค๊ธฐ
with open('your_text_file.txt', 'r', encoding='utf-8') as file:
documents = [line.strip().split() for line in file]
# FastText ๋ชจ๋ธ ํ์ต
fasttext_model = FastText(documents, vector_size=100, window=5, min_count=1, workers=4)
# ์
๋ ฅ ๋จ์ด์ ๋ํด ๊ฐ์ฅ ์ ์ฌํ ๋จ์ด๋ค์ ๋ฆฌ์คํธ ๋ฐํ
def most_similar_words(input_word, top_n=5):
if input_word in fasttext_model.wv:
most_similar_words = fasttext_model.wv.most_similar(input_word, topn=top_n)
return [word for word, _ in most_similar_words]
else:
return []
# ๋จ์ด ์
๋ ฅ ๋ฐ ๊ฒฐ๊ณผ ์ถ๋ ฅ
input_word = 'input_word'
similar_words = most_similar_words(input_word)
print(f"{input_word}์(๊ณผ) ์ ์ฌํ ๋จ์ด๋ค: {similar_words}")
- ์ฌ๊ธฐ์ "input_text_file"์๋ ์ฌ์ฉํ ํ๋ จ ๋ฐ์ดํฐ ํ์ผ์ ๋ฃ๊ณ , "input_word"์๋ ์๋ฌด๋ฐ ๋จ์ด๋ฅผ ๋ฃ์ผ๋ฉด "most_similar_words" ํจ์์์ ๋ฃ์ ๋จ์ด์ ๊ฐ์ฅ ์ ์ฌํ ๋จ์ด๋ค์ ๋ฆฌ์คํธ๋ฅผ ๋ฆฌํดํด์ค๋๋ค.
- ๋ํ top_n Parameter์์ ๋ฐํํ ์ ์ฌํ ๋จ์ด์ ๊ฐ์๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค.
๋ฐ์ํ
'๐ NLP (์์ฐ์ด์ฒ๋ฆฌ) > ๐ Natural Language Processing' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[NLP] ํฉ์ฑ๊ณฑ, ์ํ์ ๊ฒฝ๋ง, Encoder, Decoder์์ ์ํํ๋ Self-Attention (0) | 2024.03.01 |
---|---|
[NLP] Attention - ์ดํ ์ (0) | 2024.02.17 |
[NLP] Word2Vec, CBOW, Skip-Gram - ๊ฐ๋ & Model (0) | 2024.02.03 |
[NLP] GRU Model - LSTM Model์ ๊ฐ๋ณ๊ฒ ๋ง๋ ๋ชจ๋ธ (0) | 2024.01.30 |
[NLP] LSTM - Long Short Term Memory Model (0) | 2024.01.29 |