本文转载自:

自动文摘(一)、自动文摘(二)、自动文摘(三)、自动文摘(四)

目录

一、前言

Ideas

Introduction

Link

二、抽取式

Extractive Summarization

预处理

词、句表示

排序

后处理

输出

三、难点

Abstractive

Evaluation

人工评价

自动评价

重要性

四、生成式摘要

Encoder-Decoder

Attention Mechanism

Neural Summarization


一、前言

最近人工智能随着AlphaGo战胜李世乭这一事件的高关注度,重新掀起了一波新的关注高潮,有的说人工智能将会如何超越人类,有的说将会威胁到人类的生存和发展,种种声音都在表明人工智能的又一个春天即将到来,但很多学者认为媒体的过度炒作,会引发民众对人工智能不切实际地期待,从而导致人工智能寒冬的又一次到来。Yann Lecun作为上一个人工智能寒冬时期还在坚持做冷门的神经网络研究的人,他对AI有一个非常理性的认知。

最近几年在人工智能领域中大热的工程技术deep learning,将机器对图像,语音,人类语言的认知能力都提升了不少,前前后后也涌现出不少不仅仅是很cool而且是非常实用的应用,比如人脸识别,猫脸识别,无人车,语义搜索等等。其中,深度学习技术对图像和语音的影响最大,但对人类语言的理解(NLP)做的没有那么那么好。所以,不必太过鼓吹人工智能将会如何如何,民众的期待不应太过接近科幻电影,不然只能换来无尽的失望,从而导致寒冬的来临。

NLP是一个非常难的task,至今有很多的子task都没有得到太好的解决。虽然每天我们在arxiv上都可以看到update的paper,但大多数都是一些model上的小trick,在个别数据集上跑一些example,和baseline做一些对比,得到所谓的state-of-the-art结果,并没有真正深刻理解要解决的问题,所谓的唯model论。不久前,Christopher D. Manning在文章中写了这么一句话:

However, I would encourage everyone to think about problems, architectures, cognitive science, and the details of human language, how it is learned, processed, and how it changes, rather than just chasing state-of-the-art numbers on a benchmark task.

以上是一些简单的背景介绍,下面进入正题。

自动文摘(auto text summarization)是NLP中较难的技术,难点很多,至今并没有一个非常让人满意的、成熟的技术来解决这个问题。

Ideas

大家在查文献的时候,输入一个关键词之后,会返回一个paper列表,如果你只看paper的title可能会被一些标题党蒙骗,如果每篇paper都看abstract,时间会花太久,看着很烦。所以我在想,给rsarxiv添加一个功能,基于query的research survey生成。当你输入一个keyword之后,返回的结果不仅仅是paper列表,还有一个非常精炼的survey,你可以通过阅读survey了解到每篇paper的最核心工作,如果你感兴趣的话,可以进一步查看paper的具体内容。

基于这个idea,开始逐步地了解自动文摘技术,所以这一系列blog的目的是为了记录我在学习自动文摘过程中的一些点滴心得。

Introduction

第一篇blog对自动文摘做一个简单的介绍。

自动文摘技术应用最广的领域在于新闻,由于新闻信息的过载,人们迫切地希望有这么一个工具可以帮助自己用最短的时间了解最多的最有用的新闻(为什么不直接看标题呢?因为很多新闻为了哗众取宠,故意将标题起的特别吸引人眼球,但却名不副实),因此就有了Yahoo 3000w$$ 收购summly的交易。另外,搜索引擎也是应用之一,基于query的自动文摘会帮助用户尽快地找到感兴趣的内容。前者是单文档摘要技术,后者是多文档摘要技术,后者较于前者会更加复杂一些。

自动文摘出现的重要原因之一是信息过载问题的困扰,(当然个性化推荐系统是解决信息过载的另外一个好的办法)另外一个重要原因是人工文摘的成本较高。可以想象,如果计算机有能力写出一个topic下的综述paper,也就不需要survey作者去花大量的时间来读和写了。

