
[실습] 긍정 리뷰로 워드 클라우드
import pandas as pd
# 띄어쓰기 중심으로 토큰화 : nltk 패키지 활용
from nltk import word_tokenize # 토큰화 도와주는 함수
import nltk
nltk.download("punkt") # 문장부호 정보를 다운로드
# 반복 프로세스의 정도를 시각화하는 도구
from tqdm import tqdm
# 단어빈도 세기
from collections import Counter
# 워드클라우드
from wordcloud import WordCloud
import re # 정규표현식을 사용할 수 있는 모듈 로딩
# matplotlib을 통해 시각화
import matplotlib.pyplot as plt
plt.rc('font',family="batang")
review = pd.read_table('./data/naver_shopping.txt', sep='\t', header=None, names=['별점','후기'])
review


review_positive = review[review['별점'] >= 4]
text_review_positive = review_positive['후기']
text_review_positive

review_words = []
for text in tqdm(text_review_positive):
temp = word_tokenize(text) # 한 문장씩 토큰화
review_words = review_words + temp

counter = Counter(review_words)
review_most_100 = counter.most_common(100)
review_most_100

# 클렌징할 패턴 생성
unsmile_p = re.compile('[!?,.:;0-9a-zA-zㅋㅎㄷㅇ~]+')
clean_review_words = [] # 클렌징된 단어토큰이 들어갈 리스트
for w in review_words:
if unsmile_p.search(w): # 단어토큰이 패턴에 매칭된다면
continue # 다음 단어 반복으로 넘어감
if len(w) < 2 : # 한글자 단어라면
continue # 다음 단어 반복으로 넘어감
clean_review_words.append(w) # 패턴에 매칭되지 않는 다면 리스트에 추가
counter = Counter(clean_review_words)
review_most_100= counter.most_common(100)
review_most_100
stop_review_words = ['너무','아주','많이','생각보다','정말','아직','조금','진짜','있어서','완전','엄청','있습니다','그래도','들어요','쓰고','바로','근데','그냥','역시','않고','일단','매우','다시','약간','해서','처음','다만','ㅠㅠ']
# 원문에서 제거
stop_clean_review_words = [] # 불용어가 제거된 리스트
for w in clean_review_words:
if w not in stop_review_words : # 단어토큰이 불용어 목록에 포함되지 않는 경우
stop_clean_review_words.append(w)
# 카운팅된 결과에서 제거
review_most_100_dict = dict(review_most_100)
for sw in stop_review_words:
del review_most_100_dict[sw]
review_most_100_dict

# 불용어 처리된 단어토큰 빈도세기
counter = Counter(stop_clean_review_words)
review_most_100 = counter.most_common(100)
# 워드 클라우드 그리기
wc_rs = wc.generate_from_frequencies(dict(review_most_100))
plt.rc('font',family="batang")
plt.figure(figsize=(20,8)) # 가로, 세로 비율 지정 (inch 단위)
plt.imshow(wc_rs) # 그림을 시각화할 때 사용하는 함수
plt.axis('off') # x,y 눈금 숨기기
plt.show() # 시각화 결과 보여주기
