Python实现利用MMR提取自动摘要
目录
文章目录
- 目录
- 算法原理
- Demo实践
算法原理
MMR的全称是Maximal Marginal Relevance ,最大边界相关法或者最大边缘相关。公式如下:
MMR:=argmaxDi[λ×score(Di)−(1−λ)×max[Sim(Di,Dj)]]Di,Dj:第i,j号句子,λ:权衡句子重要性系数,Sim:相似度计算函数,Score:句子重要性计算函数。MMR:=\mathop{\arg\max}_{D_i} [\lambda\times score(D_i)-(1-\lambda)\times\max[Sim(D_i,D_j)]] \\D_i,D_j:第i,j号句子, \\\lambda:权衡句子重要性系数, \\Sim:相似度计算函数, \\Score:句子重要性计算函数。 MMR:=argmaxDi[λ×score(Di)−(1−λ)×max[Sim(Di,Dj)]]Di,Dj:第i,j号句子,λ:权衡句子重要性系数,Sim:相似度计算函数,Score:句子重要性计算函数。
从公式中可以看到得到的摘要的句子需要遵循两个原则:“句子重要性更高”以及“与摘要中其他句子相似程度更低”,分别对应公式中score(Di)score(D_i)score(Di)和max[Sim(Di,Dj)]max[Sim(D_i,D_j)]max[Sim(Di,Dj)]两部分,并依靠λ\lambdaλ进行权衡。简单来讲,MMR得到的摘要,句句重要,且句句不同。
其中,相似度是将句子转换为有tfidf权重的词袋模型后计算余弦相似度。对DiD_iDi句子重要性的衡量采用DiD_iDi与整个文档的相似度。
Demo实践
此小节利用一个demo演示MMR提取摘要的过程。(原始代码来自:https://github.com/fajri91/Text-Summarization-MMR/blob/master/mmr.py 经过中文改写和调优)
# -*- coding: utf-8 -*-
"""
Created on Mon Oct 23 20:00:32 2017@author: hyguo
"""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'stopwords.txt')#导入停止词
fw=open(r'mmr_result.txt','w') #最终结果
stopwords = f.readlines()
stopdict = {}
for i in stopwords: stopdict[i.replace("\n","").decode('utf8')] = 0
stopwords=stopdict"""
drop_dict生成,用于过滤输出的句子
"""
drop_dict = {}
fr = open(r'RulePositionFreq10w_range.txt')
for w in fr:w = w.strip().decode('utf8')drop_dict[w] = 0
fr.close()
drop_list = []#自定义
fr = open(r'drop_dict.txt')
for w in fr:w = w.strip()drop_list.append(w)
fr.close()"""
函数定义
"""
def cleanData(name): setlast = jieba.lcut(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\hyguo\Downloads\test.txt")#测试文件
data=open(r"JOB_20170926_51job_100.txt")#测试输入文件
#texts = data.readlines()#读行
#texts=[i[:-1] if i[-1]=='\n' else i for i in texts]
for line in data:lst = line.split("\t") com = lst[1]texts = lst[-1]texts = [texts]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('。')#句子拆分# print (parts) for part in parts: part = re.sub(r'^\s+$','',part)if part=='':continuecl = 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') fw.write(com+'\n')#if com=='北京美语软件有限公司':#print '北京美语软件有限公司'for sentence in summarySet: flag = 0for ss in drop_list:if re.findall(ss,originalSentenceOf [sentence]):flag = 1breakif flag==1:continuelst = jieba.lcut(sentence)for w in lst:if flag in drop_dict:flag = 1breakif flag==1:continuefw.write(originalSentenceOf [sentence].lstrip(' ')+'\n')
# print ('=============================================================')
# print ('\nOriginal Passages:\n') fw.write('\n')
fw.close()
输入文本内容:
北京京师乐学教育科技有限公司是北京师范大学下属企业,依托于北京师范大学深厚学术底蕴,以学生成长为中心,利用信息化手段和大数据方法,围绕学生学习、认知发展,为学校、学生、家庭提供优质的产品与服务,使企业发展成国内领先的、可持续发展的、具有全球竞争力的教育产品与服务运营提供商。
企业自己成立以来,重视研发投入,致力于用大数据方法帮助学生提升学业成就。目前已上线稳定运行的产品包括:乐冲刺作业辅导和乐冲刺中高考提分系统。系统综合教育统计学、教育测量学、数据挖掘和机器学习等多门学科,以“做得更少、学得更好”为核心理念,由北京师范大学,联合三大运营商,集合全国一流教育专家和信息化专家共同打造,投放市场以来获得了广泛的赞誉。
乐冲刺提分系统从教育基本、广泛、为迫切的需求点出发,针对当代学生重复劳动、学习效率低下等家长和社会普遍关心的问题,汇集了全国220个考区当地的教辅和十年中考原卷,依据考试大纲和出题蓝图,进行统合分析,基于大数据逐题标引、定位,精准锁定高频考点、热点和拉分点,根据练习情况,精确定位学生能力水平,有针对性地推送试题、微课讲解、视频课程,帮助其理解和记忆,还可以通过在线与非在线工具,为学生提供一对一或一对多的个性化辅导。助其在有限时间内攻克难点、消灭薄弱点、清除盲点。提供热门考点学生手机客户端,帮助学生随时训练,全面提升中考冲刺效率。在中考阶段仅做到常规三分之一到三分之二的题量,就可以获得显著的提分效果,从而得到了用户的广范青睐。
乐冲刺作业辅导系统通过各类移动终端工具,记录学生作业过程的相关数据、提供学生所需要的即时学习支持,包括讲解视频、错题订正,在线答疑等服务,彻底根除学生使用其它相关产品直接抄答案的行业共性问题。利用AR增强现实技术,将学生在空间感知、物理电路、化学实验等具有普遍有认知难度的知识点,加以抽象、建模,以友好的交互方式提升学生元认知能力。根据国家双向细目结构,将作业系统知识空间化。在学生拍题过程中,实时记录学生学习行为数据,通过相关分析和数据挖掘,即时反馈给相应的教育部门、学校,为教师及时调整课堂行为、提升课堂效率,为区域构建设常态化的质量常模提供了可能。
乐冲刺提分与辅导系统共享数据资源,随着学习应用数据的不断累积,乐冲刺将继续围绕学生全学习过程数据采集,知识与能力结构的建模,学习问题的诊断和改进,学科优势的发现和增强等方面持续深入。
目前已经在体制内与上海、北京、广东、贵州、安微、吉林等多地教育局和教育机构展开发合作,在O2O领域也实现了闭环模型,建立起了培训行业运营模式,利用系统强大的诊断与改进能力,帮助培训机构真实的降低了成本。
企业亦重视营造商业运行环境,与中国教育报、中国教育质量监测中心,中国电信、中国移动、中国联通、英特尔中国等国内知名机和企业建立了良好的合作关系,有广阔的市场基础和人脉关系,有极大地发展空间和市场前景。
企业以其快乐进取、持续创新的精神品质凝聚了一大批优秀的专业人员;其产品明显的技术壁垒、准确的市场切入、商业模式的创新性和完整性保证了其行业的领先。同时稳定而富有经验的管理团队具有优秀的项目管理能力与企业运行风险控制能力,对于企业运行风险的认知和控制意识较强,在力求发展的同时,也能够顾及财务的稳健性和企业综合实力的构建。
乐冲刺将为中国广大的学生和家庭提升优质的在线教育与认知发展服务。为提升全民核心素养,做出一个有理想的在线教育企业应有的贡献!
生成摘要如下:
北京京师乐学教育科技有限公司是北京师范大学下属企业,依托于北京师范大学深厚学术底蕴,以学生成长为中心,利用信息化手段和大数据方法,围绕学生学习、认知发展,为学校、学生、家庭提供优质的产品与服务,使企业发展成国内领先的、可持续发展的、具有全球竞争力的教育产品与服务运营提供商.乐冲刺作业辅导系统通过各类移动终端工具,记录学生作业过程的相关数据、提供学生所需要的即时学习支持,包括讲解视频、错题订正,在线答疑等服务,彻底根除学生使用其它相关产品直接抄答案的行业共性问题.
提供热门考点学生手机客户端,帮助学生随时训练,全面提升中考冲刺效率.
乐冲刺提分与辅导系统共享数据资源,随着学习应用数据的不断累积,乐冲刺将继续围绕学生全学习过程数据采集,知识与能力结构的建模,学习问题的诊断和改进,学科优势的发现和增强等方面持续深入.
Python实现利用MMR提取自动摘要相关推荐
- python爬百度翻译-Python爬取百度翻译(利用json提取数据)
本篇文章给大家带来的内容是关于Python爬取百度翻译(利用json提取数据),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 工具:Python 3.6.5.PyCharm开发工具. ...
- python从文件中提取特定文本_python利用正则表达式提取文本中特定内容
正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配. Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式. re 模块使 Python ...
- python正则匹配特殊字符_python 利用正则表达式提取特殊信息
1.删除字符串中的 Python注释 案例: import re time = "2020-01-01 # 这是一个日期" num = re.sub(r'#.*$', " ...
- Python利用正则表达式提取var自定义变量的值
目标解析HTML文件中的var自定义变量的值 本文主要利用正则表达式提取页面中的var $render_datab 变量的值,$render_datab变量的值是一个json字符串. 目录 1.导入依 ...
- 关键词提取自动摘要相关开源项目,自动化seo
关键词提取自动摘要相关开源项目 GitHub - hankcs/HanLP: 自然语言处理 中文分词 词性标注 命名实体识别 依存句法分析 关键词提取 自动摘要 短语提取 拼音 简繁转换 https: ...
- 【Python】利用python进行数据分析——以新型冠状病毒疫情为例
[Python]利用python进行数据分析--以新型冠状病毒疫情为例 重要说明 只提交该文档这一个文件,做完后提交到学习通"结课大作业"中. 1. 文件命名: 必须以学号-姓名- ...
- Python爬虫利用18行代码爬取虎牙上百张小姐姐图片
Python爬虫利用18行代码爬取虎牙上百张小姐姐图片 下面开始上代码 需要用到的库 import request #页面请求 import time #用于时间延迟 import re #正则表达式 ...
- python中文模糊关键词提取_如何用Python提取中文关键词?
本文一步步为你演示,如何用Python从中文文本中提取关键词.如果你需要对长文"观其大略",不妨尝试一下. 需求 好友最近对自然语言处理感兴趣,因为他打算利用自动化方法从长文本里提 ...
- Python爬虫——利用Scrapy批量下载图片
Python爬虫--利用Scrapy批量下载图片 Scrapy下载图片项目介绍 使用Scrapy下载图片 项目创建 项目预览 创建爬虫文件 项目组件介绍 Scrapy爬虫流程介绍 页面结构分析 定义I ...
最新文章
- .Net Core MVC初学习
- Windows 下noinstall方式安装 mysql-5.7.5-m15-winx64
- 【Linux】 -bash-4.2#问题和Cannot allocate memory
- 菜鸟涂鸦作品展_No.27
- OAuth:服务给第三方app授权的协议
- 带哨兵节点的链_关于链表中哨兵结点问题的深入剖析
- 【JavaWeb】XML和Jsoup的相关内容
- html 怎么把表格不给输入,如何让用户在HTML5网页表单中输入持续时间而不会让他们烦恼?...
- Android中JNI 的一些常用说明 JNI_OnLoad registerNatives registerNativeMethods
- Delphi创建ActiveX控件,实现安全接口及无界面代码
- av_malloc 与 av_free 的函数原型
- 办理签证用的在职证明中英文版
- POJ2545-丑数
- javascript禁用Backspace退格键(结合自己实际应用中遇到的textarea中退格造成页面假死问题做了修改)
- 商业智能知识分享:BI的4大核心技术
- [射影几何]射影线束画二次曲线
- 《观音心经》领悟后的空寂感,如何与现实世界有机结合
- 如何通过笔记本控制主机(远程链接别的电脑)
- cobar是什么? 能做什么?
- pyTorch中tensor运算
热门文章
- ffmpeg实现将H264裸流封装成.mp4或.avi文件
- html表白程序源码 html生日快乐网站制作 HTML生日快乐代码 表白程序源码html 程序员表白代码html
- android hid自动重连,Android Bluetooth HID
- 《植物大战僵尸》的12个成功秘诀
- 首届河南青少年读书成才奖颁发决定
- Legacy autograd function with non-static forward method is deprecated
- .nc地形数据的python转换实现tiff
- Linux常用命令及解析
- 网上跨行转账将实时生效 第三方支付前景渺茫
- 如何有效解决电脑桌面开始菜单不见了