언어/Python

[Python/자연어 처리] 3. Word Cloud(워드 클라우드)

MINJIN's 2023. 12. 21. 18:24

1. Word Cloud(워드 클라우드)란?

  Word Cloud(워드 클라우드)텍스트에서 나타나는 단어들을 빈도에 따라 시각적으로 나타내는 그래픽이며, 단어의 빈도가 높을수록 해당 단어가 크고 두드러지게 표시됩니다.

 

2. Word Cloud 설치

pip install wordcloud

  위 명령어를 입력하여서 Word Cloud 라이브러리를 설치합니다.

 

3. Word Cloud 테스트

1) 일반 출력

  워드 클라우드를 사용하기 위해서는 텍스트 파일과 이미지 파일이 필요합니다. 필자는 영어 성경의 마가복음 텍스트 파일과 예수 그리스도의 이미지 파일을 폴더에 저장 후, 이것들을 불러오겠습니다. 

The_Gospel_of_Mark.txt
0.08MB
jesus_001.png
0.12MB
jesus_001.png

 

  ⚠여기서 중요한 것은 배경이 투명한 PNG파일을 사용할 경우 단어들이 모든 배경에 표시됩니다. 그러므로 투명한 배경이 아닌 바탕이 흰색인 파일을 사용하시는 것이 좋습니다.

 

  이제 필요한 모듈들을 임포트하고 텍스트 파일과 이미지 파일을 불러옵니다.

from wordcloud import WordCloud, STOPWORDS
from matplotlib import font_manager, rc
import matplotlib.pyplot as plt
import numpy as np
from PIL import Image
import platform
%matplotlib inline

text = open('C:/myPyCode/The_Gospel_of_Mark.txt').read()
jesus_mask = np.array(Image.open('C:/myPyCode/jesus_paint.png'))

 

   위 코드 중 STOPWORDS는 WordCloud 생성 시 무시할 단어들의 집합을 나타냅니다. 이는 WordCloud에서 특정 단어를 제외하고 싶을 때 사용됩니다. 위 텍스트에서 가장 많이 등장하는 단어는 'undo'와 'ye'라는 단어이며 이는 의미있는 정보가 아니라서 STOPWORDS를 이용하여 제거하려 합니다.

stopwords = set(STOPWORDS)
stopwords.add("unto")
stopwords.add('ye')

 

  stopwords.add()에는 한 단어만 들어갈 수 있습니다. 그래서 저는 stopwords.add() 를 두 번 사용하여서 'undo'와 'ye' 단어를 제거하였습니다.

  이후 한글 폰트를 설정하고 피겨 생성과 동시에 사이즈를 지정합니다. 또 plt.imshow를 통해서 표시될 이미지를 설정하고, interpolation='bilinear' 를 사용하여 이미지를  부드럽게 설정합니다. 마지막으로 축은 비활성화하고 설정한 피겨를 출력합니다.

path = 'C:/Windows/Fonts/malgun.ttf'
font_name = font_manager.FontProperties(fname=path).get_name()
rc('font', family = font_name)
plt.figure(figsize=(8,8))
plt.imshow(jesus_mask, interpolation='bilinear')
plt.axis('off')
plt.show()

 

  이미지가 잘 출력 되었습니다. 이후 워드 클라우드에서 단어를 카운트하는 기능을 사용하여 단어 사용 빈도 수를 출력할 수 있습니다.

wc = WordCloud(background_color='white', max_words=2000, mask=jesus_mask,
               stopwords=stopwords)
