์ถ์ฒ์์คํ ์ ๊ณต๋ถํ๋ฉด์ LDA(Latent Dirichlet Allocation)์ ๋ํด ํฌ์คํ ์ ํ์๋๋ฐ์!
[K-Data x ๋ฌ๋์คํผ์ฆ] 4-1. LDA๋ฅผ ์ด์ฉํ ์ถ์ฒ
์ค๋ ํฌ์คํ ์์๋ ๋น ๋ฅด๊ณ ์ค์ฉ์ ์ธ ์ถ์ฒ ๊ธฐ๋ฒ๋ค์ ๋ํด ์๊ฐํด๋ณด๋ ค๊ณ ํฉ๋๋ค! ์ ๋ช ํ์ง ์์ง๋ง ์ค์ ๋ก ๋น์ฆ๋์ค/์๋น์ค์์ ๋ง์ด ์ฌ์ฉ๋๋ ๋ชจ๋ธ๋ค์ด๋ ์ ๊ณต๋ถํด๋์ผ์๋ฉด ๋์์ด ๋ ๊ฒ์ด๋ผ๊ณ
xod22.tistory.com
์ค๋์ python์ ์ฌ์ฉํด์ ๋ด์ค๊ทธ๋ฃน ๋ฐ์ดํฐ ์ธํธ๋ฅผ ์ด์ฉํด LDA๋ฅผ ์ ์ฉํด๋ณด๋ ค๊ณ ํฉ๋๋ค!

