개발 공부/딥러닝
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) |