在这篇文章中,我们将了解文本总结的基本原理,一些可以总结文本的不同方式,变形器,BART模型,最后,我们将通过使用一个有效的模型(在Python中)来实际实现其中的一些概念,以了解我们如何缩短一个文本块,同时保留它所传达的所有重要信息。
文本归纳
文本总结本质上是将一段长的文本(如一篇文章或一篇论文)缩短为一个摘要的过程,通过保留关键信息和舍弃不重要的部分来传达文本的总体意义。当我们对文本进行总结时,有两种广泛的方法。
- 抽取式总结
- 抽象式总结
提取式总结
在提取式总结中,我们通过从原始文本块中提取特定的文本行来生成一个总结,而不以任何方式改变这个文本。因此,摘要中的所有文本行都已经存在于原始文本块中。该模型只是提取它认为重要的文本行,但并不产生任何不存在于原始文本块中的内容。大多数总结系统恰好都是提取式的。
抽象式总结
在抽象总结中,我们通过建立原始文本块的内部语义表征来生成一个总结,然后用这个表征来生成一个全新的文本块。这个新的文本块(摘要)包含与原始文本块不同的句子,这类似于人类改写和缩短过长的文本块的方式。抽象法通常比提取法的计算成本要高得多,因为我们需要生成语法和语境完整的句子,这些句子与被提及的领域有关。该模型首先要彻底理解原始文本块,以便它能够有效地、有意义地总结它。
现在我们已经对文本总结有了扎实的了解,以及我们用来总结文本的两种一般方法,我们就可以了解变形器以及它们在文本总结中的应用。
变形器
长期以来,递归模型(如递归神经网络、长短期记忆等)一直被用于语言建模和机器翻译问题。然而,这些模型本质上是顺序性的,当我们必须处理较长的序列长度时,这就带来了问题,因为内存限制开始限制跨实例的批处理。由于RNN是按顺序处理数据的(或一次处理一个数据元素),所以不可能通过简单地增加处理能力来大幅提高它们的速度。这使得我们很难在非常大的数据量上训练RNN。这是因为它们的训练速度较慢,这是由于并行化的范围减少了。虽然近来我们已经成功地大大提高了这类模型的计算效率,但与顺序计算相关的缺点仍然是真实而有害的。
这就是变形金刚出现的地方。变形金刚是一种神经网络架构,是由谷歌(和UoT)的一组研究人员在2017年开发的。他们避免使用递归原则,完全依靠注意力机制来得出输入和输出之间的全局依赖关系。变换器允许比顺序模型更多的并行化,即使只经过短时间的训练,也能达到非常高的翻译质量。它们也可以在非常大的数据量上进行训练,而没有那么多困难。例如,GPT-3(Generative Pre-Trained Transformer-3)模型是在特别大的数据量上训练的,接近45兆字节!它是一个非常好的例子。
变换器有三个明显的特点,使其工作如此高效:
- 位置编码
- 注意力
- 自我注意
1.位置编码
位置编码的概念是,我们不是按顺序(或逐字)看一个句子,而是把每个词都赋予它一个独特的表示。
因此,如果我们有这样一个句子:
"他喜欢吃冰激凌"。
那么,这个句子的每个词都被分配了一个特定的索引,如下:
他 -> 1
喜欢 -> 2
要 -> 3
吃 -> 4
冰 -> 5
奶油。-> 6
在实践中,这些词没有被分配简单的索引值。变形器使用智能位置编码方案,每个位置都被映射到一个矢量。因此,我们实际上最终得到了一个位置编码矩阵,在这里我们可以找到位置信息,以及句子的编码对象。然而现在,为了更好地理解这些概念,我们将使用上述例子。
通过对句子中的每个词进行索引,我们在数据本身中存储了关于词序的信息,而不是在网络的结构中。最初,网络不会知道如何解释这些位置编码,但随着它与大量数据的合作,它开始学习如何利用它们。因此,网络会从数据中了解到词序的重要性。这使得我们在训练变形金刚时比RNN更容易。
2.注意力
假设我们想把一个句子从英语翻译成印地语。一个原始的方法是把英语句子中的每个词一个一个地翻译成印地语。这不是翻译句子的理想方法,因为传达相同信息的句子中的单词顺序往往在不同的语言中略有不同。
例如,如果我们有这样一个句子:
"Max想玩。
印地语的对应句子是:
'मैक्स खेलना चाता है।'
在这里,印地语中'想'和'玩'的词被洗掉了。然而,如果我们把英语句子一个一个地翻译出来,我们会得到这样一个句子:
'मैक्स चाहता है खेल।'
这个句子虽然还能破译一些,但远不是英语句子'Max wants to play'的正确印地语表述。
注意力是一种机制,它使模型有可能将给定句子中的每一个词联系起来,这使它对最终翻译的句子应该是什么样子有了更清晰的认识。这是模型可以在训练数据的帮助下学习的东西。通过观察两种语言的大量句子实例,模型可以开始学习单词的相互依存关系、不同的语法和标点符号规则以及更多此类语言细节。
3.自我关注
在文章的前一部分,我们主要讨论了文本翻译,这是一个非常具体的语言任务。如果我们想建立一个模型,能够学习语言的核心基础知识,使其能够执行任何数量的语言任务呢?这就是Self-Attention所帮助我们做的。Self-Attention使神经网络有可能在它所使用的句子的上下文中理解一个词。
例如,在以下句子中。
'他被告知要把车停在离墙更近的地方。'
'她今天去了公园
在这些句子中,'公园'这个词承担了不同的含义。人类可以很容易地对这些词进行上下文分析,并推断出它们的不同含义,而这正是 "自我关注 "允许神经网络所做的。
在第一个句子中,模型可能会看'汽车'这个词,并推断出'公园'这个词在这里意味着--车辆的停放,而在第二个句子中,模型可能会看'她去'这个词,并推断出'公园'这个词在这里意味着--操场或花园。
变压器是如何工作的?
从上图中我们可以看出,变形金刚由几个不同的部分组成:一个编码器堆栈和一个解码器堆栈,输入和输出预处理单元,以及输出后处理单元。在这里,输入序列被编码器映射成一个抽象的连续表示。然后,解码器接受这个抽象的连续表示,并在得到前一个输出的情况下产生一个输出。
第一个编码器接收输入序列的词嵌入。然后,这些被转换并发送给下一个编码器。最后,编码器堆栈中最后一个编码器的输出被传递给整个解码器堆栈。
在我们使用一个实用的模型之前,让我们快速看一下一种被称为BART的转化器的结构和用途。
BART
BART,即双向自动回归变换器,是一种序列到序列的去噪自动编码器。一个BART模型能够接受一个输入文本序列,并生成一个不同的输出文本序列(例如,一个英语输入->一个法语输出)。这些模型通常用于机器翻译、文本和句子分类,以及文本总结!
在研究论文 "BART:用于自然语言生成、翻译和理解的序列间去噪预训练",使用包括噪声(或损坏)数据的训练数据进行训练,然后将其映射到所获得的原始数据。该研究论文的作者使用了多种新颖的转换方法,以便为预训练的数据引入噪声。其中一些转换方法如下。
-
符号屏蔽:句子中的随机标记被替换成[MASK]元素。
-
符号删除:输入序列中的随机标记被删除。由模型来预测哪些位置没有输入。
-
文本填充:用一个单数的[MASK]标记来替换若干标记。由模型来了解有多少个标记被丢失,以及
丢失的标记的内容。 -
句子排列:句子被随机地重新排列/permuted。这使得模型有可能学习句子的逻辑顺序。
-
文件旋转:挑选一个随机的标记,并使文件以该标记开始。在该特定标记之前的内容被添加到文档的结尾。这使得模型有可能识别出文档的开始部分是什么样子。
BART的第一部分使用BERT的双向编码器(这是另一个基于双向编码的Transformer模型)来寻找输入文本序列的理想表示。
一旦我们有了这个理想的输入文本序列表示,我们需要一个解码器来解释输入文本序列并将其映射到输出目标。为了做到这一点,我们使用GPT的自动回归解码器(这是另一个基于自动回归解码的转化器模型),它只看过去的数据来做新的预测。
因此,BART模型看起来像这样:
在这里,输入序列是[ABCDE]的损坏版本,被转换为[A[MASK]B[MASK]E]。然后用双向编码器对这个被破坏的序列进行编码,并通过自动回归解码器计算出原始文本[ABCDE]的可能性。这个模型可以通过向编码器和解码器提供未被破坏的原始文本而得到进一步的微调。
正如我们前面所讨论的,BART模型是机器翻译、文本和句子分类以及文本总结的一个强大工具。BART模型在各种任务中的表现与之前提出的模型相当或更好。
现在我们对vanilla Transformers以及BART模型有了深刻的理解,我们将与HuggingFace的Transformers(这是一个Python库)合作,学习这些模型在现实世界中的使用方法我们将使用管道API来实现。
代码
首先,我们安装所需的库:
pip3 install transformers torch sentencepiece
然后,我们导入'管道'。我们使用管道API,因为它使我们能够简单地利用'transformers'中的模型:
from transformers import pipeline
现在,我们定义我们希望总结的文本。在这个案例中,我们要总结一篇关于 "2021年世界一级方程式锦标赛 "的文章。这篇文章非常详细地介绍了本赛季所发生的所有事件,然而,我们只希望保留重要的部分:即哪个车队赢得了世界车队冠军,哪个车手赢得了世界车手冠军,以及总共有多少场比赛:
original_text = """
The 2021 FIA Formula One World Championship was a motor racing championship for Formula One cars which was the 72nd running of the Formula One World Championship. It is recognised by the Fédération Internationale de l'Automobile (FIA), the governing body of international motorsport, as the highest class of competition for open-wheel racing cars. The championship was contested over twenty-two Grands Prix, and held around the world. Drivers and teams competed for the titles of World Drivers' Champion and World Constructors' Champion, respectively.
Max Verstappen won his first World Championship (and the first for a Dutch driver), driving for Red Bull Racing-Honda.
Lewis Hamilton, the defending champion, finished runner-up, driving for Mercedes.
Hamilton's teammate Valtteri Bottas was third, driving for Mercedes.
Mercedes won their eighth consecutive Constructors' Championship.
At season's end in Abu Dhabi, Max Verstappen of Red Bull Racing-Honda won the Drivers' Championship for the first time in his career. Verstappen became the first ever driver from the Netherlands, the first Honda-powered driver since Ayrton Senna in 1991, the first Red Bull driver since Sebastian Vettel in 2013 and the first non-Mercedes driver in the turbo-hybrid era to win the World Championship.
Honda became the second engine supplier in the turbo-hybrid era to power a championship winning car, after Mercedes. Four-time defending and seven-time champion Lewis Hamilton of Mercedes finished runner up. Mercedes retained the Constructors' Championship for the eighth consecutive season.
The season ended with a controversial finish, with the two title rivals for the drivers' crown entering the last race of the season with equal points. Verstappen sealed the title after winning the season-ending Abu Dhabi Grand Prix after a last-lap restart pass on Hamilton following a contentious conclusion of a safety car period. Mercedes initially protested the results, and later decided not to appeal after their protest was denied. The incident led to key structural changes to race control, including the removal of Michael Masi from his role as race director and the implementation of a virtual race control room, who assist the race director. Unlapping procedures behind the safety car were to be reassessed and presented by the F1 Sporting Advisory Committee prior to the start of the 2022 World Championship season. On 10 March 2022 the FIA World Motor Sport Council report on the events of the final race of the season was announced, and that the "Race Director called the safety car back into the pit lane without it having completed an additional lap as required by the Formula 1 Sporting Regulations", however also noted that the "results of the 2021 Abu Dhabi Grand Prix and the FIA Formula One World Championship are valid, final and cannot now be changed".
This was the first season since 2008 where the champion driver was not from the team that took the constructors' title.
"""
print(original_text)
正如我们所看到的,这是一篇非常长的文章,对其进行总结将使我们能够明显更容易区分本赛季真正重要的时刻和不重要的小细节。
现在,我们对这篇文章进行总结:
summarization = pipeline("summarization")
summary_text = summarization(original_text)[0]['summary_text']
最后,我们打印总结后的文章。
print("Summary:", summary_text)
这段特殊的代码产生了以下输出,这是原始文章的总结版本。
"摘要:2021年世界一级方程式锦标赛是国际汽车联合会(FIA)的第72届赛事,它是国际赛车运动的管理机构。冠军赛在世界各地举行,共有22场大奖赛。车手和车队争夺世界车手冠军和世界车队冠军的称号。红牛车队-本田车队的马克斯-维斯塔潘在其职业生涯中首次赢得了车手冠军。梅赛德斯车队的刘易斯-汉密尔顿获得亚军,他代表梅赛德斯车队参赛。梅赛德斯保留了他们连续第八个车队冠军。
正如我们所看到的,这个总结只告诉我们在本赛季中发生的最重要的事件。它告诉我们这篇文章是关于什么的(即2021年世界一级方程式锦标赛),总共举行了多少场比赛,它提到哪个车队和车手赢得了各自的冠军,并让我们了解这个赛季是如何影响所有相关方的。这篇文章的缩短版简明扼要,易于阅读,而且语法合理。它传达了文章的重点,并略去了任何可能对读者没有意义的东西。
结论
在OpenGenus的这篇文章中,我们了解了文本总结的基本原理,我们用来总结文本的不同方法,即。提取式文本总结和抽象式文本总结,变形器,BART模型,我们还用一个实用的模型(在Python中)来总结一个文本块。
谢谢你的阅读!