文本自動摘要任務的初步總結

由於最近需要進行組內的知識分享,因而藉此機會將文本摘要的一些基本知識以及本人的一些實踐經驗做成文稿,一方面用來組內分享,一方面也是總結一下過去在該領域的一些心得體會。因個人的能力所限,本文實質上是對文本摘要的不完全總結,如有未能囊括的知識點,還請同學們多提意見,一起進步。

本文將從以下幾點介紹文本摘要任務的相關內容。

  1. 從整體上對文本摘要任務做一個大致的介紹,包括任務分類,評測方式等。
  2. 介紹抽取式自動摘要的內容。這也是之前我主要研究實踐的領域。
  3. 介紹生成式自動摘要的內容,這裏主要介紹經典的seq2seq方法,以及其不同的變種。
  4. 介紹最近比較前沿的一些對文本摘要的研究。

文本摘要任務總覽

任務概述:用一些精煉的話來概括整篇文章的大意,用戶通過閱讀摘要獲取文章的主要內容。

文本摘要按照不同的分類準則,可以將該任務分成不同的子任務。如下圖所示:

這個分類可能還不是非常完整,但是基本上概括了目前文本摘要的任務類型。

抽取式摘要的模式主要是使用算法從源文檔中提取現成的句子作爲摘要句。在通順度上,一般是比生成式摘要要好的。但是會引入過多的冗餘信息,無法體現摘要本身的特點。

生成式摘要則是基於NLG技術,根據源文檔內容,由算法模型自己生成自然語言描述,而非提取原文的句子。生成式摘要目前很多工作都是基於深度學習中的seq2seq模型,最近在以bert爲首的大量預訓練模型出世後,也有很多工作集中在如何利用auto-regressive的預訓練模型來做NLG任務,其中就包括生成式摘要。除此之外,由於現實環境中往往缺少標註好的摘要數據,因此還有很多工作聚焦在無監督的方式,使用自編碼器或者其他思想來做無監督的生成式摘要。

壓縮式摘要其實和生成式摘要在模式上有些相似,但是其目的卻不同。壓縮式摘要主要目標在於如何對源文檔中的冗餘信息進行過濾,將原文進行壓縮後,得到對應的摘要內容。最近有一篇文章,利用了information Bottleneck的原理,嘗試對源文本進行壓縮後,再做生成式任務,後續會對該論文做一個專門的解讀。

單文檔摘要和多文檔摘要,從任務難度上來看,多文檔摘要的難度顯然更高。因爲對於一個文檔集合來說,文檔越多,其包含的主題、噪聲也越多,因此提取摘要的難度也越大。本人對多文檔摘要的研究不多,這裏就不多介紹了。

文本摘要任務評測方法

文本摘要任務屬於文本生成的範疇,因此不能用簡單的準召率來評測。當前比較常用的評測文本生成的方法大致就是BLEU,ROUGE等。這些方法的缺點在於評測質量還比不上人工,只是從基本語義單元的匹配上去評測候選摘要和標準摘要之間的相似性,缺少語義方面的維度。因此,如何設計一個合適的評測方法,也是目前文本摘要任務的一個研究方向。下面以ROUGE爲例簡單介紹一下摘要評測的流程。

備註1:摘要的reference(即用於評測的標準摘要)通常是一個集合,即一個候選摘要通常需要跟多個reference綜合摘要來比較。
備註2:還有一種情況是給出的reference直接是文檔中的原句,此時相當於對原文中每個句子做一個二分類問題,即一個句子是否是摘要句。這種情況不詳細討論。

ROUGE的基本原理:統計候選摘要句和標準摘要句重疊的基本語義單元(如n-gram),來評價摘要的質量。根據不同的計算重疊的方式,可以將ROUGE分爲以下幾類:

ROUGE-N系列,其實就是以n-gram爲基本單元,計算兩個句子之間的n-gram重合率。每個ROUGE系列的計算結果又可以細分爲precision,recall和f-beta分數,下面爲ROUGE-N的計算方法:

我叫邱震宇
所有的skip-bigram字符對有:(我叫)(我邱)(我震)(叫邱)(叫震)(叫宇)(邱震)(邱宇)(震宇)