自动文摘要解决的问题描述很简单,就是用一些精炼的话来概括整篇文章的大意,用户通过阅读文摘就可以了解到原文要表达的意思。问题包括两种解决思路,一种是extractive,抽取式的,从原文中找到一些关键的句子,组合成一篇摘要;另外一种是abstractive,摘要式的,这需要计算机可以读懂原文的内容,并且用自己的意思将其表达出来。现阶段,相对成熟的是抽取式的方案,有很多很多的算法,也有一些baseline的测试,但得到的摘要效果差强人意,对后者的研究并不是很多,人类语言包括字、词、短语、句子、段落、文档这几个level,研究难度依次递增,理解句子、段落尚且困难,何况是文档,这是自动文摘最大的难点。

Link

[1] Quora上的问答
[2] 知乎上的问答


二、抽取式

自动文摘的方法主要分为两大类,extractive和abstractive。前者是目前最主流、应用最多、最容易的方法,后者相对来说更有一种真正人工智能的味道。还有另外一种分类方法是,单文档摘要和多文档摘要,前者是后者的基础,但后者不只是前者结果简单叠加那么简单。本文只介绍单文档的extractive方法。

Extractive Summarization

抽取式的方法基于一个假设,一篇文档的核心思想可以用文档中的某一句或几句话来概括。那么摘要的任务就变成了找到文档中最重要的几句话,也就是一个排序的问题。

排序是一个非常经典的问题,也是一个非常多解决方案的问题。比如:Google根据用户的query生成的网页列表,就是一个排序之后的结果;再比如Amazon的推荐系统推荐给用户的N个可能感兴趣的产品,也都是通过算法做了排序输出的。

排序针对不同的问题,需要提出不同的指标,比如有的应用关心的是相关性,有的关心的是时效性,有的关心的是新颖性等等,在这个层面上来讨论排序,会有不同的模型。

一般的抽取式摘要问题,会考虑相关性和新颖性两个指标。相关性是指摘要所用的句子最能够代表本文档的意思,而新颖性是指候选句子包含的冗余信息要少,尽可能每句话都可以独立地表达出一种独立的意思。

下面简单介绍一些思路。

预处理

NLP任务的标准流程中第一步都是预处理,将拿到的文本做分句,这里有两种可能性,一是用句点或者其他可以表达一句话结尾的符号作为分隔,另外一种是用逗号作为分隔符获取句子。

词、句表示

这一步的思路是:将词、句子表示成计算机能理解的量,然后计算一些指标进行排序。这个地方也是各种算法、模型最大的不同之处:

1、Bag Of Words。词袋模型将词定义为一个维度,一句话表示成在所有词张成的空间中的一个高维稀疏向量。
2、TFIDF。可以理解为带权重的词袋模型,计算出每个词的TFIDF值,作为该词的权重。
3、LDA/LSI。将整篇文档利用TFIDF模型表示成一个矩阵,做SVD降维分解,生成两个矩阵,一个是文档-话题矩阵、另一个是词-话题矩阵。得到词-话题矩阵之后,可以得到句子-话题矩阵。
4、Word Embedding。Tomas Mikolov提出的Word2Vec,用了很多技巧和近似的思路让word很容易地表示成一个低维稠密向量,在很多情况下都可以达到不错的效果。词成为了一个向量,句子也可有很多种方法表示成一个向量。

排序

这里介绍两种常见的方法。

1、基于图排序

将文档的每句话作为节点,句子之间的相似度作为边权值构建图模型,用pagerank算法进行求解,得到每个句子的得分。

代表算法有TextRank和LexRank。

2、基于特征

特征工程在深度学习火之前是解决特定领域问题的良药,这里用到的特征包括:

1)句子长度,长度为某个长度的句子为最理想的长度,依照距离这个长度的远近来打分。

2)句子位置,根据句子在全文中的位置,给出分数。(比如每段的第一句是核心句的比例大概是70%)

