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开发windows GUI程序入门实例
Oct 23 Python
python使用PyGame模块播放声音的方法
May 20 Python
Python实现比较两个列表(list)范围
Jun 12 Python
详解C++编程中一元运算符的重载
Jan 19 Python
python将.ppm格式图片转换成.jpg格式文件的方法
Oct 27 Python
pycharm恢复默认设置或者是替换pycharm的解释器实例
Oct 29 Python
Python判断字符串是否xx开始或结尾的示例
Aug 08 Python
使用浏览器访问python写的服务器程序
Oct 10 Python
利用Python绘制有趣的万圣节南瓜怪效果
Oct 31 Python
pandas的相关系数与协方差实例
Dec 27 Python
Python3实现mysql连接和数据框的形成(实例代码)
Jan 17 Python
通过Python把学姐照片做成拼图游戏
Feb 15 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 XML操作类DOMDocument
2009/12/16 PHP
PHP中PCRE正则解析代码详解
2019/04/26 PHP
Javascript入门学习资料收集整理篇
2008/07/06 Javascript
网页和浏览器兼容性问题汇总(draft1)
2009/06/01 Javascript
Json和Jsonp理论实例代码详解
2013/11/15 Javascript
json的定义、标准格式及json字符串检验
2014/05/11 Javascript
DWR3 访问WEB元素的两种方法实例详解
2017/01/03 Javascript
快速实现jQuery多级菜单效果
2017/02/01 Javascript
js实现音频控制进度条功能
2017/04/01 Javascript
Angular 4环境准备与Angular cli创建项目详解
2017/05/27 Javascript
javascript checkbox/radio onchange不能兼容ie8处理办法
2017/06/13 Javascript
你可能不知道的前端算法之文字避让(inMap)
2018/01/12 Javascript
Bootstrap popover 实现鼠标移入移除显示隐藏功能方法
2018/01/24 Javascript
Vue项目数据动态过滤实践及实现思路
2018/09/11 Javascript
webpack4与babel配合使es6代码可运行于低版本浏览器的方法
2018/10/12 Javascript
react实现同页面三级跳转路由布局
2019/09/26 Javascript
vue 解决异步数据更新问题
2019/10/29 Javascript
使用axios请求接口,几种content-type的区别详解
2019/10/29 Javascript
ElementUI多个子组件表单的校验管理实现
2019/11/07 Javascript
json解析大全 双引号、键值对不在一起的情况
2019/12/06 Javascript
vue el-tree 默认展开第一个节点的实现代码
2020/05/15 Javascript
Python求导数的方法
2015/05/09 Python
Python过滤列表用法实例分析
2016/04/29 Python
python pands实现execl转csv 并修改csv指定列的方法
2018/12/12 Python
python itchat给指定联系人发消息的方法
2019/06/11 Python
Python函数装饰器原理与用法详解
2019/08/16 Python
django 配置阿里云OSS存储media文件的例子
2019/08/20 Python
Python基于stuck实现scoket文件传输
2020/04/02 Python
python能自学吗
2020/06/18 Python
Django model重写save方法及update踩坑详解
2020/07/27 Python
canvas之自定义头像功能实现代码示例
2017/09/29 HTML / CSS
OSPREY LONDON官网:英国本土皮具品牌
2019/05/31 全球购物
制药工程专业职业生涯规划范文
2014/03/10 职场文书
全运会口号
2014/06/20 职场文书
民警个人对照检查剖析材料
2014/09/17 职场文书
2014年个人业务工作总结
2014/11/17 职场文书