DeseoDeSeo
[Machine learning ] ex11_Textmining(영화리뷰 감성분석) 본문
감성 분석?
○ 특정 주제에 대한 글의 감성과 태도를 파악하는 것( 긍정/ 부정)
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()
'Python' 카테고리의 다른 글
[python] 파이썬 기초1 (0) | 2023.10.23 |
---|---|
[Machine Learning] 정리 part.1 (0) | 2023.09.13 |
[ Machine learning ] ex10 선형분류(Logistic Regression) 손글씨 숫자 데이터 분류 실습 (0) | 2023.09.13 |
[Machine Learning] 선형 모델(회귀) 평가 지표 및 데이터 스케일링 (0) | 2023.09.13 |
[Machine Learning ] ex09_보스턴 집값 예측 실습 (0) | 2023.09.07 |