首先skip-gram必須要按照字符在原始句子中的順序來組成gram。然後可以根據不同字符數組成詞組,但是這些詞組不要求字符在原文中連續,可以在中間跳過一些字符。通常會設置一個最大跳躍數m來限制跳躍距離,這是爲了防止出現大量無意義的詞組。

下面介紹使用ROUGE來做摘要評測的通用步驟:

假設當前reference摘要集有N個摘要。
for i=0;i<N;i++:
計算剔除第i個reference摘要後,剩餘N-1的reference分別與候選句計算rouge值,取最大的那個 rouge_i
end for
最後將所有rouge_i計算得到均值。

最後,關於摘要評測用的工具,github上有很多版本,之前我用的是ROUGE.pl+pyrouge。其中ROUGE.pl是用perl語言寫的(不得不說這個腳本調用方式不太方便,對於中文數據還有點bug),而pyrouge則是一個wrapper工具,調用的還是ROUGE.pl,只不過接口更加人性化。當然還可以用一些重寫ROUGE功能的腳本代碼,但是有些腳本計算得到的結果可能會與實際有偏差,這個就需要多方比對了。

抽取式摘要

抽取式摘要根據當前標註語料的條件、算力條件等有不同的做法。通常分爲無監督和有監督的方法。

有監督的方法主要有:

  • 基於傳統機器學習的方法,即提取各種特徵,包括句子的位置,是否包含關鍵詞,整合無監督方法得到的句子之間的相似性特徵等等,使用分類模型進行有監督的訓練。
  • 基於深度學習,使用序列模型如RNN來做。經典的有SummaRuNNer模型。最近幾年也有利用預訓練的language model來encode句子,然後做finetune,如fine-tune bert for extractive summarization.

有監督的方法有點在於抽取的效果通常來說都比較好,缺點也很明顯,需要標註的語料

無監督的方法主要有:

  1. 基於傳統的統計學特徵,對基本語素統計tfidf、熵特徵等,間接得到句子的權重分數,根據權重分數爲每個句子打分,最後選擇比較重要的句子。
  2. 基於cluster的方法,根據每個句子的特徵(可以是詞級別的特徵,也可以是直接對句子做embedding的特徵),將句子進行聚類,然後從每個聚類中分別選擇摘要句。基於聚類的思想還是很直觀的,它認爲一個篇文章的主題分佈將句子大致進行了分類,而做摘要就是用盡可能少的篇幅概括文章主題,因此從每個主題聚類中選取句子就能在一定程度上達到目標。這種方法的缺點在於聚類的聚合度和純淨度,以及很多聚類算法都需要指定聚簇個數。即使有一些無參數貝葉斯的主題聚類方法,但是他們在訓練和inference上的效率都不盡如人意。
  3. 基於圖挖掘的各種Rank類算法。主要是將句子視作圖的節點,然後通過一些圖論的算法來構建句子之間的關係,最後計算得到每個句子的權重分數。常見的有TextRank,LexRank等。
  4. 一些以信息學或者其他數學理論爲切入點,研究摘要本質的方法。其中,我看過的相關工作有以submodular函數的特性爲切入點同時建模摘要的冗餘度和相關性;以信息學爲切入點,探討信息熵、KL散度和摘要的冗餘度和相關性以及重要性程度的關係;另外還有以information bottleNeck爲切入點,對原文先做無監督的信息壓縮,然後再做自監督的生成式摘要的工作。

上面第四點中,說到了一些對文本摘要本質的一些研究。我準備先從這一塊開始,簡單總結一下相關的工作。

基於submodular函數特性的文本摘要

該研究論文源自

A Class of Submodular Functions for Document Summarization

