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

luhn博士認為,文章的資訊都包含在句子中,有些句子包含的資訊多,有些句子包含的資訊少。"自動摘要"就是要找出那些包含資訊最多的句子。
句子的資訊量用"關鍵詞"來衡量。如果包含的關鍵詞越多,就說明這個句子越重要。luhn提出用"簇"(cluster)表示關鍵詞的聚集。所謂"簇"就是包含多個關鍵詞的句子片段。
上圖就是luhn原始論文的插圖,被框起來的部分就是一個"簇"。隻要關鍵詞之間的距離小于"門檻值",它們就被認為處于同一個簇之中。luhn建議的門檻值是4或5。也就是說,如果兩個關鍵詞之間有5個以上的其他詞,就可以把這兩個關鍵詞分在兩個簇。
下一步,對于每個簇,都計算它的重要性分值。
以前圖為例,其中的簇一共有7個詞,其中4個是關鍵詞。是以,它的重要性分值等于 ( 4 x 4 ) / 7 = 2.3。
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
(完)