文本自動摘要

轉載自http://www.cnblogs.com/Determined22/

兩周以前讀了些文檔自動摘要的論文,并針對其中兩篇( [2] 和 [3] )做了presentation。下面把相關內容簡單整理一下。

?文本自動摘要(Automatic Text Summarization)就是說在不改變文檔原意的情況下,利用計算機程序自動地總結出文檔的主要內容。自動摘要的應用場景非常多,例如新聞標題生成、科技文獻摘要生成、搜索結果片段(snippets)生成、商品評論摘要等。在信息爆炸的互聯網大數據時代,如果能用簡短的文本來表達信息的主要內涵,無疑將有利于緩解信息過載問題。

一、概述

? ? ? 自動摘要可以從很多角度進行分類,例如單文檔摘要/多文檔摘要、單語言摘要/跨語言摘要等。從技術上說,普遍可以分為三類:

? ? ? i. 抽取式摘要(extractive),直接從原文中抽取一些句子組成摘要。本質上就是個排序問題,給每個句子打分,將高分句子摘出來,再做一些去冗余(方法是MMR)等。這種方式應用最廣泛,因為比較簡單,比如博客園的博客摘要就是前面幾句話。經典方法有LexRank和整數線性規劃(ILP)。

? ? ? LexRank是將文檔中的每個句子都看作節點,句子之間的相似度看作節點之間的邊的權重,構建一個graph;然后再計算每個節點的分數,這個打分的計算方式可以是度中心度(Degree centrality)、PageRank中心度等(論文里說這兩種計算方式其實效果沒有太大差別,文中用的ROUGE-1作為指標);這個方法的要點在于:不能每兩個句子之間都有邊,要設定一個閾值,只有相似度大于這個閾值才能有邊,閾值太大則丟失太多信息,閾值太小則又引入了太多噪聲。論文里說0.1比較合適,我們之前做過的實驗結果和這個是一致的。

? ? ? ii. 壓縮式摘要(compressive),有兩種方式:一種是pipeline,先抽取出句子,再做句子壓縮,或者先做句子壓縮,再抽句子。另一種是jointly的方式,抽句子和壓縮句子這兩個過程是同時進行的。

? ? ? 句子壓縮(Sentence compression)的經典方法是ILP:句子中的每個詞都對應一個二值變量表示該詞是否保留,并且每個詞都有一個打分(比如tf-idf),目標函數就是最大化句子中的詞的打分;既然是規劃那當然要給出限制,最簡單的限制比如說至少保留一個詞,再比如說當形容詞被保留時其修飾的詞也要保留(根據parse tree)。

? ? ? iii. 理解式摘要(abstractive),也叫產生式摘要,試圖理解原文的意思,然后生成摘要,也就是像我們人做摘要那樣來完成任務。

? ? ? 從是否有用戶查詢的角度來說,可以分為通用型摘要(generic)和基于用戶查詢的摘要(query-oriented),其中后者不僅要求生成的摘要應概括原文關鍵信息,還要盡可能與用戶查詢具有很高的相關性。

二、評價指標

首先可以是人工評價。這里只介紹自動評價。目前來說,自動評價指標采用的是ROUGE,R是recall的意思,換句話說,這個指標基于摘要系統生成的摘要與參考摘要的n元短語重疊度:

ROUGE-Nrecall=∑S∈{Ref}∑n-gram∈SCountmatch(n-gram)∑S∈{Ref}∑n-gram∈SCount(n-gram)ROUGE-Nrecall=∑S∈{Ref}∑n-gram∈SCountmatch(n-gram)∑S∈{Ref}∑n-gram∈SCount(n-gram)

摘要這個任務要求用短序列概括長序列,用召回率這樣的計算思路可以反映出人工給出的參考摘要所列出的要點中有多少被包含在了機器生成的摘要中。這個指標用來應付抽取式摘要可能問題不大,但是由于其無法評價所生成摘要的語法和語義,而且傾向于長摘要,所以其實還應該繼續探索更合理的指標來評價理解式摘要。此外,當然也可以計算基于precision的ROUGE,而且ROUGE還有ROUGE-L等多種版本;最常使用的是ROUGE-N的N取2的方式(也就是ROUGE-2)。評測工具的鏈接是這里

三、使用seq2seq + attention機制,生成理解式摘要

? ? ? 前面簡略介紹了一些概念(還差語料沒介紹,后面隨著說實驗時再說吧)。下面就開始介紹我精讀的前兩篇文章:

? ? ? [1] A Neural Attention Model for Abstractive Sentence Summarization,2015EMNLP

? ? ? [2] Abstractive Sentence Summarization with Attentive Recurrent Neural Networks,2016NAACL

