1. 程式人生 > >基於 Python 的自動文字提取:抽象法和生成法的比較

基於 Python 的自動文字提取:抽象法和生成法的比較

我們將現有的 提取方法(Extractive)(如LexRank,LSA,Luhn和Gensim現有的TextRank摘要模組)與含有51個文章摘要對的Opinosis資料集進行比較。我們還嘗試使用Tensorflow的文字摘要演算法進行抽象技術(Abstractive),但由於其極高的硬體需求(7000 GPU小時,$ 30k雲信用額),因此無法獲得良好的結果。

 

為什麼要文字摘要?

隨著推送通知和文章摘要獲得越來越多的需求,為長文字生成智慧和準確的摘要已經成為流行的研究和行業問題。

文字摘要有兩種基本方法:提取法和抽象法。前者從原始文字中提取單詞和單詞短語來建立摘要。後者學習內部語言表示以生成更像人類的摘要,來解釋原始文字的意圖。

基於 Python 的自動文字提取:抽象法和生成法的比較

文字摘要有兩種基本方法:提取和抽象。

 

提取文字摘要

首先,簡單描述當前已經存在的一些流行的文字摘要演算法和實現:

Gensim中的文字摘要

gensim.summarization模組實現了TextRank,這是一種Mihalcea等人的論文中基於加權圖的無監督演算法。它也被另一個孵化器學生Olavur Mortensen新增到部落格 - 看看他在此部落格上之前的一篇文章。它建立在Google用於排名網頁的流行PageRank演算法的基礎之上。TextRank的工作原理如下:

  1. 預處理文字:刪除停止詞並補足剩餘的單詞。

  2. 建立把句子作為頂點的圖。

  3. 通過邊緣將每個句子連線到每個其他句子。邊緣的重量是兩個句子的相似程度。

  4. 在圖表上執行PageRank演算法。

  5. 選擇具有最高PageRank分數的頂點(句子)

在原始TextRank中,兩個句子之間的邊的權重是出現在兩個句子中的單詞的百分比。Gensim的TextRank使用Okapi BM25函式來檢視句子的相似程度。它是Barrios等人的一篇論文的改進。

PyTeaser

PyTeaser是Scala專案TextTeaser的Python實現,它是一種用於提取文字摘要的啟發式方法。

TextTeaser將分數與每個句子相關聯。該分數是從該句子中提取的特徵的線性組合。TextTeaser中的特徵如下:

titleFeature:文件和句子標題共有的單詞數。

sentenceLength:TextTeaser的作者定義了一個常量“理想”(值為20),它表示摘要的理想長度,以表示字數。 sentenceLength計算為距此值的標準化距離。

sentencePosition:規範化的句子數(句子列表中的位置)。

keywordFrequency:詞袋模型中的術語頻率(刪除停用詞後)。

有關摘要的句子特徵的更多資訊,請參閱Jagadeesh等人的基於句子提取的單文件摘要。

PyTextRank

PyTextRank是原始TextRank演算法的python實現,具有一些增強功能,例如使用詞形結構而不是詞幹,結合詞性標註和命名實體解析,從文章中提取關鍵短語並基於它們提取摘要句子。除了文章的摘要,PyTextRank還從文章中提取了有意義的關鍵短語。PyTextRank分四個階段工作,每個階段將輸出提供給下一個:

  1. 在第一階段,對文件中的每個句子執行詞性標註和詞形還原。

  2. 在第二階段,關鍵短語與其計數一起被提取,並被標準化。

  3. 通過近似句子和關鍵短語之間的jaccard距離來計算每個句子的分數。

  4. 根據最重要的句子和關鍵短語總結文件。

Luhn的演算法

該演算法[ PDF ] 於1958年釋出,通過考慮文件中經常出現的“重要的”單詞以及由於非重要單詞與這些單詞之間的線性距離,對摘要提取的句子進行排名。

LexRank

LexRank是一種類似於TextRank的無監督圖形方法。LexRank使用IDF修改的餘弦作為兩個句子之間的相似性度量。該相似度用作兩個句子之間的圖形邊緣的權重。LexRank還採用了智慧的後處理步驟,確保為摘要選擇的頂級句子彼此不太相似。

更多關於LexRank與TextRank的比較可以在這裡找到。

文字摘要中的潛在語義分析(LSA)

LSA的工作原理是將資料投影到較低維空間而不會有任何重要資訊丟失。解釋該空間分解操作的一種方式是奇異向量可以捕獲並表示在語料庫中重複出現的單詞組合模式。奇異值的大小表示模式在文件中的重要性。

如果奇異向量和奇異值之類的術語似乎不熟悉,我們建議這個教程,其中涵蓋了LSA的理論,如果你是初學者,其中有python的實現教程可以幫助到您(對於熟練的人,為了強大而快速的實現,使用gensim中的LSA)。

 

如何評估文字摘要質量?

