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

简介:

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

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

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

今天,依然继续这个主题。讨论如何通过词频,对文章进行自动摘要(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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<blockquote>  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实现

目录
相关文章
|
5月前
文档的词频-反向文档频率(TF-IDF)计算
文档的词频-反向文档频率(TF-IDF)计算
40 5
|
3月前
HanLP — HMM隐马尔可夫模型 -- 训练--归一化,计算概率
HanLP — HMM隐马尔可夫模型 -- 训练--归一化,计算概率
44 0
|
6月前
|
机器学习/深度学习 自然语言处理 算法
基于TF-IDF+KMeans聚类算法构建中文文本分类模型(附案例实战)
基于TF-IDF+KMeans聚类算法构建中文文本分类模型(附案例实战)
471 1
|
6月前
TF-IDF 怎样将用单词权重的向量表示一个文档
TF-IDF 怎样将用单词权重的向量表示一个文档
57 1
|
算法 Windows
【文本分类】基于类信息的TF-IDF权重分析与改进
【文本分类】基于类信息的TF-IDF权重分析与改进
351 0
【文本分类】基于类信息的TF-IDF权重分析与改进
|
算法 数据挖掘 Linux
【文本分类】采用同义词的改进TF-IDF权重的文本分类
【文本分类】采用同义词的改进TF-IDF权重的文本分类
119 0
【文本分类】采用同义词的改进TF-IDF权重的文本分类
|
机器学习/深度学习 自然语言处理 数据处理
基于TF-IDF与逻辑回归模型实现文本实体关系抽取任务
基于TF-IDF与逻辑回归模型实现文本实体关系抽取任务
168 0
基于TF-IDF与逻辑回归模型实现文本实体关系抽取任务
TF-IDF及相似度计算
TF-IDF:衡量某个词对文章的重要性由TF和IDF组成 TF:词频(因素:某词在同一文章中出现次数) IDF:反文档频率(因素:某词是否在不同文章中出现) TF-IDF = TF*IDF TF :一个单词在一篇文章出现次数越多越重要 IDF: 每篇文章都出现的单词(如的,你,我,他) ,越不重要
392 0
TF-IDF及相似度计算
|
搜索推荐 索引
空间向量模型和tf-idf
空间向量模型和tf-idf
355 0
空间向量模型和tf-idf
|
机器学习/深度学习 算法 数据可视化
TF之LSTM:利用基于顺序的LSTM回归算法对DIY数据集sin曲线(蓝虚)预测cos(红实)(TensorBoard可视化)
TF之LSTM:利用基于顺序的LSTM回归算法对DIY数据集sin曲线(蓝虚)预测cos(红实)(TensorBoard可视化)
TF之LSTM:利用基于顺序的LSTM回归算法对DIY数据集sin曲线(蓝虚)预测cos(红实)(TensorBoard可视化)