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


Posted in Python onDecember 21, 2017

上一次,我用TF-IDF算法自动提取关键词。

今天,我们再来研究另一个相关的问题。有些时候,除了找到关键词,我们还希望找到与原文章相似的其他文章。比如,"Google新闻"在主新闻下方,还提供多条相似的新闻。

为了找出相似的文章,需要用到"余弦相似性"(cosine similiarity)。下面,我举一个例子来说明,什么是"余弦相似性"。

为了简单起见,我们先从句子着手。

句子A:我喜欢看电视,不喜欢看电影。

句子B:我不喜欢看电视,也不喜欢看电影。

请问怎样才能计算上面两句话的相似程度?

基本思路是:如果这两句话的用词越相似,它们的内容就应该越相似。因此,可以从词频入手,计算它们的相似程度。

第一步,分词。

句子A:我/喜欢/看/电视,不/喜欢/看/电影。

句子B:我/不/喜欢/看/电视,也/不/喜欢/看/电影。

第二步,列出所有的词。

我,喜欢,看,电视,电影,不,也。

第三步,计算词频。

句子A:我 1,喜欢 2,看 2,电视 1,电影 1,不 1,也 0。

句子B:我 1,喜欢 2,看 2,电视 1,电影 1,不 2,也 1。

第四步,写出词频向量。

句子A:[1, 2, 2, 1, 1, 1, 0]

句子B:[1, 2, 2, 1, 1, 2, 1]

到这里,问题就变成了如何计算这两个向量的相似程度。

我们可以把它们想象成空间中的两条线段,都是从原点([0, 0, ...])出发,指向不同的方向。两条线段之间形成一个夹角,如果夹角为 0 度,意味着方向相同、线段重合;如果夹角为 90 度,意味着形成直角,方向完全不相似;如果夹角为 180 度,意味着方向正好相反。因此,我们可以通过夹角的大小,来判断向量的相似程度。夹角越小,就代表越相似。

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

以二维空间为例,上图的a和b是两个向量,我们要计算它们的夹角θ。余弦定理告诉我们,可以用下面的公式求得:

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

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

假定a向量是[x1, y1],b向量是[x2, y2],那么可以将余弦定理改写成下面的形式:

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

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

数学家已经证明,余弦的这种计算方法对n维向量也成立。假定A和B是两个n维向量,A是 [A1, A2, ..., An] ,B是 [B1, B2, ..., Bn] ,则A与B的夹角θ的余弦等于:

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

使用这个公式,我们就可以得到,句子A与句子B的夹角的余弦。

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

余弦值越接近1,就表明夹角越接近 0 度,也就是两个向量越相似,这就叫”余弦相似性”。所以,上面的句子A和句子B是很相似的,事实上它们的夹角大约为 20.3 度。

由此,我们就得到了”找出相似文章”的一种算法:

(1)使用 TF-IDF 算法,找出两篇文章的关键词;

(2)每篇文章各取出若干个关键词(比如 20 个),合并成一个集合,计算每篇文章对于这个集合中的词的词频(为了避免文章长度的差异,可以使用相对词频);

(3)生成两篇文章各自的词频向量;

(4)计算两个向量的余弦相似度,值越大就表示越相似。

“余弦相似度”是一种非常有用的算法,只要是计算两个向量的相似程度,都可以采用它。

下一次,我想谈谈如何在词频统计的基础上,自动生成一篇文章的摘要。

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

Python 相关文章推荐
Python写的服务监控程序实例
Jan 31 Python
详解Python中映射类型(字典)操作符的概念和使用
Aug 19 Python
利用Python为iOS10生成图标和截屏
Sep 24 Python
python实时监控cpu小工具
Jun 21 Python
符合语言习惯的 Python 优雅编程技巧【推荐】
Sep 25 Python
浅谈python脚本设置运行参数的方法
Dec 03 Python
Django用户认证系统 Web请求中的认证解析
Aug 02 Python
Python pickle模块实现对象序列化
Nov 22 Python
python3 常见解密加密算法实例分析【base64、MD5等】
Dec 19 Python
Python3爬虫关于识别检验滑动验证码的实例
Jul 30 Python
如何设置PyCharm中的Python代码模版(推荐)
Nov 20 Python
Python实现PIL图像处理库绘制国际象棋棋盘
Jul 16 Python
TF-IDF与余弦相似性的应用(一) 自动提取关键词
Dec 21 #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
You might like
Protoss建筑一览
2020/03/14 星际争霸
php checkbox复选框值的获取与checkbox默认值输出方法
2010/05/15 PHP
PHP实现广度优先搜索算法(BFS,Broad First Search)详解
2017/09/16 PHP
改版了网上的一个js操作userdata
2007/04/27 Javascript
Google Map API更新实现用户自定义标注坐标
2009/07/29 Javascript
Javascript在IE或Firefox下获取鼠标位置的代码
2009/12/18 Javascript
jquery 3D球状导航的文章分类
2010/07/06 Javascript
js实现在字符串中提取数字
2013/11/05 Javascript
Javascript中的方法和匿名方法实例详解
2015/06/13 Javascript
webpack之引入图片的实现及问题
2018/10/08 Javascript
基于游标的分页接口实现代码示例
2018/11/12 Javascript
angularjs自定义过滤器demo示例
2019/08/24 Javascript
原生js实现ajax请求和JSONP跨域请求操作示例
2020/03/14 Javascript
javaScript实现一个队列的方法
2020/07/14 Javascript
[05:46]DOTA2英雄梦之声_第18期_陈
2014/06/20 DOTA
[01:31:03]DOTA2完美盛典全回顾 见证十五项大奖花落谁家
2017/11/28 DOTA
[52:32]完美世界DOTA2联赛PWL S2 Magma vs LBZS 第三场 11.18
2020/11/18 DOTA
python3.3使用tkinter开发猜数字游戏示例
2014/03/14 Python
pymongo给mongodb创建索引的简单实现方法
2015/05/06 Python
整理Python中的赋值运算符
2015/05/13 Python
python 实现返回一个列表中出现次数最多的元素方法
2019/06/11 Python
Django User 模块之 AbstractUser 扩展详解
2020/03/11 Python
python函数超时自动退出的实操方法
2020/12/28 Python
用Python实现职工信息管理系统
2020/12/30 Python
python利用appium实现手机APP自动化的示例
2021/01/26 Python
肯尼亚网上商城:Kilimall
2016/08/20 全球购物
美国领先的礼品卡网站:GiftCards.com
2016/11/02 全球购物
美国保健品专家:Life Extension
2018/05/04 全球购物
心得体会开头
2014/01/01 职场文书
个人公开承诺书
2014/03/28 职场文书
给小学生的新年寄语
2014/04/04 职场文书
给孩子的新年寄语
2014/04/08 职场文书
房屋买卖协议书范本
2014/04/10 职场文书
社会工作专业自荐信
2014/09/26 职场文书
心灵点滴观后感
2015/06/02 职场文书
保姆聘用合同
2015/09/21 职场文书