文档章节

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

Airship
 Airship
发布于 2017/08/18 22:42
字数 1094
阅读 8
收藏 0

作者: 阮一峰

日期: 2013年3月26日

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

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

今天,依然继续这个主题。讨论如何通过词频,对文章进行自动摘要(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实现

(完)

文档信息

珠峰培训

stuQ

相关文章

  • 2017.08.02: 正态分布为什么常见?

    统计学里面,正态分布(normal distribution)最常见。男女身高、寿命、血压、考试成绩、测量误差等等,都属于正态分布。

  • 2017.07.13: 神经网络入门

    眼下最热门的技术,绝对是人工智能。

  • 2016.07.22: 如何识别图像边缘?

    图像识别(image recognition)是现在的热门技术。

  • 2015.09.01: 理解矩阵乘法

    大多数人在高中,或者大学低年级,都上过一门课《线性代数》。这门课其实是教矩阵。

本文转载自:http://www.ruanyifeng.com/blog/2013/03/automatic_summarization.html

Airship
粉丝 46
博文 1070
码字总数 21664
作品 0
南京
高级程序员
私信 提问
TF-IDF与余弦相似性

TF-IDF算法 将"词频"(TF)和"逆文档频率"(IDF)这两个值相乘,就得到了一个词的TF-IDF值。某个词对文章的重要性越高,它的TF-IDF值就越大。所以,排在最前面的几个词,就是这篇文章的关键词...

Nob
2015/03/07
143
0
余弦定理的应用:基于文字的文本相似度计算

最近由于工作项目,需要判断两个txt文本是否相似,于是开始在网上找资料研究,因为在程序中会把文本转换成String再做比较,所以最开始找到了这篇关于 距离编辑算法 Blog写的非常好,受益匪浅...

大数据之路
2013/03/24
4.4K
5
TF-IDF与余弦相似性的应用(二):找出相似文章

上一次,我用TF-IDF算法自动提取关键词。 今天,我们再来研究另一个相关的问题。有些时候,除了找到关键词,我们还希望找到与原文章相似的其他文章。比如,"Google新闻"在主新闻下方,还提供...

阮一峰
2013/03/21
0
0
TF-IDF与余弦相似性的应用

阮一峰老师的博客写的相当详细了,非常佩服,在这里记录一下链接 一):自动提取关键词 url: http://www.ruanyifeng.com/blog/2013/03/tf-idf.html 笔记: 分母+1目的是防止所有文档都不包含...

技术mix呢
2017/11/14
0
0
TF-IDF与余弦相似性的应用(二):找出相似文章

转自:http://www.ruanyifeng.com/blog/2013/03/cosine_similarity.html 上一次,我用 TF-IDF 算法自动提取关键词。 今天,我们再来研究另一个相关的问题。有些时候,除了找到关键词,我们还...

泳泳啊泳泳
2018/01/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Qt编写自定义控件69-代码行数统计

一、前言 代码行数统计主要用来统计项目中的所有文件的代码行数,其中包括空行、注释行、代码行,可以指定过滤拓展名,比如只想统计.cpp的文件,也可以指定文件或者指定目录进行统计。写完这...

飞扬青云
33分钟前
8
0
驰骋工作流引擎-ccflow关于 “ 是否自动计算未来的处理人”的功能变更

关键字:流程未来节点处理人 工作流快速开发平台 工作流流设计 业务流程管理 asp.net 开源工作流 业务背景:一个流程在启动起来后,是可以对一些节点计算出来处理人是谁,流程的走向。对于另...

孟娟
49分钟前
5
0
IT兄弟连 HTML5教程 HTML5表单 HTML表单设计1

表单是PHP程序中最常使用的收集站点访问者信息的数据输入界面。通过表单浏览器获取用户的输入数据,并传送给Web服务器的脚本程序中,以各种不同的方式进行处理。在表单中提供了多种输入方式,...

老码农的一亩三分地
50分钟前
4
0
武者Vue

本文转载于:专业的前端网站➼武者Vue 1 - Introduction2 - The Vue Instance3 - Data & Methods4 - Data Binding5 - Events6 - Event Modifiers7 - Keyboard Events8 - Two-Way Data......

前端老手
56分钟前
6
0
uni app 零基础小白到项目实战

$emit 子组件传给父组件$ref 父组件操作子组件 公用模板 uni-app全局变量的几种实现方法 const websiteUrl = 'http'const now = Date.now || function() { return new Date().getTime......

达达前端小酒馆
今天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部