第二篇文章是第一篇文章所做工作的延續。它們所試圖解決的是句子級別摘要問題:輸入新聞的第一句話,試圖生成新聞標題。至于為什么是一句話,主要還是因為就目前來看神經網絡還不能很好地處理太長的序列。

由于自動摘要和機器翻譯都屬于“序列到序列”這個類型(輸入的是序列,輸出也是序列;但必須注意翻譯和摘要這兩個問題是非常不同的),因此這兩篇文章將神經機器翻譯中廣泛使用的encoder-decoder框架attention mechanism(注意力機制)引入到自動摘要問題,試圖用這樣一種fully data-driven的方式,端到端地訓練出自動摘要模型。

? ? ? 首先簡要介紹一些概念。

1.?Sequence to sequence learning 與 encoder-decoder框架

? ? ? 如果只說“序列到序列”的話,那么詞性標注(POS)其實也是這樣的過程。但是它跟翻譯、摘要顯著不同的地方在于:在POS問題中,輸入和輸出是一一對應的,而翻譯、摘要的輸出序列與輸入序列則沒有顯著的對應關系。所以如下圖所示,POS問題可以用最右邊的那個RNN結構來建模,每個時刻的輸入與輸出就是詞與詞性。相比之下,翻譯、摘要這種則可以通過倒數第二張圖那樣的結構來解決,這個結構可以看作是encoder和decoder都是RNN的encoder-decoder框架。

圖片來源:http://karpathy.github.io/2015/05/21/rnn-effectiveness/

encoder-decoder框架的工作機制是:先使用encoder,將輸入編碼到語義空間,得到一個固定維數的向量,這個向量就表示輸入的語義;然后再使用decoder,將這個語義向量解碼,獲得所需要的輸出,如果輸出是文本的話,那么decoder通常就是語言模型。這種機制的優缺點都很明顯,優點:非常靈活,并不限制encoder、decoder使用何種神經網絡,也不限制輸入和輸出的模態(例如image caption任務,輸入是圖像,輸出是文本);而且這是一個端到端(end-to-end)的過程,將語義理解和語言生成合在了一起,而不是分開處理。缺點的話就是由于無論輸入如何變化,encoder給出的都是一個固定維數的向量,存在信息損失;在生成文本時,生成每個詞所用到的語義向量都是一樣的,這顯然有些過于簡單。

2. attention mechanism 注意力機制

為了解決上面提到的問題,一種可行的方案是引入attention mechanism。所謂注意力機制,就是說在生成每個詞的時候,對不同的輸入詞給予不同的關注權重。谷歌博客里介紹神經機器翻譯系統時所給出的動圖形象地展示了attention:

圖片來源:https://research.googleblog.com/2016/09/a-neural-network-for-machine.html

? ? ? [1] 中的一張圖也展示了這一點:右側序列是輸入序列,上方序列是輸出序列。輸出序列的每個詞都對應一個概率分布,這個概率分布決定了在生成這個詞的時候,對于輸入序列的各個詞的關注程度。如圖所示,看藍色框起來的那一列,就是模型在生成joint這個詞時的概率分布,顏色最深的地方對應的是輸入的joint,說明模型在生成joint這個詞時最為關注的輸入詞是joint。所謂attention,就是說生成每個詞時都為這個詞得到這個概率分布,進而可以使生成的詞“更好”。

? ? ? 這種機制具體的實現方式將在講論文的過程中介紹。概括來說就是一個data-driven的過程,從大規模的訓練語料中學習出來

3. 實現

下面主要介紹 [2] 。剛才已經說過,文章解決的是句子級別的摘要問題,輸入是一個詞序列:x=[x1,x2,...,xM]x=[x1,x2,...,xM]?,每個詞都是詞表中的一個(記詞表大小為?VV?,低頻詞將被標為UNK);輸出也是一個詞序列:y=[y1,y2,...,yN]y=[y1,y2,...,yN]?,要求長度要短于輸入。模型的目標就是下式:

argmaxyP(y|x)arg?maxyP(y|x)

yy?是隨機變量,每個可能取值都是一個詞序列。給定輸入序列,生成某個輸出序列的概率可以用下式建模:

P(y|x;θ)=∏t=1NP(yt|{y1,y2,...,yt?1},x;θ)P(y|x;θ)=∏t=1NP(yt|{y1,y2,...,yt?1},x;θ)

所以現在的問題就變成了如何估計給定上文詞時生成當前詞?ytyt?的條件概率?P(yt|{y1,y2,...,yt?1},x;θ)P(yt|{y1,y2,...,yt?1},x;θ)?,換句話說,就是個訓練語言模型的問題。模型訓練沒什么好說的,就是使用大規模的訓練語料,語料的每個樣本都是句子-摘要對兒:S={(xi,yi)}Si=1S={(xi,yi)}i=1S,訓練方式就是用SGD來最小化負對數似然:

L=?∑i=1S∑t=1NlogP(yit|{yi1,yi2,...,yit?1},xi;θ)L=?∑i=1S∑t=1Nlog?P(yti|{y1i,y2i,...,yt?1i},xi;θ)

模型訓練完成后,給定一個句子來生成摘要:由于每個詞都有VV?種可能,如果每個長度為?NN?個詞的序列都計算一個概率再從中挑出最大的那個的話,代價太大。所以在生成摘要時采用的是beam search的方法:生成第一個詞時只保留概率最大的?kk?個詞,然后生成第二個詞時,從?kVkV?個可能的二元短語里只保留概率最大的kk?個;依次類推,每生成一個詞時都只保留kk?個。可以看出這種剪枝操作大大縮小了搜索空間,如果?k=1k=1?,就相當于是一種貪心的策略。beam search原先是統計機器翻譯里縮小短語對譯時的搜索空間的一種策略,這里把其中的思路借用了過來。

? ? ? 下面就介紹如何建模條件概率。

(1) decoder:RNN-based

這里建模條件概率時使用的是RNNLM。與傳統的基于n-gram假設的語言模型不同,RNNLM最大的優勢就是在?tt?時刻生成一個詞時可以利用到此前全部的上文信息,而不是只能利用此前n?1n?1?個時刻的信息。

? ? ? 懶得打字了,直接上圖了。。。dd?是隱層神經元個數,ctct?就是當前時刻encoder的輸出,decoder在每個時刻進行解碼都將編碼向量?ctct?作為輸入,而不是只在首個時刻引入。一個值得注意的地方是,本文給出的模型在計算?PtPt?時,并沒有顯式輸入?yt?1yt?1?,而只在計算隱狀態?htht?時輸入了yt?1yt?1?。

由于attention機制的存在,每個時刻生成詞時對輸入序列各個詞的關注程度是不一樣的,所以encoder在每個時刻給出的輸出?ctct?是不一樣的,具體如何計算將在下面馬上介紹。


? ? ? 另外,論文中也使用了帶LSTM單元的RNN,但是實驗部分中介紹道效果并不如最基本的RNN,可能的原因是復雜的模型招致了過擬合。

? ? ? (note:在 [1] 中,decoder部分用的是2003年Bengio的那個NPLM模型,在以前的博客中介紹過。)

(2) encoder:CNN-based + attention

這篇文章的編碼部分使用的是卷積操作,將輸入序列?xx?的每個詞?xixi?的從原先的詞向量xi∈Rdxi∈Rd?編碼到了新的空間,得到新的詞向量?zi∈Rdzi∈Rd?,維數不變(下圖所示,實際上是對?aiai做的卷積,aiai?相比于?xixi?多了一個?lili?,這代表的是詞在序列中的位置信息,與詞本身的語義無關,也是通過學習得到的)。

具體來說,共有?dd?個卷積核,每個卷積核的大小為?Bk∈Rq×dBk∈Rq×d(k∈{1,2,...,d}k∈{1,2,...,d}?),也就是說卷積核的寬度是詞向量維度,長度是?qq(可以類比為n-gram中的 n )。換句話說,卷積核對長度為?qq?個詞的窗口進行特征提取,一個卷積核可以得到一個feature map(圖示中的“一列”),dd?個卷積核就可以得到?dd?列。然后每個?xixi?所對應的?zizi?是什么呢?看圖,比如說第一個詞,x1x1?就是左邊的那個紫色圈圈,z1z1?就是右邊的那個紫色圈圈。到這有一個需要提及的地方——卷積所得到的每個feature map的長度相比于句子長度是變短了啊,怎么做到一一對應?答案就是padding,在卷積之前對句子序列做了padding,使得輸出的feature map的長度和句子長度是一致的(這個圖是從Yoon Kim的那篇文章截的,放在這只是示意用)。


卷積完之后,就需要得到?ctct?了,下面就是重頭戲,也就是attention的實現方式。剛才說過,attention的目的就是讓不同時刻在生成詞的時候,對輸入序列的各個詞的關注程度不同,因此encoder在每個時刻都會輸出不同的編碼向量。

? ? ? 如何做到對輸入序列的各個詞的關注程度不同?加權求和唄:

ct=∑j=1Mαj,t?1xj∈Rdct=∑j=1Mαj,t?1xj∈Rd

所以,attention的關鍵就是求那個權重:αj,t?1αj,t?1?,表示的是?tt?時刻對詞?xjxj?的關注程度。

? ? ? 這篇文章使用下面的方式求取:

αj,t?1=exp(z?jht?1)∑Mi=1exp(z?iht?1)αj,t?1=exp?(zj?ht?1)∑i=1Mexp?(zi?ht?1)