ROUGE-N指標

對於LexRank,Luhn和LSA方法,我們使用Sumy 摘要庫來實現這些演算法。我們使用ROUGE-1指標來比較所討論的技術。

Rouge-N是模型和黃金摘要(gold summary)之間的單詞N-gram度量。

具體而言,它是在模型和黃金摘要中出現的N-gram短語的計數與在黃金摘要中出現的所有N-gram短語的計數的比率。

解釋它的另一種方法是作為召回值來衡量模型摘要中出現的黃金摘要中有多少N-gram。

通常對於摘要評估,只使用ROUGE-1和ROUGE-2(有時候ROUGE-3,如果我們有很長的黃金摘要和模型)指標,理由是當我們增加N時,我們增加了需要在黃金摘要和模型中完全匹配的單詞短語的N-gram的長度。

例如,考慮兩個語義相似的短語“apples bananas”和“bananas apples”。如果我們使用ROUGE-1,我們只考慮單詞,這兩個短語都是相同的。但是如果我們使用ROUGE-2,我們使用雙字短語,因此“apples bananas”成為一個與“bananas apples” 不同的單一實體,導致“未命中”和較低的評價分數。

例:

黃金摘要:A good diet must have apples and bananas. 模型 Apples and bananas are must for a good diet.

如果我們使用ROUGE-1,則得分為7/8 = 0.875。

對於ROUGE-2,它是4/7 = ~0.57。

上述比率可以解釋為我們的演算法從所有相關資訊的集合中提取的相關資訊量,這正是召回(recall)的定義,因此Rouge是基於召回的。

更多關於如何計算得分的例子都在這裡中。

BLEU指標

BLEU指標是一種經過修改的精度形式,廣泛用於機器翻譯評估。

精度是黃金和模型轉換/摘要中共同出現的單詞數與模型摘要中單詞數的比率。與ROUGE不同,BLEU通過採用加權平均值直接考慮可變長度短語 - 一元分詞,二元分詞,三元分詞等。

實際指標只是修改精度,以避免模型的翻譯/摘要包含重複的相關資訊時的問題

例:

黃金摘要:A good diet must have apples and bananas.

模型摘要:Apples and bananas are must for a good diet.

如果我們僅考慮一元分詞的BLEU指標,即一元分詞的權重為1,所有其他N-gram權重為0,我們的BLEU比率計算為7/9 = 0.778。

分別對於一元分詞和二元分詞的權重[0.6,0.4],該比率變為0.6 *(7/9)+ 0.4 *(4/8)= 0.667。

具有修正N-gram精度的 BLEU

修改的N-gram精度的關鍵是,一旦在模型摘要中識別出參考短語/單詞,就應該將其視為耗盡。這個想法解決了模型摘要中重複/過度生成的單詞的問題。

通過首先找到單個/短語在任何單個引用中出現的最大次數來計算修改的N-gram精度。此計數成為該單詞/短語的最大引用計數。然後,我們通過其最大引用計數剪下每個模型詞/短語的總計數,在模型轉換/摘要中新增每個單詞的剪下計數,並將總和除以模型轉換/摘要中的單詞/短語的總數。

關於BLEU論文的連結(見上文)在其修改的N-gram精度上有很好的例子。

一句話總結:ROUGE和BLEU得分越高,摘要越好。

資料集

使用51篇文章的Opinosis資料集(Opinosis指一種基於圖形的方法,針對高度冗餘的意見進行抽象總結)進行比較。 每篇文章都是與產品的功能相關,如iPod的電池壽命等。這些文章是購買該產品客戶的評論的集合。 資料集中的每篇文章都有5個手動編寫的重點摘要。 通常5個重點摘要是不同的,但它們也可以是重複5次的相同文字。

模型引數

對於Gensim 的TextRank(Gensim一個python NLP庫,TextRank是python的文字處理工具,Gensim整合基於Textrank的文字摘要模組),輸出總結中的單詞計數(word_count)設定為75。

對於Sumy-LSA和Sumy-Lex_rank,輸出摘要(sentence_count)中的句子數設定為2。

 

結果

獲得的ROUGE-1和BLEU得分的平均值和標準差顯示在下表中。

基於 Python 的自動文字提取:抽象法和生成法的比較

每個總結的ROUGE分數是在這五個(個人重要摘要)分數中的最大ROUGE分數。

對於BLEU評分,我們使用NLTK的bleu_score模組,其中unigrams,bigrams和trigrams的權重分別為0.4,0.3,0.2。

對於具體示例,請檢視Garmin 255W導航裝置的這篇評論。 檢視人工和模型生成的摘要。

 

定性評估

LexRank是這兒的勝者,因為它產生了更好的ROUGE和BLEU得分。 不幸的是,我們發現它生成的總結比Gensim的TextRank和Luhn模型的總結資訊量少。 此外,LexRank並不總是在ROUGE得分中擊敗TextRank 。 例如,TextRank在DUC 2002資料集上的表現略好於LexRank。 所以LexRank和TextRank之間的選擇取決於你的資料集,這是值得嘗試這兩者的。

