-->

파이썬 wordcloud를 사용한 한글 명사 시각화

파이썬 wordcloud는 중요한 단어나 키워드를 시각화해서 보여주는 시각화 도구이다. wordcloud 자체적으로 빈도수를 계산하는 기능이 있다고 하지만 아무래도 한글의 특성이 있다보니, 나는 한글 명사를 추출하고 빈도수를 계산하는 것까지는 KoNLPy를 사용해주었다. 

 

KoNLPy 설치와 KoNLPy를 사용한 한글 명사 빈도수 계산은 아래 포스팅을 참고해주기 바란다.

 

 


관련포스팅

KoNLPy (파이썬 한글 형태소 분석기 ) 윈도우 설치 방법

 

KoNLPy (파이썬 한글 형태소 분석기 ) 윈도우 설치 방법

파이썬 한글 형태소 분석기인 KoNLPy 설치는 아래 기입된 순서대로, 본인 환경(파이썬 버전, 윈도우 비트)에만 맞게 진행해주면 에러가 발생하지 않는다. 참고로 나의 환경은 '파이썬3.8, 윈도우10 x64'이다. 자바..

liveyourit.tistory.com

파이썬 KoNLPy를 사용한 한글 명사 빈도 계산

 

파이썬 KoNLPy를 사용한 한글 명사 빈도 계산

KoNLPy 란 아무래도 언어마다 자연어처리를 하기 위한 특성이 제각각이다보니 영어에 맞춰진 자연어처리 도구를 사용하기는 한글에는 맞지 않는다. 그런 이유에서 한글 자연어 처리에 맞춤화된 파이썬 오픈소스 라..

liveyourit.tistory.com

 

 

파이썬 wordcloud 설치

wordcloud를 그냥 pip install로 설치하려고하면 다음과 같은 어마어마한 에러를 마주할 수 있다.

 

 

 

아래 링크로 들어가 본인 환경에 맞는 whl 파일을 다운받아준다. 

 


https://www.lfd.uci.edu/~gohlke/pythonlibs/#wordcloud

 

Python Extension Packages for Windows - Christoph Gohlke

by Christoph Gohlke, Laboratory for Fluorescence Dynamics, University of California, Irvine. Updated on 6 February 2020 at 19:57 UTC. This page provides 32- and 64-bit Windows binaries of many scientific open-source extension packages for the official CPyt

www.lfd.uci.edu

 

 

나는 파이썬 3.8에 윈도우10 x64를 쓰기 때문에 제일 위에 있는 wordcloud-16wordcloud‑1.6.0‑cp38‑cp38-win_amd64.whl 파일을 다운받아주었다.

 

 

 

그다음 다운받은 whl 파일이 있는 경로로 이동해 터미널창에서 다음과 같이 whl 파일을 설치해주면 된다.

 

 

 

wordcloud로 한글 키워드(명사) 시각화

wordcloud에 사용할 text 혹은 리스트만 마련되어 있다면 시각화를 수행하는 코드는 정말 간단하다. KoNLPy를 사용해 빈도수가 높은 순대로 추출한 명사 리스트를 넘겨주는 형태와 그냥 텍스트를 통째로 넘겨주는 형태 두개다 해보려고 한다. 

 

먼저, wordcloud 사용법을 알아보자. 위에서 wordcloud를 설치했으니 임포트해준다. 그다음, wordcloud 객체를 생성해주면 되는데 여기서는 총 6개의 인자를 사용했다. 추가로 mask 옵션을 사용하면 반듯한 네모박스 모형이 아닌 다른 모형으로 wordcloud를 생성해줄 수도 있다.

 

  • font_path : 한글 폰트의 경로
  • background_color : 배경 색 지정
  • width : 가로폭 지정
  • height : 세로폭 지정
  • max_words : 이미지에 넣을 최대 word 수를 지정
  • max_font_size : 이미지에 넣을 최대 폰트 크기를 지정
from wordcloud import WordCloud

wc = WordCloud(font_path='C:\\Windows\\Fonts\\08SeoulNamsanB_0.ttf', \
	background_color="white", \
	width=1000, \
	height=1000, \
	max_words=100, \
	max_font_size=300)

 

 

