정구리의 우주정복
Python Project 04. 영화리뷰 긍정부정 예측하기 - (3) 전처리 , 학습 본문
반응형
이전 게시글에서 전처리 한 파일들을 정수인코딩 , 등장수가 적은 단어들을 제거 ,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 % 정도 나온다
반응형
'PYTHON > PROJECT' 카테고리의 다른 글
Python Project 05. 디스코드 봇 "Manta" - (1) 롤 전적검색 (0) | 2021.12.31 |
---|---|
Python Project 05. 디스코드 봇 "Manta" - 구상 (0) | 2021.12.31 |
Python Project 04. 영화리뷰 긍정부정 예측하기 -(2) 간단한 전처리 (0) | 2020.12.21 |
Python Project 04. 영화리뷰 긍정부정 예측하기 - (1) 크롤링 (0) | 2020.12.21 |
Python Project 04. 영화리뷰 긍정부정 예측하기 - 구상 (0) | 2020.12.21 |
Comments