专栏首页阮一峰的网络日志TF-IDF与余弦相似性的应用(三):自动摘要

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

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

这个系列的前两部分就是很好的例子。仅仅依靠统计词频,就能找出关键词相似文章。虽然它们算不上效果最好的方法,但肯定是最简便易行的方法。

今天,依然继续这个主题。讨论如何通过词频,对文章进行自动摘要(Automatic summarization)。

如果能从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)表示关键词的聚集。所谓"簇"就是包含多个关键词的句子片段。

上图就是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的这种算法后来被简化,不再区分"簇",只考虑句子包含的关键词。下面就是一个例子(采用伪码表示),只考虑关键词首先出现的句子。

  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实现

(完)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Node 调试工具入门教程

    JavaScript 程序越来越复杂,调试工具的重要性日益凸显。客户端脚本有浏览器,Node 脚本怎么调试呢? ? 2016年,Node 决定将 Chrome ...

    ruanyf
  • 用Javascript获取页面元素的位置

    制作网页的过程中,你有时候需要知道某个元素在网页上的确切位置。 下面的教程总结了Javascript在网页定位方面的相关知识。 一、网页的大小和浏览器窗口的大小...

    ruanyf
  • 每周分享第 31 期

    欢迎投稿,请前往 GitHub 的 ruanyf/weekly 提交 issue。

    ruanyf
  • 谭安林:大数据在智能外呼系统的应用

    商业是一个价值交换的事情,并不是一个等价交换的事情,我们因为信息不对称,很有可能导致一些效应:赢者通吃。大家买一个什么东西,可能比较关注的是市场知名度比较高的,...

    云加社区技术沙龙
  • PHP生成二维码

    刚把手头的工作忙完.也是来总结下吧.这几天涉及到了一个需求.需要生成邀请一个二维码.

    桑先生
  • 网站SEO关键词布局核心优化策略

    随着互联网的高速发展,越来越多的企业认识到了SEO优化对于品牌推广的重要性,作为一名合格的SEO站长,网站关键词排名上升是我们坚持不懈的驱动力。虽然说现在找一个...

    阿南SEO
  • 关键字的优化需要注意什么?

    网站关键字可以带来更多的流量到您的网站,可以带来更好的排名为你的网站在搜索引擎。随着互联网科技的不断发展,我们在我们的日常生活中发现,在网络中起着非常重要的作用...

    申霖
  • numpy.argmax

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

    于小勇
  • 凌乱的物联网

    “智能”烤面包机的破坏程度有多大? 很大,而不仅仅是烧你的面包。 ? 一开始,互联网上的设备很有趣。我最喜欢的是卡内基 - 梅隆的计算机科学系可乐机。从20世纪...

    首席架构师智库
  • 茶馆专用小程序,掌柜们了解一下?

    去茶馆喝喝茶一直是追求生活品质的同仁们比较追捧的,不管是现在还是古代都是如此,而且茶馆的装修多是古色古香居多,但是我们生活习惯演变的非常快,借助移动互联网这班快...

    微盛企微管家

扫码关注云+社区

领取腾讯云代金券