감성분석에서 만들었던 평점,리뷰 데이터로 긍정,부정을 나누어 워드 클라우드를 생성 긍정적인 리뷰에 많이 노출되는 단어를 추출하여 영화에서 어떤 부분이 좋았는지를 추측할 수 있다. 반대로 부정적인 댓글에서는 어느 점이 싫었는지를 알 수 있어, 개선에 도움을 받을 수 있다.
import nltk
import numpy as np
from konlpy.tag import Okt; t = Okt()
import pandas as pd
import platform
import matplotlib.pyplot as plt
%matplotlib inline
path = "c:/Windows/Fonts/malgun.ttf"
from matplotlib import font_manager, rc
if platform.system() == 'Darwin':
rc('font', family='AppleGothic')
elif platform.system() == 'Windows':
font_name = font_manager.FontProperties(fname=path).get_name()
rc('font', family=font_name)
else:
print('Unknown system... sorry~~~~')
plt.rcParams['axes.unicode_minus'] = False
df=pd.read_csv('star_score.csv') # 앞서 만들었던 평점과 리뷰데이터를 이용
df1=df[df.score<5] #0~4점은 부정
df2=df[df.score>7] #8~10점은 긍정
df1=df1['text'] # 그 중에서 긍정 리뷰만 추출
df2=df2['text'] # 부정 리뷰 추출
df1
df2
pos= ''
for each_line in df2[:4000]:
pos = pos + each_line + '\n'
tokens_pos = t.nouns(pos) #형태소 분석 Okt
tokens_pos[0:10]
neg = ''
for each_line in df1[:4000]:
neg = neg + each_line + '\n'
tokens_neg = t.nouns(neg)
tokens_neg[0:10]
po = nltk.Text(tokens_pos, name='영화')
print(len(po.tokens))
print(len(set(po.tokens)))
ne = nltk.Text(tokens_neg, name='영화')
print(len(ne.tokens))
print(len(set(ne.tokens)))
pos_data=po.vocab().most_common(50)
pos_data
neg_data=ne.vocab().most_common(50)
neg_data
from wordcloud import WordCloud, STOPWORDS
from PIL import Image
import platform
import matplotlib.pyplot as plt
po.similar('영화') #nltk 안에 있는 주어진 단어와 비슷한 환경에서 쓰인 단어를 추출
plt.figure(figsize=(15,6))
po.plot(50)
plt.show() #긍정 리뷰에서 많이 나오는 단어
ne.similar('영화')
plt.figure(figsize=(15,6))
ne.plot(50)
plt.show() #부정 리뷰에서 많이 나오는 단어
mask = np.array(Image.open('popcorn.png'))
from wordcloud import ImageColorGenerator
image_colors = ImageColorGenerator(mask)
image_colors
pos_data = pos.vocab().most_common(500)
# for win : font_path='c:/Windows/Fonts/malgun.ttf'
wordcloud = WordCloud(font_path='c:/Windows/Fonts/jalnan.ttf',
relative_scaling = 0.1, mask=mask,
background_color = 'white',
min_font_size=1,
max_font_size=100).generate_from_frequencies(dict(pos_data))
default_colors = wordcloud.to_array()
plt.figure(figsize=(12,12))
plt.imshow(wordcloud.recolor(color_func=image_colors), interpolation='bilinear')
plt.axis('off')
plt.show() #긍정 워드클라우드
neg_data = neg.vocab().most_common(500)
# for win : font_path='c:/Windows/Fonts/malgun.ttf'
wordcloud = WordCloud(font_path='c:/Windows/Fonts/jalnan.ttf',
relative_scaling = 0.1, mask=mask,
background_color = 'black',
min_font_size=1,
max_font_size=100).generate_from_frequencies(dict(neg_data))
default_colors = wordcloud.to_array()
plt.figure(figsize=(12,12))
plt.imshow(wordcloud.recolor(color_func=image_colors), interpolation='bilinear')
plt.axis('off')
plt.show() #부정 워드클라우드