[ํ ์คํธ๋ง์ด๋] ํ๊ธ Word Clustering
ํ๊ธ Word Clustering
1. ํจํค์ง ๋ฐ ๋ฐ์ดํฐ ํ์ผ ๋ถ๋ฌ์ค๊ธฐ
- ํจํค์ง ๋ถ๋ฌ์ค๊ธฐ
import pickle
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.cluster import KMeans
from scipy.cluster.hierarchy import dendrogram, ward
from sklearn.metrics.pairwise import cosine_similarity
from matplotlib import font_manager
import matplotlib.pyplot as plt
- ๋ฐ์ดํฐ ํ์ผ ๋ถ๋ฌ์ค๊ธฐ
with open('ko_stopped_join.bin','rb') as fp :
ko_word_joined = pickle.load(fp)
์ฌ์ ์ ์ ์ฅํด๋ ์ ์ฒ๋ฆฌ๋ฅผ ๊ฑฐ์น ํ๊ธ ๋ฌธ์ ํ์ผ์ ๋ถ๋ฌ์จ๋ค.
์ด๋ ๋จ์ด๋ค์ด ํ๋์ ๋ฌธ์ฅ์ฒ๋ผ ๋์ด๋ ํํ ์๋ฃ์ฌ์ผ ํ๋ค.
โ with ๋ฌธ
ํ์ผ ์
์ถ๋ ฅ ๊ตฌ๋ฌธ์ ํ๋์ with ๊ตฌ๋ฌธ์ผ๋ก ๋ฌถ์ด์ ์ฌ์ฉ
with expression as target : suite
2. TFIDF์ DTM / TDM ๋ง๋ค๊ธฐ
- ko_tfidf_vectorizer์ TfidifVectorizer ์ฌ์ฉ ์ ์ธ
ko_tfidf_vectorizer = TfidfVectorizer()
TF: ํ๋์ ๋ฌธ์์์ ํน์ ๋จ์ด(Term)์ ๋ฑ์ฅ ๋น๋(Frequency)
IDF: ํน์ ๋จ์ด๊ฐ ๋ฑ์ฅํ ๋ฌธ์(Document)์ ๋น๋(Frequency)์ ์ญ์(Inverse)
- ๋ฐ์ดํฐ๋ฅผ ํ์ต์ํค๊ณ , TDM ํํ๋ก ๋ณํ
ko_tfidf_dtm = ko_tfidf_vectorizer.fit_transform(ko_word_joined)
ko_tfidf_tdm = ko_tfidf_dtm.T
- ์ด๋ฆ ๊ฐ์ ธ์ค๊ธฐ
ko_tfidf_tdm_word = ko_tfidf_vectorizer.get_feature_names()
โ get_feature_names(): ์ธ๋ฑ์ค์์ ์ด๋ฆ ๊ฐ์ ธ์ด
- ์ฝ์ฌ์ธ ๊ฑฐ๋ฆฌ ๊ณ์ฐ
ko_tfidf_dist = 1-cosine_similarity(ko_tfidf_tdm)
โ cosine_similarity() : ์ฝ์ฌ์ธ ์ ์ฌ๋ ์ธก์
๊ฐ์ ๋ฐฉํฅ(0°) 1 / ์์ ํ ๋ฐ๋ ๋ฐฉํฅ (180°) -1 / ์๋ก ๋
๋ฆฝ์ (90°) 0
-> ์ ์ฌํ ์๋ก 1์ ๊ฐ๊น์
โ 1 - cosine_similarity() : ์ฝ์ฌ์ธ ๊ฑฐ๋ฆฌ ๊ณ์ฐ
๊ฐ์ ๋ฐฉํฅ(0°) 0 / ์์ ํ ๋ฐ๋ ๋ฐฉํฅ(180°) 2 /์๋ก ๋
๋ฆฝ์ (90°) 1
-> ๊ตฐ์ง ๋ถ์์ ์ํด์๋ ๊ฑฐ๋ฆฌ์ ๊ฐ๋
์ด ํ์ํจ
๋ค๋ฅผ ์๋ก ์ซ์๊ฐ ์ปค์ง๊ณ , ๊ฐ๊น์ธ ์๋ก ์์ ๊ฐ ๊ตฌํ๋๋ก 1 ์์ cosine_similarity ๋นผ์ค
3. ๊ตฐ์ง๋ถ์ ์ํ
- ๊ตฐ์ง ์ ์ค์
k = 5
- K-means ์ ์ฉ
ko_kmeans_model = KMeans(n_clusters=k, init='k-means++', max_iter=10, n_init=10, random_state=777).fit(ko_tfidf_tdm)
KMeans ํ์ดํผํ๋ผ๋ฏธํฐ
- n_cluster : ํด๋ฌ์คํฐ์ ์(k) ์ค์
- init : ์ด๊ธฐํ ๋ฉ์๋ (๊ธฐ๋ณธ๊ฐ k-means++)
- max_iter : ๋ฐ๋ณต ์คํํ๋ ์ต๋ ํ์
- n_init : ์ด๊ธฐ ์ค์ฌ์์น ์๋ ํ์
- ๊ตฐ์ง ์ ๋ ฌ
order_centroids = ko_kmeans_model.cluster_centers_.argsort()[:, ::-1] #์ค๋ฆ์ฐจ์
- .cluster_centers_ : ์ขํ๊ฐ ํ์ธ
- argsort() : ์ธ๋ฑ์ค๋ฅผ ๋ฆฌ์คํธ ํํ๋ก ๋ฐํ
- ๋จ์ด์ ๋ผ๋ฒจ ๋ถ์ด๊ธฐ
ko_kmeans_model_word_label = ko_kmeans_model.labels_
word_dict = dict(zip(ko_tfidf_tdm_word, ko_kmeans_model_word_label))
๊ฐ ๊ตฐ์ง์ ์ํด ์๋ ๋ผ๋ฒจ์ ์ ์ฅํ๊ณ , ๊ฐ๊ฐ์ ๋จ์ด์ ์ด๋ฆ์ด ์ ์ฅ๋ tdm ์๋ฃ์ ์ฐ๊ฒฐํ์ฌ(zip) ์ฌ์ ํํ๋ค.
์ด ๋จ์ด๊ฐ ๋ช ๋ฒ์งธ ๋จ์ด์ธ์ง ๋งค์นญํ๋ ์์
์ด๋ค. ๋ผ๋ฒจ์ด ID์ ๊ฐ์ ์ญํ ์ ํ๊ฒ ๋๋ค.
- ๋จ์ด ๊ตฐ์งํ
for i in range(k) :
word_cluster = [k for k, v in word_dict.items() if v == i]
print('* cluster {}', format(i))
print('Words: {}\n'.format(' '.join(str(x) for x in word_cluster)))
for๋ฌธ์ ํตํด n๋ฒ์งธ ๋ฌธ์๊ฐ ๊ตฐ์ง์ ์ด๋ค ๋จ์ด๊ฐ ์๋์ง ํ์ธํ๋ค.
๊ตฐ์ง๋ณ๋ก ์ ๋ฆฌํ์ฌ ๊ตฐ์ง ๋ฒํธ, ๊ตฐ์ง๋ณ๋ก ์กฐ์ธ๋ ๋จ์ด๋ค์ ๋์ดํ๋ค.
4. ๋ด๋๋ก๊ทธ๋จ ์๊ฐํ
- ward ์ฐ๊ฒฐ๋ฒ ์ฌ์ฉ, ๋งคํธ๋ฆญ์ค ํํ๋ก ๋ง๋ค๊ธฐ
ko_linkage_matrix = ward(ko_tfidf_dist)
ko_linkage_matrix.shape
ko_linkage_matrix
1 - cosine_similarity๋ก ๊ณ์ฐํ ๊ฑฐ๋ฆฌ๋ฅผ ward์ ๊ตฐ์ง๊ฐ์ ์ฐ๊ฒฐ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ฌ ํ๋์ ๋งคํธ๋ฆญ์ค๋ก ๋ง๋ ๋ค.
2585๊ฐ์ ๋จ์ด์ ๋ํด 4๊ฐ์ ๊ตฐ์ง์ผ๋ก ๋๋ ์ง๋ค.
โ ward ์ฐ๊ฒฐ๋ฒ
์ฐ๊ฒฐ๋ ์ ์๋ ๊ตฐ์ง ์กฐํฉ์ ๋ง๋ค๊ณ , ๊ตฐ์ง ๋ด ํธ์ฐจ๋ค์ ์ ๊ณฑํฉ์ ๊ธฐ์ค์ผ๋ก ์ค์ฐจ ์ ๊ณฑํฉ์ ์ธก์ ํ์ฌ
์ต์ ์ ๊ณฑํฉ์ ๊ฐ์ง๊ฒ ๋๋ ๊ตฐ์ง๋ผ๋ฆฌ ์ฐ๊ฒฐํ๋ ๋ฐฉ๋ฒ
- ํฐํธ ๊ฒฝ๋ก ์ค์
ko_font_location = "C:/Windows/Fonts/malgun.ttf"
ko_font_name = font_manager.FontProperties(fname=ko_font_location).get_name()
plt.rcParams['font.family'] = ko_font_name
ํ๊ธ์ ๊ฒฝ์ฐ ํฐํธ ๊ฒฝ๋ก๋ฅผ ์๋์ฐ ํฐํธ๋ก ์ค์ ํ์ฌ ํฐํธ ๊นจ์ง์ ๋ฐฉ์งํด์ผ ํ๋ค.
- ๋ด๋๋ก๊ทธ๋จ ๊ทธ๋ฆฌ๊ธฐ
fig, ax = plt.subplots(figsize=(100,60))
plt.title('Clustering Dendrogram')
plt.ylabel('Distance')
plt.xlabel('Words')
ax = dendrogram(ko_linkage_matrix, leaf_font_size=10, leaf_rotation=50, orientation='top', labels=ko_tfidf_tdm_word)
plt.show()
๋ด๋๋ก๊ทธ๋จ์ ๊ฒฝ์ฐ ์์์ ๋ถ์ํ ๊ตฐ์ง๋ถ์ ๊ฒฐ๊ณผ์ 100% ์ผ์นํ์ง ์๋๋ค.
์ ๋ฐ์ ์ธ ๋จ์ด์ ๋ฌถ์ ํ์์ ๋ณด๊ธฐ ์ํ ๊ทธ๋ฆผ์ผ๋ก ๊ฒฝํฅ ์ ๋ฌ์ ๋ชฉ์ ์ด๋ค.
๋ฐ๋ผ์ ๋ด๋๋ก๊ทธ๋จ์ ๊ฐ์ง๊ณ ์ด๋ค ๊ตฐ์ง๋ค์ด ๋ฌถ์ฌ์๋์ง๋ฅผ ํ๋์ฉ ํ์
ํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ๋ค.
์ฐธ๊ณ ๊ฐ์ : ๋์๋ INSPIRE - python ํ ์คํธ๋ง์ด๋ 28๊ฐ ํ๊ธ Word Clustering