본문 바로가기
파이썬(Python)

[파이썬/Python] 영화('동감') 댓글 리뷰 워드 클라우드(wordcloud)로 만들어보기

by Serendipity_ 2022. 11. 20.
반응형

최근에 '동감'이라는 영화를 보았는데요, 이번에 워드클라우드를 진행하며 리메이크 작임을 알았습니다.

몽글몽글함도 있지만 약간은 내용이 아쉬운 느낌이 드는 영화였습니다. 

주인공의 심리에 완전히 이입하지 못했던 것 같습니다. 하지만 오랜만에 대학생활의 풋풋함을 느꺼보고 싶은 분들에게 추천드립니다.

 

오늘은 파이썬(Python)을 통해서 CGV 영화 댓글을 수집하여 워드클라우드로 만들어보겠습니다.

워드클라우드란? 사용빈도가 높은 단어를 예쁘게 시각화하여 보여주는 방법입니다.

워드클라우드_예시
워드클라우드 예시(http://wordcloud.kr)


1. 댓글 수집하기 

- 댓글 수집은 크롤링을 통해서 가져왔습니다.

- 이전 발행 글 참조해주시면 될 것 같습니다.

- CGV 댓글 수집의 경우, page 마다 URL에 넘버링 되지 않는 형태라 Selenium 을 통해 수집해야 합니다. 

2022.08.01 - [파이썬(Python)] - [한산-용의 출현] 댓글 수집하기

 

[한산-용의 출현] 댓글 수집하기

요즘 날씨가 너무 덥습니다. 제 블로그를 보시는 분들이라면 '숫자'로 보는 걸 좋아할 거라 생각했습니다. (기상청 자료 굳이굳이 들고왔습니다 ) 더우면 기력을 잃어버리는 개복치인 저는 영화

serendipity77.tistory.com

 

- 최근 Selenium이 업데이트 되면서 'By'와 같은 형태로 작성해주셔야 합니다. (이전 발행 글 Melon 코드 참고)


2. 데이터 불러오기

 - 편집기는 Jupyter Lab 으로 사용하였습니다.

 - 라이브러리를 불러옵니다.

from wordcloud import WordCloud # 워드클라우드 제작 라이브러리
import pandas as pd # 데이터 프레임 라이브러리
import numpy as np # 행렬 라이브러리
import matplotlib.pyplot as plt # 워드클라우드 시각화 라이브러리

 - 데이터를 불러옵니다

df = pd.read_csv('동감댓글수집_2022.11.20.csv')
df

 - 데이터 결과확인(11월 20일 기준 불러온 데이터입니다 , 360개 댓글이 있습니다)

'동감'_리뷰
'동감' 리뷰

 


3.  정규표현식으로 데이터 편집하기

 - '정규표현식'을 통해 불필요한 특수문자 등을 제거해야합니다. 한글을 제외한 모든 문자를 제거해보겠습니다.

df['Review'] = df['Review'].str.replace('[^가-힣]', ' ', regex = True)
df['Review']

 - [^가-힣] : 한글이 아닌 모든 문자를 뜻합니다.

 - replace에 따라 [^가-힣] : 한글이 아닌 모든 문자를, ' ' : 빈칸으로 만들어줘, regex = True : 정규표현식 사용할게 ! 란 뜻입니다.

정규표현식_한글아닌문자_제거
정규표현식으로 특수문자 등을 제거

 - 위에 있는 리뷰 데이터와 비교 시, 특수문자 등이 사라졌음을 볼 수 있습니다.


4. '명사'만 추출하기

 - 형태소 분석기 꼬꼬마(Kkma)를 통해서 명사만 추출해보겠습니다.

import konlpy
kkma = konlpy.tag.Kkma() #형태소 분석기 꼬꼬마(Kkma)

nouns = df['Review'].apply(kkma.nouns)
nouns

 - 추출결과 확인해보니 나쁘지 않은 것 같습니다.

kkma추출결과
kkma추출결과

 - 추출결과 비교해보겠습니다

kkma추출결과_비교
kkma추출결과 비교

 - 추출결과를 보니 1행의 원작, 리메이크 등은 잘 뽑아내었으나 3행의 여진구를 '여진'으로 뽑아내고, 위한을 '위'로 뽑아냈습니다.

 - 조금 아쉬운 결과지만 그래도 상당히 괜찮은 결과가 나타났습니다.


5. 단어 데이터프레임 만들기

 -  explode 함수를 통해 list 데이터를 한 행에 한 단어만 들어가도록 변경해줍니다.

nouns = nouns.explode()
nouns

explode 함수설명

 - 데이터 글자수를 확인하여 2개 이상만 가져오도록 합니다.

df_word = pd.DataFrame({'word' : nouns})
df_word['count'] = df_word['word'].str.len()
df_word = df_word.query('count >= 2')
df_word

글자수 2개 이상만 가져오기
글자수 2개 이상만 가져오기

 - Groupby 함수를 통해 단어별로 얼마나 쓰였는지 확인이 필요합니다.

 - 기왕이면 가장 빈도가 많은 단어순으로 '내림차순' 해보겠습니다.

df_word = df_word.groupby('word', as_index = False).count().sort_values('count', ascending = False)
df_word

단어의 빈도를 기준으로 내림차순 확인
단어의 빈도를 기준으로 내림차순 확인

 - 영화 데이터이다보니, '영화'라는 단어가 가장 많이 포진되어 있습니다.

 - '영화'데이터에서 '영화', '연기', '배우' 등은 너무나 당연히 많이 포함되는 단어라 큰 Insight를 찾기 어려울 것 같습니다.

 - 상위 3개 정도는 지운 데이터를 들고오겠습니다.

 - 단순하게 iloc 함수를 사용하여 위에서 네 번째 행부터 가져오도록 합니다. 

# 영화처럼 불필요한 단어 제거
df_word = df_word.iloc[3:, :]
df_word.head(5)

불필요한 단어 제거
불필요한 단어 제거

 - '영화', '배우', '연기' 등의 텍스트는 지워졌습니다.


6.  워드클라우드 만들기

 - 드디어 워드클라우드 라이브리러리를 쓸 수 있습니다.

 - 전처리 과정이 귀찮았습니다. 또한, 워드클라우드는 Java 등 갖가지 문제점이 발생합니다. 버전 등을 잘 확인해주셔야 합니다.

 - 데이터 프레임을 딕셔너리 형태로 변환해주셔야 합니다.

dic_word = df_word.set_index('word').to_dict()['count']
dic_word

딕셔너리 변환결과

 - 워드클라우드 함수를 사용합니다.

wc = WordCloud(random_state = 123, font_path = 'AppleGothic', width = 400,
               height = 400, background_color = 'white')

img_wordcloud = wc.generate_from_frequencies(dic_word)

plt.figure(figsize = (10, 10)) # 크기 지정하기
plt.axis('off') # 축 없애기
plt.imshow(img_wordcloud) # 결과 보여주기
plt.savefig('동감_워드클라우드') # 파일 저장

 - font_path : 'AppleGothic'은 지금 맥북으로 작업 중이라 저렇게 작성하였으며, Windows 사용자의 경우, 'Malgun Gothic'이라고 해주시면 될 것 같습니다.

 - plt : 맨 위에서 불렀던 함수 중 matplotlib.pyplot 을 활용하였습니다.

 

- 워드클라우드 결과가 나타납니다.

워드클라우드 결과
'동감' 워드클라우드 결과

 


7. 알아두면 좋은 추가사항

 - 워드클라우드를 통해 모양 및 색 등을 변경할 수 있습니다.

 - PIL 이라는 라이브러리를 임포트 해줍니다.

import PIL
icon = PIL.Image.open('cloud.png')

img = PIL.Image.new('RGB', icon.size, (255,255,255))
img.paste(icon, icon)
img = np.array(img)

여기서 cloud.png는 검은 배경화면에 구름모양의 이미지를 두었습니다.

cloud.png
cloud.png

 

 - mask = img 와 colormap 을 변경하여 모양 및 색상을 바꿔보았습니다. 

Python을 통한 워드클라우드(wordcloud)로 텍스트 시각화 많이 활용해보시길 바랍니다.

혹시 댓글 데이터 필요하신 분들께서는 아래 파일 다운로드 부탁드립니다.

 

동감댓글수집_2022.11.20.csv
0.03MB

반응형

댓글