非監(jiān)督文本摘要

本文將介紹如何利用sentence embedding來(lái)做文本摘要。

什么是文本摘要?

文本摘要是從一些文本資源中抽取重要信息并生成“主旨帝际、概要”的過(guò)程。

我們小時(shí)候的語(yǔ)文課上饶辙,老師要求概括段落大意蹲诀,指出主題思想。所以弃揽,人類很擅長(zhǎng)“文本摘要”這樣的工作脯爪,
首先通過(guò)理解文字內(nèi)容的含義,抽取重要信息矿微,并用自己的語(yǔ)言概括痕慢。在這樣一個(gè)信息爆炸的時(shí)代,人類已經(jīng)
沒有足夠的精力閱讀海量文本涌矢,自動(dòng)文本摘要算法應(yīng)運(yùn)而生:

文本摘要節(jié)省閱讀時(shí)間
文本摘要精簡(jiǎn)了文本信息掖举,讓文本檢索過(guò)程更簡(jiǎn)單,提升了檢索效率
文本摘要算法更加客觀娜庇,減少了人類的主觀“偏見”
QA系統(tǒng)中的文本摘要塔次,利于理解用戶個(gè)性化的需求

文本摘要的類型

文本摘要的類型有很多種方篮,根據(jù)輸入、意圖励负、輸出可以分為以下幾類:
[圖片上傳失敗...(image-c85cf9-1542199235016)]

根據(jù)輸入類型劃分

單文檔文本摘要

輸入是單個(gè)文檔藕溅,輸入的文本長(zhǎng)度不長(zhǎng),可以是一篇新聞继榆。早起的文本摘要系統(tǒng)都是處理單文檔的巾表。

多文檔文本摘要

輸入時(shí)多個(gè)文檔,可以是多篇新聞略吨。

根據(jù)意圖劃分

通用文本摘要

輸入文本可以是各種各樣的文本攒发,比如新聞、小說(shuō)等晋南。這一部分有大量的研究工作。

特定領(lǐng)域文本摘要

文本摘要模型要融入領(lǐng)域相關(guān)知識(shí)羔砾,來(lái)生成更準(zhǔn)確的摘要负间,比如生物醫(yī)學(xué)文檔的文本摘要生成。

基于用戶請(qǐng)求的文本摘要

根據(jù)用戶與會(huì)話機(jī)器人的對(duì)話內(nèi)容姜凄,生成會(huì)話內(nèi)容相關(guān)的文本摘要政溃。

基于輸出類型的文本摘要

抽取式

從文本中抽取句子,然后組合成為摘要态秧。這是目前廣泛使用的文本摘要算法董虱,這種文本摘要算法產(chǎn)生的句子一般沒有語(yǔ)病、邏輯問題(因?yàn)槭菑奈谋局谐槿〉穆铮?/p>

生成式

生成式的文本摘要首先從模型中申鱼,抽取phrase和sentence愤诱,然后生成摘要(很像人們概括段落大意的方式)。所以捐友,這種方法更有趣淫半、更貼近實(shí)際,當(dāng)然也更加難匣砖。

很多文本摘要算法的訓(xùn)練都需要有raw text和對(duì)應(yīng)的summary作為訓(xùn)練數(shù)據(jù)科吭。但是在大量的nlp任務(wù)中,很難獲得訓(xùn)練數(shù)據(jù)猴鲫,或者獲得訓(xùn)練數(shù)據(jù)的代價(jià)非常大对人。所以在實(shí)際的業(yè)務(wù)中,更傾向于unsupervised的方法拂共。這里簡(jiǎn)單介紹一下Kushal Chauhan在郵件文本summary方面的工作牺弄,介紹他是如何使用sentence embedding來(lái)做email summary的。

Kushal Chauhan為什么要用unsupervised text summarization方法呢匣缘?通用的文本摘要無(wú)法在郵件文本中發(fā)揮作用猖闪。一方面鲜棠,數(shù)據(jù)分布是不同的;另一方面培慌,Kushal面對(duì)的事多語(yǔ)言的文檔包含English, Danish, French等語(yǔ)言豁陆。他借鑒了《Unsupervised Text Summarization Using Sentence Embeddings》這篇論文中的方法,構(gòu)建了如下Pipeline:


image.png
步驟1:email數(shù)據(jù)清洗

首先吵护,我們來(lái)看一下email文本:

Hi Jane,

Thank you for keeping me updated on this issue. I'm happy to hear that the issue got resolved after all and you can now use the app in its full functionality again. 
Also many thanks for your suggestions. We hope to improve this feature in the future. 

In case you experience any further problems with the app, please don't hesitate to contact me again.

Best regards,

John Doe
Customer Support

1600 Amphitheatre Parkway
Mountain View, CA
United States

email開頭的 Hi name以及結(jié)尾的 best regards + name對(duì)文本摘要是沒有用處的盒音。郵件中的開頭和結(jié)尾“形態(tài)各異”,需要相應(yīng)的正則表達(dá)式去識(shí)別并刪除馅而。mailgun/talon在其github repo中實(shí)現(xiàn)了刪除郵件開頭祥诽、結(jié)尾的功能,支持多種語(yǔ)言(對(duì)于中文的支持,尚需檢驗(yàn))。這里我們給出代碼示例:

