NLP(自然語言處理)領(lǐng)域一個特別重要的任務(wù)叫做——文本摘要自動生成莉御。此任務(wù)的主要目的是快速的抽取出一篇文章的主要內(nèi)容,這樣讀者就能夠通過最少的文字匠童,了解到文章最要想表達(dá)的內(nèi)容。由于抽取出來的摘要表達(dá)出了文章最主要的含義,所以在做長文本分類任務(wù)時撰茎,我們可以采用文本摘要算法將長文本的摘要抽取出來,在采用短文本分類模型去做文本分類打洼,有時會起到出奇的好效果龄糊。
文本摘要自動生成算法
文本摘要抽取算法主要分為兩大類:
- 一種是生成式:生成式一般采用的是監(jiān)督式學(xué)習(xí)算法,最常見的就是sequence2sequence模型募疮,需要大量的訓(xùn)練數(shù)據(jù)炫惩。生成式的優(yōu)點(diǎn)是模型可以學(xué)會自己總結(jié)文章的內(nèi)容,而它的缺點(diǎn)是生成的摘要可能會出現(xiàn)語句不通順的情況阿浓。
- 另一種是抽取式:常見的算法是 textrank他嚷,MMR(Maximal Marginal Relevance),當(dāng)然也可以采用深度學(xué)習(xí)算法。抽取式指的摘要是從文章中抽出一些重要的句子筋蓖,代表整篇文章的內(nèi)容卸耘。抽取式的優(yōu)點(diǎn)是生成的摘要不會出現(xiàn)語句不通順的情況,而它的缺點(diǎn)是缺乏文本總結(jié)能力粘咖,生成的摘要可能出現(xiàn)信息丟失的情況鹊奖。
最大邊界相關(guān)算法MMR(Maximal Marginal Relevance)
MMR算法又叫最大邊界相關(guān)算法,此算法在設(shè)計之初是用來計算Query文本與被搜索文檔之間的相似度涂炎,然后對文檔進(jìn)行rank排序的算法忠聚。算法公式如下:
其中 Q 是 Query文本,C 是被搜索文檔集合唱捣,R是一個已經(jīng)求得的以相關(guān)度為基礎(chǔ)的初始集合,指的是搜索返回的K個的句子的索引两蟀。
當(dāng)我們做摘要抽取時,我們需要換個角度去看公式中的字符表示震缭,在摘要抽取時:
- 公式中的 Q和C 都代表整篇文檔赂毯。
- 而
則代表文檔中的某個句子。
- 公式中的
指的是文檔中的某個句子和整篇文檔的相似度拣宰。
-
指的是 文檔中的某個句子和已經(jīng)抽取的摘要句子的相似度党涕。
仔細(xì)觀察下公式方括號中的兩項,其中前一項的物理意義指的是待抽取句子和整篇文檔的相似程度巡社,后一項指的是待抽取句子和已得摘要的相似程度膛堤,通過減號相連,其含義是希望:抽取的摘要既能表達(dá)整個文檔的含義晌该,有具備多樣性 肥荔。而 則是控制摘要多樣性程度的一個超參數(shù),你可以根據(jù)自己的需求去調(diào)節(jié)朝群。
MMR摘要抽取算法python實現(xiàn)
使用sklearn 的 CountVectorizer 接口計算句子的詞袋向量燕耿,然后定義余弦相識度函數(shù)計算句子和文檔直接相似度,最后實現(xiàn)MMR算法姜胖。
from sklearn.feature_extraction.text import CountVectorizer
from pprint import pprint
import operator
def encode_sen(sen,corpus):
"""
input: sentence and corpus
output : bag of words vector of sentence
"""
cv = CountVectorizer()
cv = cv.fit(corpus)
vec = cv.transform([sen]).toarray()
return vec[0]
def cosin_distance(vector1, vector2):
"""
input: two bag of words vectors of sentence
output : the similarity between the sentence
"""
dot_product = 0.0
normA = 0.0
normB = 0.0
for a, b in zip(vector1, vector2):
dot_product += a * b
normA += a ** 2
normB += b ** 2
if normA == 0.0 or normB == 0.0:
return None
else:
return dot_product / ((normA * normB) ** 0.5)
def doc_list2str(doc_list):
"""
transform the doc_list to str
"""
docu_str = ""
for wordlist in doc_list:
docu_str += " ".join(wordlist)
return docu_str
def MMR(doc_list,corpus):
"""
input :corpus and the docment you want to extract
output :the abstract of the docment
"""
Corpus = corpus
docu = doc_list2str(doc_list)
doc_vec = encode_sen(docu,Corpus)
QDScore = {}
###calculate the similarity of every sentence with the whole corpus
for sen in doc_list:
sen = " ".join(sen)
sen_vec = encode_sen(sen,corpus)
score = cosin_distance(sen_vec,doc_vec)
QDScore[sen] = score
n = 2
alpha = 0.7
Summary_set = []
while n > 0:
MMRScore = {}
### select the first sentence of abstract
if Summary_set == []:
selected = max(QDScore.items(), key=operator.itemgetter(1))[0]
Summary_set.append(selected)
Summary_set_str = " ".join(Summary_set)
for sentence in QDScore.keys():
#calculate MMR
if sentence not in Summary_set:
sum_vec = encode_sen(Summary_set_str, corpus)
sentence_vec = encode_sen(sentence,corpus)
MMRScore[sentence] = alpha * QDScore[sentence] - (1 - alpha) * cosin_distance(sentence_vec,sum_vec)
selected = max(MMRScore.items(), key=operator.itemgetter(1))[0]
Summary_set.append(selected)
n -= 1
# print(len(Summary_set))
return Summary_set
測試MMR算法
在網(wǎng)上找了一個關(guān)于2018年世界杯后姆巴佩轉(zhuǎn)會巴黎的新聞誉帅,進(jìn)行摘要抽取。
import jieba
docment = "伴隨著世界杯的落幕右莱,俱樂部聯(lián)賽籌備工作又成為主流蚜锨,轉(zhuǎn)會市場必然也會在世界杯的帶動下風(fēng)起云涌,不過對于在本屆賽事上大放異彩的姆巴佩而言隧出,大巴黎可以吃一顆定心丸踏志,世界杯最佳新秀已經(jīng)親自表態(tài):留在巴黎哪里也不去。在接受外媒采訪時胀瞪,姆巴佩表達(dá)了繼續(xù)為巴黎效忠的決心针余∷潜桑“我會留在巴黎,和他們一起繼續(xù)我的路途圆雁,我的職業(yè)生涯不過剛剛開始”忍级,姆巴佩說道。事實上伪朽,在巴黎這座俱樂部轴咱,充滿了內(nèi)部的你爭我奪。上賽季烈涮,卡瓦尼和內(nèi)馬爾因為點(diǎn)球事件引發(fā)軒然大波朴肺,而內(nèi)馬爾聯(lián)合阿爾維斯給姆巴佩起“忍者神龜”的綽號也讓法國金童十分不爽,為此坚洽,姆巴佩的母親還站出來替兒子解圍戈稿。而早在二月份,一場與圖盧茲的比賽讶舰,內(nèi)馬爾也因為傳球問題賽后和姆巴佩產(chǎn)生口角鞍盗。由此可見,巴黎內(nèi)部雖然大牌云集跳昼,但是氣氛并不和睦般甲。內(nèi)馬爾離開球隊的心思早就由來已久,而姆巴佩也常常與其它俱樂部聯(lián)系在一起鹅颊,在躲避過歐足聯(lián)財政公平法案之后敷存,巴黎正在為全力留下二人而不遺余力。好在姆巴佩已經(jīng)下定決心挪略,這對巴黎高層而言历帚,也算是任務(wù)完成了一半滔岳。本屆世界杯上杠娱,姆巴佩星光熠熠,長江后浪推前浪谱煤,大有將C羅摊求、梅西壓在腳下的趨勢,他兩次追趕貝利刘离,一次是在1/8決賽完成梅開二度室叉,另一次是在世界杯決賽中完成鎖定勝局的一球,成為不滿20歲球員的第二人硫惕。另外他在本屆賽事中打進(jìn)了4粒入球茧痕,和格列茲曼并列全隊第一。而對巴黎而言恼除,他們成功的標(biāo)準(zhǔn)只有一條:歐冠踪旷。而留下姆巴佩曼氛,可以說在爭奪冠軍的路上有了仰仗,卡瓦尼在本屆世界杯同樣表現(xiàn)不錯令野,內(nèi)馬爾雖然內(nèi)心波瀾舀患,但是之前皇馬官方已經(jīng)辟謠沒有追求巴西天王,三人留守再度重來气破,剩下的就是圖赫爾的技術(shù)戰(zhàn)術(shù)與更衣室的威望聊浅,對圖赫爾而言,戰(zhàn)術(shù)板固然重要现使,但是德尚已經(jīng)為他提供了更加成功的范本低匙,像團(tuán)結(jié)法國隊一樣去團(tuán)結(jié)巴黎圣日耳曼,或許這才是巴黎取勝的鑰匙碳锈。"
sen_list = docment.strip().split("努咐。")
sen_list.remove("")
doc_list = [jieba.lcut(i) for i in sen_list]
corpus = [" ".join(i) for i in doc_list]
結(jié)果如下:從抽取的摘要基本可以得知本篇報道主要是想說明世界杯后姆巴佩將轉(zhuǎn)化巴黎,而且可能性很大殴胧。和全文主要想表達(dá)的含義基本吻合渗稍。證明MMR算法確實厲害。
MMR(doc_list,corpus)
結(jié)語
這里筆者只是簡單的介紹了MMR摘要算法的原理团滥,以及簡單實現(xiàn)竿屹。代碼部分也不是此算法的最優(yōu)實現(xiàn)。真正能夠落地的摘要算法灸姊,一定是融合了更多的其他思想拱燃,如textrank,文本句子和標(biāo)題的相似度力惯,或者引入詞向量或者句子向量來更好的表達(dá)句子語義等等碗誉。本文只是想讓大家初步了解摘要算法的一些知識,以及感受一下摘要算法的神奇之處父晶。