。他將摘要抽取的指導準則設計爲以下兩個維度:

  1. 相關度,或者說是摘要對原文內容的覆蓋度
  2. 冗餘度,或者說是摘要句的多樣性

    理解次模函數,首先要理解“邊際效應”。

    什麼是邊際效應?通俗的講,現狀態的效益和前一個狀態的差值!

    那麼什麼次模性 ?就是邊際效應一直在減少!

    舉個例子:小情侶談戀愛,剛開始天天膩歪,然後隨着時間,漸漸淡了,最後分手!爲什麼?這就是次模性,我們把時間(天)看成不同時刻的狀態x,親密度看成效益f,隨着時間,親密度的邊際效用在減少!就是說,過去的某兩天,設爲x1和x2(x2包含x1 x2>x1),今天看成x,那麼f(x1+x)-f(x1)>f(x2+x)-f(x2)。這就是爲什麼女生老是問“(今天)你愛我嗎?”,因爲她能感受到今天沒有昨天愛我了!

    所以次模性給人感覺不是很好,但是與貪婪算法就很厲害了!(負負得正嘛),執行速度快,還有很好的近似比!

    參考知乎:https://www.zhihu.com/question/34720027

基於信息理論對文本摘要的論證

這個研究來源於A Simple Theoretical Model of Importance for Summarization。是ACL2019上的一篇傑出論文。主要是從相關性,冗餘度、informative和importance四個維度,以信息理論爲支撐,對文本摘要做了一個研究。相關的論文解讀我之前寫過一篇文章,感興趣的可以去看看:拋開模型,探究文本自動摘要的本質——ACL2019 論文佳作研讀系列

下面介紹一下本人之前研究過的一些無監督做抽取式摘要的方法,包括:TextRank,MMR等。

TextRank

TextRank是一種基於圖算法的無監督抽取式摘要方法。它的思想來源於谷歌的pagerank。相信很多人對pagerank應該是比較瞭解的,這裏簡單描述其思想。

pagerank的目的是對每個網頁進行打分,將分數高的網頁放在前排。假設當前有A,B,C三個網頁。A能夠跳轉到B和C。假設每個網頁的權重分數分別爲 [公式] 。pagerank的核心思想在於一個網頁的重要性程度與它本身鏈接跳轉到的網頁數有關,也和鏈接到的網頁本身的權重分數有關。因此以網頁爲節點,建立網頁之間的有向圖。那麼網頁A的重要性程度可以通過設計一個優化函數來計算得到。簡單說就是爲了計算A的權重,需要將B和C的權重加權求和。但是假如B也能跳轉到C,那麼B的權重分數計算也需要C的權重。基於此,設計了一種冪方法,來迭代計算網頁的權重。

 

TextRank基於pagerank,改進了算法以適應文本摘要任務。首先,它將每個句子作爲圖的節點,一篇文檔中,每個句子兩兩間都通過邊來連接。其次,每條邊要賦予一個邊權重。與網頁不同,文檔中,句子和句子之間的關係更加複雜。最後基於上述思想,得到一個需要用冪方法迭代來解決的目標函數:

其中, w_{ji}表示節點i和j之間的邊權重,即兩個句子之間的相似度。默認任意兩個句子都是相連的。假設當前i=1,j=2,等式右側第二部分中,分母表示句子2與所有句子的相似度的和,分子表示句子1與句子2的相似度,再乘上句子2的權重,得到句子2的一個分數。最後對於所有與句子1相連的句子j求和,得到所有的分數之和。

這裏要解釋一下爲什麼函數會分爲兩部分。上面講pagerank時,通用的場景對應函數的第二部分。但是還存在一些特殊情況會讓該部分函數永遠無法收斂:

  • 存在環形節點
  • 存在孤島節點

出現上述情況時,會使得數據流動一直在限制某個局部的區域。因此算法設計了一個random walk機制,以一定的概率,隨機遊走到一個隨機的節點。這個概率就是上面公式中的(1-d),d又稱爲阻尼係數。

回到上述公式的求解,瞭解馬爾科夫狀態轉移的同學看到這個應該就能聯想到,之所以這個公式能夠收斂,是因爲它通過隨機遊走算法,在一段時刻之後可以達到一個平穩態,得到一個平穩分佈。

算法工具:對於中文數據來說,比較著名是TextRank4Zh。它使用默認使用jieba分詞做分詞工具,是一個非常易用的抽取式摘要工具。

對TextRank的改進

對於TextRank算法來說,w_{ji}是其可以被改進的點。設計合適的句子相似度算法,可以提升摘要抽取的質量。在TextRank4Zh中,默認的句子相似度計算方式如下:

