사람들이 시각적 자극에 민감한 만큼 시각화는 중요한 작업 중 하나이다.

 

이번에는 시각화 방법 중 하나인 워드 클라우드 (Word Cloud)에 대해서 공부해보고자 한다.

 

워드 클라우드란?

워드 클라우드는 문자로 이루어진 데이터 속에서 형태소 분석을 통해 구분된 단어들의 출현 빈도에 따라서 크기가 다르게 나타나는 시각화 도구 중 하나이다.

 

예를 들어 뉴스 기사 제목만 모아둔 파일이 있다고 했을 때, 가장 많이 나타나는 단어들을 표현하는 방법을 두 가지로 비교해보자.

 

1. 빈도수 나타내기

수치를 나타내기 때문에 가장 직관적인 방법이기도 하고, 많이 사용되는 방법이기도 하다.

예를 들어서 '국가'라는 단어가 870번 등장하고, '정책'이 863번, '토지'가 770번 등장한다고 하면

국가 870
정책 863
토지 770

이렇게 나타낼 수 있다. 

 

이런 방법은 순서대로 정렬이 되어있으면 순서대로 읽으면 순위를 알 수 있지만, 한 눈에 확 들어오지는 않는다.

 

2. 워드클라우드

워드클라우드는 데이터 전처리 과정에서 빈도수를 분석하여 시각적인 자극을 강화한 방법으로 다음과 같이 나타난다.

'포함이' 라는 단어보다 '겨우'나 '새로운'이 더 눈에 잘 들어오고, '녀석이나겠다면'이라는 문장(?)보다는 '것이다'가 더 잘 보인다. 빈도수에 기반해서 크기가 자동적으로 조정되어 나타난 것이다. 

 

빈도수에 대한 정확한 수치가 필요하진 않을 때, 조금 더 시각적인 자극이 필요할 때 이런 방법을 자주 사용하고, 데이터에 대한 정확한 통찰보다 개략적인 정보만 필요할 때 자주 사용한다. 

 

특히 웹에서 시각적 효과가 중요해진 요즘엔 웹에 등장시켜 시선을 끌기도 한다.

 

 

워드클라우드 만들기

1. 준비물

 워드클라우드를 만들기 위해서는 다음과 같은 준비물이 필요하다.

  • wordcloud 패키지: 말 그대로 wordcloud 제작을 지원하는 다양한 모듈이 담겨있는 패키지
  • KoNLpy 패키지 : 영어로만 워드클라우드를 만들 때는 꼭 필요하진 않지만, 한국어 처리를 위해서는 필요한 패키지이다. 주요 기능은 형태소 분석으로 [명사, 동사, 형용사] 등을 구분해주는 패키지이다.

 

2. 코딩

 

#필요 패키지
from wordcloud import WordCloud
from collections import Counter
from konlpy.tag import Okt

필요한 패키지들은 위와 같다. 

워드클라우드 객체 생성을 위한 wordcloud 패키지와, 단어수를 count해주는 collections 모듈의 Counter 클래스, 형태소 분석을 담당하는 KoNLpy를 import해준다.

 

with open('./output_3.csv', 'r', encoding='UTF-8') as f:
    text = f.read()

그 다음은 워드클라우드화할 문장들이 포함되어 있는 파일을 읽어온다.

나는 과거에 대학교 커뮤니티의 게시글 제목들을 크롤링한 데이터를 사용하기로 했다.

 

 

okt = Okt()
nouns = okt.nouns(text)
data = [i for i in nouns if len(i) > 1]
c = Counter(data)

이후 형태소 분석 객체를 생성하고 (Okt, Open Korean Text : 트위터에서 개발한 오픈소스 한글 처리기) 형태소 중에서 명사만 꺼낸다.

 

명사를 꺼낼 때 '야'와 같은 한글자 명사는 제외하고 하기로 하고, 빈도수를 count해준다.

 

import matplotlib.font_manager as fm

sys_font=fm.findSystemFonts()
print(f"sys_font number: {len(sys_font)}")
print(sys_font)

 

그 다음 중요한 작업 중 하나가, 한글로 작성된 텍스트를 워드클라우드 시킬 때는 폰트를 따로 적용시켜주어야 하는데 작업중인 파일과 폰트의 위치를 일치시키거나 정확한 폰트 파일의 위치를 적용시켜줘야하므로 위 과정을 통해 한글을 지원하는 폰트가 있는지 파악해야한다.

 

wc = WordCloud(font_path = 'Fonts\\NanumBarunGothicLight.ttf', 
               background_color = 'white',
               prefer_horizontal = 1,
               width = 1000, 
               height= 600, 
               max_words=100)
gen = wc.generate_from_frequencies(c)
wc.to_image()

마지막으로 워드클라우드 객체를 생성하고 옵션을 지정해준 다음에, 빈도수를 기반으로 generate해준 후, to_image()해주면..

 

 

이렇게 워드 클라우드가 나타난다. 

역시 대학교 커뮤니티답게 '교수', '시험'이 보이기도 하고 의외로 '생각'이나 '정도' 같은 단어들도 많이 보이는 것 같다.

 

워드클라우드 mask 씌우기

패키지에 의해 생성되는 기본 모양은 위와 같이 사각형의 틀 속에 글자가 배치되는 것이다.

option의 파라미터 값을 조정하면 글자의 배치나 배경 색상, 최대 폰트 크기, 최대 단어 수 등을 조정할 수 있고 frame의 모양도 설정할 수 있다.

 

네모 반듯한 것도 이쁘지만 워드클라우드를 게시하는 페이지의 특성에 따라서 다른 모양을 취해주는 것이 시각적인 효과를 더 이끌어 낼 수 있다.

 

from PIL import Image
import numpy as np

이미지를 masking 하려면 이미지 데이터를 array로 변환시키는 작업이 필요한데, 이 작업을 해주는 두 라이브러리를 호출한다.

 

이번 실습에서는 강아지 이모티콘 사진을 마스킹해서 모양을 취해보도록 하였다.

 

background = Image.open('그림1.jpg')
back_array = np.array(background)

pillow를 통해서 이미지를 픽셀화한 후, numpy를 가지고 array화 하였다.

위 과정을 거치면, 강아지 모양 사진이 RGB 색상표를 기준으로 0~255사이 범위를 가진 float타입 숫자의 array로 바뀐다.

 

wc = WordCloud(font_path = 'Fonts\\NanumBarunGothicLight.ttf', 
               background_color = 'white',
               prefer_horizontal = 1,
               width = 1000, 
               height= 600, 
               mask = back_array)

gen = wc.generate_from_frequencies(c)

wc.to_image()

처리된 이미지 파일을 워드클라우드 option의 파라미터로 주면..

 

이렇게 귀여운 강아지 모양의 워드클라우드를 볼 수 있다.