MMR自动摘要 python实现
2017-09-08 10:33
218 查看
推荐阅读:http://www.iis.sinica.edu.tw/papers/hsu/17741-F.pdf
http://www.ixueshu.com/document/c755e09b235a14d1318947a18e7f9386.html
MMR的全称为Maximal Marginal Relevance ,中文名字为最大边界相关法或者最大边缘相关。
在MMR的公式是这样的,截图来自http://www.cnblogs.com/little-horse/p/7191287.html
由于我们算的是自动摘要,所以主要看下面的公式。
左边的score计算的是句子的重要性分值,右边的计算的是句子与所有已经被选择成为摘要的句子之间的相似度最大值,注意这里的是负号,说明成为摘要的句子间的相似度越小越好。此处体现了MMR的算法原理,即均衡考虑了文章摘要的重要性和多样性。这种摘要提取方式与textrank不同,textrank只取全文的重要句子进行排序形成摘要,忽略了其多样性。
对于一篇文档,计算当前句子Q在全文中的相似度,MMR认为,对于相似度全文排名越高的表示为重要性越高。这里的相似度一般为余弦相似度,原来的论文就是cos。推荐介绍的两篇论文都有写到一些计算相似度的算法,可以研究研究。
代码来自:https://github.com/fajri91/Text-Summarization-MMR/blob/master/mmr.py 改写成中文摘要:
test.txt文本如下:
生成摘要如下:
Summary:
另外我觉得需要改进的是:分词算法和停止词库,开头和结尾的重要度需要提升,还有文章中的转折语句重要性也需要提升。但是由于没有可监督的数据做测试,所以以后有机会再尝试一下。
=========
后续:
尝试了一下有一些并不是分的很好,比如下面这段
摘要出来的是:
这里编辑一下也是可以看的:
试着使用bm25+textrank的分值当作左边的score和MMR结合一下看下成果:
我先尝试用bm25+textrank提取摘要,下面显示的是原来的结果,第一条调换一下顺序可能结果不错,后续的话会再写这个分析
1、
2、
关于二者结合的话,结果如下,第一条的画风变成了广告语:
1、
2、
文本摘要没有一个特定的标准,看读者到底想从文章中获取信息,比如上面那个事件,有人希望获知事件发生的后果,有人希望获知事件的过程,有人需要或者产品发布的信息,有人关注产品本身的价值,所以看上去也没有所谓分得好坏的标准。而一般评价分的好坏,是根据Rouge-N标准,请看这里http://blog.csdn.net/lcj369387335/article/details/69845385,需要根据专家来人工生成摘要,还是比较麻烦的。
http://www.ixueshu.com/document/c755e09b235a14d1318947a18e7f9386.html
MMR的全称为Maximal Marginal Relevance ,中文名字为最大边界相关法或者最大边缘相关。
在MMR的公式是这样的,截图来自http://www.cnblogs.com/little-horse/p/7191287.html
由于我们算的是自动摘要,所以主要看下面的公式。
左边的score计算的是句子的重要性分值,右边的计算的是句子与所有已经被选择成为摘要的句子之间的相似度最大值,注意这里的是负号,说明成为摘要的句子间的相似度越小越好。此处体现了MMR的算法原理,即均衡考虑了文章摘要的重要性和多样性。这种摘要提取方式与textrank不同,textrank只取全文的重要句子进行排序形成摘要,忽略了其多样性。
对于一篇文档,计算当前句子Q在全文中的相似度,MMR认为,对于相似度全文排名越高的表示为重要性越高。这里的相似度一般为余弦相似度,原来的论文就是cos。推荐介绍的两篇论文都有写到一些计算相似度的算法,可以研究研究。
代码来自:https://github.com/fajri91/Text-Summarization-MMR/blob/master/mmr.py 改写成中文摘要:
# -*- coding: utf-8 -*- """ Created on Thu Sep 7 17:10:57 2017 @author: Mee """ import os import re import jieba from sklearn.feature_extraction.text import CountVectorizer from sklearn.metrics.pairwise import cosine_similarity import operator f=open(r'C:\Users\user\Documents\Python Scripts/stopword.dic')#停止词 stopwords = f.readlines() stopwords=[i.replace("\n","") for i in stopwords] def cleanData(name): setlast = jieba.cut(name, cut_all=False) seg_list = [i.lower() for i in setlast if i not in stopwords] return " ".join(seg_list) def calculateSimilarity(sentence, doc):#根据句子和句子,句子和文档的余弦相似度 if doc == []: return 0 vocab = {} for word in sentence.split(): vocab[word] = 0#生成所在句子的单词字典,值为0 docInOneSentence = ''; for t in doc: docInOneSentence += (t + ' ')#所有剩余句子合并 for word in t.split(): vocab[word]=0 #所有剩余句子的单词字典,值为0 cv = CountVectorizer(vocabulary=vocab.keys()) docVector = cv.fit_transform([docInOneSentence]) sentenceVector = cv.fit_transform([sentence]) return cosine_similarity(docVector, sentenceVector)[0][0] data=open(r"C:\Users\user\Documents\Python Scripts\test.txt")#测试文件 texts = data.readlines()#读行 texts=[i[:-1] if i[-1]=='\n' else i for i in texts] sentences = [] clean = [] originalSentenceOf = {} import time start = time.time() #Data cleansing for line in texts: parts = line.split('。')[:-1]#句子拆分 # print (parts) for part in parts: cl = cleanData(part)#句子切分以及去掉停止词 # print (cl) sentences.append(part) #原本的句子 clean.append(cl) #干净有重复的句子 originalSentenceOf[cl] = part #字典格式 setClean = set(clean) #干净无重复的句子 #calculate Similarity score each sentence with whole documents scores = {} for data in clean: temp_doc = setClean - set([data])#在除了当前句子的剩余所有句子 score = calculateSimilarity(data, list(temp_doc)) #计算当前句子与剩余所有句子的相似度 scores[data] = score#得到相似度的列表 #print score #calculate MMR n = 25 * len(sentences) / 100 #摘要的比例大小 alpha = 0.7 summarySet = [] while n > 0: mmr = {} #kurangkan dengan set summary for 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 #rint str(time.time() - start) print ('\nSummary:\n') for sentence in summarySet: print (originalSentenceOf [sentence].lstrip(' ')) print ('=============================================================') print ('\nOriginal Passages:\n')
test.txt文本如下:
米家行车记录仪正式发布,告别驾驶孤单。继上周70迈智能后视镜在小米众筹上线,数小时便完成了目标众筹之后,今日小米生态链布局中的另一个车载智能新产品,米家行车记录仪正式上线小米商城,售价349元。米家行车记录仪搭载了SONY IMX323图像传感器,感光度高的CMOS可以全面提升暗光环境下的成像表现,感光元件大至1/2.9英寸,阴天或者夜景等弱光条件下,影像画面品质优势尽显。 同时搭载了Mstar的全高清影像处理芯片,具备1080P的图像处理技术。采用的耐高温胶和静电贴组合简单又安全,单指就可以进行触摸按键,160°超广角,覆盖三车道安全全方位。米家行车记录仪是由小米生态链企业板牙科技所生产,也是唯一一家致力于车载智能产品的小米生态链公司。 为何小米生态链持续发力车载智能产品?随着中国汽车市场快速蓬勃发展,目前车辆存量已达1.2亿辆,还在以每年2000万以上的速度扩充,但是连载互联网的车辆占比低于5%。 互联快速发展的时代,未来车辆将成为重要的终端入口之一。2015年,行车记录仪全国各品牌销量在3500万台每年,大量厂商试图挤入这个火热的市场。 2016下半年,在行业经过大洗牌后,剩下的厂商对自家品牌进行积累,汽车后视镜的2.0时代正式拉开序幕。 2017年,一家叫做70迈的智能后视镜产品出现在了浪潮之中,其背后同时站着顺为和小米等多家知名VC,这样的产品为何会受到多方投资的关注? 作为小米生态链企业产品,70迈智能后视镜不惜使用8.88英寸极限高清大屏,“1920*480”高清分辨率,1670万色,搭配高品质银镜7层光学镀膜,完美兼顾界面与镜面。 屏保界面进入沉浸模式,将导航HUD、ADAS预警与整车自然融为一体。 70迈创造性的将“小米生态链企业Mai OS/手机App汽车后市场服务”的模式相结合,在智能后视镜完美融合进小米产品体系的同时,用精品模式和数据驱动深挖驾驶场景的价值。 业内人士表示,未来靠硬件赚大钱已经不再是市场发展主趋势,小米就是一个最好的例子,只有互联网服务才是突破。70迈的产品用户黏性是否足够高,产品更新换代是否足够快,都是70迈一直在专注并打磨持续打磨的环节。 只有持续保持庞大的用户量,才能保证互联网增值服务的空间与价值。
生成摘要如下:
Summary:
米家行车记录仪是由小米生态链企业板牙科技所生产,也是唯一一家致力于车载智能产品的小米生态链公司 70迈创造性的将“小米生态链企业Mai OS/手机App汽车后市场服务”的模式相结合,在智能后视镜完美融合进小米产品体系的同时,用精品模式和数据驱动深挖驾驶场景的价值 继上周70迈智能后视镜在小米众筹上线,数小时便完成了目标众筹之后,今日小米生态链布局中的另一个车载智能新产品,米家行车记录仪正式上线小米商城,售价349元 为何小米生态链持续发力车载智能产品?随着中国汽车市场快速蓬勃发展,目前车辆存量已达1.2亿辆,还在以每年2000万以上的速度扩充,但是连载互联网的车辆占比低于5%按照文中的顺序应该是这样的:
继上周70迈智能后视镜在小米众筹上线,数小时便完成了目标众筹之后,今日小米生态链布局中的另一个车载智能新产品,米家行车记录仪正式上线小米商城,售价349元 米家行车记录仪是由小米生态链企业板牙科技所生产,也是唯一一家致力于车载智能产品的小米生态链公司 为何小米生态链持续发力车载智能产品?随着中国汽车市场快速蓬勃发展,目前车辆存量已达1.2亿辆,还在以每年2000万以上的速度扩充,但是连载互联网的车辆占比低于5% 70迈创造性的将“小米生态链企业Mai OS/手机App汽车后市场服务”的模式相结合,在智能后视镜完美融合进小米产品体系的同时,用精品模式和数据驱动深挖驾驶场景的价值
另外我觉得需要改进的是:分词算法和停止词库,开头和结尾的重要度需要提升,还有文章中的转折语句重要性也需要提升。但是由于没有可监督的数据做测试,所以以后有机会再尝试一下。
=========
后续:
尝试了一下有一些并不是分的很好,比如下面这段
中新网9月8日电综合报道,美国征信机构Equifax称它们的数据库遭到了攻击,将近1.43亿美国人的个人信息可能被泄露,这几乎是全美人口的一半 报道称,网络犯罪者已经接触到了包括姓名、社会安全号码、出生日期、地址和驾照编号等在内的敏感信息 还有约20.9万美国客户的信用卡卡号泄露 此外,居住在英国和加拿大的人也受到影响 Equifax称,这次信息泄露可能发生在5月中旬到7月之间 公司称它们于7月29日制止了此次攻击 美国有线电视台(CNN)称,从被泄露信息的广度和类型来看,此次数据泄露可能是有史以来“最糟糕的” Equifax的董事长兼首席执行官理查德·史密斯称:“对我们的公司来说,这显然是一起令人失望的事件,打击了我们工作的核心 Equifax是全美三大征信机构之一,追踪和评估美国消费者的财务状况 它有客户的贷款和信用卡资料,并有相关的决定信用评分的信息 Equifax的数据是从信用卡公司、银行和销售商等多种渠道获得 这些机构会将客户个人的信用活动报给征信机构 因此,并非所有受到此次信息泄露影响的人,都知道他们是Equifax的客户 消费者可以通过提交姓氏和社会安全号的后六位来查询自己是否受到影响 Equifax也将寄送文件给那些受到影响的客户
摘要出来的是:
因此,并非所有受到此次信息泄露影响的人,都知道他们是Equifax的客户 中新网9月8日电综合报道,美国征信机构Equifax称它们的数据库遭到了攻击,将近1.43亿美国人的个人信息可能被泄露,这几乎是全美人口的一半 Equifax也将寄送文件给那些受到影响的客户
这里编辑一下也是可以看的:
中新网9月8日电综合报道,美国征信机构Equifax称它们的数据库遭到了攻击,将近1.43亿美国人的个人信息可能被泄露,这几乎是全美人口的一半 并非所有受到此次信息泄露影响的人,都知道他们自己是Equifax的客户 Equifax将寄送文件给那些受到影响的客户
试着使用bm25+textrank的分值当作左边的score和MMR结合一下看下成果:
我先尝试用bm25+textrank提取摘要,下面显示的是原来的结果,第一条调换一下顺序可能结果不错,后续的话会再写这个分析
1、
70迈创造性的将“小米生态链企业MaiOS/手机App汽车后市场服务”的模式相结合,在智能后视镜完美融合进小米产品体系的同时,用精品模式和数据驱动深挖驾驶场景的价值 继上周70迈智能后视镜在小米众筹上线,数小时便完成了目标众筹之后,今日小米生态链布局中的另一个车载智能新产品,米家行车记录仪正式上线小米商城,售价349元 作为小米生态链企业产品,70迈智能后视镜不惜使用8.88英寸极限高清大屏,“1920*480”高清分辨率,1670万色,搭配高品质银镜7层光学镀膜,完美兼顾界面与镜面
2、
中新网9月8日电综合报道,美国征信机构Equifax称它们的数据库遭到了攻击,将近1.43亿美国人的个人信息可能被泄露,这几乎是全美人口的一半 报道称,网络犯罪者已经接触到了包括姓名、社会安全号码、出生日期、地址和驾照编号等在内的敏感信息 美国有线电视台(CNN)称,从被泄露信息的广度和类型来看,此次数据泄露可能是有史以来“最糟糕的”
关于二者结合的话,结果如下,第一条的画风变成了广告语:
1、
70迈创造性的将“小米生态链企业MaiOS/手机App汽车后市场服务”的模式相结合,在智能后视镜完美融合进小米产品体系的同时,用精品模式和数据驱动深挖驾驶场景的价值 米家行车记录仪搭载了SONYIMX323图像传感器,感光度高的CMOS可以全面提升暗光环境下的成像表现,感光元件大至1/2.9英寸,阴天或者夜景等弱光条件下,影像画面品质优势尽显 互联快速发展的时代,未来车辆将成为重要的终端入口之一 采用的耐高温胶和静电贴组合简单又安全,单指就可以进行触摸按键,160°超广角,覆盖三车道安全全方位
2、
中新网9月8日电综合报道,美国征信机构Equifax称它们的数据库遭到了攻击,将近1.43亿美国人的个人信息可能被泄露,这几乎是全美人口的一半 报道称,网络犯罪者已经接触到了包括姓名、社会安全号码、出生日期、地址和驾照编号等在内的敏感信息 美国有线电视台(CNN)称,从被泄露信息的广度和类型来看,此次数据泄露可能是有史以来“最糟糕的”
文本摘要没有一个特定的标准,看读者到底想从文章中获取信息,比如上面那个事件,有人希望获知事件发生的后果,有人希望获知事件的过程,有人需要或者产品发布的信息,有人关注产品本身的价值,所以看上去也没有所谓分得好坏的标准。而一般评价分的好坏,是根据Rouge-N标准,请看这里http://blog.csdn.net/lcj369387335/article/details/69845385,需要根据专家来人工生成摘要,还是比较麻烦的。
相关文章推荐
- 实现自动文本摘要(python,java)
- python实现文章或博客的自动摘要(附java版开源项目)
- Python 实现英文新闻摘要自动提取(1)
- Python 实现英文新闻摘要自动提取 (2)
- Python实现Linux主机自动创建互信
- python实现人人自动回复、抢沙发功能
- 用python实现下载必应壁纸并自动更换壁纸的功能
- 使用Lucene的Highlighter实现文件摘要的自动提取
- 自动求导程序的设计与实现(Python)
- Python实现Tab自动补全和历史命令管理的方法
- python实现网站的自动登录
- 利用python微信库itchat实现微信自动回复功能
- selenium+python实现自动登录脚本
- python自动登录12306并自动点击验证码完成登录的实现源代码
- python实现自动登录
- python实现网站的自动登录
- Python爬虫实现百度图片自动下载
- 利用Python实现自动登录
- python实现带验证码网站的自动登陆
- python实现街旁自动签到