초보 dogfootruler

1. 영화 '나를 찾아줘' 파이썬으로 간단한 분석하기 본문

StudyRoom;/Data Science;

1. 영화 '나를 찾아줘' 파이썬으로 간단한 분석하기

킹갓우부 2019. 12. 1. 19:14

요즘 파이썬에 푹 빠져버렸다.

그래서 책과 구글을 통해서 공부하고 있다.

오늘 할 것은 영화 '나를 찾아줘' 영화에 대해서 간단하게 분석하기 이다.

 

이 영화를 보지도 않고 선택한 이유는 간단하다.

부모님이 오늘 이 영화를 보러갔다. ㅎㅎ

그래서 무슨 영화 인가 궁금증이 생겼다.

 

1. import 및 설정

 

처음 import 및 설정을 다 때려 박았다.

파이썬은 인터프리터 형태여서 필요할 때, 라이브러리를 넣어주어도 되지만 그냥 먼저 필요한 것만 다 때려박았다.

import pandas as pd
import numpy as np

import platform
import matplotlib.pyplot as plt
%matplotlib inline

from matplotlib import font_manager, rc
plt.rcParams['axes.unicode_minus'] = False

if platform.system() == 'Darwin':
    rc('font', family='AppleGothic')
elif platform.system() == 'Windows':
    path = "c:/Windows/Fonts/malgun.ttf"
    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

from bs4 import BeautifulSoup
from urllib.request import urlopen
import urllib
import time

from tqdm import tqdm_notebook

import nltk
from konlpy.tag import Twitter; t = Twitter()

from wordcloud import WordCloud, STOPWORDS
from PIL import Image

 

2. 한줄평 뽑아내기

 

주소표시창에는 간단한 주소 밖에 보이지 않는다. 이런걸로는 한줄평을 제대로 볼 수가 없다

구글의 개발자 도구를 통해 정확한 주소를 알아내자(한줄평의 아래 보면 페이지가 넘어가는 곳이 있다.)

 

 

 

 

tmp = "https://movie.naver.com/movie/bi/mi/pointWriteFormList.nhn?code=175324&type=after&onlyActualPointYn=N"
html = tmp + "&onlySpoilerPointYn=N&order=sympathyScore&page={page}"

 

구글의 개발자 도구에서 관람객 한줄평에 대한 태그를 검색한다.

ment_bringMeOn = []

for n in tqdm_notebook(range(1,1000,10)):
    response = urlopen(html.format(page=n))
    
    soup = BeautifulSoup(response, "html.parser")
    
    tmp = soup.find_all('div', 'score_reple')
    
    for line in tmp :
        ment_bringMeOn.append(line.text)
    
    time.sleep(0.5)

이렇게 코드를 짜준다.  'div'태그의 score_reple이라는 속성을 가진 것을 다 찾아버려서 

ment_bringMeOn에 붙여준다.

ment = ""
for each_line in ment_bringMeOn[:1000]:
    ment = ment+each_line+'\n'

그리고 받아온 것을 한줄씩 받아오게 하기 위해서 나눈다

 

 

3. 형태소 분석 및 글자 제거

tokens_ko = t.morphs(ment)
tokens_ko

이렇게 돌려보면 형태소 하나하나 보여주게 된다.

ko = nltk.Text(tokens_ko, name='나를 찾아줘')
print(len(ko.tokens))
print(len(set(ko.tokens)))

전체 형태소와 중복되는 형태소를 제거한 형태소의 숫자가 나온다

전체는 30175개에 중복을 제외하면 1985가 나온다.

ko = nltk.Text(tokens_ko, name='나를 찾아줘')
ko.vocab().most_common(100)

이렇게 해서 가장 많이 나온 형태소 100개를 보여주게 한다.

 

예를 들어, \n나 , 등등 한줄평과 관련없는 것들을 stop_words에 담아줄겁니다.

