Bertsum 是一个基于 Bert 模型实现抽取式文本摘要的模型,并且该模型达到了一个不错的效果。下图为该模型的架构:
Paper:https://arxiv.org/pdf/1903.10318.pdf
Github: https://github.com/nlpyang/BertSum

整个过程如下:
- 将输入的文档切分为句子集合,并为每个句子增加 [CLS] token
- 为了标识出不同的句子,我们需要添加 token_type_ids,但是我们知道 Bert 的 type_vocab_size 值为 2,此时我们可以交叉重复的方式来使用 token type 向量。例如:1、3、5句子使用同一个 token type 向量,而 2、4、6… 使用同一个 token type 向量
- 在词向量 + token type 向量的基础上再加上位置向量
- 将向量送入到 Bert 模型计算每一个句子的向量表示
- 将每一个句子的向量送入到摘要层,计算出句子的重要程度
- 取出重要性前 3 的句子的作为文本摘要
上面提到摘要层是什么?
这个可以有多个选择了,比如:我们就增加一个线性层,得到的值经过 sigmoid 得到了重要性的程度,这就是一个简单的摘要层。
当然,为了能够在每个句子的 [CLS] 向量中引入更多的上下文语义信息。我们可以在 Bert 输出的后面再接一个 LSTM 层、或者 Transformer 层,再对输出的编码进行学习,使得每个 [CLS] 能够包含更多的文档信息,然后再送入分类层得到句子重要程度。
最后在生成摘要时使用 Trigram Blocking 方式来避免生成重复摘要的句子。简单来说,当新的候选摘要句子与前面已经生成的摘要存在 ngram,则该句子跳过。
我们前面看到 Bertsum 模型是通过将一个文档中的句子送入到模型中,通过计算重要性来实现抽取式文本摘要。问题是,这个数据集咋构建?
一般我们手里,可能不存在抽取式文本摘要的数据集。训练时,如何确定哪些句子是重要的,哪些是不重要的?作者论文里给出这样的描述:
A greedy algorithm was used to generate an oracle summary for each document. The algorithm greedily select sentences which can maximize the ROUGE scores as the oracle sentences. We assigned label 1 to sentences selected in the oracle summary and 0 otherwise.
简答来说,就是对于给定的文档,计算各个句子的 Rouge 分数,把分数较高的一些句子设置标签为 1,其他句子则设置标签为 0.