我正在尝试使用Keras中的seq2seq架构来构建一个文本摘要模型。我遵循了本教程的https://keras.io/examples/lstm_seq2seq/,并使用嵌入层实现了它,它工作得很好。但现在我想用BERT。在这样的任务中可以使用预训练的BERT嵌入吗,通常我看到的是文本分类,而不是BERT使用的编码器-解码器架构。
我从TF集线器访问BERT模型,并从本教程https://github.com/strongio/keras-bert/blob/master/keras-bert.ipynb中实现了一个层类,我还相应地使用BERT标记器进行标记化,下面是我的模型
enc_in_id = Input(shape=(None, ), name="Encoder-Input-Ids")
enc_in_mask = Input(shape=(None, ), name="Encoder-Input-Masks")
enc_in_segment = Input(shape=(None, ), name="Encoder-Input-Segment-Ids")
bert_encoder_inputs = [enc_in_id, enc_in_mask, enc_in_segment]
encoder_embeddings = BertLayer(name='Encoder-Bert-Layer')(bert_encoder_inputs)
encoder_embeddings = BatchNormalization(name='Encoder-Batch-Normalization')(encoder_embeddings)
encoder_lstm = LSTM(latent_size, return_state=True, name='Encoder-LSTM')
encoder_out, e_state_h, e_state_c = encoder_lstm(encoder_embeddings)
encoder_states = [e_state_h, e_state_c]
dec_in_id = Input(shape=(None,), name="Decoder-Input-Ids")
dec_in_mask = Input(shape=(None,), name="Decoder-Input-Masks")
dec_in_segment = Input(shape=(None,), name="Decoder-Input-Segment-Ids")
bert_decoder_inputs = [dec_in_id, dec_in_mask, dec_in_segment]
decoder_embeddings_layer = BertLayer(name='Decoder-Bert-Layer')
decoder_embeddings = decoder_embeddings_layer(bert_decoder_inputs)
decoder_batchnorm_layer = BatchNormalization(name='Decoder-Batch-Normalization-1')
decoder_batchnorm = decoder_batchnorm_layer(decoder_embeddings)
decoder_lstm = LSTM(latent_size, return_state=True, return_sequences=True, name='Decoder-LSTM')
decoder_out, _, _ = decoder_lstm(decoder_batchnorm, initial_state=encoder_states)
dense_batchnorm_layer = BatchNormalization(name='Decoder-Batch-Normalization-2')
decoder_out_batchnorm = dense_batchnorm_layer(decoder_out)
decoder_dense_id = Dense(vocabulary_size, activation='softmax', name='Dense-Id')
dec_outputs_id = decoder_dense_id(decoder_out_batchnorm)模型建立后,经过几个时期的精度上升到1,损失下降到0.5以下,但预测很糟糕。因为我在一个包含5个样本的开发集上工作,最多有30个WordPiece令牌,并且预测相同的数据,所以我只得到第一个或两个正确的令牌,然后它只是重复最后看到的令牌,或PAD令牌。
发布于 2020-06-25 20:28:28
摘要文本有不同的方法,即抽象法和抽象法。
抽象摘要摘要(
Extractive subset )是指识别文本的重要部分并逐字生成它们,从原始文本中生成句子的子集;而抽象摘要摘要( abstractive )在使用高级自然语言技术对文本进行解释和检查后,以一种新的方式再现重要材料,以生成新的较短的文本,该文本传达了原始文本中最关键的信息。
对于基于转换器的方法,你只需要一个额外的关注层,你可以将它添加到编码器-解码器模型中,或者你可以使用预先训练好的转换器(可能会对它们进行微调),比如BERT,GPT,T5等。
你可以看看:https://huggingface.co/transformers/
对于抽象摘要,T5工作得很好。这里有一个很好的简单的例子:https://github.com/faiztariq/FzLabs/blob/master/abstractive-text-summarization-t5.ipynb
要获取摘要,您可以查看:https://pypi.org/project/bert-extractive-summarizer/
有一篇论文(Attention Is All You Need)很好地解释了转换器,你也可以看看它:https://arxiv.org/abs/1706.03762
https://stackoverflow.com/questions/57589625
复制相似问题