Python实现利用MMR提取自动摘要

目录

算法原理

MMR的全称是Maximal Marginal Relevance ,最大边界相关法或者最大边缘相关。公式如下:

M M R := arg min D i [ λ × s c o r e ( D i ) ( 1 λ ) × max [ S i m ( D i , D j ) ] ] D i D j : i j λ : S i m : S c o r e :

从公式中可以看到得到的摘要的句子需要遵循两个原则:“句子重要性更高”以及“与摘要中其他句子相似程度更低”,分别对应公式中 s c o r e ( D i ) m a x [ S i m ( D i , D j ) ] 两部分,并依靠 λ 进行权衡。简单来讲,MMR得到的摘要,句句重要,且句句不同。

其中,相似度是将句子转换为有tfidf权重的词袋模型后计算余弦相似度。对 D i 句子重要性的衡量采用 D i 与整个文档的相似度。

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=='':
                continue
            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') 
    fw.write(com+'\n')
    #if com=='北京美语软件有限公司':
        #print '北京美语软件有限公司'
    for sentence in summarySet:  
        flag = 0
        for ss in drop_list:
            if re.findall(ss,originalSentenceOf [sentence]):
                flag = 1
                break
        if flag==1:
            continue
        lst = jieba.lcut(sentence)
        for w in lst:
            if flag in drop_dict:
                flag = 1
                break
        if flag==1:
            continue
        fw.write(originalSentenceOf [sentence].lstrip(' ')+'\n')  
#    print ('=============================================================')  
#    print ('\nOriginal Passages:\n')  
    fw.write('\n')
fw.close()

输入文本内容:

北京京师乐学教育科技有限公司是北京师范大学下属企业,依托于北京师范大学深厚学术底蕴,以学生成长为中心,利用信息化手段和大数据方法,围绕学生学习、认知发展,为学校、学生、家庭提供优质的产品与服务,使企业发展成国内领先的、可持续发展的、具有全球竞争力的教育产品与服务运营提供商。
企业自己成立以来,重视研发投入,致力于用大数据方法帮助学生提升学业成就。目前已上线稳定运行的产品包括:乐冲刺作业辅导和乐冲刺中高考提分系统。系统综合教育统计学、教育测量学、数据挖掘和机器学习等多门学科,以“做得更少、学得更好”为核心理念,由北京师范大学,联合三大运营商,集合全国一流教育专家和信息化专家共同打造,投放市场以来获得了广泛的赞誉。
乐冲刺提分系统从教育基本、广泛、为迫切的需求点出发,针对当代学生重复劳动、学习效率低下等家长和社会普遍关心的问题,汇集了全国220个考区当地的教辅和十年中考原卷,依据考试大纲和出题蓝图,进行统合分析,基于大数据逐题标引、定位,精准锁定高频考点、热点和拉分点,根据练习情况,精确定位学生能力水平,有针对性地推送试题、微课讲解、视频课程,帮助其理解和记忆,还可以通过在线与非在线工具,为学生提供一对一或一对多的个性化辅导。助其在有限时间内攻克难点、消灭薄弱点、清除盲点。提供热门考点学生手机客户端,帮助学生随时训练,全面提升中考冲刺效率。在中考阶段仅做到常规三分之一到三分之二的题量,就可以获得显著的提分效果,从而得到了用户的广范青睐。
乐冲刺作业辅导系统通过各类移动终端工具,记录学生作业过程的相关数据、提供学生所需要的即时学习支持,包括讲解视频、错题订正,在线答疑等服务,彻底根除学生使用其它相关产品直接抄答案的行业共性问题。利用AR增强现实技术,将学生在空间感知、物理电路、化学实验等具有普遍有认知难度的知识点,加以抽象、建模,以友好的交互方式提升学生元认知能力。根据国家双向细目结构,将作业系统知识空间化。在学生拍题过程中,实时记录学生学习行为数据,通过相关分析和数据挖掘,即时反馈给相应的教育部门、学校,为教师及时调整课堂行为、提升课堂效率,为区域构建设常态化的质量常模提供了可能。
乐冲刺提分与辅导系统共享数据资源,随着学习应用数据的不断累积,乐冲刺将继续围绕学生全学习过程数据采集,知识与能力结构的建模,学习问题的诊断和改进,学科优势的发现和增强等方面持续深入。
目前已经在体制内与上海、北京、广东、贵州、安微、吉林等多地教育局和教育机构展开发合作,在O2O领域也实现了闭环模型,建立起了培训行业运营模式,利用系统强大的诊断与改进能力,帮助培训机构真实的降低了成本。
企业亦重视营造商业运行环境,与中国教育报、中国教育质量监测中心,中国电信、中国移动、中国联通、英特尔中国等国内知名机和企业建立了良好的合作关系,有广阔的市场基础和人脉关系,有极大地发展空间和市场前景。
企业以其快乐进取、持续创新的精神品质凝聚了一大批优秀的专业人员;其产品明显的技术壁垒、准确的市场切入、商业模式的创新性和完整性保证了其行业的领先。同时稳定而富有经验的管理团队具有优秀的项目管理能力与企业运行风险控制能力,对于企业运行风险的认知和控制意识较强,在力求发展的同时,也能够顾及财务的稳健性和企业综合实力的构建。
乐冲刺将为中国广大的学生和家庭提升优质的在线教育与认知发展服务。为提升全民核心素养,做出一个有理想的在线教育企业应有的贡献!

生成摘要如下:

北京京师乐学教育科技有限公司是北京师范大学下属企业,依托于北京师范大学深厚学术底蕴,以学生成长为中心,利用信息化手段和大数据方法,围绕学生学习、认知发展,为学校、学生、家庭提供优质的产品与服务,使企业发展成国内领先的、可持续发展的、具有全球竞争力的教育产品与服务运营提供商.
  乐冲刺作业辅导系统通过各类移动终端工具,记录学生作业过程的相关数据、提供学生所需要的即时学习支持,包括讲解视频、错题订正,在线答疑等服务,彻底根除学生使用其它相关产品直接抄答案的行业共性问题.
提供热门考点学生手机客户端,帮助学生随时训练,全面提升中考冲刺效率.
乐冲刺提分与辅导系统共享数据资源,随着学习应用数据的不断累积,乐冲刺将继续围绕学生全学习过程数据采集,知识与能力结构的建模,学习问题的诊断和改进,学科优势的发现和增强等方面持续深入.

猜你喜欢

转载自blog.csdn.net/melon0014/article/details/81354972