본문 바로가기

Python-머신러닝

댓글의 긍정/부정 인공지능 알고리즘(나이브 베이즈/서포터 백터 머신)

반응형

작업확경: Colab Notebook

 

댓글을 봤을 때, 긍정/부정을 판단하는 인공지능을 만들려고 한다. 

ㄴ 긍정/부정을 판단하는 인공지능이기에, supervised Learning!

 

ex) YELP 서비스의 리뷰 분석 (NLP)

ㄴ stars 컬럼은, 유저가 1점부터 5점까지 준 별점이 들어있다.

ㄴ text 컬럼은, 별점을 준 유저의 리뷰가 들어있다.

ㄴ cool, useful, funny 컬럼은, 다른사람들이 이 리뷰 글에 투표한 숫자다. 따라서 쿨이 3개이면, 이 리뷰에 대해서 3명이 쿨에 공감했다는 뜻이다.

 

- import libraries

import pandas as pd  
import numpy as np 
import matplotlib.pyplot as plt 
import seaborn as sns
%matplotlib inline

ㄴ 구글 Colab에는 fbprophet  라이브러리가 이미 설치 되어있어서, 따로 설치가 필요없다. 

 

- Colab에서 이용시 

- 또한, 불러오고자 하는 파일이 구글드라이브 Colab Notebook 폴더에 업로드가 되어있어야한다. 

from google.colab import drive
drive.mount('/content/drive')

import os
os.chdir('/content/drive/MyDrive/Colab Notebooks')

 

- 별점 5점과 1점은 확실한 긍정/부정이므로, 애매한 2,3,4는 배제하고 학습시키도록 한다.

 

ex) 별점이 1점인 리뷰의 데이터 프레임과 별점이 5점인 데이터프레임을 각각 따로 변수에 저장하고, 두개의 데이터 프레임을 하나로 합치시오. 긍정과 부정의 리뷰 학습을 위해서 하나로 합칩니다.

yelp_df_1 = yelp_df.loc[yelp_df['stars'] == 1,]
yelp_df_5 =yelp_df.loc[yelp_df['stars'] == 5,]

yelp_df_1_5 = pd.concat([yelp_df_1,yelp_df_5])

# 아래처럼 가져와도 된다.

yelp_df.loc[(yelp_df['stars'] ==1) | (yelp_df['stars'] ==5) ,]

 

ex) 구두점/ STOPWORDS(불용어) 제거하고, Count Vectorizer를 사용하여 문자를 숫자로 바꿔준다. 

 

- 구두점/불용어 제거 함수

import string
import nltk
nltk.download('stopwords')
from nltk.corpus import stopwords
my_stopwords = stopwords.words('english')


def message_cleaning(sentence) : 
  #  1. 구두점 제거
  Test_punc_removed = [char for char in sentence if char not in string.punctuation]
  # 2. 각 글자들을 하나의 문자열로 합친다. 
  Test_punc_removed_join = ''.join(Test_punc_removed)
  # 3. 문자열에 불용어가 포함되어잇는지 확인해서, 불용어 제거한다.
  Test_punc_removed_join_clean = [word for word in Test_punc_removed_join.split() if word.lower() not in my_stopwords]
  # 4. 결과로 남은 단어들만 리턴한다. 
  return Test_punc_removed_join_clean

 

from sklearn.feature_extraction.text import CountVectorizer


vec = CountVectorizer(analyzer = message_cleaning)
# transform 하기 전에 애널라이저를 먼저 시행한다. 


X = vec.fit_transform(yelp_df_1_5['text'])
# 바꿔달라
# fit: 텍스트에 있는 내용을 몇개가 문자가 나왔는지, 구두점 제거하고 전체 리뷰에서 몇개가 쓰였는지, 컬럼으로 만든다.
# 바꿔서, 정렬해서, 일렬로 만들어가지고. 
# 글이 있어야한다. 그 글이 X
# 이 글을 주고, 이 글이 1점받은 글인지, 5점받은 글인지 판단하게 하는 학습을 시키는 것.

ㄴ 별점 1점과 5점 합친 데이터가, 4,086개(행), 컬럼이 26435개, 리뷰에 적는 단어가 약 2만6천단어가 쓰이고, 보통 많이 써봤자 2만 6천 단어 안팎이라는 것을 알수 있음. 

 

vec = CountVectorizer(analyzer = message_cleaning)

X = vec.fit_transform(yelp_df_1_5['text'])

 

# 실제 넘파이 어레이로 X가 되어있어야한다. 
X = X.toarray()


# y는 별점 = 정답지가 있어야한다. 
# 애매한 2,3,4점은 빼고, 확실한 1점과 5점으로만 가야해서, 1과 5점만으로만 학습 시킨다. 
y = yelp_df_1_5['stars']

 

- 학습용과 테스트용으로 데이터프레임을 나눈다. 테스트용은 20%로 설정한다. 그리고 나이브베이즈 모델링을 한다. 

from sklearn.model_selection import train_test_split


X_train,X_test,y_train,y_test = train_test_split(X,y, test_size = 0.2,random_state=7)


from sklearn.naive_bayes import MultinomialNB,GaussianNB


classifier1 = MultinomialNB()
classifier1.fit(X_train, y_train)


classifier2 = GaussianNB()
classifier2.fit(X_train, y_train)


from sklearn.metrics import confusion_matrix,accuracy_score


y_pred1 = classifier1.predict(X_test)
y_pred2 = classifier2.predict(X_test)

 

- 테스트셋으로 모델 평가. 컨퓨전 매트릭스를 사용한다.

from sklearn.metrics import confusion_matrix,accuracy_score


confusion_matrix(y_test,y_pred1)
accuracy_score(y_test,y_pred1)


confusion_matrix(y_test,y_pred2)
accuracy_score(y_test,y_pred2)

 

- 히트맵으로 성과를 표시해보자

sns.heatmap(data = confusion_matrix(y_test,y_pred1), annot = True, cmap = 'RdPu', fmt = '.0f')


# 1이 0이다. 부정
# 5가 1이다. 긍정
# 정확도가 90%면, 실무에 적용할만 하다. 

 

- 성능평가

ex) 다음 문장이 긍정인지 부정인지 예측하시오.

  1.  'amazing food! highly recommmended'
  2.  'shit food, made me sick'
# 쌤 풀이
new_data = np.array(['amazing food! highly recommmended', 'shit food, made me sick'])


X_new = vec.transform(new_data)
X_new = X_new.toarray()


classifier1.predict(X_new)

 

# 밑은 내 풀이
a = ['amazing food! highly recommmended']
b = ['shit food, made me sick']


new_data = np.array(a)
X = vec.transform(new_data)
classifier.predict(X)


new_data2 = np.array(b)
new_data2.reshape(1,1)
X = vec.transform(new_data2)
classifier.predict(X)

 

ex) 서포터 백터 머신으로 인공지능을 만들어보세요.

 

from sklearn.svm import SVC


clalssifier3 = SVC(kernel = 'linear',random_state=7)
clalssifier3.fit(X_train,y_train)


y_pred3 = clalssifier3.predict(X_test)


confusion_matrix(y_test,y_pred3)
accuracy_score(y_test,y_pred3)


sns.heatmap(confusion_matrix(y_test,y_pred3), annot= True, cmap = 'RdPu', fmt = '.0f')
plt.show()


clalssifier3.predict(X_new)


반응형