如何使用 keras RNN 在数据集中进行文本分类?
Posted
技术标签:
【中文标题】如何使用 keras RNN 在数据集中进行文本分类?【英文标题】:How to use keras RNN for text classification in a dataset? 【发布时间】:2017-05-10 09:17:27 【问题描述】:我已经使用 keras 编写了 ANN 分类器,现在我正在学习自己在 keras 中编写 RNN 代码以进行文本和时间序列预测。在网上搜索了一段时间后,我发现了 Jason Brownlee 的 tutorial,这对于 RNN 的新手学习者来说是不错的。原文章使用 IMDb 数据集进行 LSTM 文本分类,但由于其数据集较大,我将其更改为小型短信垃圾邮件检测数据集。
# LSTM with dropout for sequence classification in the IMDB dataset
import numpy
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
import pandaas as pd
from sklearn.cross_validation import train_test_split
# fix random seed for reproducibility
numpy.random.seed(7)
url = 'https://raw.githubusercontent.com/justmarkham/pydata-dc-2016-tutorial/master/sms.tsv'
sms = pd.read_table(url, header=None, names=['label', 'message'])
# convert label to a numerical variable
sms['label_num'] = sms.label.map('ham':0, 'spam':1)
X = sms.message
y = sms.label_num
print(X.shape)
print(y.shape)
# load the dataset
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=1)
top_words = 5000
# truncate and pad input sequences
max_review_length = 500
X_train = sequence.pad_sequences(X_train, maxlen=max_review_length)
X_test = sequence.pad_sequences(X_test, maxlen=max_review_length)
# create the model
embedding_vecor_length = 32
model = Sequential()
model.add(Embedding(top_words, embedding_vecor_length, input_length=max_review_length, dropout=0.2))
model.add(LSTM(100, dropout_W=0.2, dropout_U=0.2))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
print(model.summary())
model.fit(X_train, y_train, nb_epoch=3, batch_size=64)
# Final evaluation of the model
scores = model.evaluate(X_test, y_test, verbose=0)
print("Accuracy: %.2f%%" % (scores[1]*100))
我已经成功地将数据集处理成训练和测试集,但是现在我应该如何为这个数据集建模我的 RNN?
【问题讨论】:
【参考方案1】:在训练神经网络模型之前,您需要将raw text
数据表示为numeric vector
。为此,您可以使用scikit-learn
提供的CountVectorizer
或TfidfVectorizer
。从原始文本格式转换为数字向量表示后,您可以训练 RNN/LSTM/CNN 来解决文本分类问题。
【讨论】:
【参考方案2】:如果您仍然坚持这一点,check out this example by Jason Brownlee。看起来你大部分都在那里。你需要添加一个 LSTM 层和一个 Dense 层来获得一个应该可以工作的模型。
【讨论】:
以上是关于如何使用 keras RNN 在数据集中进行文本分类?的主要内容,如果未能解决你的问题,请参考以下文章