3)句子是否包含标题词,根据句子中包含标题词的多少来打分。

4)句子关键词打分,文本进行预处理之后,按照词频统计出排名前10的关键词,通过比较句子中包含关键词的情况,以及关键词分布的情况来打分。

代表算法是TextTeaser。

后处理

排序之后的结果只考虑了相关性并没有考虑新颖性,非常有可能出现排名靠前的几句话表达的都是相似的意思。所以需要引入一个惩罚因子,将新颖性考虑进去。对所有的句子重新打分,如下公式:

a x score(i) + (1-a) x similarity(i,i-1), i = 2,3,….N

序号i表示排序后的顺序,从第二句开始,排第一的句子不需要重新计算,后面的句子必须被和前一句的相似度进行惩罚。

这个算法就是所谓的MMR(Maximum Margin Relevance)

输出

输出的结果一般是取排序后的前N句话,这里涉及到一个非常重要的问题,也是一直自动文摘质量被诟病的问题,可读性。因为各个句子都是从不同的段落中选择出来的,如果只是生硬地连起来生成摘要的话,很难保证句子之间的衔接和连贯。保证可读性是一件很难的事情。

这里有一个取巧的方法,就是将排序之后的句子按照原文中的顺序输出,可以在一定程度下保证一点点连贯性。

路漫漫其修远兮,吾将上下而求索

[1] TextRank源码阅读笔记
[2] TextTeaser源码阅读笔记


三、难点

虽然有很多SaaS提供Summarization的服务,虽然有很多App尤其是新闻类App标榜自己拥有多么牛的技术做Summarization,我们还是不得不承认自动文摘的技术离一个高水平的AI还有一段距离,很长的一段距离。都说自动文摘很难,到底难在哪里?

Abstractive

上一篇博客分享了Extraction方法的一些思路,本篇简单聊一点Abstractive的想法。
Abstractive是一个True AI的方法,要求系统理解文档所表达的意思,然后用可读性强的人类语言将其简练地总结出来。这里包含这么几个难点:

1、理解文档。所谓理解,和人类阅读一篇文章一样,可以说明白文档的中心思想,涉及到的话题等等。

2、可读性强。可读性是指生成的摘要要能够连贯(Coherence)与衔接(Cohesion),通俗地讲就是人类读起来几乎感觉不出来是AI生成的(通过图灵测试)。

3、简练总结。在理解了文档意思的基础上,提炼出最核心的部分,用最短的话讲明白全文的意思。

上述三个难点对于人类来说都不是一件容易的事情,何况是发展没太多年的自然语言处理技术。人工智能领域中AI能够领先人类的例子很多,包括前不久很火的Alpha狗,图片识别,主要是利用计算机远强于人类的计算能力,但也有很多的领域,AI离人类的水平还有很远,比如paper的survey,summarization,机器翻译等等。

近几年随着Deep Learning的火爆,研究者们利用一些最新的研究成果来做summarization,比如attention model,比如rnn encoder-decoder框架,在一定程度上实现了abstractive,但还是处于研究初期,效果还不算很好。

Evaluation

自动文摘最大的一个难点是评价问题,如何有效地、合理地评价一篇文摘的效果是一个很难的问题。

人工评价

一千个读者,有一千个哈姆雷特

不同的人理解一篇文档会有很大的不同,基于人工评价的方法有类似于评价开放的文科辨析题目答案一样,需要从答案中寻找一些所谓的要点,计算要点覆盖率,打分。人工评价结果在很大程度上都是可信的,因为人可以推理、复述并使用世界知识将具有类似意思但形式不同的文本单元关联起来,更加灵活一些,但时间成本太高,效率太低。

自动评价

计算机评价效果,需要给定参考摘要作为标准答案,通过制定一些规则来给生成的摘要打分。目前,使用最广泛的是ROUGH系统(Recall-Oriented Understudy for Gisting Evaluation),基本思想是将待审摘要和参考摘要的n元组共现统计量作为评价依据,然后通过一系列标准进行打分。包括:ROUGH-N、ROUGH-L、ROUGH-W、ROUGH-S和ROUGH-SU几个类型。通俗地将就是通过一些定量化的指标来描述待审摘要和参考文摘之间的相似性,维度考虑比较多,在一定程度上可以很好地评价Extracive产生的摘要。

这里涉及到一个重要的问题,就是标注语料问题。自动评价需要给定一系列文档已经他们的参考文摘,用来测试不同的算法效果。TAC(Text Analysis Conference)和TREC(Text REtrieval Conference)两个会议提供了相关的评测数据集,自动文摘领域的paper都是以这些数据集为baseline,与其他paper的算法进行对比。会议的数据集毕竟有限,新的领域中做自动文摘需要建立自己的数据集作为标准。

现有的评价标准存在的一个重要问题在于没有考虑语义层面上的相似,评价extractive还好,但评价abstractive就会效果不好了。Deep Learning其实就是一个representation learning,将世界万物表示成数字,然后作分析。在词、句子甚至段落这个层面上的表示学习研究的非常多,也有很多的state-of-the-art的结果,所以做语义层面上的评价并不难。

重要性

评价对于一个研究领域非常重要,是牵引这个领域前进的首要因素,评价需要制定标准,标准的好坏关系到这个领域的研究质量,尤其是研究者们的paper质量,因为大家相互比较算法的优劣就十分依赖这样的标准。标准数据集的建立以及baseline的提出,是最首要的任务。


四、生成式摘要

这篇博客是自动文摘系列的第四篇,重点介绍近期abstractive summarization的一些研究情况。abstractive是学术界研究的热点,尤其是Machine Translation中的encoder-decoder框架和attention mechanism十分火热,大家都试着将abstractive问题转换为sequence-2-sequence问题,套用上面两种技术,得到state-of-the-art结果,2015年来已经有许多篇paper都是这种套路,于是就有了下面的吐槽:

Encoder-Decoder

Encoder-Decoder不是一种模型,而是一种框架,一种处理问题的思路,最早应用于机器翻译领域,输入一个序列,输出另外一个序列。机器翻译问题就是将一种语言序列转换成另外一种语言序列,将该技术扩展到其他领域,比如输入序列可以是文字,语音,图像,视频,输出序列可以是文字,图像,可以解决很多别的类型的问题。这一大类问题就是上图中的sequence-to-sequence问题。这里以输入为文本,输出也为文本作为例子进行介绍:

encoder部分是将输入序列表示成一个带有语义的向量,使用最广泛的表示技术是Recurrent Neural Network,RNN是一个基本模型,在训练的时候会遇到gradient explode或者gradient vanishing的问题,导致无法训练,所以在实际中经常使用的是经过改良的LSTM RNN或者GRU RNN对输入序列进行表示,更加复杂一点可以用BiRNN、BiRNN with LSTM、BiRNN with GRU、多层RNN等模型来表示,输入序列最终表示为最后一个word的hidden state vector。

decoder部分是以encoder生成的hidden state vector作为输入“解码”出目标文本序列,本质上是一个语言模型,最常见的是用Recurrent Neural Network Language Model(RNNLM),只要涉及到RNN就会有训练的问题,也就需要用LSTM、GRU和一些高级的model来代替。目标序列的生成和LM做句子生成的过程类似,只是说计算条件概率时需要考虑encoder向量。

这里,每一种模型几乎都可以出一篇paper,尤其是在这个技术刚刚开始应用在各个领域中的时候,大家通过尝试不同的模型组合,得到state-of-the-art结果。

该框架最早被应用在Google Translation中,paper详情可以见[1],2014年12月发在arxiv上。

Attention Mechanism

注意力机制在NLP中的使用也就是2015年的事情,也是从机器翻译领域开始。我们仔细看decoder中生成目标文本序列这部分,第一个word的生成完全依赖于encoder的last hidden state vector,而这个vector更多的是表示输入序列的最后一个word的意思,也就是说rnn一般来说都是一个有偏的模型。

打个比方,rnn可以理解为一个人看完了一段话,他可能只记得最后几个词说明的意思,但是如果你问他前面的信息,他就不能准确地回答,attention可以理解为,提问的信息只与之前看完的那段话中一部分关系密切,而其他部分关系不大,这个人就会将自己的注意力锁定在这部分信息中。这个就是所谓attention mechanism的原理,每个hidden state vector对于decoder生成每个单词都有影响,但影响分布并不相同,请看下图:

图中行文本代表输出,列文本代表输入,颜色越深表示两个词相关性越强,即生成该词时需要多注意对应的输入词。不同的paper在使用attention上会有不同的技巧,这里不一一赘述了。

Neural Summarization

使用deep learning技术来做abstractive summarization的paper屈指可数,大体的思路也类似,大概如下:

0、首先将自动文摘的问题构造成一个seq2seq问题,通常的做法是将某段文本的first sentence作为输入,headlines作为输出,本质上变成了一个headlines generative问题。

1、选择一个big corpus作为训练、测试集。自动文摘的技术没有太成熟的一个重要原因在于没有一个成熟的大规模语料。一般来说都选择Gigawords作为训练、测试集,然后用DUC的数据集进行验证和对比。

2、选择一个合适的encoder,这里可以选simple rnn,lstm rnn,gru rnn,simple birnn,lstm birnn,gru birnn,deep rnn,cnn,以及各种各样的cnn。不同model之间的组合都是一种创新,只不过创新意义不太大。用encoder将输入文本表示成一个向量。

3、选择一个合适的decoder,decoder的作用是一个language model,用来生成summary words。

4、设计一个合适的attention model。不仅仅基于encoder last hidden state vector和上文来预测输出文本序列,更要基于输入中“注意力”更高的词来预测相应的词。

5、设计一个copy net。只要是语言模型都会存在相同的问题,比如out-of-vocabulary词的处理,尤其是做新闻类摘要的生成时,很多词都是人名、机构名等专有名词,所以这里需要用copy net 将输入中的词copy过来生成输出。在生成中文摘要问题上,将words降维到characters可以避免oov的问题,并且取得不错的结果。

接下来想做的事情是将neural summarization相关的paper精读之后写成blog。

[1] Sequence to Sequence Learning with Neural Networks

[2] A Neural Attention Model for Abstractive Sentence Summarization

[3] LCSTS: A Large Scale Chinese Short Text Summarization Dataset

[4] Incorporating Copying Mechanism in Sequence-to-Sequence Learning