該方法採用簡單的詞元的重合度匹配來計算兩個句子的相似度。顯然,這種方法還是比較簡單原始的。改進地方很多,大致分爲以下兩個方面:

  1. 採用多樣化的句子相似度計算。如LexRank中的方法,對每個句子採用詞元的tfidf相關特徵,得到句子的特徵表示,然後採用餘弦相似度,得到兩個句子的相似度。
  2. 用更好的方式去編碼句子,使其用更稠密的向量表示。

其中,方法2在目前有很多可選的方案。具體如下:

其中,第一種方案常見的有詞向量加權求和(權重可以是詞的tfidf),或者是最近幾年研究比較多的sif或者usif方法,利用矩陣分解的相關技術來提升句子向量表示效果。這些方法優點在於簡單高效,但是缺點就是未將整個句法語義信息編碼到向量中。

第二種方案常見的有sent2vec,doc2vec,skip-thought等。基本上都是借鑑詞向量的訓練方式,將其改造,以適用於句子向量的訓練任務。

第三種方案是以Bert,GPT-2,XLNET等預訓練language model爲代表的一系列方法。目前這個方案的效果還是不錯的,研究熱度也很高。缺點在於對於算力的要求實在是有點高。

MMR

TextRank的優點在於不需要標註數據,不需要進行預訓練,效果尚可。但是缺點也很明顯。從其核心思想可以看出來,它挑選摘要句時會側重於挑選那些與很多句子相似度高的句子。因此,最後會導致挑選的很多句子冗餘度比較高,從而遺漏一些帶有其他主題信息卻“勢單力薄“的句子。爲了緩解這個問題,我在之前的工作中嘗試引入了submodular函數和MMR方法,submodular方法前面已經說過了,這裏介紹一下MMR方法。

MMR,全稱爲Maximal Marginal Relevance。它的核心思想同時考慮了內容相關性和多樣性。公式如下:

其中,R是原文句子集合,S是當前已有的摘要集合。Q是原文所有句子集合。 D_i表示從剩餘的文章中選擇一個候選摘要句計算MMR。等式右邊的第一部分衡量候選句子和原文的相似度。第二部分衡量候選句子和當前已有的摘要集合的冗餘性。

優化該函數使用的是貪心方法,在每一輪選擇摘要句時,計算每個句子的MMR得分,然後選擇分數最高的那個放到候選摘要集合中。

我們可以將MMR方法與TextRank方法結合起來,各取其優點。我是這麼做的:

將等式第一部分,用TextRank學習到的句子的權重得分替換 sim1\left ( \right )。TextRank的權重得分是在句子相似度的基礎上通過無監督學習得到,比直接使用相似度要更全面。

methods might work but actually not

這一章節列一些我之前思考嘗試過的一些方法,但是最後實際效果卻不如預計,可能是我在具體實現上有些問題,這裏貼出來,供大家一起思考。

1、基於劉知遠老師的一篇論文做的一個嘗試。衡量相關性可以借鑑機器翻譯的思想,即A和B如果相關度高,則A翻譯爲B的概率應當也是比較高的。因此可以使用一些基於詞對齊模型的傳統翻譯模型,如IBM model系列。得到每個句子和文章剩餘內容的一個對齊概率。後續可能改進的點有:

  • 這個概率值用法也有多種,例如直接作爲一個特徵,並賦予一個超參數權重,與TextRank和MMR整合起來,通過ROGUE值來調整。
  • 或者直接將這個概率作爲挑選候選摘要的依據。每次挑選對齊概率最大的那個作爲摘要句。

2、衡量冗餘性:假定我們在之前的流程中會將句子編碼到同一個向量空間中,當前已有摘要集合爲S,待候選摘要爲 C_i。有如下思想:可以通過將一個句子A向量進行一個方向上的分解,其中一個方向爲句子B向量的方向,另一個方向是與B垂直的方向,兩個句子的冗餘程度體現在兩個句子在同一方向上的模長的比值。假設兩個句子很相似,即兩個句子夾角很小,此時句子A在句子B上的投影應當是很大的。(這個方法有點缺陷,即除了夾角外,向量之間的歐式距離也有影響。)