很明顯,外層就是一個softmax,起到歸一化的作用;核心在于里面的那一項?z?jht?1zj?ht?1。其中,zjzj?是詞?xjxj?經過編碼后的新的詞向量,ht?1ht?1?則代表的是tt?時刻之前的輸出序列信息,也就是即將生成的詞?ytyt?的上文信息。

本文使用的是內積操作來實現attention,除此之外,還可以在?zjzj?和ht?1ht?1中間夾一個矩陣,這種形式在兩個向量不同維的時候可以起到將維度對齊的作用(soft alignment);維度相同時也可以夾矩陣(如 [3] 中所做),用內積操作的話會使得模型的參數變少。除此之外,當然還可以使用其他的方式,可以參考相關的論文,不同的實現方式代表著對?zjzj?和?ht?1ht?1這兩方面信息的不同耦合方式。至于這種“看似簡單”的方式為什么可以顯著提升效果,答案就是data-driven。

4. 實驗結果

? ? ? 文章使用的訓練語料是Gigaword,包含了400萬個新聞-標題對兒;測試數據使用兩種,一種是從Gigaword里隨機選了2000個出來(沒有用在訓練),另一種是評測數據DUC-2004,包含500個。模型的調參是在驗證集上用perplexity這個指標,文章對比了 [1] 的三種encoder和本文的兩種encoder(Simple RNN和帶LSTM的RNN),結果表明Simple RNN的困惑度是最低的。

下面是測試集上的指標。ABS+就是[1]中的模型,RAS是本文的模型。左邊是Gigaword上的測試結果,表明即便是?k=1k=1?這種貪心搜索的情況,RAS也要好于ABS+;而右邊是DUC評測上的結果,優勢有所削弱,可能是因為訓練語料和評測語料的差異。

? ? ? 文章中給出的幾個示例。前兩個例子表明了RAS對于ABS+的提升,而第三個例子則表明RAS對于比喻句的情況就沒有正確理解語義。

四、使用attention機制,生成基于用戶查詢的抽取式摘要:同時處理句子顯著性與查詢相關性

? ? ? 下面介紹一篇抽取式摘要的文章,生成的是基于用戶查詢的摘要。

? ? ??[3]?AttSum: Joint Learning of Focusing and Summarization with Neural Attention,2016COLING

? ? ? 從這篇文章主要可以看到,attention不僅可以用在encoder-decoder的場景,只要是想把具有一定“對齊”關系(比如機器翻譯里的源語言單詞和目標語言單詞的“對齊”)的兩個東西聯系起來的場景其實都可以用。

? ? ? 傳統的方案是先對句子的顯著性進行打分,再對句子和查詢的相關性進行打分,二者組合得到最終打分。在計算句子和查詢的相關性時,通常使用人工特征表示并計算相似度,實際上相似度不能度量相關性。

而這篇文章的核心idea是將兩個打分合并在一起:首先將句子、查詢都用CNN表示成向量,然后使用attention給出文檔中的句子權重(這個權重反映的是句子向量和查詢向量的相關性,用attention的方式來計算:用句子向量和查詢向量中間夾一個矩陣的方式),然后基于此將句子向量加權得到文檔向量,再計算文檔向量和句子向量的相似度,給出句子打分。最后用MMR去冗余。此外,訓練時采用了pairwise的方式(將正負樣本結對,使這對樣本的分差盡可能大),并且用的是hinge loss。如果去掉句子權重,也就是說用句子向量的平均值得到文檔向量,那這個過程就相當于只對句子顯著性進行了打分。


? ? ? 先放上slides,以后有時間的話再補充文字吧。。。



五、總結

? ? ? 總的來說,[1] [2] 用encoder-decoder做自動摘要主要沿襲了神經機器翻譯的“模樣”,是開創性的工作。但這兩個任務其實有顯著的不同:例如翻譯是要盡可能不損失信息,而摘要是只保留最關鍵信息;翻譯的輸出序列長度正比于輸入序列長度,而摘要的輸出序列長度要短于輸入序列長度;從遇到的問題來說,翻譯中存在過翻、漏翻,而摘要則面臨生成的詞在語料中是罕見詞等問題。因此,用于這兩個任務的輔助機制既有共同點(如最小風險訓練),更有區別(翻譯有Coverage機制,摘要有CopyNet機制)。另外,做文摘的方法是五花八門的,比如強化學習。



參考資料:?

[1] A Neural Attention Model for Abstractive Sentence Summarization,2015EMNLP

[2] Abstractive Sentence Summarization with Attentive Recurrent Neural Networks,2016NAACL

[3]?AttSum: Joint Learning of Focusing and Summarization with Neural Attention,2016COLING

[4] 《統計自然語言處理》

[5]http://rsarxiv.github.io/tags/自動文摘/

[6]https://github.com/lipiji/app-dl

[7]?LexRank: Graph-based Lexical Centrality as Salience in Text Summarization,2004JAIR

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容