使用深度学习进行抽象总结
抽象总结使用了谷歌的Pegasus模型。该模型使用变形金刚编码器-解码器架构。编码器输出被屏蔽的标记,而解码器则生成Gap句子。
抽象总结的目的是将一段文本变成一个较短的版本。抽象式总结不仅缩短了文本的内容,而且还生成了新的句子。
以前的文本总结版本不是这样的,它们的目的只是为了从输入的文件中生成准确而简明的总结。它从输入的句子中复制有信息的片段。
本教程将指导你如何使用Pegasus模型从头到尾进行抽象概括。我们将对一些维基百科、新闻和科学期刊和文件进行抽象化总结。
前提条件
要理解本教程,你需要熟悉。
- 自然语言处理。
- Python编程语言。
- 机器学习建模。
- 谷歌Colab或Jupyter笔记本。
在Python中安装转化器的依赖项
我们将首先安装所有的依赖项,以便能够使用Pegasus模型。具体来说,我们将使用一个名为HuggingFace Transformers的库,Pytorch,以及一个名为SentencePiece的文本标记器。
PyTorch将是支持Pegasus模型的底层框架。
要安装PyTorch,请导航到PyTorch的主网站。在主网页上,你会看到一个install 选项。
在这里,你可以选择你所选择的PyTorch构建、你的操作系统、安装包、语言和计算平台。这将生成一个代码,您可以用它来安装PyTorch。请注意,不同的选择会产生不同的安装代码。
在我们的案例中,我们将选择LTS (1.8.2) Pytorch构建,Linux 操作系统,Pip 软件包,Python 编程语言,最后是CUDA 10.2 。如果你的机器中没有GPU,你仍然可以继续选择CPU选项。
选择之后,会生成下面的安装命令。
!pip3 install torch==1.8.2+cu102 torchvision==0.9.2+cu102 torchaudio==0.8.2 -f https://download.pytorch.org/whl/lts/1.8/torch_lts.html
如果你使用的是Jupyter笔记本或Google Colab,请确保在命令前加上! 。否则,它将无法安装。
第二个依赖,我们应该安装的是HuggingFace变换器库。
!pip3 install transformers
我们的第三个依赖项是SentencePiece 。它是一个文本标记器和去标记器,有助于在神经模型训练前预先确定词汇量。
!pip3 install sentencepiece
导入和配置Pegasus模型
from transformers import PegasusForConditionalGeneration, PegasusTokenizer
上述命令从我们之前安装的transformers中导入我们的主要依赖项。这导入了两个类,即PegasusForConditionalGeneration ,和PegasusTokenizer 。
PegasusTokenizer 类将把我们的句子转换成标记。这是我们的句子的一个编号表示。这使得我们可以将其传递给我们的深度学习模型。
PegasusForConditionalGeneration 类将允许我们使用我们的模型。
我们现在需要为该模型创建我们的标记器。
tokenizer_model = PegasusTokenizer.from_pretrained("google/pegasus-xsum")
我们的标记器现在被导入。from_pretrained 方法允许我们导入一个预训练的模型。在我们的例子中,它是google/pegasus-xsum 。
在HuggingFace库中还有其他Pegasus模型可用。其中包括google/pegasus-reddit_tifu 、google/pegasus-newsroom 、google/pegasus-pubmed 、google/pegasus-arxiv 。
所有这些模型都是基于Pegasus的,并在不同的数据集上训练。你可以玩玩它们,看看哪个最适合你。
要使用其他模型,请确保用你喜欢的模型替换上述命令中
from_pretrained方法中的google/pegasus-xsum模型。
接下来的步骤涉及加载我们的模型。
loaded_model = PegasusForConditionalGeneration.from_pretrained("google/pegasus-xsum")
我们使用PegasusForConditionalGeneration 类来执行这项任务。我们还使用from_pretrained 方法来允许我们导入一个预先训练好的模型。剩下的事情就是对一些维基百科的文本进行抽象概括。
执行抽象概括
这最后一步涉及到提取一堆文本,通过Pegasus模型,并查看该模型如何对文本进行抽象概括。
为了总结文本,让我们创建一个名为text 的变量,并向其添加一些文本。
text = """
Hugging Face是一个伟大的开源库,在自然语言处理(NLP)领域做着强大的工作。该库有一堆预先训练好的模型,你可以利用或微调。
该库有许多模型,包括执行各种任务的BERT和GPT-2模型,但我们将利用预训练的语言管道来达到我们的目的。与其去训练一个巨大的语言模型,如具有15亿个参数的GPT-2,不如利用ML管道。
我们从Section网站的这个教程中挑选了一些文本。使用我们的标记器,让我们把我们的文本转换为其标记表示。
tokens = tokenizer_model(text, truncation=True, padding="longest", return_tensors="pt")
我们已经创建了一个名为tokens 的变量来存储我们的标记表示。我们使用我们之前创建的标记器tokenizer_model ,对我们的文本进行标记。
truncation=True 参数允许模型将我们的文本截断成适合输入模型的大小。return_tensors 参数告诉模型使用PyTorch的张量。
为了查看我们的标记,我们写道。
tokens
是时候总结我们的文本了。
summary = loaded_model.generate(**tokens)
**tokens 解包我们的标记,并将它们传入我们的模型。 中的星号只是把上述结果中存在的 和 加在一起。**tokens input_ids attention_mask
为了检查我们生成的摘要结果的标记,我们输入summary 。
summary
这些结果代表了我们的输出标量。这些对人类来说可能只是一堆数字,但对机器来说不是。这就是它们理解语言的方式。对这些值进行解码将帮助我们理解这些数字。
tokenizer_model.decode(summary[0])
上面的summary 结果显示,这些结果是在一个嵌套的列表中。但是我们只需要第一个结果,所以这就是我们对[0]进行索引的原因。
运行上述命令显示了我们的摘要文本。那块文本是如何被总结出来的,这难道不令人印象深刻吗?如果你浏览一下这个巨大的文本块,你会发现这个文本的总结版本并不存在。
它是新颖的,完全是由模型生成的。这就是抽象化总结的意义所在!
总结
这就是抽象化总结的概要。
有时候,模型不会给你一个抽象的总结。而是一个文本总结。这可能是因为你没有为那个特定的任务使用经过微调的pegasus模型。
尝试使用为该任务微调的Pegasus模型以获得更好的结果。例如,相对于google/pegasus-xsum ,pegasus-reddit_tifu 最适合对Reddit帖子进行抽象总结。