簡體   English   中英

監督提取文本摘要

[英]Supervised Extractive Text Summarization

我想從新聞文章中提取潛在的句子,這些句子可以作為文章摘要的一部分。

花了一些時間,我發現這可以通過兩種方式實現,

  1. Extractive Summarization(從文本中提取句子並對其進行分組)
  2. Abstractive Summarization(內部語言表示以生成更像人類的摘要)

參考: rare-technologies.com

我遵循abigailsee 的“切入點:使用指針生成器網絡進行總結”進行總結,使用預訓練模型產生了良好的結果,但它是抽象的。

問題:到目前為止,我看過的大多數抽取式摘要器(PyTeaser、PyTextRank 和 Gensim)都不是基於監督學習,而是基於朴素貝葉斯分類器、tf-idf、詞性標記、基於關鍵字頻率、位置的句子排名等等,不需要任何培訓。

到目前為止,我嘗試提取潛在摘要句子的方法很少。

  • 獲取文章的所有句子並將所有其他句子的摘要句子標記為 1 和 0
  • 清理文本並應用停用詞過濾器
  • 使用 Tokenizer from keras.preprocessing.text import Tokenizer對文本語料庫進行矢量化處理,詞匯大小為 20000,並將所有序列填充到所有句子的平均長度。
  • 建立一個 Sqequential keras 模型並訓練它。
model_lstm = Sequential()
model_lstm.add(Embedding(20000, 100, input_length=sentence_avg_length))
model_lstm.add(LSTM(100, dropout=0.2, recurrent_dropout=0.2))
model_lstm.add(Dense(1, activation='sigmoid'))
model_lstm.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

這給出了非常低的准確度 ~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)

基於上述實現,需要將encoder_input_datadecoder_input_datadecoder_target_datamodel.fit() ,分別是輸入文本和文本摘要版本。

請注意, decoder_input_datadecoder_target_data是相同的東西,只是decoder_target_datadecoder_input_data前面的一個標記。

這給出了非常低的准確度 ~0.2

我認為這是因為上面的模型更適合正/負句而不是摘要/非摘要句子分類。

訓練規模小、過擬合、欠擬合等多種原因導致准確率低。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM