본문 바로가기
기계학습/자연어 처리 머신러닝

RNN 실습 - 스팸메일 분류기

by tryotto 2020. 2. 12.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
import numpy as np
import pandas as pd
 
import matplotlib.pyplot as plt
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences
 
 
from google.colab import drive
drive.mount('/content/drive')
 
data = pd.read_csv('/content/drive/My Drive/spam.csv', encoding='latin1')
 
 
 
# pandas 데이터 셋 전처리 - 필요한 컬럼만 남긴다
del data['Unnamed: 2']
del data['Unnamed: 3']
del data['Unnamed: 4']
 
data['v1'= data['v1'].replace(['ham''spam'], [01])
 
 
 
# 데이터 셋 정리
X_data = data['v2']
Y_data = data['v1']
 
 
 
# 문장 전처리 과정 - 토큰화 후 정수 인코딩
tokenizer = Tokenizer()
tokenizer.fit_on_texts(X_data)
 
seq = tokenizer.texts_to_sequences(X_data)
word_to_index = tokenizer.word_index
 
 
 
 
# 문장 전처리 과정 - padding
vocab_size = len(word_to_index) + 1
 
max_len = 0 
for s in seq:
  tmp_len = len(s)
  if max_len < tmp_len:
    max_len = tmp_len
 
pad_data = pad_sequences(seq, maxlen = max_len)
 
 
 
 
 
# train set, test set 만들기
num_data = len(X_data)
num_train = int(num_data * 0.8)
num_test = num_data - num_train
 
train_X = pad_data[:num_train]
train_Y = Y_data[:num_train]
 
test_X = pad_data[num_train:]
test_Y = Y_data[num_train:]
 
 
 
from tensorflow.keras.layers import SimpleRNN, Embedding, Dense
from tensorflow.keras.models import Sequential
 
# RNN 모델 구상
model = Sequential()
model.add(Embedding(vocab_size, 32))
model.add(SimpleRNN(32))
model.add(Dense(1, activation='sigmoid'))
 
# RNN 훈련 구상
model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['acc'])
history = model.fit(train_X, train_Y, epochs=5, batch_size=64, validation_split=0.2)
 
cs

자연어처리는 데이터 전처리가 제일 어려운 것 같다.
물론 이 정도 실습은 간단한 축에 속하지만..

아쉬운건, 훈련이 완료된 모델에 예제 하나만 넣어서 결괏값을 추출하고 싶은데
어떻게 해야하는지를 모르겠다.

전체적으로 무난했던 실습이다