文本摘要(文本摘要模型)
本篇文章旨在通过探讨相关研究、案例分析和数据分析,深入了解[主题]的方方面面。通过对[主题]的全面考察,我们将揭示其重要性,并提出有见地的见解以促进对该领域的进一步理解和发展。
2.1 国内研究
国内学者对[主题]的研究始于[年代]。[作者姓名]在[本文题目]中提出[观点],并通过[研究方法]验证了[结论]。[作者姓名]进一步在[本文题目]中深入探究了[子主题],发现[发现]。近几年,[作者姓名]等学者将[研究方法]引入[主题]研究,取得了突破性的进展。
2.2 国外研究
国外对[主题]的研究已取得了较为成熟的成果。[作者姓名]在[本文题目]中建立了[模型],为[问题]的解决提供了理论基础。[作者姓名]等学者通过[研究方法]对[案例]进行了深入分析,提出了[观点]。[作者姓名]在[本文题目]中提出了[创新方法],为[方法]的进一步发展提供了新思路。
为了深入了解[主题]在实际中的应用,本研究选取了[案例名称]作为分析对象。该案例具有[特点],能够充分体现[主题]的特征。通过对该案例的全面分析,我们发现[发现],并总结出[结论]。这些发现为[主题]的应用提供了宝贵的经验和借鉴。
为了获得对[主题]更全面的认识,本研究收集了[数据来源]的数据,并采用[数据分析方法]对其进行了分析。分析结果显示[结果],这有力地支持了[观点]。同时,我们还通过[数据分析方法]对[子主题]进行了进一步的探索,发现[发现]。这些数据分析结果为[主题]的研究提供了有力的证据支撑。
通过对相关研究、案例分析和数据分析的综合考察,本研究得出了以下主要结论:
- [结论 1]
- [结论 2]
- [结论 3]
基于这些结论,本研究提出以下建议以促进[主题]的进一步发展:
- [建议 1]
- [建议 2]
- [建议 3]
本研究对[主题]的研究提供了新的见解和启示,为该领域的深入探索奠定了基础。未来,期待有更多学者投入到[主题]的研究中,共同推动[主题]的理论与实践发展。
入门| 文本摘要自动生成技术的前世今生
当我们点开某个网站或新闻APP时,经常能看到这样的标题:“14亿人都不知道的真相,历史的血泪……”、“删前速看!XXX视频流出”等,但是点进页面时往往会发现,都是标题党!而时间和流量却在悄悄溜走。
如果这时候有方法能够先阅读新闻,再提炼出关键内容,那么将大大节约时间并精准地找到我们需要的内容。
而这就是图鸭君此次会介绍的技术——“文本摘要自动生成”技术! 文本摘要充斥着我们生活的方方面面,从新闻关键词的提炼到Google、网络等搜索引擎的结果优化,真正实现搜索中的所见即所得,“Smarter & Faster”。
主流的文本摘要方式 目前主流的文本摘要自动生成有两种方式,一种是抽取式(extractive),另一种是生成式(abstractive)。
抽取式顾名思义,就是按照一定权重,从原文中寻找跟中心思想最接近的一条或几条句子。
而生成式是计算机通读原文,在理解整篇文章意思的基础上,重新生成概要。
抽取式摘要目前已经相对成熟,但抽取质量及内容流畅度均差强人意。
伴随着深度学习的研究,生成式摘要对质量和流畅度都有很大的提升,但目前也涉及到原文本长度过长、抽取内容不佳等问题的限制。
文本摘要的发展概况 抽取式摘要是一种比较成熟的方案,其中Text rank排序算法以其简洁、高效的特点被工业界广泛运用。
大体思想就是先去除文章中的一些停用词,之后对句子的相似度进行度量,计算每一句相对另一句的相似度得分,迭代传播,直到误差小于0.0001,再对上述方法得到的关键语句进行排序,即可获得摘要。
抽取式摘要主要考虑单词词频,并没有过多的语义信息,像“猪八戒”、“孙悟空”这样的词汇都会被独立对待,无法建立文本段落中完整的语义信息。
生成式文本摘要主要依靠深度神经网络结构实现,2014年由Goolge Brain团队提出的Sequence-to-Sequence序列,开启了NLP中端到端网络的火热研究。
Sequence-to-Sequence又称为编、解码器(Encoder、Decoder)架构。
其中Encoder、Decoder均由数层RNN/LSTM构成,Encoder负责把原文编码为一个向量C;Decode负责从向量C中提取提取信息,获取语义,生成文本摘要。
但是由于“长距离依赖”问题的存在,RNN到最后一个时间步输入单词时,已经丢失了相当一部分信息。
此时编码生成的语义向量C同样也丢失了大量信息,就可能导致生成摘要准确性不足。
Bahdanau等人在14年发表的论文《Neural Machine Translation by Jointly Learning to Align and Translate》中,第一次将Attention机制应用于NLP中。
Attention机制是一种注意力(资源)分配机制,在某个特定时刻,总是特地关注跟它相关的内容,其他内容则进行选择性忽视。
就像下图,在翻译“Knowledge”时,只会关注“知识”,这样的对齐能让文本翻译或者摘要生成更具针对性。
RNN/LSTM单元下每个词是按照顺序输入网络的,会记录文章的序列信息,所以大多数NLP任务,都是采用的RNN架构。
但是这种架构限制了网络训练及摘要生成的速度,因为RNN必须一个个输入、一个个生成,无法进行并行计算。
2016年Facebook AI Research(FAIR)发表了《A Convolutional Encoder Model for Neural Machine Translation》,对Encoder部分采用似乎不擅长处理序列信息的卷积网络(CNN)来实现,结果在翻译、摘要任务中,也达到了当年的最高水准; 2017年5月,还是FAIR,发布了《Convolutional Sequence to Sequence Learning》,第一次实现Encoder、Decoder均采用CNN单元,使网络在训练阶段能够并行计算,效率进一步提升。
同时引入了Multi-step Attention,相比于之前只在最后一层生成翻译时往回看,多跳注意(Multi-step Attentio)的优化点在于Decoder阶段生成每一层的语义向量时都会往回看,进而提升了准确度。
同时还有一些其他的trick:像引入单词的位置信息、残差网络、计算Attention时对高层语义信息和低层细节信息兼收并取等。
最后在生成翻译和摘要时,速度相比之前最快的网络,提升了近9倍!同时在WMT-14英德、英法两项的单模型训练结果中,BLEU得分达到了25.16、40.46,英法翻译任务也是迄今为止得分最高的模型。
时隔一个月,17年6月,Google团队发布了名为《Attention Is All You Need》的文章,即不用CNN和RNN单元,只用Self-Attention和Encoder-Decoder Attention,就完全实现了端到端的翻译任务,也是在WMT-14英德、英法翻译任务中,BLEU值达到了28.4和41.0的高分,因为同样可以并行计算,模型的训练及生成速度也有所提升。
Self-Attention相比于之前的模型更加关注句子的内部结构,也就是word-pairs的信息,附图是是论文中Attention可视化的结果,可以发现仅在源文端,模型便学习到了“making more difficult”的word-pairs信息。
同理对目标端,模型也会单独学习句子的内部结构信息。
之后利用Encoder-Decoder Attention建立源文和目标词组、句子的对应关系。
相比于FAIR 的卷积模型得到很高层才能看到句子的完整信息,Self-Attention在第一层便巧妙地建立了每个词和整个句子的联系,同时位置编码采用三角函数的相对位置法表示,理论上可以泛化到训练中未见过的更长长度句子的翻译中。
目前Self-Attention仅用在了翻译任务中,但这样的思想,在文本摘要自动生成的任务中,也是可以参照的。
总结: 从传统的Text rank抽取式,到深度学习中采用RNN、CNN单元处理,再引入Attention、Self-Attention机器生成摘要的方式,这一步步的转化使得文本摘要生成的方式跟人类思维越来越像,先理解后提取概要。
与此同时生成的摘要效果,也常常让我们惊艳。
但文本摘要自动生成依然还有很多难题,如段落太长,那机器对于段落的理解时间就会更长,而过长的时间会导致机器对于段落信息的记忆损失;而深度学习非常依赖有标签的样本,标注工作也会是一笔非常大的开销等等,这些都是需要大家去解决与克服的问题。
简而言之,文本摘要自动生成技术是一项非常具有前景但也是极具挑战性的技术。
Pointer Network 生成文本摘要
指针网络 Pointer Network 是一种 Seq2Seq 模型,但是其 Decoder 预测的结果是从 Encoder 的输入序列中得到的。
Pointer Network 从输入序列中得到输出结果,所以比较适合用于文本摘要的生成,并且可以比较好的避免 OOV (Out of vocabulary) 问题。
本文主要介绍两种利用 Pointer Network 的文本摘要算法:Pointer-Generator Networks 和 Multi-Source Pointer Network。
在之前的文章中介绍过指针网络 Pointer Network,指针网络是一种 Seq2Seq 模型,但是其 Decoder 预测的结果是从 Encoder 的输入序列中得到的。
指针网络改变了传统 Seq2Seq 模型 Attention 的用法,用 Encoder 输入序列中 Attention 得分最高的作为当前输出。
下图展示了传统 Seq2Seq Attention 与 Pointer Network 使用上的区别。
简单来说,传统的 Seq2Seq 在预测时计算的是整个字典中的概率分布,而 Pointer Network 预测时计算的是输入序列中每个单词的概率分布。
而文章摘要是 NLP 中一个比较重要的领域,常见的文章摘要方法可以分为抽取式摘要和生成式摘要。
抽取式摘要主要从源文档中提取现成的句子作为摘要句,一般在语句流畅程度上比生成式摘要好,但是容易引入较多的冗余信息。
生成式摘要主要根据源文档内容,通过算法模型生成摘要,而非提取原文的句子。
Pointer Network 由于可以复制输入序列的 token 作为输出,因此比较适合用于文本摘要,另外 Pointer Network 可以在一定程度上缓解 OOV 问题。
例如训练集里面没有出现 哈士奇 这一个单词,但是在预测的时候出现了 哈士奇,一般的 Seq2Seq 在生成摘要时通常会用 UNK 替换 哈士奇,但是 Pointer Network 可以直接从输入序列中复制 哈士奇 作为输出。
本文主要介绍两种利用 Pointer Network 的文本摘要算法:Pointer-Generator Networks 和 Multi-Source Pointer Network。
Pointer-Generator Networks 是一种同时利用了抽取式和生成式的摘要算法,而 Multi-Source Pointer Network 主要是抽取式。
Pointer-Generator Networks 出自论文 《Get To The Point: Summarization with Pointer-Generator Networks》。Pointer-Generator Networks 的主要内容包括以下两点:
Pointer-Generator Networks 在 Seq2Seq 基础上加入了指针网络,首先看一下 Seq2Seq 的模型结构图,如下图所示。
Seq2Seq 中利用 Decoder 的输出和 Encoder 每一时刻的输出计算出 Attention 分数,并根据 Attention 分数融合 Encoder 的输出得到 context vector,将 context vector 和 Decoder 的输出传入 Softmax 得到字典中 token 的概率分布。计算的公式如下:
Pointer-Generator Networks 在 Seq2Seq 中加入了指针网络的机制,模型如下图所示。
可以看到,Pointer-Generator Networks 在 Seq2Seq 预测的概率分布 P_vocab (图中绿色部分) 加上了 Attention 分布 (图中蓝色部分),得到最后的概率分布。
可以看到 P_vocab 中原本没有单词 2-0,但是在 Attention 分布中包含了 2-0,因此最后的分布也加入了 2-0,从而减缓 OOV 问题。
Pointer-Generator Networks 通过一个参数 p_gen 将两个分布加在一起,p_gen 通过学习得到。
Pointer-Generator Networks 为了避免模型生成重复的序列以及遗漏翻译,加入了 coverage 机制。
通过一个 coverage 向量 c t 记录 t 时刻前所有的 Attention 分数,因此可以通过 coverage 向量中每个 token 的取值判断该 token 是否被使用过,取值高的更可能被使用过。
然后在计算 Attention 时要加入 coverage 向量。
最后要在 Loss 中加上 coverage loss,可以看到对于第 i 个单词,如果其 attention 值和 coverage 值都很大,说明之前已经大概率生成过单词 i,则此时 coverage loss 会很大。
上面是三种模型的摘要对比,蓝色的是参考摘要,红色的是错误的摘要,可以看到 Seq2Seq 模型的摘要包含较多错误以及 UNK 单词。
绿色的是重复的摘要,Pointer-Generator Networks 虽然比较少错误和未知单词,但是其会生成重复的摘要。
而加上了 coverage 机制的 Pointer-Generator Networks 则可以比较好避免重复摘要。
Multi-Source Pointer Network (以下简称 MS-Pointer) 出自论文《Multi-Source Pointer Network for Product Title Summarization》,是阿里巴巴团队提出的,用于生成产品的标题。
MS-Pointer 需要两个数据源,其中一个是商品原来的标题,另一个是一些额外的信息。
额外的信息称为 knowledge,主要包含商品名和品牌名,类似与一些商品的标签。
由于产品的标题不应该引入不相关的信息并且要保留原来的重要信息,所以 MS-Pointer 采用了抽取式的方法,摘要中所有的 token 均来自标题或者 knowledge。
MS-Pointer 和 Pointer-Generator Networks 比较类似,区别在于 MS-Pointer 使用一个标题 Encoder 得到标题 token 的 Attention 分布,使用一个 knowledge Encoder 得到 knowledge 的 Attention 分布,将两个 Attention 分布融合在一起。模型的示意图如下:
如上图所示,MS-Pointer 将两个 Attention 分布融合,融合的参数用以下公式计算:
Get To The Point: Summarization with Pointer-Generator Networks
Multi-Source Pointer Network for Product Title Summarization
文本摘要方法
《Term Weighting Approaches in Automatic Text Retrieval》
TF-IDF的主要思想是:如果某个词或短语在一篇文章中出现的频率高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。其计算公式如下:
其中, TF表示词频(Term Frequency) , IDF表示逆向文件频率(Inverse Document Frequency) 。
TF表示词在文档d中出现的频率 ,而IDF的主要思想是:如果包含词t的文档越少,IDF越大,则说明词条t具有很好的类别区分能力。
词频(TF) 指的是某一个给定的词语在该文件中出现的频率。
这个数字是对 词数 (term count)的归一化,以防止它偏向长的文件。
对于在某一特定文件里的词语来说,它的重要性可表示为:
其中分子是该词在文件中的出现次数,而分母则是在文件中所有字词的出现次数之和
逆向文件频率(IDF) 指的是一个词语普遍重要性的度量。某一特定词语的IDF,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取以10为底的对数得到:
某一特定文件内的高词语频率,以及该词语在整个文件集合中的低文件频率,可以产生出高权重的TF-IDF。
因此,TF-IDF倾向于过滤掉常见的词语,保留重要的词语。
其计算公式如下:
TF-IDF算法基于假设 :对区别文档最有意义的词语应该是那些在文档中出现频率高,而在整个文档集合的其他文档中出现频率少的词语,因此引入TF词频作为测度,就可以体现同类文本的特点;另外考虑到单词区别不同类别的能力,TF-IDF法认为一个单词出现的文本频数越小,它区别不同类别文本的能力就越大,因此引入了逆文本频度IDF的概念,以TF和IDF的乘积作为特征空间坐标系的取值测度,完成对TF权重的调整,其目的在于突出重要单词,抑制次要单词。
本质上IDF是一种试图抑制噪音的加权 ,且单纯认为文本频数小的单词就越重要,文本频数大的单词就越无用,显然并不完全正确。
IDF的简单结构并不能有效地反映单词的重要程度和特征词的分布情况,使其无法很好地完成对权值调整的功能,所以TF-IDF法的精度并不是很高。
此外,在TF-IDF算法中并没有体现出单词的位置信息,特征词在不同的位置对文章内容的反映程度不同,其权重的计算方法也应不同。
使用TF_IDF模型实现文本摘要任务,具体思想如下 :
《TextRank: Bringing Order into Texts》
最经典的TextRank通过将文本建模成无向全连接图结构,在图上利用PageRank迭代计算每个节点的重要性分数,从而能够提取关键节点。
对于关键词提取而言, 图上的每个节点即为文档的词,边则代表词和词之间的共现关系,即在长度为N的滑动窗口内部的所有词认为是存在共现关系的 ,这些词也就相互之间有边连接。
这里构造的图是无边权的,计算节点V_i的PageRank分数的方法如下式,d的存在目的是为了使模型有一定的概率跳到图上其它随机点上,避免孤立点计算出现死循环,一般取d=0.85,初始节点分数均为1。
注意下式是迭代计算的,一般设为20次:
对于关键句提取而言,图上的节点代表文档中的句子,边权则用下式计算,其中S_i,S_j为两个句子,w_k代表句子中的词,也即节点边权定义为和两个句子词重叠率成正比,之所以还要除以句子长度的对数之和, 是考虑到越长的句子越可能出现重叠的词 :
关键句提取中TextRank方法建立的图为带边权的图,因而以下式计算PageRank分数,这里w_{ij}即为节点V_i,V_j之间的边权大小,d的规定同上:
故,基于上述方法可知, TextRank方法是无监督的不需要训练
这里使用 sklearn 实现,使用TextRank抽取文档中的关键句,实现无监督提取文本摘要
A Robustly Optimized BERT Pretraining Approach
Roberta本质上是一个调到最优的bert模型。chinese-roberta-wwm-ext针对中文任务的特点,对roberta的训练策略进行了进一步的优化
整体改进 :
输入 :原始文本是一个句子,如“使用语言模型来预测下一个词的probability”,经过分词和随机mask后,会得到预处理文本“使 用 语 言 [MASK] [MASK] 来 [MASK] [MASK] 下 一 个 词 的 [MASK] [MASK] [MASK]”,这里采用了全词掩码策略
输出 :对[MASK]位置的词进行预测,输出概率值
预训练过程 :集成了RoBERTa和BERT-wwm的优点,对两者进行了一个自然的结合。 和之前本目录中的模型之间的区别如下:
Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer
mT5是T5的多语言变体 ,已在包含101中语言的新的基于Common Crawl的数据集中进行了预训练。
mT5的模型架构和训练过程与T5紧密相似,其改进点在于:使用GeGLU非线性(Shazeer,2020年)激活函数,在更大模型中缩放dmodel而不是改变dff, 对无标签数据进行预训练而没有dropout等措施。
本项目直接加载降级处理后的mT5模型(hugging Face库中对应的版本为:csebuetnlp/mT5_multilingual_XLSum), 输入文本通过tokenizer进行分词得到对应的token id (支持最大长度为512),然后调用generate函数,将编码的输入文本进行解码,目前项目在解码过程中的超参数设置如下:支持最大长度max_length=70, 解码所用的beam search所保留的beam值为4。
然后将得到的generate token ids经过tokenizer解码生成具体预测的文本。
ROUGE英文全称 Recall-Oriented Understudy for Gisting Evaluation ,专注于 召回率而非精度 。N指的是N-gram,它会查看有多少个参考译句中的n元词组出现在了输出之中
公式的分母是统计在参考译文中N-gram的个数,而分子是统计参考译文与机器译文共有的N-gram个数。
对两个生成句和参考句(word piece进行tokenize)分别用bert提取特征,然后对2个句子的每一个词分别计算内积,可以得到一个相似性矩阵。基于这个矩阵,我们可以分别对参考句和生成句做一个最大相似性得分的累加然后归一化,得到bertscore的precision,recall和F1:
给测试集的句子赋予较高几率值的语言模型较好,当语言模型训练完以后,测试集中的句子都是正常的句子,那么训练好的模型就是在测试集上的几率越高越好,对于句子s
它的概率为:
困惑度与测试集上的句子概率相关,其基本思想是: 给测试集的句子赋予较高概率值的语言模型较好,当语言模型训练完之后,测试集中的句子都是正常的句子,那么训练好的模型就是在测试集上的概率越高越好 ,公式如下: