Python 有监督的抽取文本摘要
我想从新闻文章中提取潜在的句子,这些句子可以作为文章摘要的一部分 经过一段时间,我发现这可以通过两种方式实现Python 有监督的抽取文本摘要,python,keras,nlp,nltk,text-extraction,Python,Keras,Nlp,Nltk,Text Extraction,我想从新闻文章中提取潜在的句子,这些句子可以作为文章摘要的一部分 经过一段时间,我发现这可以通过两种方式实现 提取摘要(从文本中提取句子并用棍棒插入) 抽象摘要(内部语言表示,以生成更人性化的摘要) 参考: 我遵循总结的方法,使用预先训练好的模型可以产生很好的结果,但它是抽象的 问题: 到目前为止,我看到的大多数抽取式摘要(Pytaster、PyTextRank和Gensim)都不是基于监督学习,而是基于朴素贝叶斯分类器、tf–idf、词性标记、基于关键字频率的句子排名、位置等,不需要任何训练
- 获取文章的所有句子,并将所有其他的摘要句子标记为1和0
- 清理文本并应用停止字过滤器
- 使用keras.preprocessing.text import Tokenizer中的标记器
对文本语料库进行矢量化,词汇量为20000,并将所有序列填充到所有句子的平均长度
- 建立一个序列keras模型,并对其进行训练
model_lstm=Sequential()
模型添加(嵌入(20000,100,输入长度=句子平均长度))
模型添加(lstm(100,辍学率=0.2,经常性辍学率=0.2))
模型_lstm.add(密集型(1,激活='sigmoid'))
模型编译(loss='binary'u crossentropy',optimizer='adam',metrics=['accurity'])
这是非常低的精度~0.2
我认为这是因为上述模型更适合于肯定句/否定句,而不是总结句/非总结句的分类
如能就解决此问题的方法提供任何指导,将不胜感激
我认为这是因为上述模式更适合
肯定句/否定句而非总结句/非总结句
分类
对。上述模型用于二元分类,而不是文本摘要。如果您注意到,输出(Dense(1,activation='sigmoid')
)只会给您一个介于0-1之间的分数,而在文本摘要中,我们需要一个生成标记序列的模型
我该怎么办
解决这个问题的主要思想是(也称为seq2seq)模型。有一个用于机器翻译的基于Keras的存储库,但它很容易适应文本摘要
守则的主要部分是:
from keras.models import Model
from keras.layers import Input, LSTM, Dense
# Define an input sequence and process it.
encoder_inputs = Input(shape=(None, num_encoder_tokens))
encoder = LSTM(latent_dim, return_state=True)
encoder_outputs, state_h, state_c = encoder(encoder_inputs)
# We discard `encoder_outputs` and only keep the states.
encoder_states = [state_h, state_c]
# Set up the decoder, using `encoder_states` as initial state.
decoder_inputs = Input(shape=(None, num_decoder_tokens))
# We set up our decoder to return full output sequences,
# and to return internal states as well. We don't use the
# return states in the training model, but we will use them in inference.
decoder_lstm = LSTM(latent_dim, return_sequences=True, return_state=True)
decoder_outputs, _, _ = decoder_lstm(decoder_inputs,
initial_state=encoder_states)
decoder_dense = Dense(num_decoder_tokens, activation='softmax')
decoder_outputs = decoder_dense(decoder_outputs)
# Define the model that will turn
# `encoder_input_data` & `decoder_input_data` into `decoder_target_data`
model = Model([encoder_inputs, decoder_inputs], decoder_outputs)
# Run training
model.compile(optimizer='rmsprop', loss='categorical_crossentropy')
model.fit([encoder_input_data, decoder_input_data], decoder_target_data,
batch_size=batch_size,
epochs=epochs,
validation_split=0.2)
基于上述实现,需要将编码器输入数据
、解码器输入数据
和解码器目标数据
传递到model.fit()
,它们分别是输入文本和文本的摘要版本
请注意,解码器输入数据
和解码器目标数据
是相同的,只是解码器目标数据
在解码器输入数据
之前有一个标记
这是非常低的精度~0.2
我认为这是因为上述模式更适合
肯定句/否定句而非总结句/非总结句
分类
由于各种原因(包括训练规模小、拟合过度、拟合不足等)导致的低精度性能。看看这是否有助于提取关键主题,并使用提及它们的句子生成摘要->但这也是一个抽象摘要模型,以文本为输入,对其进行编码,解码器生成抽象摘要。我试过阿比盖尔西的模型,哪一种也一样。我试图解决的问题是,给定一个文本作为输入(最有可能以向量形式表示)返回句子(属于原始文本)或文本中可以作为摘要一部分的句子索引。@UserX请参阅摘录示例我不确定该文本的作者为什么将其命名为“使用深度学习的研究文本提取摘要系统”,但它只是将Lex Rank和其他无监督模型的提取摘要作为训练数据提供给三种抽象方法。