본문 바로가기
Python

[텍스트마이닝] 한글 빈도분석과 WordCloud

by 권미정 2023. 1. 27.

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


1. 분석 명령어

① 패키지 및 데이터 불러오기

먼저, 필요한 명령어들을 불러옵니다.

import numpy as np
from sklearn.feature_extraction.text import CountVectorizer
from matplotlib import font_manager
import matplotlib.pyplot as plt
from wordcloud import WordCloud
import pickle

 

지난 강의에서 만들었던 한글 파일을 여는 코드를 fp라고 임의로 지정하고, pickle을 로드하여 ko_word에 저장합니다.

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

 

ko_word를 실행하면, 단어들이 쭉 나열된 형태로 잘 저장된 것을 확인할 수 있습니다.

 

② DTM 자료 만들기

상위 100개를 뽑아서 cv에 저장하겠습니다.

cv=CountVectorizer(max_features=100)

 

fit_transform라는 명령어를 사용해서 dtm 자료를 만들어 확인해 봅시다.

dtm=cv.fit_transform(ko_word)
dtm

문서가 세로로 118개, 상위 단어 100개가 가로로 나오는 자료가 만들어졌습니다.

 

지금 dtm에 이름이 없기 때문에, get_feature_names 명령어를 사용해 cv의 이름을 words에 저장하겠습니다.

words=cv.get_feature_names()

 

③ 단어별 빈도세기 및 단어-빈도(TF) 만들기

이번에는 DTM 자료가 아래와 같이 만들어졌다고 생각했을 때, 각 단어별 개수를 카운트해 보겠습니다.

  가능성 가치 ... 인간
문서 1 2 1   0
문서 2 0 2   1
문서 3 1 1   0
...        
문서 118 3 2   0

 

dtm.sum(axis=0)을 하면 세로로 개수를 더한 값을 구할 수 있고, count_mat에 저장합니다.

count_mat=dtm.sum(axis=0)
count_mat

잘 저장되었지만, 행렬 형태입니다.

 

A-29

B-24

C-26

위와 같은 형태로 차원을 줄여 array 형태로 만들겠습니다.

차원을 줄일 때는 squeeze를 사용하고, 단어와 카운트를 묶기 위해 zip을 사용합니다.

count=np.squeeze(np.asarray(count_mat))
word_count=list(zip(words,count))
word_count

단어와 빈도가 잘 매치되었습니다.

 

이를 워드클라우드로 만들기 위해서는 개수가 많은 순서대로 정렬되어야 합니다.

word_count=sorted(word_count, key=lambda x:x[1], reverse=True)
word_count

빈도가 높은 순으로 정렬되었습니다.

 

④ wordcloud 작성하기

이제 워드클라우드를 작성해 봅시다!

주의! 한글은 폰트가 깨질 수 있기 때문에, font_pathwindow 폰트로 설정해 주어야 합니다.

wc=WordCloud(font_path='C:/Windows/Fonts/malgun.ttf', background_color='black', width=800, height=600)

빈도는 word_count로 지정해 줍니다.

cloud=wc.generate_from_frequencies(dict(word_count))

워드클라우드의 크기, 축 등을 설정해 줍니다.

plt.figure(figsize=(12,9))
plt.imshow(cloud)
plt.axis('off')
plt.show()

 

폰트 깨지는 것 없이 잘 만들어졌습니다!

댓글