分享一下前一段时间公司需要做的文章自动摘要。

一.摘要方法

目前来说,文章摘要自动生成主要分为两种方法:生成式和抽取式。

生成式采用sequence2sequence+Attention的模型,采用Encoder-Decoder的结构,具体方法可以阅读这篇论文:https://arxiv.org/pdf/1509.00685.pdf

抽取式则是通过关键词筛选等方法,从原文中截取句子组成摘要,目前的方法有MMR,TextRank,LDA等。

起初尝试了生成式摘要,使用文章的标题作为样本标签,对模型进行训练,但是效果不是很好,生成的摘要中包含了标题中的关键字,但是无法组成正确的语序。所以最终决定采用抽取式来生成新闻摘要。

后续两种方法在这里:

自动摘要生成(二):由PageRank转变而来的TextRank算法

自动摘要生成(三):词向量相似度与有效词含量

二.具体算法

经过测试后,决定采用MMR,TextRank,文章标题相似度,TextRank+Embedding,全文词向量叠加Embedding相似度,这几种方法的加权组合,筛选出新闻的摘要。

本篇重点讲解MMR算法的理论和实现。

MMR

1.MMR原理

MMR是Maximal Marginal Releuance的缩写,中文为最大边界相关算法或最大边缘相关算法。

设计之初是用来计算Query语句与被搜索文档之间的相似度,从而对文档进行rank排序的算法。

公式在这:

当我们将MMR用于新闻摘要提取时,可以将Query看做是整篇文档,对公式稍作修改,变成下面这个样子:

Sim(Q,di)变为了score(i),表示文章第i句的得分,得分即本句话与整个文章的相似度。中括号内第二项为当前句子i与已经成为候选摘要的句子j的相似度。lambda为需要调整的参数。

此处就很好的体现出了MMR算法的特点,就是注重抽取摘要内容的多样性,通过减去中括号内第二项,最小化选取摘要句子之间的相似性,使得生成的摘要多样化。

当然我们可以通过调节lambda参数来控制文章摘要的多样性:

----high lambda:Higher accuracy

---low lambda:Higher diversity

2.MMR实现

下面截取部分代码来说说MMR是怎么实现的。

首先是第一项score的计算

def calculateSimilarity(sentence, doc):  # 根据句子和句子,句子和文档的余弦相似度if doc == []:return 0vocab = {}for word in sentence.split():vocab[word] = 0  # 生成所在句子的单词字典,值为0docInOneSentence = ''for t in doc:docInOneSentence += (t + ' ')  # 所有剩余句子合并for word in t.split():vocab[word] = 0  # 所有剩余句子的单词字典,值为0cv = CountVectorizer(vocabulary=vocab.keys())docVector = cv.fit_transform([docInOneSentence])sentenceVector = cv.fit_transform([sentence])return cosine_similarity(docVector, sentenceVector)[0][0]

score是表示当前句子和文档的相似度,这里使用了sklearn的词频统计模块,首先建立词表,然后根据词表,将句子和文章转换成one-hot形式的稀疏向量,再用sklearn自带的cosine_similarity模块计算他们的语义似度。

关于语义相似度计算可以看我之前写过的这篇文章https://blog.csdn.net/zjrn1027/article/details/80170966

同时Tips一下,使用gensim也可以完成如上的任务,具体可以参照gensim的官方文档看看。

下面是摘要生成的过程

n = 3
alpha = 0.9
summarySet = []
while n > 0:mmr = {}# kurangkan dengan set summaryfor sentence in scores.keys():if not sentence in summarySet:mmr[sentence] = alpha * scores[sentence] - (1 - alpha) * calculateSimilarity(sentence, summarySet)  # 公式selected = max(mmr.items(), key=operator.itemgetter(1))[0]summarySet.append(selected)# print (summarySet)n -= 1

这里需要设置两个参数,n是抽取生成摘要的句子数量,alpha及公式中的lambda值,用于控制生成摘要的多样性。

依次计算所有句子的MMR值,最后选取MMR最大的三个值作为摘要输出。

