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中的赋值运算符
May 13 Python
Python简单网络编程示例【客户端与服务端】
May 26 Python
python版opencv摄像头人脸实时检测方法
Aug 03 Python
详解python实现识别手写MNIST数字集的程序
Aug 03 Python
Python笔记之工厂模式
Nov 20 Python
opencv设置采集视频分辨率方式
Dec 10 Python
tensorflow 报错unitialized value的解决方法
Feb 06 Python
Python3标准库之threading进程中管理并发操作方法
Mar 30 Python
Python matplotlib可视化实例解析
Jun 01 Python
使用Django的JsonResponse返回数据的实现
Jan 15 Python
一行Python命令实现批量加水印
Apr 07 Python
 python中的元类metaclass详情
May 30 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编程开发“虚拟域名”系统
2006/10/09 PHP
从零开始学YII2框架(五)快速生成代码工具 Gii 的使用
2014/08/20 PHP
php正则表达式基本知识与应用详解【经典教程】
2017/04/17 PHP
THINKPHP-Apache服务器中使用Alias虚拟目录URL重写 隐藏index.php
2021/03/09 PHP
百度 popup.js 完美修正版非常的不错 脚本之家推荐
2009/04/17 Javascript
jQuery EasyUI中对表格进行编辑的实现代码
2010/06/10 Javascript
Jquery中获取iframe的代码
2011/01/11 Javascript
js页面滚动时层智能浮动定位实现(jQuery/MooTools)
2011/08/23 Javascript
javascript结合ajax读取txt文件内容
2014/12/05 Javascript
特殊日期提示功能的实现方法
2016/06/16 Javascript
原生js实现网易轮播图效果
2020/04/10 Javascript
ES6中Proxy与Reflect实现重载(overload)的方法
2017/03/30 Javascript
详解webpack进阶之插件篇
2017/07/06 Javascript
jquery ztree实现右键收藏功能
2017/11/20 jQuery
Angular2实现的秒表及改良版示例
2019/05/10 Javascript
[02:28]DOTA2亚洲邀请赛附加赛 RECAP赛事回顾
2015/01/29 DOTA
python获取文件后缀名及批量更新目录下文件后缀名的方法
2014/11/11 Python
python 生成器协程运算实例
2017/09/04 Python
python使用suds调用webservice接口的方法
2019/01/03 Python
python实现通过flask和前端进行数据收发
2019/08/22 Python
Python 70行代码实现简单算式计算器解析
2019/08/30 Python
python raise的基本使用
2020/09/10 Python
网页中的电话号码如何实现一键直呼效果_附示例
2016/03/15 HTML / CSS
宝拉珍选美国官网:Paula’s Choice美国
2018/01/07 全球购物
什么是用户模式(User Mode)与内核模式(Kernel Mode) ?
2014/07/21 面试题
经济管理专业毕业生自荐信范文
2014/01/02 职场文书
高中毕业生的个人自我评价
2014/02/21 职场文书
公司授权委托书范本
2014/04/03 职场文书
详细的本科生职业生涯规划范文
2014/09/16 职场文书
个人作风纪律整顿整改措施
2014/10/25 职场文书
九寨沟导游词
2015/02/02 职场文书
英语辞职信怎么写
2015/02/28 职场文书
美丽人生观后感
2015/06/03 职场文书
掌握这项技巧,一年阅读300本书不是梦
2019/09/12 职场文书
vue如何批量引入组件、注册和使用详解
2021/05/12 Vue.js
css3带你实现3D转换效果
2022/02/24 HTML / CSS