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


Posted in Python onDecember 21, 2017

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

这个标题看上去好像很复杂,其实我要谈的是一个很简单的问题。

有一篇很长的文章,我要用计算机提取它的关键词(Automatic Keyphrase extraction),完全不加以人工干预,请问怎样才能正确做到?

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

这个问题涉及到数据挖掘、文本处理、信息检索等很多计算机前沿领域,但是出乎意料的是,有一个非常简单的经典算法,可以给出令人相当满意的结果。它简单到都不需要高等数学,普通人只用10分钟就可以理解,这就是我今天想要介绍的TF-IDF算法。

让我们从一个实例开始讲起。假定现在有一篇长文《中国的蜜蜂养殖》,我们准备用计算机提取它的关键词。

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

一个容易想到的思路,就是找到出现次数最多的词。如果某个词很重要,它应该在这篇文章中多次出现。于是,我们进行"词频"(Term Frequency,缩写为TF)统计。

结果你肯定猜到了,出现次数最多的词是----"的"、"是"、"在"----这一类最常用的词。它们叫做"停用词"(stop words),表示对找到结果毫无帮助、必须过滤掉的词。

假设我们把它们都过滤掉了,只考虑剩下的有实际意义的词。这样又会遇到了另一个问题,我们可能发现"中国"、"蜜蜂"、"养殖"这三个词的出现次数一样多。这是不是意味着,作为关键词,它们的重要性是一样的?

显然不是这样。因为"中国"是很常见的词,相对而言,"蜜蜂"和"养殖"不那么常见。如果这三个词在一篇文章的出现次数一样多,有理由认为,"蜜蜂"和"养殖"的重要程度要大于"中国",也就是说,在关键词排序上面,"蜜蜂"和"养殖"应该排在"中国"的前面。

所以,我们需要一个重要性调整系数,衡量一个词是不是常见词。如果某个词比较少见,但是它在这篇文章中多次出现,那么它很可能就反映了这篇文章的特性,正是我们所需要的关键词。

用统计学语言表达,就是在词频的基础上,要对每个词分配一个"重要性"权重。最常见的词("的"、"是"、"在")给予最小的权重,较常见的词("中国")给予较小的权重,较少见的词("蜜蜂"、"养殖")给予较大的权重。这个权重叫做"逆文档频率"(Inverse Document Frequency,缩写为IDF),它的大小与一个词的常见程度成反比。

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

下面就是这个算法的细节。

第一步,计算词频。

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

考虑到文章有长短之分,为了便于不同文章的比较,进行"词频"标准化。

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

或者

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

第二步,计算逆文档频率。

这时,需要一个语料库(corpus),用来模拟语言的使用环境。

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

如果一个词越常见,那么分母就越大,逆文档频率就越小越接近0。分母之所以要加1,是为了避免分母为0(即所有文档都不包含该词)。log表示对得到的值取对数。

第三步,计算TF-IDF。

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

可以看到,TF-IDF与一个词在文档中的出现次数成正比,与该词在整个语言中的出现次数成反比。所以,自动提取关键词的算法就很清楚了,就是计算出文档的每个词的TF-IDF值,然后按降序排列,取排在最前面的几个词。

还是以《中国的蜜蜂养殖》为例,假定该文长度为1000个词,"中国"、"蜜蜂"、"养殖"各出现20次,则这三个词的"词频"(TF)都为0.02。然后,搜索Google发现,包含"的"字的网页共有250亿张,假定这就是中文网页总数。包含"中国"的网页共有62.3亿张,包含"蜜蜂"的网页为0.484亿张,包含"养殖"的网页为0.973亿张。则它们的逆文档频率(IDF)和TF-IDF如下:

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

从上表可见,"蜜蜂"的TF-IDF值最高,"养殖"其次,"中国"最低。(如果还计算"的"字的TF-IDF,那将是一个极其接近0的值。)所以,如果只选择一个词,"蜜蜂"就是这篇文章的关键词。

除了自动提取关键词,TF-IDF算法还可以用于许多别的地方。比如,信息检索时,对于每个文档,都可以分别计算一组搜索词("中国"、"蜜蜂"、"养殖")的TF-IDF,将它们相加,就可以得到整个文档的TF-IDF。这个值最高的文档就是与搜索词最相关的文档。

TF-IDF算法的优点是简单快速,结果比较符合实际情况。缺点是,单纯以"词频"衡量一个词的重要性,不够全面,有时重要的词可能出现次数并不多。而且,这种算法无法体现词的位置信息,出现位置靠前的词与出现位置靠后的词,都被视为重要性相同,这是不正确的。(一种解决方法是,对全文的第一段和每一段的第一句话,给予较大的权重。)