wc = wc.generate(text)
wc.words_
{'said': 1.0,
 'man': 0.75,
 'one': 0.625,
 'come': 0.6153846153846154,
 'Jesus': 0.5961538461538461,
 'saith': 0.5961538461538461,
 'say': 0.5384615384615384,
 'came': 0.49038461538461536,
 'thou': 0.49038461538461536,
 'God': 0.4807692307692308,
 'disciples': 0.4423076923076923,
 'thy': 0.4326923076923077,
 'thing': 0.4326923076923077,
 'saying': 0.4230769230769231,
 ...
 'cushion': 0.009615384615384616,
 'awake': 0.009615384615384616,
 'perish': 0.009615384615384616,
 'awoke': 0.009615384615384616,
 ...}

 

  마가복음 텍스트 안의 모든 단어들의 빈도 수가 출력 되었습니다. 가장 많이 등장하는 단어는 'said'였습니다. 

 

  ✔ 실제로 성서학자들이 각 문헌의 단어 빈도 수를 파악하여서 그 문헌에서 가장 많이 사용되는 단어를 파악한 후 그와 관련한 주제 연구를 진행하는 경우도 있습니다. 위 출력에서 'said'라는 단어가  마가복음 텍스트 안에서 가장 많이 사용된 것으로 보아, 마가복음은 예수 그리스도께서 말씀하신 부분을 많이 기록했다는 것을 유추할 수 있습니다. 

 

  이제 위 결과를 이미지에 겹쳐 보이게 출력합니다.

plt.figure(figsize=(8,8))
plt.imshow(wc, interpolation='bilinear')
plt.axis('off')
plt.show()

 

  잘 출력되는 것을 확인할 수 있습니다. 

 

{'said': 1.0,
 'man': 0.75,
 'one': 0.625,
 'come': 0.6153846153846154,
 'Jesus': 0.5961538461538461,
 'saith': 0.5961538461538461,
 'say': 0.5384615384615384,
 'came': 0.49038461538461536,
 'thou': 0.49038461538461536,
 'God': 0.4807692307692308,
 'disciples': 0.4423076923076923,
 'thy': 0.4326923076923077,
 'thing': 0.4326923076923077,
 'saying': 0.4230769230769231,
 ...
 'cushion': 0.009615384615384616,
 'awake': 0.009615384615384616,
 'perish': 0.009615384615384616,
 'awoke': 0.009615384615384616,
 ...}

 

  확실히 표 왼쪽의 텍스트를 보여주는 것보다 표의 오른쪽의 워드 클라우드를 활용한 그래픽을 보여주는 것이 설교를 듣는 청중들에게는 딱딱하게 다가오지 않고 디자인적으로 보기 좋으며 기억에 남을 수 있는 방법일 것 같습니다. 

 

2) 색상 변경

  사용자가 원한다면 워드 클라우드의 색상 또한 바꿀 수 있습니다. 아래와 같이 코드를 다시 작성합니다.

wc = WordCloud(max_words=1000, mask=jesus_mask, stopwords=stopwords,
               margin=10, random_state=1).generate(text)
default_colors = wc.to_array()

 

  random_state는 난수 생성에 사용되는 시드(seed) 값입니다. 시드 값은 난수 발생 알고리즘의 초기 상태를 결정하므로 동일한 시드 값을 사용하면 항상 동일한 난수가 생성됩니다. 저는 시드를 1로 설정하여 같은 코드를 여러 번 실행하더라도 워드 클라우드의 생성 결과가 동일하게 나타나게 했습니다.

 

  이후 워드 클라우드의 각 단어에 적용할 색상을 정의합니다

import random
def grey_color_func(word, font_size, position, orientation, random_state= None, **kwargs):
    return 'hsl(0,0%%,%d%%)' % random.randint(60,100)

 

  hsl(0,0%%,%d%%) 은 hsl(색상, 채도, 명도)를 나타냅니다. 여기서 색상 부분은 0, 채도 부분은 0%, 명도 부분은 60%에서 100% 사이의 임의의 값을 가지게 됩니다.

 

  이제 위와 마찬가지로 결과를 이미지에 출력합니다.

plt.figure(figsize=(8,8))
plt.imshow(wc.recolor(color_func=grey_color_func, random_state=3), interpolation='bilinear')
plt.axis('off')
plt.show()

 

  위 기능을 통해서 다양한 분위기에 맞는 색상을 사용하여 시각 효과를 더욱 높일 수 있습니다.