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

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

今天,依然继续这个主题。讨论如何通过词频,对文章进行自动摘要(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的这种算法后来被简化,不再区分"簇",只考虑句子包含的关键词。下面就是一个例子(采用伪码表示),只考虑关键词首先出现的句子。

 
   1: Summarizer(originalText, maxSummarySize):
   2:     // 计算原始文本的词频,生成一个数组,比如[(10,'the'), (3,'language'), (8,'code')...]
   3:     wordFrequences = getWordCounts(originalText)
   4:     // 过滤掉停用词,数组变成[(3, 'language'), (8, 'code')...]
   5:     contentWordFrequences = filtStopWords(wordFrequences)
   6:     // 按照词频进行排序,数组变成['code', 'language'...]
   7:     contentWordsSortbyFreq = sortByFreqThenDropFreq(contentWordFrequences)
   8:     // 将文章分成句子
   9:     sentences = getSentences(originalText)
  10:     // 选择关键词首先出现的句子
  11:     setSummarySentences = {}
  12:     foreach word in contentWordsSortbyFreq:
  13:       firstMatchingSentence = search(sentences, word)
  14:       setSummarySentences.add(firstMatchingSentence)
  15:       if setSummarySentences.size() = maxSummarySize:
  16:         break
  17:     // 将选中的句子按照出现顺序,组成摘要
  18:     summary = ""
  19:     foreach sentence in sentences:
  20:       if sentence in setSummarySentences:
  21:         summary = summary + " " + sentence
  22:     return summary

 

类似的算法已经被写成了工具,比如基于Java的Classifier4J库的SimpleSummariser模块、基于C语言的OTS库、以及基于classifier4J的C#实现和python实现。

原文地址:

http://www.ruanyifeng.com/blog/2013/03/automatic_summarization.html

转载于:https://www.cnblogs.com/chaosimple/archive/2013/04/07/3005762.html

[转] TF-IDF与余弦相似性的应用(三):自动摘要相关推荐

  1. scitkit-learn:计算机科学论文的TF / IDF和余弦相似度

    几个月前,我下载了数千篇计算机科学论文的元数据,这样我就可以尝试编写一个迷你推荐引擎来告诉我接下来应该读什么论文. 由于我没有任何人可以阅读每篇论文的数据,因此排除了协作过滤方法,所以我认为我可以尝试 ...

  2. TF-IDF与余弦相似性的应用(一):自动提取关键词 - 阮一峰的网络日志

    TF-IDF与余弦相似性的应用(一):自动提取关键词 - 阮一峰的网络日志 TF-IDF与余弦相似性的应用(一):自动提取关键词 作者: 阮一峰 日期: 2013年3月15日 这个标题看上去好像很复杂 ...

  3. TF-IDF与余弦相似性的应用(一):自动提取关键词

    http://www.ruanyifeng.com/blog/2013/03/tf-idf.html 作者: 阮一峰 日期: 2013年3月15日 这个标题看上去好像很复杂,其实我要谈的是一个很简单的 ...

  4. 搜索引擎:文本分类——TF/IDF算法

    原理 TFIDF的主要思想是:如果某个词或短语在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类.TFIDF实际上是:TF * IDF,TF ...

  5. TF-IDF与余弦相似性的应用(二):找出相似文章

    FROM:http://www.ruanyifeng.com/blog/2013/03/cosine_similarity.html 作者: 阮一峰 日期: 2013年3月21日 上一次,我用TF-I ...

  6. 关键词提取算法—TF/IDF算法

    关键词提取算法一般可分为有监督学习和无监督学习两类. 有监督的关键词提取方法可以通过分类的方式进行,通过构建一个较为完善的词表,然后判断每个文档与词表中的每个词的匹配程度,以类似打标签的方式,达到关键 ...

  7. tf/idf_Neo4j:带密码的TF / IDF(和变体)

    tf/idf 几周前,我写了一篇博客文章,介绍了如何使用scikit-learn在HIMYM成绩单上运行TF / IDF,以按情节找到最重要的短语,然后我很好奇在Neo4j中很难做到. 我首先将Wik ...

  8. Neo4j:带密码的TF / IDF(和变体)

    几周前,我写了一篇博客文章,介绍了如何使用scikit-learn在HIMYM成绩单上运行TF / IDF,以按情节找到最重要的短语,然后我很好奇在Neo4j中很难做到. 我首先将Wikipedia的 ...

  9. 余弦相似度/卷积核之间的成对余弦相似性

    目录 定义: 例子: python函数计算余弦相似性 定义: 余弦距离,也称为余弦相似度,是用向量空间中两个向量之间的夹角余弦值作为衡量两个个体之间的差异大小的度量.(不难理解,余弦相似度就是基于两个 ...

  10. 基于余弦相似性的指纹匹配算法在WIFI室内定位上的应用(转)

    1.引言 "求孤的坐标-" "谁看到月明了?" "独嘉坐在哪里,我TT登陆不了!" "有人看到我的土豪金了么?" &qu ...

最新文章

  1. 【转载】 Python动态生成变量
  2. 语言模型也不能乱说话!DeepMind发布GopherCite:讲话必须带证据
  3. PowerPC VxWorks BSP分析7——image压缩
  4. 边缘计算将取代云计算?云计算前景与网络前景
  5. 直接内存访问(DMA)
  6. 多种方法教你破解电信共享上网的限制
  7. 正确关闭WCF代理对象
  8. Python 中的黑暗角落(三):模块与包
  9. Atitit.api参数传递的设计
  10. react native环境搭建的一些坑
  11. 【Java教程】Java 适配器模式
  12. LOIC低轨道粒离子炮QQ交流群
  13. 数据结构-顺序表基本操作-C语言代码
  14. 对赌协议里,隐藏了多少致命陷阱
  15. 吉他调音软件 android,吉他调音器专业版
  16. springboot启动原理及其流程
  17. 安卓游戏平台怎样对接游戏?
  18. Linux如何安装集群及细节操作
  19. intra-mart使用笔记
  20. 传统加密技术续-Hill Vigenere Vernam

热门文章

  1. 机器学习 | 算法笔记- 集成学习(Ensemble Learning)
  2. vue:在router里面给页面加title
  3. 4.12L.02_CT Makefile
  4. 01-UIScrollView01-大图片展示
  5. 详解数据治理相关的7个术语和名词
  6. 如何通过数据分析鉴别假微博大V?
  7. 一文看懂数据挖掘:哪一种方法最好?都需要哪些技术?
  8. 抖音封杀小猪佩奇,一年赚100亿的“社会人”得罪了谁?
  9. python之路day5_Python语言之python之路笔记day19
  10. Java 面试 80% 的人都会踩这些坑,你知道几种?