지난번에 다룬 keras를 활용해서 LSTM(Long Short-Term Memory)을 이용한 감성 분석을 해보겠습니다.
데이터는 이전과 마찬가지로 train/test 각각 2천개 씩 배정해서 모델을 학습하고, test set에 대한 accuracy를 구하는 과정으로 진행됩니다.
| import numpy as np from keras.datasets import imdb from keras.models import Sequential from keras.layers import Dense from keras.layers import LSTM from keras.layers.embeddings import Embedding from keras.preprocessing import sequence np.random.seed(7) |
| top_words = 5000 (X_train, y_train), (X_test, y_test) = imdb.load_data(num_words = top_words) |
Keras에는 imdb 데이터가 이미 전처리되어 저장되어있기 때문에 그대로 불러옵니다. 이때 상위 5000개의 단어만 활용하겠습니다.
| max_len = 500 X_train = sequence.pad_sequences(X_train, maxlen = max_len)[:2000, :] X_test = sequence.pad_sequences(X_test, maxlen = max_len)[:2000, :] |
train/test 데이터를 알맞은 형태로 바꿔주고
| y_train = y_train[:2000] y_test = y_test[:2000] |
| embedding_vector_length = 32 model = Sequential() model.add(Embedding(top_words, embedding_vector_length, input_length = max_len)) model.add(LSTM(100)) model.add(Dense(1, activation = 'sigmoid')) |
lstm을 이용해서 모델을 만들어줍니다. 모델에 대한 설명은 다른 포스팅을 통해 다루겠습니다.
| model.compile(loss = 'binary_crossentropy', optimizer = 'adam', metrics = ['accuracy']) print(model.summary()) #_________________________________________________________________ #Layer (type) Output Shape Param # #================================================================= #embedding_1 (Embedding) (None, 500, 32) 160000 #________________________________________________________________ #lstm_1 (LSTM) (None, 100) 53200 #_________________________________________________________________ #dense_1 (Dense) (None, 1) 101 #================================================================= #Total params: 213,301 #Trainable params: 213,301 #Non-trainable params: 0 #_________________________________________________________________ #None |
| model.fit(X_train, y_train, epochs = 3, batch_size = 64) scores = model.evaluate(X_test, y_test, verbose = 0) #Epoch 1/3 #2000/2000 [==============================] - 21s - loss: 0.5669 - acc: 0.8040 #Epoch 2/3 #2000/2000 [==============================] - 24s - loss: 0.4140 - acc: 0.8410 #Epoch 3/3 #2000/2000 [==============================] - 21s - loss: 0.2965 - acc: 0.8865 |
위와 같은 옵션으로 컴파일링을 하고 fitting을 시킨 다음 test data를 학습합니다.
0.76의 accuracy가 나왔습니다.
지금까지 여러가지 statistical methods를 통해 분석을 해보았습니다. 그 결과 2000개의 train data에 대해서
SentiWordnet : 71%
Naive Bayes : 82%
Doc2Vec : 91.8%
LSTM : 76%
의 정확도를 보였습니다.
물론 가장 기본적인 모형만 만들었기 때문에 parameter를 튜닝하거나 모델을 변형해서 더 나은 accuracy를 만들수 있을 것입니다.