從資料中推導的另一個結論是Gensim的Textrank優於普通的PyTextRank,因為它在純TextRank中使用BM25函式代替了Cosine IDF函式。

該表的另一點是Luhn的演算法具有較低的BLEU分數。 這是因為它提取了更長的概要,因此涵蓋了對產品的更多評論。 不幸的是,我們無法縮短它,因為Sumy中Luhn演算法的封裝不提供更改字數限制的引數。

 

抽象文字抽樣

一種神經網路方法

Google的Textsum是一種最先進的開源抽象文字概要架構。 它可以根據前兩個句子建立新聞文章的頭條。

以Textsum形式的Gigaword資料集(前兩個句子,頭條)訓練了400萬對之後,這已經展示出了良好的結果。 在訓練期間,它根據文章的前兩句優化了概要的可能性。 編碼層和語言模組是同時訓練。 為了生成概要,它搜尋所有可能概要的地方,以找到給定文章的最可能的單詞序列。

以下是用於訓練TextSum模型以及模型生成的概要的資料示例。

基於 Python 的自動文字提取:抽象法和生成法的比較

請注意“head”一詞不會出現在原始文字中。 該模型已生成它。 這在以上幾種的提取演算法中永遠不會發生。

我們運行了谷歌提供的Tensorflow網路並調整了一些超引數。 不幸的是,我們僅僅能在需要的時間內訓練模型10%,並獲得質量非常低的概要。 由於這個獲得的概要沒有任何意義,我們甚至無法使用上面的ROUGE和BLEU分數。

為了比較對神經網路架構的不同調整,我們不得不求助於使用適合訓練集“執行平均損失”的模型的數學測量。 可以在此要點中建立模型的平均執行損耗圖。

訓練了多少才算夠?

Tensorflow的作者建議實施培訓數百萬個時間步驟,以成功地在現他們的結果。 這意味著在啟用GPU的群集上需要為期數週的培訓時間。 谷歌自己使用10臺機器,每臺4個GPU,持續訓練一個周。 這相當於執行 GPU 7000個小時或3萬美元的AWS雲信用。 但是在我們的處理中,我們沒有這樣的硬體資源。

此外,Google TextSum作者使用Annotated English Gigaword資料集,且資料集需要3000美元的許可證。 因此,我們使用相對較小但免費的新聞文章資料集:CNN和DailyMail來代替Annotated English Gigaword資料集。 這些320k文章被轉換成Textsum相容格式和詞彙。 你可以通過github使用我們的程式碼生成你自己的TextSum相容的預處理CNN和DailyMail資料。

最初,使用預設引數的培訓是在NVIDIA GTX 950M膝上型電腦上完成的,但是即使在培訓超過48小時後演算法似乎也沒有收斂。 為了加快過程並生成有意義的概要,我們切換到配備NVIDIA K520 GPU的g2.2xlarge Amazon EC2裝置上。

 

注意

我們不充分訓練的TextSum模型生成的非常差的概要的一些示例。 這類似於在Pavel Surmenok的部落格中訓練TextSum的嘗試。

基於 Python 的自動文字提取:抽象法和生成法的比較

某些詞語在許多概要中,然而不考慮這些詞語是否出現在實際文章及其在測試集中的概要中,例如, “曼徹斯特聯合”和“曼徹斯特城市”這一短語在生成的概要中重複了很多次。

另一個觀察是,最初(global_steps

只有在50,000個時間步之後,損失(以及概要的語義質量)才有明顯的改善。在接近一天訓練了100,000個時間步長之後,我們觀察了質量 - 在這裡我們使用我們的主觀理解來判斷所述質量 – 概要總體上有所改善。即便如此,摘要顯然不符合標準。考慮到培訓時間,這是可以預期的。該模型的作者聲稱,如果使用者願意在所需時間和計算方面進行權衡,則可以獲得更好的結果。

 

總結

對於提取技術,我們的測量告訴我們:LexRank的表現稍優於Gensim的TextRank,但同時我們也觀察到TextRank能夠提供更高質量的概要。 我們認為這個使用的資料集會影響獲得的總結的質量。 一個好的做法是執行兩種演算法並使用其中一個能夠提供更令人滿意的概要的演算法。 未來的方向是將Gensim的TextRank實現與Paco Nathan的PyTextRank進行比較。

由於缺乏GPU資源和許多優化引數,我們結束了對抽象概括的研究,在這一點上我們無法絕對推斷該模型可以用作當前提取實現的替代方案。當然,人們總是可以嘗試在幾百萬(更多)時間步長內訓練模型並調整一些引數,以檢視結果在CNN-Dailymail資料集或其他資料集上是否變的更好。