SummaRuNNer

關於抽取式摘要,最後講一下SummaRuNNer。對於該算法模型,我並沒有做過多的實踐研究,這裏只簡單描述其思想。

SummaRuNNer,基於RNN,將除了對詞級別做RNN編碼外,還在句子級別上做了RNN的編碼,最後訓練的target爲每個句子是否屬於摘要句子。如圖所示:

該論文另一個比較重要的設計在於它的訓練目標函數,如圖所示:

可以看到,它從多個不同維度去建模一個摘要句的特徵,包括之前說的相關度和冗餘度,除此之外還有句子本身包含的信息量,句子在文章中的位置(通常來說文章開頭的句子是摘要句的可能性比較大)等。

生成式摘要

相對於抽取式摘要,我在生成式摘要上的工作還是比較少的,目前也在努力研究中。

目前,大部分做生成式摘要都是用NLG的方式去做的,其中大部分都是基於的seq2seq框架。關於seq2seq,我之前的文章也有講過,詳見:seq2seq之tensorflow源碼解析

也有一些學者研究如何利用深度無監督模型去做生成式摘要任務。如以自編碼器爲主體架構,對其進行不同程度的改造,從壓縮或者生成兩個角度去無監督生成摘要文本,同時爲了提升效果,也會利用GPT,XLNET等預訓練語言模型做finetune。這也是後續我準備深入研究的領域。

使用seq2seq框架做摘要通常會遇到以下幾個問題:

  1. OOV問題。源文檔語料中的詞的數量級通常會很大,但是經常使用的詞數量則相對比較固定。因此通常會根據詞的頻率過濾掉一些詞做成詞表。這樣的做法會導致生成摘要時會遇到UNK的詞。
  2. 摘要的可讀性。通常使用貪心算法或者beamsearch方法來做decoding。這些方法生成的句子有時候會存在不通順的問題。
  3. 摘要的重複性。這個問題出現的頻次很高。與2的原因類似,由於一些decoding的方法的自身缺陷,導致模型會在某一段連續timesteps生成重複的詞。
  4. 長文本摘要生成難度大。對於機器翻譯來說,NLG的輸入和輸出的語素長度大致都在一個量級上,因此NLG在其之上的效果較好。但是對摘要來說,源文本的長度與目標文本的長度通常相差很大,此時就需要encoder很好的將文檔的信息總結歸納並傳遞給decoder,decoder需要完全理解並生成句子。可想而知,這是一個很難的事情。
  5. 模型的訓練目標與最終的評測指標不太一致。這裏牽扯到兩個問題,一個是seq2seq的訓練模式中,通常會使用teacher-forcing的方式,即在decoder上,將真實target的輸入和模型在前一時刻生成的詞一起送到下一個時刻的神經元中計算。但是在inference時,是不會有真實target的,因此存在一個gap;另一個問題就是通常模型訓練的目標函數都是交叉熵損失函數。但是摘要的評測卻不是以交叉熵來判斷的,目前一些榜單通常以ROUGE、BLEU等方式評測,雖然這些評測也不是很完美,但是與交叉熵的評測角度均在較大差異。

目前,已經出現了很多研究來嘗試解決上述的方法。比如ACL2019中的最佳長論文就是嘗試解決問題5。下面我將簡單介紹pointer-network,其可以在一定程度上解決問題1,2,3。

Pointer-network

方法來自論文:Get to the Point.

核心思想在於,在decoder上,每個訓練樣本構建的詞表除了原始的詞表外,還需要增加訓練樣本輸入文本的詞表,具體做法如下:

每個training data的詞表都是不一樣的。詞表=global詞表+local詞表。

global詞表:整個語料使用傳統的方法將低頻詞使用UNK表示,其他詞添加到詞表中。

local詞表:每個training record輸入語句的詞表,與global詞表用不同的id_set表示。

同時在模型中設計一個 [公式] ,表示最終使用的模型輸出是否使用decoder生成的詞的概率。如上圖所示,encoder的attention生成的alignment會參與到最後decoder輸出詞分佈的計算中。