这里有一点需要注意,第一次while时,由于还没有选取句子作为摘要,summarySet为空,所以第一句摘要的生成是从文章中选一条与整篇文章相似度最高的词作为摘要存入summarySet。

效果

我们输入两篇不同类型的文章来看看效果。

NEW1:

title:

20年来首次!四千吨级重载货车压桥抵御洪峰,宝成铁路大桥已平安。

context:

7月11日,连续强降雨,让四川登上了中央气象台“头条”,涪江绵阳段水位迅速上涨,洪水一度漫过了宝成铁路涪江大桥桥墩基座,超过封锁水位。洪水在即,中国铁路成都局集团公司紧急调集两列重载货物列车,一前一后开上涪江大桥,每一列货车重量约四千吨,用“重车压梁”的方式,增强桥梁自重,抵御汹涌的洪水。从11日凌晨开始,四川境内成都、绵阳、广元等地连续强降雨,而四川北向出川大动脉—宝成铁路,便主要途径成绵广这一区域。连续的强降雨天气下,绵阳市境内的涪江水位迅速上涨,一度危及到了宝成铁路涪江大桥的安全,上午10时,水位已经超过了涪江大桥上、下行大桥的封锁水位。记者从中国铁路成都局集团公司绵阳工务段了解到,上行线涪江大桥,全长393米,建成于1953年;下行线涪江大桥,全长438米,建成于1995年。“涪江大桥上游有一个水电站,由于洪水太大,水电站已无法发挥调节水位的作用。”情况紧急,铁路部门决定采用“重车压梁”的方式,增强桥梁自重,提高洪峰对桥墩冲刷时的梁体稳定性。简单来说,就是将重量大的货物列车开上涪江大桥,用货车的自重,帮助桥梁抵御汹涌的洪水。恰好,绵阳工务段近期正在进行线路大修,铁路专用的卸砟车,正好停放在绵阳附近。迎着汹涌的洪水,两列重载货车驶向宝成铁路涪江大桥。上午10时30分,第一列46052次货车,从绵阳北站开出进入上行涪江桥。上午11时15分,第二列22001次货车,从皂角铺站进入下行涪江桥。这是两列超过45节编组的重载货物列车,业内称铁路专用卸砟车,俗称“老K车”,车厢里装载的均为铁路道砟,每辆车的砟石的重量在70吨左右。记者从绵阳工务段了解到,货车里满载的砟石、加上一列货车的自重,两列“压桥”的货运列车,每一列的重量超过四千吨。“采用重车压梁的方式来应对水害,在平时的抢险中很少用到。”据了解,在绵阳工务段,上一次采用重车压梁,至少已经是二十年前的事。下午4时许,经铁路部门观测,洪峰过后,涪江水位开始下降,目前已经低于桥梁封锁水位。从下午4点37分开始,两列火车开始撤离涪江大桥。在桥上停留约6个小时后,两列重载货物列车成功完成了“保桥任务”,宝成铁路涪江大桥平安了!

abstract:

7月11日,连续强降雨,让四川登上了中央气象台“头条”,涪江绵阳段水位迅速上涨,洪水一度漫过了宝成铁路涪江大桥桥墩基座,超过封锁水位

连续的强降雨天气下,绵阳市境内的涪江水位迅速上涨,一度危及到了宝成铁路涪江大桥的安全,上午10时,水位已经超过了涪江大桥上、下行大桥的封锁水位

洪水在即,中国铁路成都局集团公司紧急调集两列重载货物列车,一前一后开上涪江大桥,每一列货车重量约四千吨,用“重车压梁”的方式,增强桥梁自重,抵御汹涌的洪水

NEW2:

title:

姆巴佩夺冠后表忠心:留在巴黎 哪儿也不去!

context:

伴随着世界杯的落幕,俱乐部联赛筹备工作又成为主流,转会市场必然也会在世界杯的带动下风起云涌,不过对于在本届赛事上大放异彩的姆巴佩而言,大巴黎可以吃一颗定心丸,世界杯最佳新秀已经亲自表态:留在巴黎哪里也不去。在接受外媒采访时,姆巴佩表达了继续为巴黎效忠的决心。“我会留在巴黎,和他们一起继续我的路途,我的职业生涯不过刚刚开始”,姆巴佩说道。事实上,在巴黎这座俱乐部,充满了内部的你争我夺。上赛季,卡瓦尼和内马尔因为点球事件引发轩然大波,而内马尔联合阿尔维斯给姆巴佩起“忍者神龟”的绰号也让法国金童十分不爽,为此,姆巴佩的母亲还站出来替儿子解围。而早在二月份,一场与图卢兹的比赛,内马尔也因为传球问题赛后和姆巴佩产生口角。由此可见,巴黎内部虽然大牌云集,但是气氛并不和睦。内马尔离开球队的心思早就由来已久,而姆巴佩也常常与其它俱乐部联系在一起,在躲避过欧足联财政公平法案之后,巴黎正在为全力留下二人而不遗余力。好在姆巴佩已经下定决心,这对巴黎高层而言,也算是任务完成了一半。本届世界杯上,姆巴佩星光熠熠,长江后浪推前浪,大有将C罗、梅西压在脚下的趋势,他两次追赶贝利,一次是在1/8决赛完成梅开二度,另一次是在世界杯决赛中完成锁定胜局的一球,成为不满20岁球员的第二人。另外他在本届赛事中打进了4粒入球,和格列兹曼并列全队第一。而对巴黎而言,他们成功的标准只有一条:欧冠。而留下姆巴佩,可以说在争夺冠军的路上有了仰仗,卡瓦尼在本届世界杯同样表现不错,内马尔虽然内心波澜,但是之前皇马官方已经辟谣没有追求巴西天王,三人留守再度重来,剩下的就是图赫尔的技术战术与更衣室的威望,对图赫尔而言,战术板固然重要,但是德尚已经为他提供了更加成功的范本,像团结法国队一样去团结巴黎圣日耳曼,或许这才是巴黎取胜的钥匙。

abstract:

伴随着世界杯的落幕,俱乐部联赛筹备工作又成为主流,转会市场必然也会在世界杯的带动下风起云涌,不过对于在本届赛事上大放异彩的姆巴佩而言,大巴黎可以吃一颗定心丸,世界杯最佳新秀已经亲自表态:留在巴黎哪里也不去

“我会留在巴黎,和他们一起继续我的路途,我的职业生涯不过刚刚开始”,姆巴佩说道

好在姆巴佩已经下定决心,这对巴黎高层而言,也算是任务完成了一半

可以看出生成的摘要质量还是可以的,同时根据文章的长度以及不同的文章类型,对参数n和alpha进行调整,得到的文章摘要效果应该会更好。

在此种方法之上,可以根据Word2Vec训练的词向量进行累加生成句子向量和文章向量,或者使用Doc2Vec直接生成句子向量,对现有的one-hot形式的句子向量进行替代。后续也会对这种方法进行测试~

