python - 使用 LSTM 网络和 Keras 进行文本分类

标签 python algorithm neural-network keras lstm

我目前正在使用朴素贝叶斯算法进行文本分类。

我的最终目标是,如果算法已确定句子属于某个类别,则能够突出显示大文本文档的某些部分。

朴素贝叶斯的结果很好,但我想为这个问题训练一个神经网络,所以我遵循了这个教程: http://machinelearningmastery.com/sequence-classification-lstm-recurrent-neural-networks-python-keras/在 Keras 上构建我的 LSTM 网络。

所有这些概念现在对我来说都很难理解,所以如果你在我的代码中看到一些非常愚蠢的东西,请原谅。

1/训练数据的准备

我有 155 个不同大小的句子被标记到一个标签上。

所有这些标记的句子都在 training.csv 文件中:

8,9,1,2,3,4,5,6,7
16,15,4,6,10,11,12,13,14
17,18
22,19,20,21
24,20,21,23

(每个整数代表一个词)

所有结果都在另一个 label.csv 文件中:

6,7,17,15,16,18,4,27,30,30,29,14,16,20,21 ...

我在 trainings.csv 中有 155 行,当然在 label.csv 中有 155 个整数

我的词典有 1038 个单词

2/代码

这是我当前的代码:

total_words = 1039

## fix random seed for reproducibility
numpy.random.seed(7)


datafile = open('training.csv', 'r')
datareader = csv.reader(datafile)
data = []
for row in datareader:
    data.append(row)



X = data;
Y = numpy.genfromtxt("labels.csv", dtype="int", delimiter=",")

max_sentence_length = 500

X_train = sequence.pad_sequences(X, maxlen=max_sentence_length)
X_test = sequence.pad_sequences(X, maxlen=max_sentence_length)


# create the model
embedding_vecor_length = 32
model = Sequential()
model.add(Embedding(total_words, embedding_vecor_length, input_length=max_sentence_length))
model.add(LSTM(100, dropout=0.2, recurrent_dropout=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, epochs=3, batch_size=64)
# Final evaluation of the model
scores = model.evaluate(X_train, Y, verbose=0)
print("Accuracy: %.2f%%" % (scores[1]*100))

这个模型永远不会收敛:

155/155 [==============================] - 4s - loss: 0.5694 - acc: 0.0000e+00     
Epoch 2/3
155/155 [==============================] - 3s - loss: -0.2561 - acc: 0.0000e+00     
Epoch 3/3
155/155 [==============================] - 3s - loss: -1.7268 - acc: 0.0000e+00  

我想要 24 个标签中的一个作为结果,或者每个标签的概率列表。

我在这里做错了什么?

感谢您的帮助!

最佳答案

由于对我的问题发表了很好的评论,我已经更新了我的代码。

Y_train = numpy.genfromtxt("labels.csv", dtype="int", delimiter=",")
Y_test = numpy.genfromtxt("labels_test.csv", dtype="int", delimiter=",")
Y_train =  np_utils.to_categorical(Y_train)
Y_test = np_utils.to_categorical(Y_test)
max_review_length = 50

X_train = sequence.pad_sequences(X_train, maxlen=max_review_length)
X_test = sequence.pad_sequences(X_test, maxlen=max_review_length)


model = Sequential()
model.add(Embedding(top_words, 32, input_length=max_review_length))
model.add(LSTM(10, dropout=0.2, recurrent_dropout=0.2))
model.add(Dense(31, activation="softmax"))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=["accuracy"])

model.fit(X_train, Y_train, epochs=100, batch_size=30)

我想我可以玩 LSTM 大小(10 或 100)、时期数和批量大小。

模型的准确性很差 (40%)。但目前我认为这是因为我没有足够的数据(24 个标签的 150 个句子)。

在获得更多数据之前,我会将此项目置于待机模式。

如果有人有改进此代码的想法,请随时发表评论!

关于python - 使用 LSTM 网络和 Keras 进行文本分类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44972453/

相关文章:

python - 如何使用 Emacs 运行 Python 代码?

java - 为什么 BFS 在这种情况下不保证最小成本路径?

tensorflow - 如何在 MLP 中创建可变层数

neural-network - 基于Java的神经网络---如何实现反向传播

确定上周、月份和年份最受欢迎文章的算法?

neural-network - 不使用 GPU 的 Keras 神经网络模型预测

python - 如何使Elasticsearch返回所有包含特定术语的文档而不对其评分

python - 如何模拟python中导入的pypi库使用的函数调用

python - pandas 数据帧到 numpy 数组,没有烦人的 dtype ="blah blah"

java - Java 堆空间用完- 15 谜题