下一次,我将用TF-IDF结合余弦相似性,衡量文档之间的相似程度。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
跟老齐学Python之使用Python操作数据库(1)
Nov 25 Python
在Python中marshal对象序列化的相关知识
Jul 01 Python
Python编程实现及时获取新邮件的方法示例
Aug 10 Python
Python 3实战爬虫之爬取京东图书的图片详解
Oct 09 Python
Python编程实现从字典中提取子集的方法分析
Feb 09 Python
pyspark.sql.DataFrame与pandas.DataFrame之间的相互转换实例
Aug 02 Python
Python实现随机创建电话号码的方法示例
Dec 07 Python
Pytorch 抽取vgg各层并进行定制化处理的方法
Aug 20 Python
Python使用Tkinter实现转盘抽奖器的步骤详解
Jan 06 Python
python使用梯度下降和牛顿法寻找Rosenbrock函数最小值实例
Apr 02 Python
Python引入多个模块及包的概念过程解析
Sep 21 Python
Pytorch中的学习率衰减及其用法详解
Jun 05 Python
基于Python的文件类型和字符串详解
Dec 21 #Python
Python绘制七段数码管实例代码
Dec 20 #Python
python代码实现ID3决策树算法
Dec 20 #Python
python决策树之CART分类回归树详解
Dec 20 #Python
python中文乱码不着急,先看懂字节和字符
Dec 20 #Python
python决策树之C4.5算法详解
Dec 20 #Python
python 3.6 +pyMysql 操作mysql数据库(实例讲解)
Dec 20 #Python
You might like
PHP大批量数据操作时临时调整内存与执行时间的方法
2011/04/20 PHP
php笔记之:数据类型与常量的使用分析
2013/05/14 PHP
PHP查询并删除数据库多列重复数据的方法(利用数组函数实现)
2016/02/23 PHP
PHP 数组遍历foreach语法结构及实例
2016/06/13 PHP
浅谈Laravel队列实现原理解决问题记录
2017/08/19 PHP
javascript动画对象支持加速、减速、缓入、缓出的实现代码
2012/09/30 Javascript
extjs4 treepanel动态改变行高度示例
2013/12/17 Javascript
jquery使用append(content)方法注意事项分享
2014/01/06 Javascript
canvas实现十二星座星空图
2017/02/14 Javascript
jQuery事件对象的属性和方法详解
2017/09/09 jQuery
JavaScript实现浅拷贝与深拷贝的方法分析
2018/07/05 Javascript
微信小程序利用canvas 绘制幸运大转盘功能
2018/07/06 Javascript
Vant的安装和配合引入Vue.js项目里的方法步骤
2018/12/05 Javascript
[03:26]《DAC最前线》之EG经理自述DOTA2经历
2015/02/02 DOTA
[03:07]完美世界DOTA2联赛PWL DAY10 决赛集锦
2020/11/11 DOTA
python翻译软件实现代码(使用google api完成)
2013/11/26 Python
python批量生成本地ip地址的方法
2015/03/23 Python
使用py2exe在Windows下将Python程序转为exe文件
2016/03/04 Python
Win10下Python环境搭建与配置教程
2016/11/18 Python
Python中easy_install 和 pip 的安装及使用
2017/06/05 Python
高效测试用例组织算法pairwise之Python实现方法
2017/07/19 Python
详解flask表单提交的两种方式
2018/07/21 Python
python Dijkstra算法实现最短路径问题的方法
2019/09/19 Python
wxPython实现整点报时
2019/11/18 Python
使用python采集Excel表中某一格数据
2020/05/14 Python
Django中和时区相关的安全问题详解
2020/10/12 Python
html5之Canvas路径绘图、坐标变换应用实例
2012/12/26 HTML / CSS
DC Shoes荷兰官方网站:美国极限运动品牌
2019/10/22 全球购物
如何开启linux的ssh服务
2015/02/14 面试题
介绍下Lucene建立索引的过程
2016/03/02 面试题
致200米运动员广播稿
2014/02/06 职场文书
社区服务标语
2014/07/01 职场文书
私人房屋买卖协议书
2014/10/04 职场文书
春节晚会开场白
2015/05/29 职场文书
eval(cmd)与eval($cmd)的区别与联系
2021/07/07 PHP
浅谈为什么我的 z-index 又不生效了
2022/07/15 HTML / CSS