該模型還有一個獨創點在於設計一個Coverage mechanism來解決生成重複的問題。主要包含了兩個方面:

1、在計算encoder的attention時,在原始的計算公式中,增加了歷史時刻的attention history信息,如圖紅色框中的內容: [公式] 表示的是歷史attention信息的累積。

2、增加一個coverage loss,來懲罰生成重複詞的行爲。

在實際的使用中,不能直接在訓練一開始就將covloss囊括進來。原因是訓練初期,模型在相關度和信息度上還沒有訓練得到一個穩定的模型,此時將covloss加進來的話,會大大降低模型的性能。因此最好的實踐方式是在模型訓練後期即將收斂時,再將covloss加進來。

pointer-network在一定程度上確實能很好解決問題1,2,3。但是卻對問題4,5沒有很好的解決辦法。

下面最後介紹一個研究,從某種程度上算是針對問題5做了優化。

Neural Headline Generation with Minimum Risk Training

論文來源如下:Neural Headline Generation with Minimum Risk Training

這篇論文主要新穎點在於將ROUGE、BLEU等無法直接用作損失函數的評測指標(因爲這些指標都不可微,不能參與梯度更新)引入到了訓練目標函數中:

其中, [公式] 表示對於文章x,模型能夠生成的所有可能的摘要集合。y表示reference摘要句, [公式] 表示候選摘要句和reference的距離。 [公式] 表示所有可能的摘要集合與reference距離的期望。

將上述公式進一步拆開,得到:

實際上,上述公式的思想在於通過 Y(x:\theta )概率分佈,採樣得到一個候選摘要子集,從這個子集中,計算每個摘要和reference的距離。此時可以引入ROUGE等指標作爲distance,因爲 \Delta 此時相當於是一個常數。

但是,翻了一下論文,作者似乎並沒有給出如何採樣得到摘要子集的算法。之前在一個比賽羣中有聽過作者的分享,當時是說了這個方法,後來手機換了,信息丟失掉了。如果有知道的同學還請告知一下,後期我會補充在文章中。

updated on 2020/03/24 基於作者大大的評論回覆,論文中對於摘要子集的採樣使用的最簡單的隨機採樣,特補充在此。

該論文在實踐過程中也需要注意訓練的模式問題。即在模型初始訓練過程中,不能直接使用上述的目標函數,理由是在模型訓練初期,生成的摘要都比較差,此時不管怎麼採樣,都不會得到很好的模型。因此需要通過交叉熵損失函數先將模型訓練到一個較爲穩定的狀態,然後再引入新的損失函數。

其他未來研究

除了上述工作研究外,目前還有很多前沿的文本摘要研究。例如引入了強化學習的思想,試圖將一些評測指標作爲reward來讓模型進行自我學習。也有一些研究設計了一種新的模式,即先通過某種方法將源文檔做一個壓縮,得到一個長度較爲合適的文本。然後以壓縮後的文本爲target,訓練生成式。根據壓縮方式的不同,有不同的論文研究,例如Fast Abstractive Summarization with Reinforce-Selected Sentence Rewriting,以及BottleSum: Unsupervised and Self-supervised Sentence Summarization using the Information Bottleneck Principle等等。後續會專門對一些感興趣的論文做專門的解讀。

另外,在最近的實踐中,發現了一些新的decoding方法用於inference,比如top-k,top-p等。前者在每個時刻保留模型生成的概率最大的k個詞,然後從這k個詞中採樣得到當前時刻的最終輸出。而top-p則是將詞按照概率分佈降序排列,進行概率的累計計算,當累計概率達到閾值P時,停止計算,在當前閾值P內的所有詞中採樣。通過實踐,發現這些方法對最後模型的效果都有一定的提升,算是一個trick吧。後續也會持續對decoding的相關方法做更深入的研究。

總結

本文主要總結我在文本摘要方面的一些研究和實踐心得,只涉及到了文本摘要任務的很小的一方面。後續,還將繼續在該領域持續鑽研,希望後續能在這方面有更多的心得產出。同時,也歡迎各位同僚多多交流,共同進步。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章