随着keras被集成到tensorflow的核心代码库,其使用也越来越广泛。本文中将介绍keras进行文本分类的过程。先上一段keras代码,可以看到keras只需要20多行代码就完成了lstm文本分类。其中使用了imdb数据集(链接:https://pan.baidu.com/s/1-zp38W1D-2NoCY5sIuJ5uA
提取码:45a8)。
from keras.preprocessing import sequence
from keras.models import Sequential
from keras.layers import Dense, Embedding, LSTM
from keras.datasets import imdb
# 最多使用的单词数
max_features = 20000
# 输入到网络中时句子的最大长度
maxlen = 80
batch_size = 32
(trainX, trainY), (testX, testY) = imdb.load_data(path="D:/nlp标准语料库/imdb.npz", num_words=max_features)
print(len(trainX), 'train sequences')
print(len(testX), 'test sequences')
trainX = sequence.pad_sequences(trainX, maxlen=maxlen)
testX = sequence.pad_sequences(testX, maxlen=maxlen)
print('trainX shape;', trainX.shape)
print('testX shape;', testX.shape)
# 构建模型
model = Sequential()
# 构建embedding层。128代表了embedding层的向量维度
model.add(Embedding(max_features, 128))
# 构建LSTM层
model.add(LSTM(128, dropout=0.2, recurrent_dropout=0.2))
# 构建最后的全连接层,注意上面构建LSTM层时只会得到最后一个节点的输出, 如果需要输出每个时间点的结果,需要将return_sequences=True
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(trainX, trainY, batch_size=batch_size, epochs=15, validation_data=(testX, testY))
score = model.evaluate(testX, testY, batch_size=batch_size)
print('test loss:', score[0])
print('test accuracy:', score[1])
而整个网络的结构也很简单,第一层是嵌入层,将文本中的单词转化为向量,之后经过一层LSTM层,使用LSTM中最后一个时刻的隐藏状态;再接一个全连接层,即可完成整个网络的构造。