天天看点

TF-IDF与余弦相似性的应用(三):自动摘要

有时候,很简单的数学方法,就可以完成很复杂的任务。

TF-IDF与余弦相似性的应用(三):自动摘要

luhn博士认为,文章的信息都包含在句子中,有些句子包含的信息多,有些句子包含的信息少。"自动摘要"就是要找出那些包含信息最多的句子。

句子的信息量用"关键词"来衡量。如果包含的关键词越多,就说明这个句子越重要。luhn提出用"簇"(cluster)表示关键词的聚集。所谓"簇"就是包含多个关键词的句子片段。

TF-IDF与余弦相似性的应用(三):自动摘要

上图就是luhn原始论文的插图,被框起来的部分就是一个"簇"。只要关键词之间的距离小于"门槛值",它们就被认为处于同一个簇之中。luhn建议的门槛值是4或5。也就是说,如果两个关键词之间有5个以上的其他词,就可以把这两个关键词分在两个簇。

下一步,对于每个簇,都计算它的重要性分值。

TF-IDF与余弦相似性的应用(三):自动摘要

以前图为例,其中的簇一共有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

(完)

继续阅读