Python实现利用MMR提取自动摘要
目錄
文章目錄
- 目錄
- 算法原理
- Demo實踐
算法原理
MMR的全稱是Maximal Marginal Relevance ,最大邊界相關法或者最大邊緣相關。公式如下:
MMR:=arg?max?Di[λ×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提取自动摘要的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在Windows10上安装wls
- 下一篇: 阿里云的oss bucket设置 404