MMR自動摘要python実現
おすすめの読書:http://www.iis.sinica.edu.tw/papers/hsu/17741-F.pdf
http://www.ixueshu.com/document/c755e09b235a14d1318947a18e7f9386.html
MMRのフルネームはMaximal Maginal Relevanceといい、中国語の名前は最大境界関連法または最大エッジ関連です。
MMRでの公式はこのようになり、スクリーンショットはhttp://www.cnblogs.com/little-horse/p/7191287.html
私たちは自動ダイジェストを計算していますので、主に次の式を見ます。
左のscoreは文の重要度の分値を計算しています。右の計算は文と要約として選択された文の間の類似度の最大値です。ここのはマイナス記号です。要約となる文の類似度が小さいほど良いと説明しています。ここではMMRのアルゴリズム原理を体現しています。つまり、文章の要約の重要性と多様性をバランスよく考慮しています。このような要約抽出方式はtextrakと違って、textrakは全文の重要な文だけを取って並べ替えてダイジェストを形成して、その多様性を見落としました。
文書については、現在の文Qの全文中の類似度を計算し、MMRは類似度が高いほど全文ランキングの重要性が高いと考えている。ここの類似度はコサインの類似度が一般的で、元の論文はcosです。紹介した二つの論文には類似度を計算するアルゴリズムが書いてあります。研究できます。
コードの由来:https://github.com/fajri91/Text-Summarization-MMR/blob/master/mmr.py 中国語の要約に書き換える:
サマリー:
===========
続き:
試してみましたが、あまり上手ではありませんでした。例えば、次のように。
まずbm 25+textrakで要約を抽出してみます。下には元の結果が表示されています。第一条の置き換えは順序がいいかもしれません。後はこの分析を書きます。
1、
1、
http://www.ixueshu.com/document/c755e09b235a14d1318947a18e7f9386.html
MMRのフルネームはMaximal Maginal Relevanceといい、中国語の名前は最大境界関連法または最大エッジ関連です。
MMRでの公式はこのようになり、スクリーンショットはhttp://www.cnblogs.com/little-horse/p/7191287.html
私たちは自動ダイジェストを計算していますので、主に次の式を見ます。
左のscoreは文の重要度の分値を計算しています。右の計算は文と要約として選択された文の間の類似度の最大値です。ここのはマイナス記号です。要約となる文の類似度が小さいほど良いと説明しています。ここではMMRのアルゴリズム原理を体現しています。つまり、文章の要約の重要性と多様性をバランスよく考慮しています。このような要約抽出方式はtextrakと違って、textrakは全文の重要な文だけを取って並べ替えてダイジェストを形成して、その多様性を見落としました。
文書については、現在の文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("
","") 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]=='
' 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 ('
Summary:
')
for sentence in summarySet:
print (originalSentenceOf [sentence].lstrip(' '))
print ('=============================================================')
print ('
Original Passages:
')
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 。
, 。
以下の要約を生成します。サマリー:
,
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
bm 25+textrakのスコアを左のスコアとして使ってみます。MMRと組み合わせてみます。まずbm 25+textrakで要約を抽出してみます。下には元の結果が表示されています。第一条の置き換えは順序がいいかもしれません。後はこの分析を書きます。
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専門家によるマニュアル作成が必要ですか?それとも面倒くさいですか?