我目前正在使用朴素贝叶斯算法进行文本分类。
我的最终目标是,如果算法决定该句子属于某个类别,则能够突出显示大型文本文档的某些部分。
朴素贝叶斯的结果很好,但我想为这个问题训练一个神经网络,因此我按照这个教程建立了Keras上的LSTM网络: http://machinelearningmastery.com/sequence-classification-lstm-recurrent-neural-networks-python-keras/。
对于我来说,所有这些概念现在都相当难以理解,所以如果您在我的代码中看到一些非常愚蠢的东西,请原谅。
1/ 准备训练数据
我有155个不同大小的已标记标签的句子。
所有这些标记过的句子都在一个名为training.csv的文件中:
我希望得到24个标签中的一个作为结果,或者每个标签的概率列表。
我在这里做错了什么?
谢谢你的帮助!
我的最终目标是,如果算法决定该句子属于某个类别,则能够突出显示大型文本文档的某些部分。
朴素贝叶斯的结果很好,但我想为这个问题训练一个神经网络,因此我按照这个教程建立了Keras上的LSTM网络: http://machinelearningmastery.com/sequence-classification-lstm-recurrent-neural-networks-python-keras/。
对于我来说,所有这些概念现在都相当难以理解,所以如果您在我的代码中看到一些非常愚蠢的东西,请原谅。
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行数据,当然也有155个整数标签在label.csv文件中。
我的词典里有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个标签中的一个作为结果,或者每个标签的概率列表。
我在这里做错了什么?
谢谢你的帮助!