ํ ํฝ ๋ชจ๋ธ๋ง
: ํ ํฝ ๋ชจ๋ธ๋ง(Topic Modeling)์ด๋ ๋ฌธ์ ์งํฉ์ ์จ์ด ์๋ ์ฃผ์ ๋ฅผ ์ฐพ์๋ด๋ ๊ฒ์ ๋๋ค.
์ฌ๋์ด ์ํํ๋ ํ ํฝ ๋ชจ๋ธ๋ง์ ๋ ํจ์ถ์ ์ธ ์๋ฏธ๋ก ๋ฌธ์ฅ์ ์์ฝํ๋ ๊ฒ์ ๋ฐํด, ๋จธ์ ๋ฌ๋ ๊ธฐ๋ฐ ํ ํฝ ๋ชจ๋ธ์ ์จ๊ฒจ์ง ์ฃผ์ ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ํํํ ์ ์๋ ์ค์ฌ ๋จ์ด๋ฅผ ํจ์ถ์ ์ผ๋ก ์ถ์ถํฉ๋๋ค.
๋จธ์ ๋ฌ๋ ๊ธฐ๋ฐ ํ ํฝ ๋ชจ๋ธ๋ง์ ์์ฃผ ์ฌ์ฉ๋๋ ๊ธฐ๋ฒ์ LSA(Latent Semantic Analysis)์ LDA(Latent Dirichlet Allocatoin)์ ๋๋ค.
์ค์ต
20๋ด์ค๊ทธ๋ฃน ๋ฐ์ดํฐ๋ 20๊ฐ์ ์ฃผ์ ๋ฅผ ๊ฐ์ง ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณ ์๋๋ฐ ์ด์ค ํน์ 8๊ฐ์ ์ฃผ์ ๋ฅผ ์ถ์ถํด์ ์ฌ์ฉํด๋ณด๊ฒ ์ต๋๋ค.
1. ํจํค์ง ์ํฌํธ & ์ฌ์ดํท๋ฐ ๋ด์ฅ๋ฐ์ดํฐ(20๋ด์ค๊ทธ๋ฃน ๋ฐ์ดํฐ) ๋ถ๋ฌ์ค๊ธฐ
from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.decomposition import LatentDirichletAllocation
2. ์นด์ดํธ ๊ธฐ๋ฐ ํผ์ฒ ๋ฒกํฐํ
#๋ชจํ ์ฌ์ดํด, ์ผ๊ตฌ, ๊ทธ๋ํฝ์ค, ์๋์ฐ์ฆ, ์ค๋, ๊ธฐ๋
๊ต, ์ ์๊ณตํ, ์ํ 8๊ฐ ์ฃผ์ ๋ฅผ ์ถ์ถ
cats = ['rec.motorcycles', 'rec.sport.baseball', 'comp.graphics', 'comp.windows.x', 'talk.politics.mideast', 'soc.religion.christian', 'sci.electronics', 'sci.med']
#์์์ cats๋ณ์๋ก ๊ธฐ์ฌ๋ ์นดํ
๊ณ ๋ฆฌ๋ง ์ถ์ถ, fetch_20newsgrouops()์ categories์ cats์
๋ ฅ
news_df = fetch_20newsgroups(subset='all', remove=('headers', 'footers', 'quotes'), categories=cats, random_state=0)
#LDA๋ Count๊ธฐ๋ฐ์ ๋ฒกํฐํ๋ง ์ ์ฉํฉ๋๋ค.
count_vect = CountVectorizer(max_df=0.95, max_features=1000, min_df=2, stop_words='english', ngram_range=(1,2))
fect_vect = count_vect.fit_transform(news_df.data)
print(fect_vect)
print(fect_vect.shape)
7862๊ฐ์ ๋ฌธ์๊ฐ 1000๊ฐ์ ํผ์ฒ๋ก ๊ตฌ์ฑ๋ ํ๋ ฌ ๋ฐ์ดํฐ๋ก ๋ณํ๋จ..!
3. LDA ํ ํฝ ๋ชจ๋ธ๋ง ์ํ
: n_components์ ์ถ์ถํ๊ณ ์ ํ๋ ํ ํฝ์ ์๋ฅผ ์ง์ ํ๋ฉด ๋ฉ๋๋ค. ๊ฒฐ๊ณผ๋ก components_๋ ๊ฐ๋ณ ํ ํฝ๋ณ๋ก ๊ฐ wordํผ์ฒ๊ฐ ์ผ๋ง๋ ๋ง์ด ํด๋น ํ ํฝ์ ํ ๋น๋๋์ง์ ๋ํ ์์น๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. ๋์ ๊ฐ์ผ์๋ก ํด๋น wordํผ์ฒ๋ ๊ทธ ํ ํฝ์ ์ค์ฌ word๊ฐ ๋ฉ๋๋ค.
lda = LatentDirichletAllocation(n_components=8, random_state=0)
lda.fit(fect_vect)
print(lda.components_.shape)
lda.components_
components_๋ array[8, 1000]์ผ๋ก ๊ตฌ์ฑ๋ผ ์์ต๋๋ค.
8๊ฐ์ ํ ํฝ๋ณ๋ก 1,000๊ฐ์ word ํผ์ฒ๊ฐ ํด๋น ํ ํฝ๋ณ๋ก ์ฐ๊ด๋ ๊ฐ์ ๊ฐ๊ณ ์์ต๋๋ค.
์๋ฅผ๋ค์ด components_์ 0๋ฒ์งธ row(ํ), 10๋ฒ์งธ column(์ด)์ ์๋ ๊ฐ์ ํผ์ฒ ๋ฒกํฐํ๋ ํ๋ ฌ์์ 10๋ฒ์งธ ์ปฌ๋ผ์ ํด๋นํ๋ ํผ์ฒ๊ฐ Topic #0์ ์ฐ๊ด๋ ์์น๊ฐ์ ๋๋ค.
4. ๊ฐ topic๋ณ ๋ํ ๋จ์ด ์ถ๋ ฅ
def display_topics(model, feature_names, no_top_words):
for topic_index, topic in enumerate(model.components_):
print('Topic #', topic_index)
#components_ array์์ ๊ฐ์ฅ ๊ฐ์ด ํฐ ์์ผ๋ก ์ ๋ ฌํ์ ๋, ๊ทธ ๊ฐ์ array์ธ๋ฑ์ค๋ฅผ ๋ฐํ.
topic_word_indexes = topic.argsort()[::-1]
topic_index=topic_word_indexes[:no_top_words]
#top_indexes๋์์ธ ์ธ๋ฑ์ค๋ณ๋ก feature_names์ ํด๋นํ๋ word feature ์ถ์ถ ํ join concat
feature_concat = ' '.join([feature_names[i] for i in topic_index])
print(feature_concat)
#CountVectorizer๊ฐ์ฒด ๋ด์ ์ ์ฒด word์ ๋ช
์นญ์ get_feature_names()์ ํตํด ์ถ์ถ
feature_names = count_vect.get_feature_names()
#ํ ํฝ๋ณ ๊ฐ์ฅ ์ฐ๊ด๋๊ฐ ๋์ word๋ฅผ 15๊ฐ๋ง ์ถ์ถ
display_topics(lda, feature_names, 15)
Topic #0์ ๊ฒฝ์ฐ ์ํ์ ๊ด๋ จ๋ ์ฃผ์ ์ด๊ฐ ์ถ์ถ๋ ๊ฒ์ ์์ํ ์ ์์ต๋๋ค.
Topic #1์ ๊ฒฝ์ฐ ๋ช ํํ์ง ์๊ณ ์ผ๋ฐ์ ์ธ ๋จ์ด๊ฐ ์ฃผ๋ฅผ ์ด๋ฃจ๊ณ ์์ต๋๋ค.
Topic #2๋ ์ปดํจํฐ ๊ทธ๋ํฝ์ค ์์ญ์ ์ฃผ์ ์ด๊ฐ ์ถ์ถ๋๊ณ
Topic #3์ ๊ฒฝ์ฐ๋ ์ผ๋ฐ์ ์ธ ๋จ์ด๊ฐ ์ถ์ถ๋์ต๋๋ค.
Topic #4๋ ์ค๋๊ณผ ๊ด๋ จ๋ ๋จ์ด๊ฐ ์ถ์ถ๋๊ณ
Topic #5๋ ์ปดํจํฐ ๊ทธ๋ํฝ์ค ์์ญ์ ์ฃผ์ ์ด๊ฐ ์ผ๋ถ ์ถ์ถ๋์ต๋๋ค.
Topic #6๋ ๊ธฐ๋ ๊ต์ ๊ด๋ จ๋ ๋จ์ด๊ฐ ์ถ์ถ๋๊ณ ,
Topic #7๋ ์๋์ฐ ์ด์์ฒด์ ์ ๊ด๋ จ๋ ๋จ์ด๊ฐ ์ถ์ถ๋์ต๋๋ค.
Topic #1, Topic #3, Topic #5๊ฐ ์ ๋งคํ ์ฃผ์ ์ด๊ฐ ์ถ์ถ๋์ต๋๋ค. ํนํ ๋ชจํฐ์ฌ์ดํด, ์ผ๊ตฌ ์ฃผ์ ์ ๊ฒฝ์ฐ ๋ช ํํ ์ฃผ์ ์ด๊ฐ ์ถ์ถ๋์ง ์์์ต๋๋ค..!
'๐ ๋จธ์ ๋ฌ๋ | ๋ฅ๋ฌ๋ > ํ ์คํธ ๋ถ์' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํ ์คํธ ๋ถ์] KoNLPy - Twitter ์ค๋ฅ ํด๊ฒฐ (0) | 2022.03.22 |
---|---|
[ํ ์คํธ ๋ถ์] 6. KoNLPy๋ฅผ ์ด์ฉํ ๋ค์ด๋ฒ ์ํ ํ์ ๊ฐ์ฑ๋ถ์ (0) | 2022.03.19 |
[ํ ์คํธ ๋ถ์] 4-2. ๋น์ง๋ ํ์ต ๊ธฐ๋ฐ ๊ฐ์ฑ ๋ถ์ (0) | 2022.02.27 |
[ํ ์คํธ ๋ถ์] 4-1. ์ง๋ํ์ต ๊ธฐ๋ฐ ๊ฐ์ฑ ๋ถ์ - IMDB์ํํ (0) | 2022.02.26 |
[ํ ์คํธ ๋ถ์] 3. Bag of Words (BOW) (0) | 2022.02.24 |