๐ ์๋ฒ ๋ฉ
• ์๋ฒ ๋ฉ : ์ฌ๋์ ์ธ์ด๋ฅผ ์ปดํจํฐ๊ฐ ์ดํดํ ์ ์๋ ์ธ์ด (์ซ์) ํํ์ธ ๋ฒกํฐ๋ก ๋ณํํ ๊ฒฐ๊ณผ
• ์๋ฒ ๋ฉ์ ์ญํ
โช ๋จ์ด ๋ฐ ๋ฌธ์ฅ ๊ฐ ๊ด๋ จ์ฑ ๊ณ์ฐ
โช ์๋ฏธ์ ํน์ ๋ฌธ๋ฒ์ ์ ๋ณด์ ํจ์ถ (ex. ์-์ฌ์, ๊ต์ฌ-ํ์)
โ ํฌ์ํํ ๊ธฐ๋ฐ ์๋ฒ ๋ฉ : ์ํซ์ธ์ฝ๋ฉ
• Sparse representation : ๋๋ถ๋ถ์ ๊ฐ์ด 0์ผ๋ก ์ฑ์์ ธ ์๋ ๊ฒฝ์ฐ๋ก ๋ํ์ ์ธ ๋ฐฉ๋ฒ์ด ์ํซ์ธ์ฝ๋ฉ
• ์ํซ์ธ์ฝ๋ฉ : ๋จ์ด N ๊ฐ๋ฅผ ๊ฐ๊ฐ N ์ฐจ์์ ๋ฒกํฐ๋ก ํํํ๋ ๋ฐฉ์
from sklearn import preprocessing
label_encoder = preprocessing.LabelEncoder()
onehot_encoder = preprocessing.OneHotEncoder()
a = label_encoder.fit_transform(data['colunn'])
• ์ํซ์ธ์ฝ๋ฉ์ ๋จ์
โช ์ํ์ ์ธ ์๋ฏธ์์ ์ํซ๋ฒกํฐ๋ ํ๋์ ์์๋ง 1์ ๊ฐ์ง๊ณ ๋๋จธ์ง๋ 0์ ๊ฐ์ง๋ ํฌ์๋ฒกํฐ๋ฅผ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ ๋ ๋จ์ด์ ๋ํ ๋ฒกํฐ ๋ด์ ์ ๊ตฌํ๋ฉด 0์ ๊ฐ์ง๋ฏ๋ก ์ง๊ตํ๊ฒ ๋๋ค. ์ฆ ๋จ์ด๋ผ๋ฆฌ ๊ด๊ณ์ฑ (์ ์์ด, ๋ฐ์์ด) ์์ด ์๋ก ๋ ๋ฆฝ์ ์ธ ๊ด๊ณ๊ฐ ๋๋ค.
โช ํ๋์ ๋จ์ด๋ฅผ ํํํ๋๋ฐ ๋ง๋ญ์น์ ์๋ ๋จ์ด ๊ฐ์๋งํผ ์ฐจ์์ด ์กด์ฌํ๋ฏ๋ก ์ฐจ์์ ์ ์ฃผ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
๐ ๋์์ฑ : ์ ๊ฒฝ๋ง์ ๊ธฐ๋ฐํ์ฌ ๋จ์ด๋ฅผ ๋ฒกํฐ๋ก ๋ฐ๊พธ๋ Word2Vec, GloVe, FastText ๋ฐฉ๋ฒ๋ก ์ด ์ฃผ๋ชฉ์ ๋ฐ๊ณ ์์
โก ํ์๊ธฐ๋ฐ ์๋ฒ ๋ฉ : CountVector, TF-IDF
• ๋จ์ด๊ฐ ์ถํํ ๋น๋๋ฅผ ๊ณ ๋ คํด ์๋ฒ ๋ฉ ํ๋ ๋ฐฉ๋ฒ
(1) Count vector
• ๋ฌธ์์งํฉ์์ ๋จ์ด๋ฅผ ํ ํฐ์ผ๋ก ์์ฑํ๊ณ ๊ฐ ๋จ์ด์ ์ถํ ๋น๋์๋ฅผ ์ด์ฉํด ์ธ์ฝ๋ฉํด ๋ฒกํฐ๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ
• ํ ํฌ๋์ด์ง๊ณผ ๋ฒกํฐํ๊ฐ ๋์์ ๊ฐ๋ฅ
๋ฌธ์๋ฅผ ํ ํฐ ๋ฆฌ์คํธ๋ก ๋ณํ → ๊ฐ ๋ฌธ์์์ ํ ํฐ์ ์ถํ ๋น๋๋ฅผ ์นด์ดํธ → ๊ฐ ๋ฌธ์๋ฅผ ์ธ์ฝ๋ฉํ๊ณ ๋ฒกํฐ๋ก ๋ณํ
from sklearn.feature_extraction.text import CountVectorizer
corpus = [
'This is last chance.',
'and if you do not have this chance.',
'you will never get any chance.',
'will you do get this one?',
'please, get this chance',
]
vect = CountVectorizer()
vect.fit(corpus)
vect.vocabulary_ # ๋จ์ด์ฌ์
# countvector ์ ์ฉ ๊ฒฐ๊ณผ๋ฅผ ๋ฐฐ์ด๋ก ๋ณํํ๊ธฐ
vect.transform(['you will never get any chance']).toarray()
(2) TF-IDF
• ์ ๋ณด๊ฒ์๋ก ์์ ๊ฐ์ค์น๋ฅผ ๊ตฌํ ๋ ์ฌ์ฉ๋๋ ์๊ณ ๋ฆฌ์ฆ
• Term Frequency ๋จ์ด๋น๋ : ๋ฌธ์ ๋ด์์ ํน์ ๋จ์ด๊ฐ ์ถํํ ๋น๋
• Inverse Document Frequency ์ญ๋ฌธ์ ๋น๋ : ํ ๋จ์ด๊ฐ ์ ์ฒด ๋ฌธ์์์ ์ผ๋ง๋ ๊ณตํต์ ์ผ๋ก ๋ง์ด ๋ฑ์ฅํ๋์ง ๋ํ๋ด๋ ๊ฐ (ํน์ ๋จ์ด๊ฐ ๋ํ๋ ๋ฌธ์ ๊ฐ์) ์ธ DF ์ ์ญ์ ๊ฐ
โช ํค์๋ ๊ฒ์์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ๊ฒ์์์ง, ์ค์ ํค์๋ ๋ถ์, ๊ฒ์ ์์ง์์ ๊ฒ์ ๊ฒฐ๊ณผ์ ์์๋ฅผ ๊ฒฐ์ ํ๋ ์ํฉ์์ ์ฌ์ฉ๋๋ค.
from sklearn.feature_extraction.text import TfidfVectorizer
doc = ['I like machine learning', 'I love deep learning', 'I run everyday']
tfidf_vectorizer = TfidfVectorizer(min_df = 1)
# min_df : ์ต์ ๋น๋๊ฐ์ ์ค์ ํด์ฃผ๋ ํ๋ผ๋ฏธํฐ๋ก, DF ์ ์ต์๊ฐ์ ์ค์ (ํน์ ๋จ์ด๊ฐ ๋ํ๋ด๋ ๋ฌธ์์ ์)ํ์ฌ
## ํด๋น ๊ฐ๋ณด๋ค ์์ DF ๋ฅผ ๊ฐ์ง ๋จ์ด๋ค์ ๋จ์ด์ฌ์ ์์ ์ ์ธํ๋ค.
tfidf_matrix = tfidf_vectorizer.fit_transform(doc)
TF-IDF ๊ฐ์ ํน์ ๋ฌธ์ ๋ด์์ ๋จ์ด์ ์ถํ๋น๋๊ฐ ๋๊ฑฐ๋ ์ ์ฒด ๋ฌธ์์์ ํน์ ๋จ์ด๊ฐ ํฌํจ๋ ๋ฌธ์๊ฐ ์ ์์๋ก ๊ฐ์ด ๋๋ค. ๋ฐ๋ผ์ ์ด ๊ฐ์ ํ์ฉํด ๋ฌธ์์ ๋ํ๋๋ ํํ ๋จ์ด (a, the) ๋ค์ ๊ฑธ๋ฌ๋ด๊ฑฐ๋ ํน์ ๋จ์ด์ ๋ํ ์ค์๋๋ฅผ ์ฐพ์ ์ ์๋ค.
โข ์์ธก๊ธฐ๋ฐ ์๋ฒ ๋ฉ
• ์ ๊ฒฝ๋ง ๊ตฌ์กฐ๋ฅผ ์ด์ฉํด ํน์ ๋ฌธ๋งฅ์์ ์ด๋ค ๋จ์ด๊ฐ ๋์ฌ์ง "์์ธก" ํ๋ฉด์ ๋จ์ด๋ฅผ ๋ฒกํฐ๋ก ๋ง๋๋ ๋ฐฉ์
(1) Word2Vec
• ํ ์คํธ์ ๊ฐ ๋จ์ด๋ง๋ค ํ๋์ฉ ์ผ๋ จ์ ๋ฒกํฐ๋ฅผ ์ถ๋ ฅํ๋ค.
• word2vec ์ ์ถ๋ ฅ ๋ฒกํฐ๊ฐ 2์ฐจ์ ๊ทธ๋ํ์ ํ์๋ ๋ ์๋ฏธ๋ก ์ ์ผ๋ก ์ ์ฌํ ๋จ์ด์ ๋ฒกํฐ๋ ์๋ก ๊ฐ๊น๊ฒ ํํ๋๋ค. ์ฆ, ํน์ ๋จ์ด์ ๋์์ด๋ฅผ ์ฐพ์ ์ ์๋ค.
import gensim
from gensim.models import Word2Vec
→ ์๋์ธต์๋ ๊ฐ ๋จ์ด์ ๋ํ ๊ฐ์ค์น๊ฐ ํฌํจ๋์ด ์๋ค.
๐น CBOW
• ์ฃผ๋ณ๋จ์ด๋ก๋ถํฐ ์ค์ฌ ๋จ์ด๋ฅผ ์์ธกํ๋ ๋ฐฉ๋ฒ
• ๊ฐ์ค์น ํ๋ ฌ์ ๋ชจ๋ ๋จ์ด์์ ๊ณตํต์ผ๋ก ์ฌ์ฉ
โช ํฌ๊ธฐ๊ฐ N ์ธ ์๋์ธต : N ์ ์ ๋ ฅ ํ ์คํธ๋ฅผ ์๋ฒ ๋ฉํ ๋ฒกํฐ ํฌ๊ธฐ
โช V : ๋จ์ด์งํฉ์ ํฌ๊ธฐ
โช ์๋์ธต์ ์๋ฒ ๋ฉ๋ ๋ฒกํฐ ์ฐจ์์ ๋จ์ด์ ๋ฒกํฐ๋ก ์ฌ์ฉํ๋ ๊ฒ!
gensim.models.Word2Vec(data, min_count=1, size = 100, window = 5, sg = 0)
# data : ํ ํฐํ๋ ๋ฌธ์-๋จ์ด ๋ฆฌ์คํธ
# min_count : ๋จ์ด์ ๋ํ ์ต์ ๋น๋์ ์ ํ (๋น๋๊ฐ ์์ ๋จ์ด๋ ํ์ตX)
# size : ์๋ ๋ฒกํฐ์ ํน์ง๊ฐ. ์๋ฒ ๋ฉ๋ ๋ฒกํฐ์ ์ฐจ์
# window : ์ปจํ
์คํธ ์๋์ฐ์ ํฌ๊ธฐ
# sg = 0 : CBOW, sg = 1 : skip-gram
๐น Skip-gram
• ์ค์ฌ๋จ์ด๋ก๋ถํฐ ์ฃผ๋ณ ๋จ์ด๋ฅผ ์์ธกํ๋ ๋ฐฉ๋ฒ
• ์ ๋ ฅ ๋จ์ด ์ฃผ๋ณ์ k ๊ฐ์ ๋จ์ด๋ฅผ ๋ฌธ๋งฅ์ผ๋ก ๋ณด๊ณ ์์ธก ๋ชจํ์ ๋ง๋ ๋ค.
gensim.models.Word2Vec(data, min_count=1, size=100, window=5, sg=1)
# ๋จ์ด ์ ์ฌ๋ ๊ณ์ฐ
model2.wv.similarity('peter','wendy')
๋ฐ์ดํฐ ์ฑ๊ฒฉ, ๋ถ์์ ๋ํ ์ ๊ทผ ๋ฐฉ๋ฒ ๋ฐ ๋์ถํ๊ณ ์ ํ๋ ๊ฒฐ๋ก ๋ฑ์ ์ข ํฉ์ ์ผ๋ก ๊ณ ๋ คํด ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ค.
(2) Fasttext
• ํจ์คํธํ ์คํธ
Word2vec ์ ๋จ์ ์ ๋ณด์ํด ๊ฐ๋ฐ๋ ์๋ฒ ๋ฉ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. Word2vec ์ ๋ถ์ฐํํ์ ์ด์ฉํด ๋ถ์ฐ๋ถํฌ๊ฐ ์ ์ฌํ ๋จ์ด๋ค์ ๋น์ทํ ๋ฒกํฐ๊ฐ์ ํ ๋นํ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ฏ๋ก ์ฌ์ ์ ์๋ ๋จ์ด์ ๋ํด์๋ ๋ฒกํฐ ๊ฐ์ ์ป์ ์ ์๋ค๋ ๋จ์ ๊ณผ, ์์ฃผ ์ฌ์ฉ๋์ง ์๋ ๋จ์ด์ ๋ํด์ ํ์ต์ด ๋ถ์์ ํ๋ค๋ ๋จ์ ์ด ์๋ค.
FastText ๋ ๋ ธ์ด์ฆ์ ๊ฐํ๋ฉฐ ์๋ก์ด ๋จ์ด์ ๋ํด์๋ "ํํ์ ์ ์ฌ์ฑ" ์ ๊ณ ๋ คํ ๋ฒกํฐ ๊ฐ์ ์ป์ด ๋ง์ด ์ฌ์ฉ๋๋ ์๊ณ ๋ฆฌ์ฆ ์ค ํ๋๋ค.
FastText ๋ ์ฌ์ ์ ์๋ ๋จ์ด์ ๋ํด ๋ฒกํฐ ๊ฐ์ ๋ถ์ฌํ๊ธฐ ์ํด, ์ฃผ์ด์ง ๋ฌธ์์ ๊ฐ ๋จ์ด๋ฅผ n-gram ์ผ๋ก ํํํ๋ ๋ฐฉ์์ ์ฑํํ๋ค. ์ธ๊ณต ์ ๊ฒฝ๋ง์ ์ด์ฉํด ํ์ต์ด ์๋ฃ๋ ํ ๋ฐ์ดํฐ์ ์ ๋ชจ๋ ๋จ์ด๋ฅผ ๊ฐ n-gram ์ ๋ํด ์๋ฒ ๋ฉํ๋ค. ๋ฐ๋ผ์ ์ฌ์ ์ ์๋ ๋จ์ด๊ฐ ๋ฑ์ฅํ๋ฉด, n-gram ์ผ๋ก ๋ถ๋ฆฌ๋ subword ์ ์ ์ฌ๋๋ฅผ ๊ณ์ฐํด ์๋ฏธ๋ฅผ ์ ์ถํ ์ ์๋ค.
from gensim.test.utils import common_texts
from gensim.models import FastText
model = FastText(data, size = 4, window = 3, min_count = 1)
# data : word lists
# window : ๊ณ ๋ คํ ์๋ค ํญ (์๋ค ์ธ ๋จ์ด)
# min_count : ๋จ์ด์ ๋ํ ์ต์ ๋น๋์ ์ ํ
# ๋จ์ด ๊ฐ ์ ์ฌ๋ ๊ณ์ฐ
model.wv.similarity('peter', 'wendy')
• ์ฌ์ ํ๋ จ๋ ํจ์คํธํ ์คํธ ๋ชจ๋ธ ์ฌ์ฉ ์์
์ํคํผ๋์ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ ํ์ตํ ํ๊ตญ์ด ๋ชจ๋ธ์ ๋ด๋ ค๋ฐ์ ์ฌ์ฉํ๋ค.
from __future__ import print_function
from gensim.models import KeyedVectors # gensim ์ ์ด์ฉํด ์ฌ์ ํ์ต๋ ๋ชจ๋ธ์ ์ด์ฉ
model_kr = KeyedVectors.load_word2vec_format('wiki.ko.vec') # ์ฌ์ ํ์ต๋ ๋ชจ๋ธ ๋ก๋ฉ
find_similar_to = '๋
ธ๋ ฅ' # ๋
ธ๋ ฅ๊ณผ ์ ์ฌํ ๋จ์ด์ ์ ์ฌ๋๋ฅผ ํ์ธ
for similar_word in model_kr.similar_by_word(find_similar_to) : # similar_by_word
print("Word: {0}, Similarity: {1:.2f}".format(
similar_word[0], similar_word[1]
))
๋ ธ๋ ฅ์ด๋ผ๋ ๋จ์ด์ ์กฐ์ฌ๊ฐ ๋ถ์ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฌ์ค๋ค.
similarities = model_kr.most_similar(positive=['๋๋ฌผ', '์ก์๋๋ฌผ'], negative=['์ฌ๋']) # most_similar
print(similarities)
# "๋๋ฌผ", "์ก์๋๋ฌผ" ์๋ ๊ธ์ ์ ์ด์ง๋ง, "์ฌ๋" ์๋ ๋ถ์ ์ ์ธ ๋จ์ด๋ฅผ ์ดํด๋ณด๊ธฐ
# ์ฌ๋๊ณผ๋ ๊ด๊ณ๊ฐ ์์ผ๋ฉด์ ๋๋ฌผ๊ณผ ๊ด๋ จ๋ ๋จ์ด๋ค์ ์ถ๋ ฅํ๋ค.
โฃ ํ์/์์ธก ๊ธฐ๋ฐ ์๋ฒ ๋ฉ
• Glove
ํ์๊ธฐ๋ฐ์ LSA ์ ์์ธก๊ธฐ๋ฐ์ Word2vec ๋จ์ ์ ๋ณด์ํ๊ธฐ ์ํ ๋ชจ๋ธ์ด๋ค. ๊ธ๋ก๋ฒ ๋์๋ฐ์ ํ๋ฅ ์ ํฌํจํ๋ ๋จ์ด ์๋ฒ ๋ฉ ๋ฐฉ๋ฒ์ผ๋ก, ๋จ์ด์ ๋ํ ํต๊ณ ์ ๋ณด์ skip-gram ์ ํฉ์น ๋ฐฉ์์ด๋ผ๊ณ ํ ์ ์๋ค.
from gensim.test.utils import datapath, get_tmpfile
from gensim.models import KeyedVectors
from gensim.scripts.glove2word2vec import glove2word2vec
glove_file = datapath('..\chap10\data\glove.6B.100d.txt') # ์๋ง์ ๋จ์ด์ ๋ํด ์ฐจ์ 100๊ฐ๋ฅผ ๊ฐ์ง๋ ์๋ฒ ๋ฉ ๋ฒกํฐ๋ฅผ ์ ๊ณต
word2vec_glove_file = get_tmpfile("glove.6B.100d.word2vec.txt")
glove2word2vec(glove_file, word2vec_glove_file) # word2vec ํํ๋ก ๊ธ๋ก๋ธ ๋ฐ์ดํฐ๋ฅผ ๋ณํ
model = KeyedVectors.load_word2vec_format(word2vec_glove_file) # word2vec.c ํ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ด
# bill ๋จ์ด ๊ธฐ์ค์ผ๋ก ๊ฐ์ฅ ์ ์ฌํ ๋จ์ด์ ๋ฆฌ์คํธ๋ฅผ ์ถ๋ ฅ
model.most_similar('bill')
# ‘cherry’์ ๊ด๋ จ์ฑ์ด ์๋ ๋จ์ด์ ๋ฆฌ์คํธ๋ฅผ ๋ฐํ
model.most_similar(negative=['cherry'])
# ‘woman’, ‘king’๊ณผ ์ ์ฌ์ฑ์ด ๋์ผ๋ฉด์ ‘man’๊ณผ ๊ด๋ จ์ฑ์ด ์๋ ๋จ์ด๋ฅผ ๋ฐํ
model.most_similar(positive=['woman', 'king'], negative=['man'])
# ‘breakfast cereal dinner lunch’ ์ค ์ ์ฌ๋๊ฐ ๋ฎ์ ๋จ์ด๋ฅผ ๋ฐํ
model.doesnt_match("breakfast cereal dinner lunch".split())
'1๏ธโฃ AIโขDS > ๐ Deep learning' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฅ๋ฌ๋ ํ์ดํ ์น ๊ต๊ณผ์] 7์ฅ ์๊ณ์ด I (1) | 2022.11.10 |
---|---|
[๋ฅ๋ฌ๋ ํ์ดํ ์น ๊ต๊ณผ์] 5์ฅ ํฉ์ฑ๊ณฑ ์ ๊ฒฝ๋ง โ (0) | 2022.10.06 |
[๋ฅ๋ฌ๋ ํ์ดํ ์น ๊ต๊ณผ์] 4์ฅ ๋ฅ๋ฌ๋ ์์ (1) | 2022.10.04 |
[๋ฅ๋ฌ๋ ํ์ดํ ์น ๊ต๊ณผ์] 2์ฅ ์ค์ต ํ๊ฒฝ ์ค์ ๊ณผ ํ์ดํ ์น ๊ธฐ์ด (1) | 2022.09.23 |
[๋ฅ๋ฌ๋ ํ์ดํ ์น ๊ต๊ณผ์] 1์ฅ ๋จธ์ ๋ฌ๋๊ณผ ๋ฅ๋ฌ๋ (0) | 2022.09.22 |
๋๊ธ