한국어 wordCloud 생성

semi·2020년 9월 20일
0

NLP

목록 보기
4/5

한글 폰트 다운로드

글씨가 깨지는 것을 방지하기 위하여 한글폰트를 넣어주어야 한다.
colab 환경에서 진행하는 경우, 아래 코드를 실행하여 준다.

!apt-get install fonts-nanum*
!apt-get install fontconfig

window 환경에서 진행하는 경우는 폰트를 다운받고 후에 폰트 경로를 설정하여 준다.

불용어 사전 구축

wordCloud에 포함되지 않았으면 하는 단어들을 미리 .txt 파일에 저장한다. 
txt 파일은 한 줄에 한 단어가 들어가도록 작성하여 dataset 폴더에 위치시켰다.

라이브러리 install

 pip install WordCloud
 pip install konlpy

wordCloud 생성 코드

import sys
from konlpy.tag import Okt
from collections import Counter
from wordcloud import WordCloud
import pandas as pd


# --------------------------------------- 변수 -------------------------------
DATASET_PATH = '/content/drive/My Drive/Colab Notebooks/recommend_music_by_sentiment_analysis/dataset/'
RESULT_PATH = '/content/drive/My Drive/Colab Notebooks/recommend_music_by_sentiment_analysis/result/'
FONT_PATH = '/usr/share/fonts/truetype/nanum/NanumGothic.ttf'
EXCEL_NAME = 'angry.xlsx'
PNG_NAME = 'angry.png'
COMMON_NUMBER = 50
EMOTION_LIST = ["happy", 'sad', 'depressed', 'love', 'angry']
# ----------------------------------------------------------------------------

# 엑셀의 문장들을 하나의 문장으로 합침
def make_docs(): 
  xlsx = pd.read_excel(DATASET_PATH + EXCEL_NAME, names = ['c1', 'c2'])
  docs = ""
  for i in xlsx['c1']:
    docs+=str(i)+'.'
  return docs

# 불용어 사전 구축
def make_stop_words():
  f = open(DATASET_PATH + 'stop_words_kr.txt','r')
  stop_words = []
  while True:
      line = f.readline()
      if not line: break
      stop_words.append(line[:-1])
  return stop_words

# 고빈도 명사 리스트 구축
def get_noun(news, stop_words):
  okt = Okt()
  noun_ = okt.nouns(news)
  noun = []
  for i in noun_:
    noun.append(i.replace(" ", ""))
  new_noun = []
  for i, v in enumerate(noun):
    if (len(v) >= 2) and (v not in stop_words):
      new_noun.append(v)
      
  count = Counter(new_noun)
  noun_list = count.most_common(COMMON_NUMBER)
  return noun_list

# wordcloud 생성
def visualize(noun_list):
  wc = WordCloud(font_path = FONT_PATH,
                 background_color = "white",
                 width = 1000,
                 height = 1000,
                 max_words = COMMON_NUMBER,
                 max_font_size = 300)
  wc.generate_from_frequencies(dict(noun_list))
  wc.to_file(RESULT_PATH + PNG_NAME)

for emotion in EMOTION_LIST:
  EXCEL_NAME = emotion + '.xlsx'
  PNG_NAME = emotion + '.png'
  docs = make_docs()
  stop_words = make_stop_words()
  noun_list = get_noun(docs, stop_words)
  visualize(noun_list)
  print('finish ' + emotion)

0개의 댓글