여기서 한가지만 주의해줄 것은, font_path에 한글 폰트 경로를 꼭 넘겨주어야 한다는 것이다. 처음에는 써주지 않으면 기본 글꼴로 자동으로 지정될 것이라 생각해 써주지 않았는데 그러면 아래와 같은 네모네모한 이미지를 마주하게 된다.

 

 

 

텍스트 통째로 넘겨주기

첫번째로, txt를 읽어서 텍스트를 통째로 넘겨줄 수 있다. 아래 코드에서 보이는 것과 같이 generate(text) 형태로 사용해주면 된다. 이미지 출력 방법에는 여러가지가 있지만, to_file 함수를 사용해서 png로 저장하는 방식을 사용했다.

 

wc.generate(news)
wc.to_file('wordcloud_news.png')

 

 

참고로, 나는 보안 뉴스 기사의 주요 키워드를 시각화하기 위해 시각화할 텍스트 대상으로 크롤링한 보안 뉴스 기사를 사용했다. 확실히 텍스트를 그냥 통으로 넘겨주다 보니 뭔가 키워드를 찾고 싶은 사람이라면 적절하지 않은 방법인 것 같다.

 

 

전체 코드는 다음과 같다.

 

import sys
from wordcloud import WordCloud

filename = sys.argv[1]
f = open(filename,'r',encoding='utf-8')	
news = f.read()

wc = WordCloud(font_path='C:\\Windows\\Fonts\\08SeoulNamsanB_0.ttf', \
	background_color="white", \
	width=1000, \
	height=1000, \
	max_words=100, \
	max_font_size=300)
    
wc.generate(news)
wc.to_file('wordcloud_news.png')

 

 

빈도순으로 추출한 명사 리스트 넘겨주기

두번째로, 위에서 넘겨준 같은 텍스트를 KoNLPy를 사용해 명사를 추출한 후 빈도수가 높은 순대로 정렬한 리스트를 넘겨보도록 한다. 리스트는 위에도 링크한 '파이썬 KoNLPy를 사용한 한글 명사 빈도 계산' 포스팅 코드의 결과로 나온 noun_list를 dict으로 변환 후 넘겨준다.

 

wc.generate_from_frequencies(dict(noun_list)
wc.to_file('wordcloud_news.png')

 

noun_list 모양은 아래와 같다.

 

 

 

실제 단어 빈도수대로 단어의 크기가 커지다보니 텍스트를 통으로 넘겨주는 것보다는 확실히 유의미해 보이는 단어가 많이 보인다. 또한, 한글 형태소 분석기 KoNLPy를 사용했기 때문에 위에서 보이던 '했다'와 같은 비명사도 찾아볼 수 없다.

 

 

 

전체 코드는 아래와 같다.

 

import sys
from konlpy.tag import Okt
from collections import Counter
from wordcloud import WordCloud

def get_noun(news):

	okt = Okt()
	noun = okt.nouns(news)
	for i,v in enumerate(noun):
		if len(v) < 2:
			noun.pop(i)

	count = Counter(noun)
	noun_list = count.most_common(100)

	return noun_list


def visualize(noun_list):

	wc = WordCloud(font_path='C:\\Windows\\Fonts\\08SeoulNamsanB_0.ttf', \
		background_color="white", \
		width=1000, \
		height=1000, \
		max_words=100, \
		max_font_size=300)

	wc.generate_from_frequencies(dict(noun_list))
	wc.to_file('keyword.png')


if __name__=="__main__":
	
	filename = sys.argv[1]
	
	f = open(filename,'r',encoding='utf-8')	
	news = f.read()
	noun_list = get_noun(news)
	visualize(noun_list)

 

 

여기서 한가지 더, TMI를 서술하자면... 계속 뉴스기사 전문을 크롤링한 텍스트를 사용했는데 아무래도 그러다보니 '보안', '뉴스', '기자'와 같은 일반적인 단어들이 많이 포함되는 것 같다. 그래서 이번엔, 뉴스 제목만 크롤링해서 시각화해보기로 했다.

 

확실히, 조금 더 일반적인 단어들은 많이 줄어든 것 같다.

 

 

댓글

Designed by JB FACTORY