自动摘要生成(一):最大边界相关算法(MMR)相关推荐

  1. 最大边界相关算法MMR(Maximal Marginal Relevance) 实践

    NLP(自然语言处理)领域一个特别重要的任务叫做--文本摘要自动生成.此任务的主要目的是快速的抽取出一篇文章的主要内容,这样读者就能够通过最少的文字,了解到文章最要想表达的内容.由于抽取出来的摘要表达 ...

  2. MMR(最大边界相关算法)

    最大边界相关算法 用于计算查询文本和搜索文档之间的相似度,然后对文档进行排序.算法公式为 MMR ( Q , C , R ) = A r g max ⁡ d i , i n , c k [ λ s i ...

  3. TextRank方法的优化——MMR(最大边界相关算法)

    文章目录 TextRank方法的优化--MMR(最大边界相关算法) 一.文件目录 二.TextRank优化--MMR(main.py) 实验结果 TextRank方法的优化--MMR(最大边界相关算法 ...

  4. 自动摘要生成(二):由PageRank转变而来的TextRank算法

    一.瞎扯 这是我2019年写的第一篇博客,开篇说点题外话,翻了一下博客的记录,上一遍新闻自动摘要生成(一)的博客还是去年7月写的,这大半年的时间里,忙着秋招,忙着找工作,忙着实习,忙着完成毕业设计,以 ...

  5. 自动摘要生成(三):词向量相似度与有效词含量

    一.前言 新闻在动摘要生成的前两部分在这里: 自动摘要生成(一):最大边界相关算法(MMR) 自动摘要生成(二):由PageRank转变而来的TextRank算法 这里是新闻摘要生成系列的第三部分,这 ...

  6. 最大边缘相关多样性算法MMR的学习和实现

    最大边缘相关多样性算法MMR的学习和实现 MMR算法原理 Python 实现 算法思路总结 在做毕业设计的时候,导师推荐了篇经典的关于推荐多样性重排的算法的论文,所以在这里记录一下学习的历程.本文介绍 ...

  7. 15-垃圾回收相关算法

    垃圾回收相关算法 标记阶段:引用计数算法(Java未使用) 垃圾标记阶段:对象存活判断 在堆里存放着几乎所有的Java对象实例,在GC执行垃圾回收之前,首先需要区分出内存中哪些是存活对象,哪些是已经死 ...

  8. JVM学习笔记之-拉圾回收概述,垃圾回收相关算法

    拉圾回收概述 什么是垃圾 垃圾收集,不是Java语言的伴生产物.早在1960年,第一门开始使用内存动态分配和垃圾收集技术的Lisp语言诞生. 关于垃圾收集有三个经典问题: 哪些内存需要回收? 什么时候 ...

  9. 第 15 章 垃圾回收相关算法

    第 15 章 垃圾回收相关算法 1.标记阶段:引用计数器 1.1.标记阶段的目的 垃圾标记阶段:判断对象是否存活 在堆里存放着几乎所有的Java对象实例,在GC执行垃圾回收之前,首先需要区分出内存中哪 ...

最新文章

  1. Application runtime path /opt/lampp/htdocs/yii/test/protected/runtime is not valid. 错误
  2. Scala基础 - 下划线使用指南
  3. 服务器高并发的解决方法
  4. Fibonacci Again
  5. Ubuntu 16.04 安装Python 3.6
  6. java json lib 日期
  7. linux oracle 01157,Oracle数据库启动时出现ORA-01157和ORA-01110问题
  8. app android de,Android Deobfuscation
  9. 简述计算机的英语作文,初中计算机的英语作文
  10. include引用php,php使用include 和require引入文件的区别
  11. 网页中使用任意字体之实际操作
  12. 写作就像升级打怪,4个实战技巧让你“写什么都很棒”!
  13. mysql中毫秒的保存类型
  14. 基于Python-turtle库绘制路飞的草帽骷髅旗、美国队长的盾牌、高达
  15. mysql 修改多表数据库_mysql数据库:mysql增删改、单表、多表及子查询
  16. 利用百度OCR实现验证码自动识别
  17. 网易云音乐歌单解析下载源码
  18. weblogic控制台超时时间_WebLogic如何设置session超时时间
  19. mac 安装和升级go
  20. 12306能删候补订单记录_12306候补购票功能使用教程:一次只能提交1个候补订单...

热门文章

  1. 基于cisco 模拟公司网络拓扑
  2. JNI详解---从不懂到理解
  3. 双粗虚线中间一条实线_马路上实线两边有很粗的虚线(中间实线或虚线两边还有很粗的虚线是啥意思)...
  4. 简述计算机视觉中的单眼线索,知觉-心理学文章-壹心理
  5. 新零售线上+线下的完美营销
  6. Mac使用技巧:轻松自定义设置系统键盘
  7. 科目二考试之倒车入库步骤
  8. 微博html5版什么手机,搜狐微博推出全新手机HTML5触屏版
  9. Nginx 代理缓存
  10. 详谈HTTPS SSL/TLS协议原理