TF-IDF與余弦相似性的應用(三):自動摘要

jopen 11年前發布 | 11K 次閱讀 算法

        有時候,很簡單的數學方法,就可以完成很復雜的任務。

        這個系列的前兩部分就是很好的例子。僅僅依靠統計詞頻,就能找出關鍵詞相似文章。雖然它們算不上效果最好的方法,但肯定是最簡便易行的方法。

        今天,依然繼續這個主題。討論如何通過詞頻,對文章進行自動摘要(Automatic summarization)。

TF-IDF與余弦相似性的應用(三):自動摘要

        如果能從 3000 字的文章,提煉出 150 字的摘要,就可以為讀者節省大量閱讀時間。由人完成的摘要叫"人工摘要",由機器完成的就叫"自動摘要"。許多網站都需要它,比如論文網站、新聞網站、搜索引擎等等。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)表示關鍵詞的聚集。所謂"簇"就是包含多個關鍵詞的句子片段。

TF-IDF與余弦相似性的應用(三):自動摘要

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

        下一步,對于每個簇,都計算它的重要性分值。

TF-IDF與余弦相似性的應用(三):自動摘要

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

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

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

Summarizer (originalText, maxSummarySize):

// 第一步,計算原始文本的詞頻,生成一個數組,比如[(10,'the'), (3,'language'), (8,'code')...]

wordFrequences = getWordCounts (originalText)

// 過濾掉停用詞,數組變成[(3, 'language'), (8, 'code')...]

contentWordFrequences = filtStopWords (wordFrequences)

// 按照詞頻進行排序,數組變成['code', 'language'...]

contentWordsSortbyFreq = sortByFreqThenDropFreq (contentWordFrequences)

// 將文章分成句子

sentences = getSentences (originalText)

// 選擇關鍵詞首先出現的句子

setSummarySentences = {}

foreach word in contentWordsSortbyFreq:

firstMatchingSentence = search (sentences, word)

setSummarySentences.add (firstMatchingSentence)

if setSummarySentences.size () = maxSummarySize:

break

// 將選中的句子按照出現順序,組成摘要

summary = ""

foreach sentence in sentences:

if sentence in setSummarySentences:

summary = summary + " " + sentence

return summary

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

        (完)

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!