16. 데이터 분석하기영화 리뷰 분석(22.07.26)
[감성분석 + 토픽 모델링]
목표: 영화 리뷰 데이터에 감성 분석 모델을 구축하여 새로운 데이터의 감성을 분석
텍스트마이닝이란?: 비정형 텍스트 데이터로부터 패턴을 찾아내어 의미있는 정보를 추출하는 분석 기법 ->데이터마이닝 + 자연어 처리
과정: 텍스트 전처리->특성 벡터화->머신러닝 모델 구축 및 학습/평가 프로세스 수행
특성 벡터화란?: 텍스트를 구성하는 단어 기반의 특성 추출을 하고, 이를 숫자형 값인 벡터값을 표현하는 것
- >> 내용이 많아 따로 정리하였음.
감성분석이란?: 텍스트에서 사용자의 주관적인 의견이나, 감성,태도를 분석하는 텍스트 마이닝의 핵심 분석 기법중 하나.
텍스트에서 감성을 나타내는 단어를 기반으로 긍정/부정의 감성을 결정, 감성단어에 대한 사전을 가진 상태에서 단어를 검색하여 점수계산.
토픽모델링이란?: 문서를 구성하는 키워드를 기반으로 토픽을 추출하고, 추출한 토픽을 기준으로 문서를 분류 및 분석하는 기법. 문서에서 다루는 토픽을 도출하여 동향을 파악하고, 새로운 문서의 토픽을 예측하는 분석에 사용
LDA란?: 대표적인 머신러닝 기반 토픽모델링 방법.
디리클레분포를 이용하여 주어진 문서에 잠재되어있는 토픽을 추론하는 확률 모델 알고리즘 사용.
LDA는 특정 주제에 특정 단어가 나타날 확률과 문서에 대한 주제 분포 비율을 나타내며, 각 문서를 주제별로 나타날 확률 분포에 대해 벡터화하기 때문에 문서 임베딩 기법으로 간주할 수 있다.
LDA는 토픽의 개수K가 토픽분석의 성능을 결정짓는 중요한 요소로 사용자가 정해주어야 하는 하이퍼파라미터이다.
1. 데이터 수집
깃허브에 공개된 네이버 영화 리뷰 데이터셋 이용.
깃허브 -> ratngs.txt, ratingstest.txt, ratingstrain.txt 다운
2.데이터 준비 및 탐색
train데이터부터 데이터 전처리를 해볼 것이다.
train_df=pd.read_csv('../data/Movie/ratings_train.txt',encoding='utf-8',sep='\t',engine='python')
train_df.head()
train_df.info()
데이터의 정보를 봤을 때, document에 결측치가 5개 존재하는 것을 볼 수있다.
train_df=train_df[train_df['document'].notnull()]
train_df.info()
[01행]: document가 notnull인 행만 train_df에 저장
train_df['label'].value_counts()
trian_data의 분류결과를 보면 부정감성이 75170개 긍정감성이 74825개 있는 것을 볼 수 있다.
import re
train_df['documnet']=train_df['document'].apply(lambda x: re.sub(r'[^ ㄱ-ㅣ가-힣]+'," ",x))
train_df.head()
[01행]: 정규식을 사용하기 위해서 re모듈을 import 한다.
[02행]: 'ㄱ'으로 시작하거나, '가~힣'까지의 문자를 제외한 나머지는 공백으로 치환
같은 과정을 test데이터도 동일하게 진행해준다.
test_df=pd.read_csv('../data/Movie/ratings_test.txt',encoding='utf-8',sep='\t',engine='python')
test_df.head()
test_df.info()
test_df=test_df[test_df['document'].notnull()]
test_df.info()
train_df['label'].value_counts()
import re
test_df['documnet']=test_df['document'].apply(lambda x: re.sub(r'[^ ㄱ-ㅣ가-힣]+'," ",x))
test_df.head()
2.분석 모델 구축
from konlpy.tag import Okt
okt=Okt()
def okt_tokenizer(text):
tokens=okt.morphs(text)
return tokens
[01~02행] : 형태소 분석기에 사용할 konlpy패키지의 okt클래슬르 임포트하고, 객체생성
[03~05행]: 문장을 토큰화하기 위한 함수를 정의, okt.morphs()를 통해 형태소 단위로 토큰화 진행
from sklearn.feature_extraction.text import TfidfVectorizer
tfidf = TfidfVectorizer(tokenizer = okt_tokenizer, ngram_range=(1,2), min_df=3, max_df=0.9)
tfidf.fit(train_df['document'])
train_tfidf = tfidf.transform(train_df['document'])
[01,02행]: 사이킷런의 tfidfvectorizer을 이용해서 TF-IDF벡터화에 사용될 객체 생성
- >단어의 크기는 1~2, 최소출현빈도는 3, 최대출현빈도는 90%로 설정
[03,04행]: 벡터모델을 FIT하고 train_df의 document행을 변환
from sklearn.linear_model import LogisticRegression
SA_lr=LogisticRegression(random_state=0)
SA_lr.fit(train_tfidf,train_df['label'])
[01행]: 사이킷런의 로지스틱 객체 생성
[02행]: 독립변수를 위에서 생성한 train_tfidf로 하고, 종속변수를 label column으로 설정하여 fit
from sklearn.model_selection import GridSearchCV
params={'C':[1,3,3.5,4,4.5,5]}
SA_lr_grid_cv=GridSearchCV(SA_lr,param_grid=params,cv=3,scoring='accuracy',verbose=1)
SA_lr_grid_cv.fit(train_tfidf,train_df['label'])
print(SA_lr_grid_cv.bnest_params_,round(SA_lr_grid_cv.best_score_,4))
SA_lr_best=SA_lr_grid_cv.best_estimator_
이전 머신러닝 모델에서도 사용한 GridSearchCV를 통해서 최적의 하이퍼파라미터 값을 찾는다.
3. 분석 모델 평가
최적의 하이퍼 파라미터를 이용한 분류모델을 저장했으니, 이제 테스트셋으로 모델을 평가해보자.
from sklearn.metrics import accuracy_score
test_tfidf = tfidf.transform(test_df['document'])
test_predict = SA_lr_best.predict(test_tfidf)
print('감성 분석 정확도 : ', round(accuracy_score(test_df['label'], test_predict), 3))
test set에 대해 분류모델을 적용시켜본 결과 accuracy가 86.6이 나왔다. 어느정도 정확한 모델이 되었으므로 테스트셋말고 임의의 데이터에 적용시켜보자.
st = input('감성 분석할 문장입력 >> ')
st = re.compile(r'[ㄱ-ㅣ가-힣]+').findall(st)
st = [" ".join(st)]
st
st_tfidf = tfidf.transform(st)
st_predict = SA_lr_best.predict(st_tfidf)
if(st_predict== 0):
print(st , "->> 부정 감성")
else :
print(st , "->> 긍정 감성")
[01행]: 임의의 문장을 입력한다.
[02,03행]: 텍스트 전처리를 시행
[05,06행]: 만들어진 분류모델에 전처리된 데이터를 입력
[07,08행]: 분류결과에 따라 부정,긍정 판별
'데이터분석실습 > 데이터 과학 기반의 파이썬 빅데이터 분석' 카테고리의 다른 글
파이썬 빅데이터 분석 Day 17 (1) | 2023.11.02 |
---|---|
파이썬 빅데이터 분석 Day 15 (1) | 2023.10.26 |
파이썬 빅데이터 분석 Day 14 (0) | 2023.10.26 |
파이썬 빅데이터 분석 Day 13 (0) | 2023.10.26 |
파이썬 빅데이터 분석 Day 12 (1) | 2023.10.26 |