stop_words = ['\n\n\n','.','신고','2019.11','(','****)','가','영화','27','이','로','평','...','에','입니다',
'\n\n\n\n\n\n\n\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t',
'의','는','28','를','은','\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\n\n\n\n\n\n', '10:20','j','ssang','ssan','zmdk','09:37','\n\n', '/', 'jmsu', 
'\n\n\n\n\n\n','관람객','만','한','극','된','보기','스포일러','포함','\n\n\n\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t','MacGyVer','jeep', 'Unbalance',
'제목','분명','베','도','을','****','30','나','?',',','에서','0','그','인','fhg','제','봤다','??','처럼', '봤는데',
'\n\n\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t',
'ㅠㅠ','두','개','것','못','보다','!','남','곳',')','중','ㅋㅋ','\n\n\n\n\n\n\n']
tokens_ko = [each_word for each_word in tokens_ko 
                            if each_word not in stop_words]

ko = nltk.Text(tokens_ko, name='나를 찾아줘')
ko.vocab().most_common(100)

 

필요 없는 것들이 많이 제거가 된것으로 보입니다.

 

4. 워드 클라우드로 시각화 하기

data = ko.vocab().most_common(300)

wordcloud = WordCloud(font_path='c:/Windows/Fonts/malgun.ttf',
                      relative_scaling = 0.2,
                      #stopwords=STOPWORDS,
                      background_color='white',
                      ).generate_from_frequencies(dict(data))
plt.figure(figsize=(16,8))
plt.imshow(wordcloud)
plt.axis("off")
plt.show()

이렇게 코드를 짜주면, 

그럼 이 한줄평을 종합해서 '나를 찾아줘'의 영화가 어느정도의 내용이 예상이 가능하죠

일단 주연배우인 이영애가 보이고, 사투리가 나오는것이 지방에서 일어난 일을 설정한 것 같습니다

경찰은 제 역할을 못해, 견찰이라 불리는 것 같고, 살인과 강간이 일어나는 영화일 거 같네요

그리고 슬프다 등등 내용을 봤을때 어느정도 눈물샘을 자극하는 영화가 아닌가 생각이 듭니다.

중간에, 세월호가 보여서 집에 부모님이 왔을때 영화가 세월호랑 관련이 있냐고 물으니 관련 없다고 하시네요

한 이정도만 영화의 내용이 예측이 가능한것 같습니다.

 

5. 평점 분석하기

 

영화가 나온지 5일밖에 되지 않았기 때문에 평점을 제대로 분석할 수는 없었다.

date = pd.date_range('2019-11-27', periods=4, freq='D')
movie_date = []
movie_name = []
movie_point = []

for today in tqdm_notebook(date):
    html_bring = "https://movie.naver.com/movie/sdb/rank/rmovie.nhn?" +\
                    "sel=cur&tg=0&date={date}"
    response = urlopen(html_bring.format(date = urllib.parse.quote(today.strftime('%Y%m%d'))))
    soup = BeautifulSoup(response, "html.parser")
        
    end = len(soup.find_all('td', 'point'))
    
    movie_date.extend([today for n in range(0, end)])
    movie_name.extend([soup.find_all('div', 'tit5')[n].a.string for n in range(0, end)])
    movie_point.extend([soup.find_all('td', 'point')[n].string for n in range(0, end)])

일단, 27일 부터 30일까지의 평점을 보기 위해서, 틀을 만들고, 

영화 평점을 볼수 있는곳으로 27일부터의 평점을 가서 다 긁어옵니다.

movie = pd.DataFrame({'date':movie_date, 'name':movie_name, 
                                      'point':movie_point})
movie['point'] = movie['point'].astype(float)
tmp = movie.query('name == ["나를 찾아줘"]')
tmp

긁어온 자료들을 데이터프레임 형식으로 만들어주고

거기서, 제목이 '나를 찾아줘'인 영화를 검색해봅니다.

아주 잘 나옵니다.

이제 마지막으로 이 데이터들을 그래프로 만들어보겠습니다.

plt.figure(figsize=(16,8))
plt.plot(tmp['date'], tmp['point'])
plt.legend(loc='best')
plt.grid()
plt.show()

첫날 7.89라는 괜찮은 곳에서 출발을 했지만, 점점 떨어지는 것을 볼 수 있다.

계속 떨어질 것 같은데, 딱 7점에서 왔다리 갔다리 할 것 같은 느낌이 든다.

개인적으로 7이 넘으면 볼만한 영화라고 생각하는데, 

딱 그냥 킬링타임용 영화인 것 같다.

 

Comments