# clean() is a modified version of extract_signature() found in bruteforce.py in the GitHub repository linked above
cleaned_email, _ = clean(email)

lines = cleaned_email.split('\n')
lines = [line for line in lines if line != '']
cleaned_email = ' '.join(lines)

上面的email經(jīng)過(guò)處理繁堡,可以得到:

Thank you for keeping me updated on this issue. I'm happy to hear that the issue got resolved after all and you can now use the app in its full functionality again. Also many thanks for your suggestions. We hope to improve this feature in the future. In case you experience any further problems with the app, please don't hesitate to contact me again.
步驟2: 語(yǔ)言檢測(cè)

不同語(yǔ)言的sentence tokenization不同斑唬,不能都當(dāng)做英文進(jìn)行處理。所以,首先使用polyglot, langdetect 或 textblob來(lái)進(jìn)行語(yǔ)言檢測(cè)。langdetect的相關(guān)內(nèi)容,我在funNLP中介紹過(guò)阔挠,它支持55種不同的語(yǔ)言識(shí)別,如下所示:

from langdetect import detect
lang = detect(cleaned_email) # lang = 'en' for an English email
步驟3: 句子分割

識(shí)別出email使用的語(yǔ)言后脑蠕,使用對(duì)應(yīng)語(yǔ)言的tokenization方法购撼,對(duì)email進(jìn)行句子分割。對(duì)于英文email谴仙,可以使用nltk中的sent_tokenize進(jìn)行分割即可:

from nltk.tokenize import sent_tokenize
sentences = sent_tokenize(email, language = lang)
句子分割
步驟4: skip-thought encoder

這一部分介紹如何對(duì)句子進(jìn)行編碼迂求。句子的編碼方式多種多樣,最簡(jiǎn)單的莫過(guò)于將句子中的每個(gè)詞對(duì)應(yīng)的詞向量加起來(lái)晃跺,再平均锁摔,類似于fasttext的做法。在此基礎(chǔ)上哼审,復(fù)雜一點(diǎn)的谐腰,不同的詞有不同的權(quán)重,比如 and, the 這類詞權(quán)重就應(yīng)該低一些涩盾。此時(shí)十气,可以使用tf-idf相關(guān)信息做權(quán)重。論文《A SIMPLE BUT TOUGH-TO-BEAT BASELINE FOR SEN- TENCE EMBEDDINGS》就是這么做的春霍。

上述方法砸西,沒有考慮句子中的詞的順序,這很可能會(huì)影響summarization的模型表現(xiàn),所以采用了skip-thought sentence encoder芹枷,并以wikipedia作為訓(xùn)練數(shù)據(jù)衅疙。skip-thought sentence encoder包含兩個(gè)部分:

  1. encoder network: GRU-RNN用于生成固定長(zhǎng)度的句子S_i向量表示。
  2. decoder network: 用于產(chǎn)生S_i的前后句S_{i-1}S_{i+1}鸳慈,前后兩句采用分別的decoder:previous decoder和next decoder饱溢。
    image.png

