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中logging模块的用法实例
Sep 29 Python
python中readline判断文件读取结束的方法
Nov 08 Python
Python用zip函数同时遍历多个迭代器示例详解
Nov 14 Python
python 数据清洗之数据合并、转换、过滤、排序
Feb 12 Python
安装Python和pygame及相应的环境变量配置(图文教程)
Jun 04 Python
教你使用python画一朵花送女朋友
Mar 29 Python
详解python列表生成式和列表生成式器区别
Mar 27 Python
python 应用之Pycharm 新建模板默认添加编码格式-作者-时间等信息【推荐】
Jun 17 Python
Django认证系统实现的web页面实现代码
Aug 12 Python
对Python获取屏幕截图的4种方法详解
Aug 27 Python
python读取图像矩阵文件并转换为向量实例
Jun 18 Python
Restful_framework视图组件代码实例解析
Nov 17 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
php结合js实现点击超链接执行删除确认操作
2014/10/31 PHP
Yii2选项卡的简单使用
2017/05/26 PHP
PHP实现动态添加XML中数据的方法
2018/03/30 PHP
php设计模式之抽象工厂模式分析【星际争霸游戏案例】
2020/01/23 PHP
javascript与webservice的通信实现代码
2010/12/25 Javascript
js 浏览本地文件夹系统示例代码
2013/10/24 Javascript
基于JavaScript实现弹出框效果
2016/02/19 Javascript
JS读取XML文件数据并以table形式显示数据的方法(兼容IE与火狐)
2016/06/02 Javascript
javascript添加前置0(补零)的几种方法
2017/01/05 Javascript
JQuery页面随滚动条动态加载效果的简单实现(推荐)
2017/02/08 Javascript
Javascript中JSON数据分组优化实践及JS操作JSON总结
2017/12/22 Javascript
详解如何在vue项目中引入elementUI组件
2018/02/11 Javascript
Vue点击切换颜色的方法
2018/09/13 Javascript
Vue表单输入绑定的示例代码
2018/11/01 Javascript
vue拖拽组件使用方法详解
2018/12/01 Javascript
微信小程序把百度地图坐标转换成腾讯地图坐标过程详解
2019/07/10 Javascript
微信小程序前端promise封装代码实例
2019/08/24 Javascript
js利用iframe实现选项卡效果
2020/08/09 Javascript
Python中的CURL PycURL使用例子
2014/06/01 Python
Python中的with语句与上下文管理器学习总结
2016/06/28 Python
python之PyMongo使用总结
2017/05/26 Python
python实现远程通过网络邮件控制计算机重启或关机
2018/02/22 Python
六行python代码的爱心曲线详解
2019/05/17 Python
Pycharm新手教程(只需要看这篇就够了)
2019/06/18 Python
Pycharm 2019 破解激活方法图文详解
2019/10/11 Python
使用Python给头像加上圣诞帽或圣诞老人小图标附源码
2019/12/25 Python
学python最电脑配置有要求么
2020/07/05 Python
anello泰国官方网站:日本流行包包品牌
2019/08/08 全球购物
英国领先的游戏零售商:GAME
2019/09/24 全球购物
J2SDK1.5与J2SDK5.0有什么区别
2012/09/19 面试题
采购主管岗位职责
2014/02/01 职场文书
中国梦口号
2014/06/13 职场文书
中学教师师德师风演讲稿
2014/08/22 职场文书
2015年银行大堂经理工作总结
2015/04/24 职场文书
乒乓球比赛通知
2015/04/27 职场文书
车间安全生产管理制度
2015/08/06 职场文书