관리 메뉴

DeseoDeSeo

[Machine learning ] ex11_Textmining(영화리뷰 감성분석) 본문

Python

[Machine learning ] ex11_Textmining(영화리뷰 감성분석)

deseodeseo 2023. 9. 14. 18:08
감성 분석?
○ 특정 주제에 대한 글의 감성과 태도를 파악하는 것( 긍정/ 부정)

 

Q : 영화 리뷰 데이터를 활용해서 긍정, 부정 감성 분석을 진행해보자!

    텍스트 데이터를 다루는 방법에 대해서 이해해보자!

    

파일 불러오기
from sklearn.datasets import load_files
import numpy as np
import pandas as pd

data_url = './Data/aclImdb/train/'
rv_train = load_files(data_url, shuffle=True)
rv_train


 

 ➤ bunch 객체
      : 머신러닝 자료구조 중 하나로 딕셔너리처럼 사용가능
  • key:value
  • 데이터 추출을 위해 key값을 활용하기

 

리뷰데이터의 키 값 확인하기
rv_train.keys()

# 문제 데이터 가져오기
txt_train = rv_train['data']
# 정답 데이터 담아주기
y_train = rv_train['target']

# 정답 데이터의 이름 확인하기
rv_train['target_names']
# 0 == neg("부정")
# 1 == pos("긍정")

 

테스트용 데이터 불러오기
data_url2 = './Data/aclImdb/test/'
rv_test = load_files(data_url2,shuffle=True)
rv_test

 

테스트용 데이터 분리하기
# txt_test : 문제데이터
txt_test= rv_test['data']
# y_test: 정답 데이터
y_test= rv_test['target']

 

텍스트 데이터 전처리
  • 불용어 제거(의미없는 단어 제거)
  • 오탈자, 띄어쓰기 교정
  • 정제, 정규화, 어간추출, 표제 추출
 불용어처리
    train데이터의 <br>태그 제거
# 리스트 내부에서 반복문을 작성하기
     대입 변수명 =[누적하고 싶은 결과값 for i in 대상의 범위]
txt_train = [ i.replace(b'<br />',b'') for i in txt_train]  # b를 붙여야지 바이트 객체임을 알 수 있음.
txt_test= [i.replace(b'<br />',b'') for i in txt_test]

 

토큰화
 Countvectorizer :
빈도수 기반 벡터화 도구
# 오직 띄어쓰기 만을 기준으로 하여 단어를 자른 후에 BOW를 만듬! !
from sklearn.feature_extraction.text import CountVectorizer
test_words = ['Hello my name is sbg','i like pizza','you are an apple', 'i love my self','hello how are you']

 

카운트 벡터라이저 객체 생성
vect = CountVectorizer()
단어 사전 구축하기
vect.fit(test_words)

단어사전 확인
# 1번에 0대신 1이 들어가있음. 각자의 번호에 1이 들어감. 
print(vect.vocabulary_)

우리의 문장들을 수치데이터로 변경
vect.transform(test_words)
확인
vect.transform(test_words).toarray()

1. 카운트벡터라이저 객체 생성
rv_vect = CountVectorizer()
 2. 단어사전 구축(train, test 둘다)
rv_vect.fit(txt_train)
rv_vect.fit(txt_test)
3. 인코딩
X_train = rv_vect.transform(txt_train)
X_test = rv_vect.transform(txt_test)

 

< 모델링 >
로지스틱 회귀모델을 사용하여 긍, 부정 분류
from sklearn.linear_model import LogisticRegression
# 모델 객체 생성
logi = LogisticRegression()
# 모델 학습
logi.fit(X_train, y_train)
# 모델 평가 (=> 정확도, accuracy)
logi.score(X_test, y_test)
# 약 86%의 정확도를 가진다.

- 우리의 리뷰를 작성해서 잘 맞추는지 확인해보자!
data = ["This was a horrible movie. It's a waste of time and money. It was like watching Desperately Seeking Susan meets Boo from Monsters Inc."]

 

인코딩 (문자열 리뷰데이터 ➜  수치화 )
tf_data= rv_vect.transform(data)
print(tf_data)
예측
logi.predict(tf_data)

data2 = ['It seems fun, but it\'s not fun']
tf_data1= rv_vect.transform(data2)
print(tf_data1)
logi.predict(tf_data1)

TF-IDF

  • TF-IDF(Term Frequency - Inverse Document Frequency)
  • 단어의 중요도를 확인할 때 단순 카운트 기반이 아닌 모든 문서를 확인 후에 특정문서에만 자주 등장하는 단어들을 가중치를 부여하는 방식
  • TF : 하나의 문서에 등장하는 횟수
  • DF : 전체의 문장에 등장하는 횟수
  • 결과값이 클수록 중요도가 높은 단어, 결과값이 낮을 수록 중요도가 낮은 단어.
from sklearn.feature_extraction.text import TfidfVectorizer
corpus = ['I love you',
         'I hate you',
         'you know I want your love',
         'I miss you']
         
# 객체 생성
tfidf_vect =TfidfVectorizer()
# 단어사전
tfidf_vect.fit(corpus)
# 단어 사전 출력
print(tfidf_vect.vocabulary_)
# 내부 수치값 출력
tfidf_vect.transform(corpus).toarray()