跟skip gram有點(diǎn)像,給定中間的元素走芋,預(yù)測(cè)前后的元素绩郎。skip-thought encoder最小化句子重構(gòu)的Loss,這樣encoder就能夠?qū)W會(huì)正確地編碼句子翁逞。對(duì)于具有類似意思的句子肋杖,其編碼后的向量依然相近⊥诤《Skip-Thought Vectors》論文中闡述了更多的細(xì)節(jié)状植。
[圖片上傳失敗...(image-932a53-1542199235016)]](https://upload-images.jianshu.io/upload_images/2528310-637b6b05249bcd13.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

作者使用了theano開源代碼來(lái)做訓(xùn)練,pytorch版本開源代碼怨喘。

Skip-Thoughts Encoder-Decoder Architecture

將句子編碼的代碼就變得非常簡(jiǎn)單了:

# The 'skipthoughts' module can be found at the root of the GitHub  repository linked above
import skipthoughts

# You would need to download pre-trained models first
model = skipthoughts.load_model()

encoder = skipthoughts.Encoder(model)
encoded =  encoder.encode(sentences)
步驟5: 聚類

將email中的每一個(gè)句子編碼后浅萧,可以使用k-means進(jìn)行聚類。聚類的數(shù)目等于summary的句子數(shù)目哲思。

import numpy as np
from sklearn.cluster import KMeans

n_clusters = np.ceil(len(encoded)**0.5)
kmeans = KMeans(n_clusters=n_clusters)
kmeans = kmeans.fit(encoded)
步驟5: 形成摘要

對(duì)于幾個(gè)cluster,選取距離cluster中心最近的句子吩案。選出句子后棚赔,如何對(duì)這些句子排序呢?分析每個(gè)cluster中的全部句子在原文中的順序徘郭,如果該cluster中的多數(shù)句子排在第一靠益,那么該cluster中選取的那個(gè)句子也排在第一句,代碼如下:

from sklearn.metrics import pairwise_distances_argmin_min
avg = []
for j in range(n_clusters):
    idx = np.where(kmeans.labels_ == j)[0]
    avg.append(np.mean(idx))
closest, _ = pairwise_distances_argmin_min(kmeans.cluster_centers_, encoded)
ordering = sorted(range(n_clusters), key=lambda k: avg[k])
summary = ' '.join([email[closest[idx]] for idx in ordering])

上文中的郵件残揉,summary結(jié)果如下:

I'm happy to hear that the issue got resolved after all and you can now use the app in its full functionality again. 
Also many thanks for your suggestions. 
In case you experience any further problems with the app, please don't hesitate to contact me again.

skip-thought encoder的訓(xùn)練語(yǔ)料來(lái)自wikipedia胧后。email summarization的源代碼詳見github

總結(jié)一下抱环,本文使用了wikipedia的數(shù)據(jù)壳快,訓(xùn)練了skip-thought encoder,用來(lái)做sentence embedding镇草,拿到embedding后眶痰,做clustering,然后挑選句子梯啤,并根據(jù)cluster中的所有句子的位置 進(jìn)行排序竖伯。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子七婴,更是在濱河造成了極大的恐慌祟偷,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,744評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件打厘,死亡現(xiàn)場(chǎng)離奇詭異修肠,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)婚惫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門氛赐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人先舷,你說(shuō)我怎么就攤上這事艰管。” “怎么了蒋川?”我有些...
    開封第一講書人閱讀 163,105評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵牲芋,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我捺球,道長(zhǎng)缸浦,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,242評(píng)論 1 292
  • 正文 為了忘掉前任氮兵,我火速辦了婚禮裂逐,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘泣栈。我一直安慰自己卜高,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,269評(píng)論 6 389
  • 文/花漫 我一把揭開白布南片。 她就那樣靜靜地躺著掺涛,像睡著了一般。 火紅的嫁衣襯著肌膚如雪疼进。 梳的紋絲不亂的頭發(fā)上薪缆,一...
    開封第一講書人閱讀 51,215評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音伞广,去河邊找鬼拣帽。 笑死,一個(gè)胖子當(dāng)著我的面吹牛嚼锄,可吹牛的內(nèi)容都是我干的诞外。 我是一名探鬼主播,決...
    沈念sama閱讀 40,096評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼灾票,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼峡谊!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,939評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤既们,失蹤者是張志新(化名)和其女友劉穎濒析,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體啥纸,經(jīng)...
    沈念sama閱讀 45,354評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡号杏,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,573評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了斯棒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盾致。...
    茶點(diǎn)故事閱讀 39,745評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖荣暮,靈堂內(nèi)的尸體忽然破棺而出庭惜,到底是詐尸還是另有隱情,我是刑警寧澤穗酥,帶...
    沈念sama閱讀 35,448評(píng)論 5 344
  • 正文 年R本政府宣布护赊,位于F島的核電站,受9級(jí)特大地震影響砾跃,放射性物質(zhì)發(fā)生泄漏骏啰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,048評(píng)論 3 327
  • 文/蒙蒙 一抽高、第九天 我趴在偏房一處隱蔽的房頂上張望判耕。 院中可真熱鬧,春花似錦翘骂、人聲如沸壁熄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至志鞍,卻和暖如春瞭亮,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背固棚。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工统翩, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人此洲。 一個(gè)月前我還...
    沈念sama閱讀 47,776評(píng)論 2 369
  • 正文 我出身青樓厂汗,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親呜师。 傳聞我的和親對(duì)象是個(gè)殘疾皇子娶桦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,652評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)載自http://www.cnblogs.com/Determined22/ 兩周以前讀了些文檔自動(dòng)摘要的論文,...
    nightwish夜愿閱讀 10,595評(píng)論 0 6
  • 轉(zhuǎn)載 序 文本摘要是自然語(yǔ)言處理中比較難的一個(gè)任務(wù),別說(shuō)是用機(jī)器來(lái)做文摘了衷畦,就連人類做文摘的時(shí)候都需要具備很強(qiáng)的語(yǔ)...
    城市中迷途小書童閱讀 508評(píng)論 0 2
  • 轉(zhuǎn)載 序 文本摘要是自然語(yǔ)言處理中比較難的一個(gè)任務(wù)栗涂,別說(shuō)是用機(jī)器來(lái)做文摘了,就連人類做文摘的時(shí)候都需要具備很強(qiáng)的語(yǔ)...
    readilen閱讀 8,397評(píng)論 1 10
  • 工作中有說(shuō)到?jīng)]做到的,我一度焦慮菩混、懷疑自己忿墅,我不是個(gè)重承諾的人? 我會(huì)言出必諾沮峡,我存好心疚脐、說(shuō)好話、做好事帖烘!我怎么想...
    玥來(lái)玥好耶閱讀 370評(píng)論 0 0