【读】自动文摘——预备相关推荐

  1. AAAI 2020 | 多模态基准指导的生成式多模态自动文摘

    2020-01-06 10:17 导语:基本想法是优化多模态摘要训练的目标函数~ 作者 | 朱军楠.张家俊 多模态自动文摘是指利用计算机实现从含有两种或两种以上模态(如图片.文本等)的信息中生成图文式 ...

  2. 论文浅尝 - AAAI2020 | 多模态基准指导的多模态自动文摘

    论文笔记整理:刘雅,天津大学硕士. 链接: https://aaai.org/ojs/index.php/AAAI/article/view/6525 动机 近年来,随着计算机视觉以及自然语言处理技术 ...

  3. 自动文摘评测方法:Rouge-1、Rouge-2、Rouge-L、Rouge-S

    关于ROUGE ROUGE(Recall-Oriented Understudy for Gisting Evaluation),在2004年由ISI的Chin-Yew Lin提出的一种自动摘要评价方 ...

  4. Rouge | 自动文摘及机器翻译评价指标

    tag:评价指标,摘要,nlp Rouge(Recall-Oriented Understudy for Gisting Evaluation),是评估自动文摘以及机器翻译的一组指标.它通过将自动生成 ...

  5. 自动文摘评测方法:Rouge-L、Rouge-N

    Rouge-L 的初认识 本人参加百度机器阅读理解比赛,发现阅读理解比赛的评价标注,以Rouge-L为主,若 Rouge-L相同的 话,则看 BLEU-4.由此可见,Rough-L 作为自动文摘评测方 ...

  6. 简易中文自动文摘系统(合集)

    目录 简易中文自动文摘系统(一):绪论 自动文摘的介绍 自动文摘分类 简易中文自动文摘系统(二):中文语料库的准备 中文语料库 jieba分词 简易中文自动文摘系统(三):模型训练 词向量 word2 ...

  7. 自动文摘系统实现总结

    自动文摘系统实现总结 应用场景 利用Ai系统帮助人把不同分类的大量文档自动做总结,重要点总结,比较典型公司美国alphasense公司主要做这块终端抽取重要信息,大量节省人力成本和时间成本 自动文摘有 ...

  8. 中文自动文摘关键技术总结

    中文自动文摘关键技术总结 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多AI干货 csdn:https://blog.csdn.net/abcgkj github:ht ...

  9. 【CIPS 2016】(8-10章)信息抽取、情感分析自动文摘 (研究进展、现状趋势)

    CIPS 2016 笔记整理 <中文信息处理发展报告(2016)>是中国中文信息学会召集专家对本领域学科方 向和前沿技术的一次梳理,官方定位是深度科普,旨在向政府.企业.媒体等对中文 信息 ...

  10. 几个机器翻译与自动文摘评价指标

    文章目录 总体认识 客观评价指标 BLEU METEOR ROUGE ROUGE-N ROUGE-L ROUGE-S 参考资料 总体认识 自然语言中的机器翻译或者自动文摘任务的评价指标主要分为两大类: ...

最新文章

  1. FPGA从Xilinx 的7系列学起(5)
  2. Hessian Web Service C# 示例
  3. 想成为BAT中的一员,你总要去学点什么(一)
  4. .NET正则基础之——平衡组
  5. 排序sort,统计wc
  6. ASP.NET的属性绑定、表达式绑定、集合绑定、方法绑定、DropDownList集合绑定、DataList绑定、GridView绑定
  7. js原生语法实现表格操作
  8. WPF中DataGrid的使用实例
  9. css中绝对定位与相对定位的区别
  10. 用傅里叶分析得到频域信息 MATLAB,信号分析实验_傅里叶matlab实现.doc
  11. [网络应用]Foobar2000界面入门:认识Foobar的UI系统,熟悉三种主流界面插件
  12. atmega328 48手动解锁 擦除
  13. 新鲜出炉,程序员年度薪酬排行榜
  14. 上传图片到淘宝 API 返回值说明
  15. TCP-丢包率【传输中所丢数据包数量占发送数据包的比率=(输入报文-输出报文)/输入报文】【TCP只保证传输层消息可靠,并不保证应用层的消息可靠。想保证应用层的消息可靠性,需应用层自己实现逻辑做保障】
  16. 如何用Appium连接并操作手机App
  17. Java POI 设置字体下划线、方框打勾、字体加粗
  18. Photoshop cs5 永久序列号
  19. 开心一刻:邪恶的小明
  20. 每个人都能制作的简易版狂拍灰太狼小游戏(HTML+CSS+JavaScript)

热门文章

  1. 网页中插入FLASH的三种方法
  2. java微信开发教程,Java微信公众平台开发(1) 接入微信公众平台
  3. 小兔 —— 「 洛谷 」P2768 珍珠项链
  4. 统计push点击次数的shell脚本最初版本1
  5. 小白也能懂的DPDK技术解析
  6. HDRP shader 获取阴影(Custom Pass)
  7. 围棋棋盘怎么编程python_python围棋_python围棋程序_python实现围棋ai - 云+社区 - 腾讯云...
  8. MMORPG开发入门[转]
  9. gcc中的 -I -L(大写l) -l(小写l) -Wl,-rpath 选项
  10. SSO单点登录方案大全