1. 程式人生 > 實用技巧 >關於文件檢索03

關於文件檢索03

通過詞頻,對文章進行自動摘要(Automatic summarization)

摘要呢分為人工摘要和自動摘要。自動摘要呢,就是要找到那些包含資訊最多的句子。有些句子包含資訊多,有些句子包含資訊少,自動摘要就是要找到那些包含資訊最多的句子。

句子資訊用關鍵詞來衡量。如果包含的關鍵詞越多,就說明這個句子越重要。有一個概念呢,就是用簇cluster表示關鍵詞的聚集。所謂的簇就是包含多個關鍵詞的句子片段。

當然了,我們稱被框起來的部分是一個簇,只要管家此的距離小於門檻值,他們就被認為處於同一個簇之中,專家的建議門檻是4或5.也就是說兩個關鍵詞之間有5個以上的其他詞,就可以把兩個關鍵詞分在兩個簇。

在對每一個簇,都計算他的重要性分值

下以這個圖為例有

其中的簇一共有7個詞,其中4個是關鍵詞。因此,它的重要性分值等於 ( 4 x 4 ) / 7 = 2.3。然後,找出包含分值最高的簇的句子(比如5句),把它們合在一起,就構成了這篇文章的自動摘要。

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

虛擬碼中貌似沒有考慮句子重複的問題。