글씨가 깨지는 것을 방지하기 위하여 한글폰트를 넣어주어야 한다.
colab 환경에서 진행하는 경우, 아래 코드를 실행하여 준다.
!apt-get install fonts-nanum*
!apt-get install fontconfig
window 환경에서 진행하는 경우는 폰트를 다운받고 후에 폰트 경로를 설정하여 준다.
wordCloud에 포함되지 않았으면 하는 단어들을 미리 .txt 파일에 저장한다.
txt 파일은 한 줄에 한 단어가 들어가도록 작성하여 dataset 폴더에 위치시켰다.
pip install WordCloud
pip install konlpy
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)