본문 바로가기
Data Analysis/Python

[Python] 파이썬으로 한글 Word cloud 만들기

by lucky__lucy 2024. 2. 6.

 

1. 패키지 설치 및 작업 경로 설정

# Package Installation
!pip install nltk
!pip install --upgrade pip
!pip install konlpy
!pip install wordcloud
!pip install --upgrade gensim
!pip install matplotlib

import pandas as pd
from konlpy.tag import Kkma
kkma = Kkma()
import nltk
from nltk import FreqDist
from konlpy.tag import Okt; t = Okt()
import matplotlib.pyplot as plt
from matplotlib import font_manager, rc
from wordcloud import WordCloud, STOPWORDS

# Specify the working directory
file_path = 'D:/*/'

 

2. 데이터 불러오기 및 전처리

# Read Excel data
data_hs = pd.read_excel(file_path + '*.xlsx', sheet_name=0)

# 제목 + 키워드 + 초록 합치기
df_hs = pd.DataFrame() # Create an empty dataframe
df_hs['year'] = data_hs['연도'] # Get the year
df_hs['words'] = data_hs['제목'] + ' ' + data_hs['키워드'] + ' ' + data_hs['초록']
df_hs['words'] = df_hs['words'].str.replace('\n', ' ') # 엔터링을 띄어쓰기로 대체

 

3. 형태소 분석

# 워드 클라우드 생성을 위해 모든 문자열을 하나로 합치기
combined_text = ' '.join(df_hs['words'].astype(str))
tokens_ko = t.nouns(combined_text) # 명사 분석

ko = nltk.Text(tokens_ko, name = 'keyword analysis') 
print(len(ko.tokens)) # 토큰(문서 길이)의 수
print(len(set(ko.tokens))) # 고유 토큰의 수
ko.vocab() # Print words and their frequencies # 단어 및 빈도 출력

 

4. 빈도 분석

font_name = font_manager.FontProperties(fname="c:/Windows/Fonts/malgun.ttf").get_name()
rc('font', family=font_name)

# 단어 빈도 그래프 생성
plt.figure(figsize=(12,6))
ko.plot(50) # Print most frequent 50 words
plt.show()

# 단어 및 빈도 csv 파일 생성
freq_dist = FreqDist(ko.tokens)
df_freq_dist = pd.DataFrame(freq_dist.items(), columns=['단어', '빈도']).sort_values(by='빈도', ascending=False)
df_freq_dist.to_csv(file_path + 'word_frequency.csv', index=False, encoding='cp949')

# 제외할 단어 설정
stop_words = ['것', '수', '및', '위', '등', '이', '비', '의', '그']
ko = [each_word for each_word in ko if each_word not in stop_words]

# 단어 빈도 그래프 재생성
ko = nltk.Text(ko, name='keyword analysis')
plt.figure(figsize=(12,6))
ko.plot(50)
plt.show()
stop word 설정 전
stop word 설정 후

 

5. 워드 클라우드 생성

# 워드 클라우드 생성
data = ko.vocab().most_common(150)
wordcloud = WordCloud(font_path='c:/Windows/Fonts/malgun.ttf',
                     relative_scaling = 0.2,
                     background_color='white',
                     ).generate_from_frequencies(dict(data))
plt.figure(figsize=(12,8))
plt.imshow(wordcloud)
plt.axis("off")
plt.savefig(file_path + 'wordCloud.png')
plt.show()

필요에 따라 plt.savefig(*) 코드 생략 가능하며, plt.savefig()가 plt.show()보다 뒷 줄에 있을 경우 백지로 출력됨을 주의해야 한다.
plt 코드들은 plt 코드들끼리 한꺼번에 실행한다.

ver 1
ver 2

 

6. 원하는 모양으로 워드 클라우드 만들기

import numpy as np
from PIL import Image

mask = np.array(Image.open(file_path + 'cloud.png'))

data = ko.vocab().most_common(150)
wordcloud = WordCloud(font_path='c:/Windows/Fonts/malgun.ttf',
                      relative_scaling=0.2, mask=mask,
                      background_color='white',
                      ).generate_from_frequencies(dict(data))
default_colors = wordcloud.to_array()

plt.figure(figsize=(6,6))
plt.imshow(wordcloud)
plt.axis('off')
plt.show()
728x90
반응형