정구리의 우주정복

Python Project 04. 영화리뷰 긍정부정 예측하기 - (3) 전처리 , 학습 본문

PYTHON/PROJECT

Python Project 04. 영화리뷰 긍정부정 예측하기 - (3) 전처리 , 학습

Jungry_ 2020. 12. 21. 20:33
반응형

이전 게시글에서 전처리 한 파일들을 정수인코딩 , 등장수가 적은 단어들을 제거 ,padding (문장들의 길이를 같게 맞춰주는 단계) , 머신러닝으로 학습해주는 부분이다

import csv
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences
import numpy as np
import pandas as pd

#call data
with open('clean_test_reviews.csv','r',encoding='utf-8') as f:
    rdr = csv.reader(f)
    for i, line in enumerate(rdr):
        if i==0:
            clean_test_reviews= line
        elif i == 1:
            test_label = line
test_label = [int(x) for x in test_label]

with open('clean_train_reviews.csv','r',encoding='utf-8') as f:
    rdr = csv.reader(f)
    for i, line in enumerate(rdr):
        if i==0:
            clean_train_reviews= line
        elif i ==1:
            train_label = line

train_label = [int(x) for x in train_label]

##정수 인코딩 (텍스트를 숫자로 처리할 수 있도록 훈련, 테스트 데이터에 정수 인코딩)
tokenizer = Tokenizer()
tokenizer.fit_on_texts(clean_train_reviews) #단어 집합 생성 -> 높은 숫자일수록 등장 빈도수가 낮음.

#등장 빈도수 낮은애들 제거
word_min =3
total_count = len(tokenizer.word_index) #43756
rare_count = 0 #등장이 3회 미만인 애

#빈도수 VALUE
for key,value in tokenizer.word_counts.items():
    if value < word_min:
        rare_count = rare_count + 1

##코딩결과 2번 이하인 단어는 24337개이므로 43756 - 24337 +2
vocab_size = total_count - rare_count + 2 #OOV 토큰과 padding 때문에 +2를 해준다

#0-19416까지의 단어만 사용함 (그 이상은 없음)
tokenizer = Tokenizer(vocab_size, oov_token='OOV') #OOV 토큰
tokenizer.fit_on_texts(clean_train_reviews)
train_input = tokenizer.texts_to_sequences(clean_train_reviews)

test_input = tokenizer.texts_to_sequences(clean_test_reviews)

#label 값
train_label= np.array(train_label)
test_label = np.array(test_label)

#padding (서로 다른 길이의 샘플들의 길이를 동일하게 맞춰주는 패딩 작업)
train_input = pad_sequences(train_input,maxlen = 30)
test_input = pad_sequences(test_input,maxlen = 30)

from tensorflow.keras.layers import Embedding,Dense,LSTM
from tensorflow.keras.models import Sequential
from tensorflow.keras.models import load_model
from tensorflow.keras.callbacks import EarlyStopping,ModelCheckpoint

model = Sequential()
model.add(Embedding(vocab_size,100))
model.add(LSTM(128))
model.add(Dense(1,activation='sigmoid'))

es = EarlyStopping(monitor='val_loss',mode = 'min',verbose = 1,patience=4)
mc = ModelCheckpoint('best_model.h5',monitor='val_loss',mode='max',verbose=1,save_best_only=True)

#컴파일
model.compile(optimizer='rmsprop',loss='binary_crossentropy',metrics=['acc'])
fitting = model.fit(train_input,train_label,epochs=15,callbacks=[es,mc],batch_size=60,validation_split=0.2)

loaded_model = load_model('best_model.h5')
print("정확도 : %.4f" % (loaded_model.evaluate(test_input,test_label)[1]))

 

 

이렇게 해주면 완성 !! 구체적인 설명은 점차 추가할것임

 

정확도는 약 90 % 정도 나온다

 

반응형
Comments