當前位置:
首頁 > 知識 > 使用Python自動提取內容摘要

使用Python自動提取內容摘要

點擊上方

Python開發

」,選擇「置頂公眾號」


關鍵時刻,第一時間送達!



利用計算機將大量的文本進行處理,產生簡潔、精鍊內容的過程就是文本摘要,人們可通過閱讀摘要來把握文本主要內容,這不僅大大節省時間,更提高閱讀效率。但人工摘要耗時又耗力,已不能滿足日益增長的信息需求,因此藉助計算機進行文本處理的自動文摘應運而生。近年來,自動摘要、信息檢索、信息過濾、機器識別、等研究已成為了人們關注的熱點。


自動摘要(Automatic Summarization)的方法主要有兩種:Extraction 和 Abstraction。其中 Extraction 是抽取式自動文摘方法,通過提取文檔中已存在的關鍵詞,句子形成摘要;Abstraction 是生成式自動文摘方法,通過建立抽象的語意表示,使用自然語言生成技術,形成摘要。由於自動摘要方法需要複雜的自然語言理解和生成技術支持,應用領域受限。,抽取式摘要成為現階段主流,它也能在很大程度上滿足人們對摘要的需求。

目前抽取式的主要方法:




  • 基於統計:統計詞頻,位置等信息,計算句子權值,再簡選取權值高的句子作為文摘,特點:簡單易用,但對詞句的使用大多僅停留在表面信息。



  • 基於圖模型:構建拓撲結構圖,對詞句進行排序。例如,TextRank/LexRank



  • 基於潛在語義:使用主題模型,挖掘詞句隱藏信息。例如,採用 LDA,HMM



  • 基於線路規劃:將摘要問題轉為線路規劃,求全局最優解。


2007 年,美國學者的論文 《A Survey on Automatic Text Summarization》(Dipanjan Das, Andre F.T. Martins, 2007)總結了目前的自動摘要演算法。其中,很重要的一種就是詞頻統計。這種方法最早出自 1958 年的 IBM 公司科學家 H.P. Luhn 的論文 《The Automatic Creation of Literature Abstracts》。


Luhn 博士認為,文章的信息都包含在句子中,有些句子包含的信息多,有些句子包含的信息少。"自動摘要"就是要找出那些包含信息最多的句子。句子的信息量用"關鍵詞"來衡量。如果包含的關鍵詞越多,就說明這個句子越重要。Luhn 提出用"簇"(cluster)表示關鍵詞的聚集。所謂"簇"就是包含多個關鍵詞的句子片段。



上圖就是 Luhn 原始論文的插圖,被框起來的部分就是一個"簇"。只要關鍵詞之間的距離小於"門檻值",它們就被認為處於同一個簇之中。Luhn 建議的門檻值是 4 或 5。也就是說,如果兩個關鍵詞之間有 5 個以上的其他詞,就可以把這兩個關鍵詞分在兩個簇。下一步,對於每個簇,都計算它的重要性分值。


以上圖為例,其中的簇一共有 7 個詞,其中 4 個是關鍵詞。因此,它的重要性分值等於 ( 4 x 4 ) / 7 = 2.3。


