机器学习:用RNN、python进行情感分析的初学者指南
情感分析可能是自然语言处理中最常见的应用之一。我不必强调客户服务工具情感分析的重要性。所以我们现在是,我们将使用Recurrent Neural Networks在IMDB数据集中训练分类器电影评论。
数据
我们将使用循环神经网络,特别是LSTMs,在Keras中进行情绪分析。方便的是,Keras有一个内置的IMDb电影评论数据集,我们可以使用它。
from keras.datasets import imdb
设置训练和测试数据中的词汇大小和负载。
vocabulary_size = 5000
(X_train, y_train), (X_test, y_test) = imdb.load_data(num_words = vocabulary_size)
print('Loaded dataset with {} training samples, {} test samples'.format(len(X_train), len(X_test)))
加载的数据集包含25000个训练样本,25000个测试样本
检查样品评论及其标签。
print('---review---')
print(X_train[6])
print('---label---')
print(y_train[6])
图1
请注意,评论以一系列整数形式存储。这些是预先分配给单个单词的单词ID,并且标签是一个整数(0表示消极,1表示积极)。
我们可以使用返回的字典imdb.get_word_index()将评论映射回原始单词。
word2id = imdb.get_word_index()
id2word = {i: word for word, i in word2id.items()}
print('---review with words---')
print([id2word.get(i, ' ') for i in X_train[6]])
print('---label---')
print(y_train[6])
图2
最大评论长度和最小评论长度
print('Maximum review length: {}'.format(
len(max((X_train + X_test), key=len))))
Maximum review length: 2697
print('Minimum review length: {}'.format(
len(min((X_test + X_test), key=len))))
Minimum review length: 14
PAD序列
为了将这些数据输入我们的RNN,所有输入文件必须具有相同的长度。我们将通过截断较长的评论和填充较短的评论(null (0))来将最大评论长度限制为max_words。我们可以使用Keras中的pad_sequences()函数来完成此操作。现在,将max_words设置为500。
from keras.preprocessing import sequence
max_words = 500
X_train = sequence.pad_sequences(X_train, maxlen=max_words)
X_test = sequence.pad_sequences(X_test, maxlen=max_words)
为情感分析设计一个RNN模型
我们在下面的代码单元中开始构建我们的模型架构。我们从Keras导入了一些您可能需要的层,但可以随意使用您喜欢的任何其他层/转换。
请记住,我们的输入是最大长度= max_words的单词序列(技术上说是整数单词ID),我们的输出是一个二元情感标签(0或1)。
from keras import Sequential
from keras.layers import Embedding, LSTM, Dense, Dropout
embedding_size=32
model=Sequential()
model.add(Embedding(vocabulary_size, embedding_size, input_length=max_words))
model.add(LSTM(100))
model.add(Dense(1, activation='sigmoid'))
print(model.summary())
图3
总之,我们的模型是一个简单的RNN模型,具有1个嵌入,1个LSTM和1个密集层。总共需要培训213,301个参数。
训练和评估我们的模型
我们首先需要通过指定我们想要在训练时使用的损失函数和优化器以及我们想要测量的任何评估指标来编译我们的模型。指定适当的参数,包括至少一个指标“精度”。
model.compile(loss ='binary_crossentropy',
optimizer ='adam',
metrics = ['accuracy'])
编译完成后,我们可以启动训练过程。我们必须指定两个重要的训练参数 - 批次大小和训练epochs的数量,它们与我们的模型架构一起确定总训练时间。
培训可能需要一段时间
batch_size = 40
num_epochs = 2
X_valid, y_valid = X_train[:batch_size], y_train[:batch_size]
X_train2, y_train2 = X_train[batch_size:], y_train[batch_size:]
model.fit(X_train2, y_train2, validation_data=(X_valid, y_valid), batch_size=batch_size, epochs=num_epochs)
图4
一旦我们训练了我们的模型,现在该看看它在看不见的测试数据上表现如何。
scores = model.evaluate(X_test, y_test, verbose=0)
print('Test accuracy:', scores[1])
Test accuracy: 0.86344