본문 바로가기
Python

[텍스트마이닝] 한글 Document cluster

by 권미정 2023. 2. 16.

동아대 INSPIRE - python텍스트마이닝 29강을 실습 및 정리한 내용입니다.


이번 글에서는 한글 문서 간 군집 분석을 실습해 보겠습니다.

 

1. 패키지/데이터 불러오기, TFIDF기준 DTM 만들기

먼저 필요한 패키지들을 불러옵니다. 여기서 KMeans는 반복을 통한 군집분석을, dendrogram은 그림으로 시각화하는 패키지입니다. 분석의 결과와 그림의 결과가 다르게 나올 수 있는데 잘못된 것은 아니라는 점을 알고 있으면 됩니다.

import numpy as np

import pickle

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.cluster import KMeans
from scipy.cluster.hierarchy import dendrogram, linkage, ward
from sklearn.metrics.pairwise import cosine_similarity

import matplotlib.pyplot as plt

그리고 분석할 데이터 파일을 가져옵니다. 이때 조인된 데이터를 가져와야 합니다.

with open('ko_stopped_join.bin', 'rb') as fp:
    ko_word_joined = pickle.load(fp)

TfidfVectorizer를 사용해 ko_tfidf_vectorizer로 선언하고, fit_transform을 사용해 dtm 자료로 만듭니다. 단어의 이름을 쓰기 위해서 get_feature_names를 사용해 저장합니다. 마지막 줄은 문서 간의 거리를 계산하기 위한 코드입니다.

ko_tfidf_vectorizer = TfidfVectorizer()
ko_tfidf_dtm = ko_tfidf_vectorizer.fit_transform(ko_word_joined)
ko_tfidf_dtm_word = ko_tfidf_vectorizer.get_feature_names()
ko_tfidf_dist = 1-cosine_similarity(ko_tfidf_dtm)

 

2. 군집분석 수행

이제 k 값, 즉 군집 수를 5개로 설정하고 분석을 수행해 봅시다. max_iter(최대 반복 수)는 10으로 설정합니다.

k=5
ko_kmeans_model = KMeans(n_clusters=k, init='k-means++', max_iter=10, n_init=10, random_state=777).fit(ko_tfidf_dtm)

-1을 써서, 정렬을 낮은 것부터 0,1,2,3,4 순서로 되도록 설정합니다. 

order_centroids=ko_kmeans_model.cluster_centers_.argsort()[:, ::-1]

문서의 라벨을 ko_kmeans_model_doc_label에 저장합니다. 이걸 해 주어야 1번이 몇 번째 문서에 있는지 매칭이 됩니다.

ko_kmeans_model_doc_label = ko_kmeans_model.labels_

이제 각 군집의 문서 번호와 문서를 대표하는 단어를 함께 보여 주는 코드입니다. 군집과 문서 번호, 군집을 구성하는 단어들이 5개까지 출력되겠군요. 

for i in range(k):
    label_cluster= np.where(ko_kmeans_model_doc_label==i)[0].tolist()
    word_cluster = []
    for ind in order_centroids[i, :30]:
        word_cluster.append(ko_tfidf_dtm_word[ind])
    print('* Cluster {}'.format(i))
    print('Document Numbers: {}'.format(' '.join(str(x) for x in label_cluster)))
    print('Words: {}\n'.format(' '.join(str(x) for x in word_cluster)))

살펴보면, 한 군집은 30개의 단어로 구성되어 있습니다. 단어들을 보면 어떠한 주제와 관련성 있는 것들로 묶인 것으로 보입니다. 이처럼 word clustering보다 document clustering이 직관적으로 이해하기 쉽고, 한쪽으로 쏠리는 경향이 덜 나타난다고 합니다.

 

3. 덴드로그램 시각화

마지막으로 덴드로그램을 그려 볼 건데, 먼저 군집 간의 거리를 계산한 것을 ward 군집법을 사용하고 matrix 형태로 만들어 줍니다.

ko_linkage_matrix=ward(ko_tfidf_dist)

사이즈 등을 설정하고 시각화 결과를 출력해 봅시다.

fig, ax=plt.subplots(figsize=(25,15))
plt.title('Clustering Dendrogram')
plt.ylabel('Distance')
plt.xlabel('Documents')
ax=dendrogram(ko_linkage_matrix, leaf_font_size=10, leaf_rotation=50, orientation='top')
plt.show()

어떤 문서들이 가까운지 한눈에 구분됩니다.

 

 

이번 실습을 통해, document clustering을 하면 여러 문서들 간의 거리를 직관적으로 파악하는 데 좋다는 것을 알 수 있었습니다. 하지만 무조건적으로 좋은 방법이란 없기 때문에, 여러 방법들을 해 보고 비교하는 것이 중요합니다.

댓글