리그캣의 개발놀이터

konlpy를 이용한 wordcloud 그리기 본문

개발 공부/딥러닝

konlpy를 이용한 wordcloud 그리기

리그캣 2018. 5. 14. 23:26

라이브러리 추가

import json
import re
from konlpy.tag import Twitter
from collections import Counter
import matplotlib.pyplot as plt
import matplotlib
from matplotlib import font_manager, rc
import pytagcloud
import webbrowser


showGraph

wordInfo라고 하는 딕셔너리(Dictionary)형식의 데이터를 받아 막대 그래프를 그리는 함수

#[CODE 1]
def showGraph(wordInfo):

font_location = "c:/Windows/fonts/malgun.ttf"

#FONT의 위치를 찾아줌
font_name = font_manager.FontProperties(fname=font_location).get_name()

#font의 이름 저장
matplotlib.rc('font', family=font_name)
plt.xlabel('주요 단어')
plt.ylabel('빈도수')
plt.grid(True)

#그래프의 x축과 y축 지정

Sorted_Dict_Values = sorted(wordInfo.values(), reverse=True)
Sorted_Dict_Keys = sorted(wordInfo, key=wordInfo.get, reverse=True)
plt.bar(range(len(wordInfo)), Sorted_Dict_Values, align='center')
plt.xticks(range(len(wordInfo)), list(Sorted_Dict_Keys), rotation='70')
plt.show()

#Sorted_Dict_Keys’와 ‘Sorted_Dict_Values’쌍에는 최대 빈도수값과 최대빈도수 단어 저장


saveWordCloud

WordCloud를 그려서 저장하는 기능

#[CODE 2]
def saveWordCloud(wordInfo, filename):

taglist = pytagcloud.make_tags(dict(wordInfo).items(), maxsize=80)
pytagcloud.create_tag_image(taglist, filename, size=(640, 480), fontname='korean', rectangular=False)

#데이터리스트, 저장할 파일명, 저장할 크기..
webbrowser.open(filename)  



다음과 같이 저장가능하다.

Main

def main():

openFileName = 'jtbcnews_facebook_2018-03-01_2018-03-31.json'
cloudImagePath = openFileName + '.jpg'

rfile = open(openFileName, 'r', encoding='utf-8').read()

jsonData = json.loads(rfile)
message = ''

jtbcnews.json에 있는 명사를 찾아서 빈도수 저장하기 위한 파일.

‘message’의 내용을 합쳐 하나의 문자열로 만드는 작업을 수행

‘message’ 부분에 ‘\t’이나 ‘\n’등의 문자를 제거하기 위해서 문자나 숫자가 아닌 경우에는 공란(‘ ‘)으로 바꾼후 넣어 문자열을 작성

#[CODE 3]
for item in jsonData:
    if 'message' in item.keys():
        message = message + re.sub(r'[^\w]', ' ', item['message']) + ' '

json파일에 있는 메시지 가져와서 명사 추출하기위하여 탐색함


#[CODE 4]
nlp = Twitter()
nouns = nlp.nouns(message)
count = Counter(nouns)

품사 클래스: ‘KoNLPy’는 Kkma, Komoranm Twitter, Mecab(윈도우에서는 사용 불가), Hannanum 등의 여러 품사 클래스가 있음

예제에서는 konlpy.tag의 Twitter() 품사 클래스를 이용

counter.most_common(50) : 상위 50개의 리스트

   #[CODE 5]
   wordInfo = dict()
   for tags, counts in count.most_common(50):
       if (len(str(tags)) > 1):
           wordInfo[tags] = counts
           print ("%s : %d" % (tags, counts))
           
   showGraph(wordInfo)
   saveWordCloud(wordInfo, cloudImagePath)


Comments