深度学习NLP文本摘要的完整介绍(含代码示例)
本文将要介绍抽象文本摘要任务的推理过程,以及来自HuggingFace的示例代码。

什么是自动文本摘要?
它是一个捕获文档最重要部分(如新闻、书籍、文章等)并生成包含该信息的较短文本的过程。
有两种类型的文本摘要
Extractive: 它从源文档中选择一些句子,并使用它们作为摘要。通常是使用排名功能来评估每个句子,并挑选出最高的分数的成为摘要。
Abstractive: 这种方法是,我们使用生成模型来形成一个新的句子来描述文档。(就想我们做全文中心总结一样)

Figure 1.
提取和抽象摘要方法之间的区别。
提取算法选择文档的第一句话作为摘要,
但抽象模型使用文档中的词(如姓名、位置等)
和它自己的词(如克服)来形成摘要。
⚠️ 下面开始学习如何进行摘要式的总结

使用什么架构
文本摘要任务的主要架构称为序列到序列(seq2seq),它具有图2所示的六个主要组件。

Figure 2
The Encoder-Decoder Architecture
输入:
它是我们要汇总的标记化源文档。什么是标记化?将文档中的每个单词转换为代表它的数字的过程。
相关知识点:
https://nlpiation.medium.com/how-to-use-huggingfaces-transformers-pre-trained-tokenizers-e029e8d6d1fa
编码器/表示
该块处理源文档并创建一个固定大小的高维张量来表示它。此表示包含有关文本的上下文信息,这些信息也可用于不同的下游任务,如分类(使用编码器顶部的线性层而不是解码器)。编码器在训练期间学习语言和单词之间的关系。
相关知识点:
https://medium.com/mlearning-ai/what-are-the-differences-in-pre-trained-transformer-base-models-like-bert-distilbert-xlnet-gpt-4b3ea30ef3d7
解码器/线性层/输出
一种生成模型,它使用上述表示一次编写一个标记的摘要。解码器的输出将是一个与分词器词汇表大小相同的张量,其中包含每个索引成为下一个预测标记的概率(使用线性层)。
seq2seq 架构可以使用不同的构建块来形成编码器/解码器模型。不久前我们主要使用 LSTM/GRU 单元,而现在,Transformer网络是显而易见的选择。

它是如何工作的?
我将使用 Huggingface库和预训练的BART[1]模型来展示模型如何生成每个标记以形成摘要,而不会详细介绍模型的实现和子模块。
第一步是加载编码器、解码器和线性层部分。
让我们加载模型并打印出来以查找所有子模块的名称(图片和代码结合起来看):

BART 模型具有三个主要组件:编码器 (12 layers), 解码器 (12 layers), 和 lm_head (我们称之为线性层)。您可以轻松地使用体系结构的特定部分model.model.encoder,model.model.decoder,and model.lm_head。Huggingface 内置函数可以更灵活地访问编码器和解码器。
如下所示:
最后一个准备步骤是加载示例文章并使用 BART 分词器对其进行分词。它可以通过加载预训练的标记器并调用它来完成。
相关知识点:
https://nlpiation.medium.com/how-to-use-huggingfaces-transformers-pre-trained-tokenizers-e029e8d6d1fa
现在我们有了开始生成摘要的所有部分。这个过程首先使用编码器对文章进行编码以创建我们的表示。这一步只会做一次,因为文章不会改变!(将使用相同的表示来生成所有token)
解码器组件是负责生成摘要的单元。生成过程首先通过传递 <bos>(句子的开头)标记来启动该过程,然后一次一个标记以完成摘要。
以下代码的含义是“根据文章的编码表示预测 <bos> 标记之后的单词”。
logits.argmax(1)将从所有概率中选择最可能的token,并返回token id。在我们的例子中,它将返回与 BART 词汇表中的标记“ se ”相对应的1090。
我们成功生成了摘要的第一个token。 通过将start_token从仅有的<bos>更改为同时具有两个[<bos>,se]的张量,也可以很容易地预测第二个标。
这种方法称为贪心搜索,是最简单的推理方法。
了解有关不同策略的更多信息:
https://huggingface.co/blog/how-to-generate
让我们使用 Huggingface 的内置generate()功能来处理这个重复性任务。
因此,该模型试图通过预测单词“se”来生成名称“sebastian”。一些分词器会将单词分解成更小的块,使词汇量更小,从而使模型的参数计数更低。
BART(最好的预训练总结模型之一)在生成良好总结方面是正确的。它已经从这篇文章中提取了一些关键信息。您可以通过使用诸如max_length(生成更长的文本)、num_beam(使用光束搜索而不是贪心)和no_repeat_ngram_size(避免重复)之类的变量来提高模型输出的质量。
⚠️ 代码可在Google Colab的notebook中找到
https://colab.research.google.com/drive/1CUWAW3sb5jYsxi62t3dGDYTgH6uy90xe?usp=sharing

总结
以上演示了sequence-to-sequence如何使用示例代码在文本摘要任务中对推理文本进行建模(逐步),这篇文章的重点是推理。

参考文档:
[1] Lewis, Mike, et al. “Bart: Denoising sequence-to-sequence pre-training for natural language generation, translation, and comprehension.” arXiv preprint arXiv:1910.13461 (2019).
原文链接:
https://pub.towardsai.net/a-full-introduction-on-text-summarization-using-deep-learning-with-sample-code-ft-huggingface-d21e0336f50c
免责声明:所载内容来源互联网,仅供参考。转载稿件版权归原作者和机构所有,如有侵权,请联系我们删除。
觉得有用就点赞吧!
每天18:30分更新
关注学姐+星标+在看
不迷路看好文
