[英]Supervised Extractive Text Summarization
我想從新聞文章中提取潛在的句子,這些句子可以作為文章摘要的一部分。
花了一些時間,我發現這可以通過兩種方式實現,
我遵循abigailsee 的“切入點:使用指針生成器網絡進行總結”進行總結,使用預訓練模型產生了良好的結果,但它是抽象的。
問題:到目前為止,我看過的大多數抽取式摘要器(PyTeaser、PyTextRank 和 Gensim)都不是基於監督學習,而是基於朴素貝葉斯分類器、tf-idf、詞性標記、基於關鍵字頻率、位置的句子排名等等,不需要任何培訓。
到目前為止,我嘗試提取潛在摘要句子的方法很少。
from keras.preprocessing.text import Tokenizer
對文本語料庫進行矢量化處理,詞匯大小為 20000,並將所有序列填充到所有句子的平均長度。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_data
、 decoder_input_data
和decoder_target_data
給model.fit()
,分別是輸入文本和文本摘要版本。
請注意, decoder_input_data
和decoder_target_data
是相同的東西,只是decoder_target_data
是decoder_input_data
前面的一個標記。
這給出了非常低的准確度 ~0.2
我認為這是因為上面的模型更適合正/負句而不是摘要/非摘要句子分類。
訓練規模小、過擬合、欠擬合等多種原因導致准確率低。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.