일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 정보처리기사
- firebase
- 계층
- 인증
- PICASSO
- 전송계층
- 글라이드
- Glide
- 네트워크
- 페이지
- 저평가주
- 알바후기
- 선점스케줄링
- IP
- 페이지 교체 알고리즘
- 조선협객전M
- SJF
- 파이어베이스
- 조선협객전
- 네트워크 관리사
- FCFS
- RR
- 운영체제
- 클로즈베타
- 안드로이드
- FIFO
- 응용계층
- 비선점스케줄링
- 게임후기
- hrn
- Today
- Total
초보 dogfootruler
1. 영화 '나를 찾아줘' 파이썬으로 간단한 분석하기 본문
요즘 파이썬에 푹 빠져버렸다.
그래서 책과 구글을 통해서 공부하고 있다.
오늘 할 것은 영화 '나를 찾아줘' 영화에 대해서 간단하게 분석하기 이다.
이 영화를 보지도 않고 선택한 이유는 간단하다.
부모님이 오늘 이 영화를 보러갔다. ㅎㅎ
그래서 무슨 영화 인가 궁금증이 생겼다.
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이 넘으면 볼만한 영화라고 생각하는데,
딱 그냥 킬링타임용 영화인 것 같다.