본문 바로가기
App Programming/Web Crawler

[Web Crawler] 네이버 영화 댓글 감정 분석과 예측

by goatlab 2022. 11. 24.
728x90
반응형
SMALL

필수 라이브러리 설치

 

!apt-get update
!apt-get install g++ openjdk-8-jdk python-dev python3-dev -y
!pip3 install JPype1-py3
!pip3 install konlpy
!JAVA_HOME="/usr/lib/jvm/java-8-openjdk-amd64"

 

네이버 영화 사이트에서 리뷰 수집

 

import requests
from bs4 import BeautifulSoup
import pandas as pd
import time

review_page = 'https://movie.naver.com/movie/bi/mi/pointWriteFormList.naver?code=184516&type=after&isActualPointWriteExecute=false&isMileageSubscriptionAlready=false&isMileageSubscriptionReject=false&page={}'
dict_score = dict()

for page_number in range(1, (7394//10) + 2):
    time.sleep(2)
    print(f'[+]와칸다 포에버 {page_number}페이지 조회 시작...')
    res = requests.get(review_page.format(page_number))
    bs4obj = BeautifulSoup(res.text, 'html.parser')

    for index, score_result in enumerate(bs4obj.find_all('div', {"class": 'score_result'})[0].find_all('li')):
        list0 = score_result
        score = int(list0.em.text) # 점수
        text = list0.find_all('span', {'id': f'_filtered_ment_{index}'})[0].text.strip()
        dict_score[f'{page_number}-{index}'] = [score,text]
    
    if page_number == 10:
        break

print(f'[+]와칸다 포에버 {page_number}페이지까지 조회 완료')    
pd.DataFrame(dict_score, index=['score','text']).T

 

리뷰 데이터 다운로드

 

# 리눅스 명령어를 사용해 다운로드 수행
!wget https://github.com/e9t/nsmc/raw/master/ratings_train.txt 

review_df = pd.read_csv('ratings_train.txt', sep='\t')
review_df.head()
review_df.shape

 

데이터 전처리

 

from sklearn.model_selection import train_test_split

review_df.dropna(inplace=True)
x = review_df['document'].values
y = review_df['label'].values

train_x, test_x, train_y, test_y = train_test_split(x, y, test_size=0.2, random_state=0)
print(train_x.shape)
print(test_x.shape)
print(train_y.shape)
print(test_y.shape)
from konlpy.tag import Twitter

twitter = Twitter()
twitter.morphs(train_x[0])
  • tokenizer=twitter.morphs는 형태소 분석기를 사용해 텍스틑 자르겠다는 의미이다.
  • ngram_range=(1,2)은 단어를 여러개 묶어서 벡터라이징을 수행해 순서를 인지할 수 있는 장점이 있다.
  • min_df=3 데이터가 최소 3회이상 등장해야 특징으로 사용할 수 있다 (너무 희소한 것은 특징으로 사용하기 어려움).
  • max_df=0.9 데이터의 빈도수가 top 10% 들어가면 특징으로 사용할 수 없다 (너무 흔한 것은 특징으로 보기 어려움).
from sklearn.feature_extraction.text import TfidfVectorizer
from konlpy.tag import Twitter

tfv = TfidfVectorizer(tokenizer=twitter.morphs, ngram_range=(1,2), min_df=3, max_df=0.9)
tfv.fit(train_x)
tfv_train_x = tfv.transform(train_x) # 텍스트를 숫자로 변환한 train_x가 완성된다.
tfv_train_x

 

평점 학습

 

from sklearn.linear_model import LogisticRegression # 이진분류 알고리즘
from sklearn.model_selection import GridSearchCV    # 하이퍼파리미터 최적화

clf = LogisticRegression(random_state=0)
params = {'C': [1,3,5,7,9]}
grid_cv = GridSearchCV(clf, param_grid=params, cv=4, scoring='accuracy', verbose=1)
grid_cv.fit(tfv_train_x, train_y)
print(grid_cv.best_params_)
print(grid_cv.best_score_)

 

평점 예측

 

tfv_test_x = tfv.transform(test_x)
grid_cv.best_estimator_.score(tfv_test_x, test_y)
a = ['아 너무 재미있어요 꼭 보세요',
     '핵노잼 너무 재미없어 절대 보지마',
     '영화 너무 훌륭해요!',
     '영화가 지루해요',
     '보지마삼'
    ]

my_review = tfv.transform(a)
grid_cv.best_estimator_.predict(my_review)
728x90
반응형
LIST