然後,找出包含分值最高的簇的句子(比如 5 句),把它們合在一起,就構成了這篇文章的自動摘要。具體實現可以參見 《Mining the Social Web: Analyzing Data from Facebook, Twitter, LinkedIn, and Other Social Media Sites》(O"Reilly, 2011)一書的第 8 章,python 代碼見 github。


Luhn 的這種演算法後來被簡化,不再區分"簇",只考慮句子包含的關鍵詞。下面就是一個例子(採用偽碼錶示),只考慮關鍵詞首先出現的句子。


類似的演算法已經被寫成了工具,比如基於 Java 的 Classifier4J庫的 SimpleSummariser模塊、基於 C 語言的 OTS庫、以及基於 classifier4J 的 C#實現和 python 實現。


參考文章:




  • http://www.ruanyifeng.com/blog/2013/03/automatic_summarization.html



  • http://joshbohde.com/blog/document-summarization


TextTeaser


TextTeaser 原本是為在線長文章(所謂 tl;dr:too long; didn"t read)自動生成摘要的服務,其原本的收費標準是每摘要 1000 篇文章付費 12 美元或每月 250 美元。巴爾賓稱 TextTeaser 可以為任何使用羅馬字母的文本進行摘要,而且比同類工具如 Cruxbot 和 Summly(在 2013 年 3 月被 雅虎斥資 3000 萬美元收購)更準確。其創造者霍洛?巴爾賓(Jolo Balbin)表示,在"發現一些擴展問題,特別是 API 中的問題後",他決定將 TextTeaser 代碼開源。


TextTeaser 開源的代碼一共有三個 class,TextTeaser,Parser,Summarizer。



  • TextTeaser,程序入口類。給定待摘要的文本和文本題目,輸出文本摘要,默認是原文中最重要的 5 句話。



  • Summarizer,生成摘要類。計算出每句話的分數,並按照得分做排序,然後按照原文中句子的順序依次輸出得分最高的 5 句話作為摘要。



  • Parser,文本解析類。對文本進行去除停用詞、去除標點符號、分詞、統計詞頻等一些預處理操作。


其中打分模型分為四部分:




  • 句子長度,長度為 20 的句子為最理想的長度,依照距離這個長度來打分。



  • 句子位置,根據句子在全文中的位置,給出分數。(巴爾賓認為一篇文章的第二句比第一句更重要,因為很多作家都習慣到第二句話引入關鍵點)備註:用段落效果會怎樣?



  • 文章標題與文章內容的關係,句子是否包含標題詞,根據句子中包含標題詞的多少來打分。



  • 句子關鍵詞打分,文本進行預處理之後,按照詞頻統計出排名前 10 的關鍵詞,通過比較句子中包含關鍵詞的情況,以及關鍵詞分布的情況來打分(sbs,dbs 兩個函數)。


開源版本:




  • Scala 版本:https://github.com/MojoJolo/textteaser



  • Python 版本:https://github.com/DataTeaser/textteaser


自己嘗試這個調用 Python 版本。主要:不要使用 pip install textteaser 進行安裝,該安裝方式安裝的是這個項目:


https://github.com/jgoettsch/py-textteaser,該項目並非演算法實現,而是 API 實現。直接下載代碼即可:https://github.com/DataTeaser/textteaser


下載完成後在 Windows 下運營 test.py 會報錯,報錯信息如下:

  1. Traceback

    (

    most recent call last

    ):

  2.   

    File

    "D:/textteaser/test.py"

    ,

    line

    12

    ,

    in

    <

    module

    >

  3.     sentences

    =

    tt

    .

    summarize

    (

    title

    ,

    text

    )

  4.   

    File

    "D:textteasertextteaser__init__.py"

    ,

    line

    13

    ,

    in

    summarize

  5.     result

    =

    self

    .

    summarizer

    .

    summarize

    (

    text

    ,

    title

    ,

    source

    ,

    category

    )

  6.   

    File

    "D:textteasertextteasersummarizer.py"

    ,

    line

    11

    ,

    in

    summarize

  7.     sentences

    =

    self

    .

    parser

    .

    splitSentences

    (

    text

    )

  8.   

    File

    "D:textteasertextteaserparser.py"

    ,

    line

    62

    ,

    in

    splitSentences

  9.     tokenizer

    =

    nltk

    .

    data

    .

    load

    (

    "file:"

    os

    .

    path

    .

    dirname

    (

    os

    .

    path

    .

    abspath

    (

    __file__

    ))

    "/trainer/english.pickle"

    )

  10.   

    File

    "C:Python27libsite-packagesnltkdata.py"

    ,

    line

    806

    ,

    in

    load

  11.     resource_val

    =

    pickle

    .

    load

    (

    opened_resource

    )

  12. ImportError

    :

    No

    module named copy_reg


針對報錯信息,做如下修改:


1、將"D:textteasertextteaserparser.py"第 62 行進行修改:

  1. #tokenizer = nltk.data.load("file:" os.path.dirname(os.path.abspath(__file__)) "/trainer/english.pickle")

  2. tokenizer

    =

    nltk

    .

    data

    .

    load

    (

    "file:"

    os

    .

    path

    .

    dirname

    (

    os

    .

    path

    .

    abspath

    (

    __file__

    ))

    os

    .

    sep

    "trainer"

    os

    .

    sep

    "english.pickle"

    )


2、找到"Libsite-packagesnltkdata.py"第 924 行,將

  1.    

    return

    find

    (

    path_

    ,

    [

    ""

    ]).

    open

    ()


修改為:

  1.     file_path

    =

    find

    (

    path_

    ,

    [

    ""

    ])

  2.     data

    =

    open

    (

    file_path

    ,

    "rb"

    ).

    read

    ()

  3.     newdata

    =

    data

    .

    replace

    (

    "rn"

    ,

    "n"

    )

  4.     

    if

    newdata

    !=

    data

    :

  5.         f

    =

    open

    (

    file_path

    ,

    "wb"

    )

  6.         f

    .

    write

    (

    newdata

    )

  7.         f

    .

    close

    ()

  8.     f

    =

    open

    (

    file_path

    ,

    "rb"

    )

  9.     

    return

    f


注意:TextTeaser 目前只支持英文摘要。


TextRank


TextRank 演算法是一種用於文本的基於圖的排序演算法。其基本思想來源於谷歌的 PageRank 演算法, 通過把文本分割成若干組成單元(單詞、句子) 並建立圖模型, 利用投票機制對文本中的重要成分進行排序, 僅利用單篇文檔本身的信息即可實現關鍵詞提取、文摘。和 LDA、HMM 等模型不同, TextRank 不需要事先對多篇文檔進行學習訓練, 因其簡潔有效而得到廣泛應用。


TextRank 一般模型可以表示為一個有向有權圖 G =(V, E), 由點集合 V 和邊集合 E 組成, E 是 V ×V 的子集。圖中任兩點 Vi , Vj 之間邊的權重為 wji , 對於一個給定的點 Vi, In(Vi) 為 指 向 該 點 的 點 集 合 , Out(Vi) 為點 Vi 指向的點集合。點 Vi 的得分定義如下:



其中, d 為阻尼係數, 取值範圍為 0 到 1, 代表從圖中某一特定點指向其他任意點的概率, 一般取值為 0.85。使用 TextRank 演算法計算圖中各點的得分時, 需要給圖中的點指定任意的初值, 並遞歸計算直到收斂, 即圖中任意一點的誤差率小於給定的極限值時就可以達到收斂, 一般該極限值取 0.0001。


基於 TextRank 的關鍵詞提取


關鍵詞抽取的任務就是從一段給定的文本中自動抽取出若干有意義的詞語或片語。TextRank 演算法是利用局部辭彙之間關係(共現窗口)對後續關鍵詞進行排序,直接從文本本身抽取。其主要步驟如下:




  1. 把給定的文本 T 按照完整句子進行分割,



  2. 對於每個句子,進行分詞和詞性標註處理,並過濾掉停用詞,只保留指定詞性的單詞,如名詞、動詞、形容詞,其中是保留後的候選關鍵詞。



  3. 構建候選關鍵詞圖 G = (V,E),其中 V 為節點集,由 2 生成的候選關鍵片語成,然後採用共現關係(co-occurrence)構造任兩點之間的邊,兩個節點之間存在邊僅當它們對應的辭彙在長度為 K 的窗口中共現,K 表示窗口大小,即最多共現 K 個單詞。



  4. 根據上面公式,迭代傳播各節點的權重,直至收斂。



  5. 對節點權重進行倒序排序,從而得到最重要的 T 個單詞,作為候選關鍵詞。



  6. 由 5 得到最重要的 T 個單詞,在原始文本中進行標記,若形成相鄰片語,則組合成多詞關鍵詞。例如,文本中有句子"Matlab code for plotting ambiguity function",如果"Matlab"和"code"均屬於候選關鍵詞,則組合成"Matlab code"加入關鍵詞序列。


基於 TextRank 的自動文摘


基於 TextRank 的自動文摘屬於自動摘錄,通過選取文本中重要度較高的句子形成文摘,其主要步驟如下:




  1. 預處理:將輸入的文本或文本集的內容分割成句子得,構建圖 G =(V,E),其中 V 為句子集,對句子進行分詞、去除停止詞,得,其中是保留後的候選關鍵詞。



  2. 句子相似度計算:構建圖 G 中的邊集 E,基於句子間的內容覆蓋率,給定兩個句子,採用如下公式進行計算:


    若兩個句子之間的相似度大於給定的閾值,就認為這兩個句子語義相關並將它們連接起來,即邊的權值:



  3. 句子權重計算:根據公式,迭代傳播權重計算各句子的得分;



  4. 抽取文摘句:將 3 得到的句子得分進行倒序排序,抽取重要度最高的 T 個句子作為候選文摘句。



  5. 形成文摘:根據字數或句子數要求,從候選文摘句中抽取句子組成文摘。


參考資料:




  • https://github.com/letiantian/TextRank4ZH



  • https://github.com/chenbjin/ASExtractor


玻森自動摘要


玻森採用的是最大邊緣相關模型(Maximal Marginal Relevance)的一個變種。MMR 是無監督學習模型,它的提出是為了提高信息檢索(Information Retrieval)系統的表現。例如搜索引擎就是目前大家最常用的信息檢索系統。大家可能經常會碰到,對於我們輸入的一個關鍵詞,搜索引擎通常會給出重複的或者內容太接近的檢索的情況。為了避免這個現象,搜索引擎可以通過 MMR 來增加內容的多樣性,給出多方面考慮的檢索結果,以此來提高表現。這樣的思想是可以被借鑒用來做摘要的,因為它是符合摘要的基本要求的,即權衡相關性和多樣性。不難理解,摘要結果與原文的相關性越高,它就接近全文中心意思。而考慮多樣性則使得摘要內容更加的全面。非常的直觀和簡單是該模型的一個優點。


相比於其他無監督學習方法,如 TextRank(TR), PageRank(PR)等,MMR 是考慮了信息的多樣性來避免重複結果。TR,PR 是基於圖(Graph)的學習方法,每個句子看成點,每兩個點之間都有一條帶權重(Weighted)的無向邊。邊的權重隱式定義了不同句子間的遊走概率。這些方法把做摘要的問題看成隨機遊走來找出穩態分布(Stable Distribution)下的高概率(重要)的句子集,但缺點之一便是無法避免選出來的句子相互之間的相似度極高的現象。而 MMR 方法可以較好地解決句子選擇多樣性的問題。具體地說,在 MMR 模型中,同時將相關性和多樣性進行衡量。因此,可以方便的調節相關性和多樣性的權重來滿足偏向"需要相似的內容"或者偏向"需要不同方面的內容"的要求。對於相關性和多樣性的具體評估,玻森是通過定義句子之間的語義相似度實現。句子相似度越高,則相關性越高而多樣性越低。


自動摘要的核心便是要從原文句子中選一個句子集合,使得該集合在相關性與多樣性的評測標準下,得分最高。數學表達式如下:



需要注意的是,D,Q,R,S 都為句子集,其中,D 表示當前文章,Q 表示當前中心意思,R 表示當前非摘要,S 表示當前摘要。可以看出,在給定句子相似度的情況下,上述 MMR 的求解為一個標準的最優化問題。但是,上述無監督學習的 MMR 所得摘要準確性較低,因為全文的結構信息難以被建模,如段落首句應當有更高的權重等。為了提高新聞自動摘要的表現,玻森在模型中加入了全文結構特徵,將 MMR 改為有監督學習方法。從而模型便可以通過訓練從"標準摘要"中學習特徵以提高準確性。


玻森採用摘要公認的 Bi-gram ROUGE F1 方法來判斷自動生成的摘要和"標準摘要"的接近程度。經過訓練,玻森在訓練數集上的表現相對於未學習的摘要結果有了明顯的提升——訓練後的摘要系統 F1 提高了 30%。值得一提的是,在特徵訓練中,為了改善摘要結果的可讀性,玻森加指代關係特徵,使得模型表現提高了 8%。


相關鏈接:




  • http://bosonnlp.com/



  • http://docs.bosonnlp.com/summary.html


其他相關開源項目




  • https://github.com/isnowfy/snownlp



  • https://github.com/jannson/yaha



  • https://github.com/miso-belica/sumy





  • 作者:標點符



  • https://www.biaodianfu.com/automatic-text-summarizer.html



  • Python開發整理髮布,轉載請聯繫作者獲得授權


【點擊成為Android大神】

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Python開發 的精彩文章:

怎樣用Python給寶寶取個好名字?
如果編程語言是飛機

TAG:Python開發 |