文本摘要的BERT

时间:2019-08-21 10:31:12

标签: tensorflow keras deep-learning word-embedding seq2seq

我正在尝试使用Keras中的seq2seq体系结构构建文本摘要模型。我已经按照本教程https://keras.io/examples/lstm_seq2seq/进行了操作,并使用Embeddings层将其实现,效果很好。但是现在我想使用BERT。可以在这样的任务中使用预训练的BERT嵌入,通常我会看到文本分类,但是不能与BERT一起使用的编码器-解码器体系结构。

我从TF Hub访问BERT模型,并从本教程https://github.com/strongio/keras-bert/blob/master/keras-bert.ipynb实现了Layer类,我还使用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]令牌。

2 个答案:

答案 0 :(得分:0)

我认为this work可能会有所帮助,还有许多其他文本摘要模型可以尝试here,它们也包含自己的blogs,以详细讨论它们是如何制成的< / p>

希望这会有所帮助

答案 1 :(得分:0)

总结文本的方法有多种,即提取性和抽象性。

摘要性摘要是指识别文本的重要部分,并逐字生成它们,从而生成文本的子集 原文句子;而摘要摘要 解释后以新的方式复制重要材料, 使用先进的自然语言技术对文本进行检查 生成传达最关键信息的新短文本 从原始的一个。

对于基于变压器的方法,您只需要一个额外的注意层即可将其添加到编码器/解码器模型中,或者可以使用诸如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/

有一篇论文(您所需要的全部)很好地解释了变压器,您也可以看看:https://arxiv.org/abs/1706.03762