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 相关文章推荐
高性能web服务器框架Tornado简单实现restful接口及开发实例
Jul 16 Python
使用Python下的XSLT API进行web开发的简单教程
Apr 15 Python
python使用multiprocessing模块实现带回调函数的异步调用方法
Apr 18 Python
在Django中创建URLconf相关的通用视图的方法
Jul 20 Python
python给指定csv表格中的联系人群发邮件(带附件的邮件)
Dec 31 Python
Python生成词云的实现代码
Jan 14 Python
python对Excel的读取的示例代码
Feb 14 Python
python3.6使用SMTP协议发送邮件
May 20 Python
Python如何在单元测试中给对象打补丁
Aug 03 Python
20行Python代码实现一款永久免费PDF编辑工具的实现
Aug 27 Python
如何用六步教会你使用python爬虫爬取数据
Apr 06 Python
Python测试框架pytest高阶用法全面详解
Jun 01 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 adodb连接mssql解决乱码问题
2009/06/12 PHP
php ss7.5的数据调用 (笔记)
2010/03/08 PHP
php遍历替换目录下文件指定内容的方法
2016/11/10 PHP
thinkPHP线上自动加载异常与修复方法实例分析
2016/12/01 PHP
Laravel框架路由管理简单示例
2019/05/07 PHP
JavaScript 组件之旅(四):测试 JavaScript 组件
2009/10/28 Javascript
JS模拟面向对象全解(一、类型及传递)
2011/07/13 Javascript
js操作CheckBoxList实现全选/反选(在客服端完成)
2013/02/02 Javascript
JavaScript定义类的几种方式总结
2014/01/06 Javascript
二叉树的非递归后序遍历算法实例详解
2014/02/07 Javascript
JS+CSS实现淡入式焦点图片幻灯切换效果的方法
2015/02/26 Javascript
js实现顶部可折叠的菜单工具栏效果实例
2015/05/09 Javascript
jQuery模拟完美实现经典FLASH导航动画效果【附demo源码下载】
2016/11/09 Javascript
web.js.字符串与正则表达式操作
2017/05/13 Javascript
简单实现js放大镜效果
2017/07/24 Javascript
Three.js加载外部模型的教程详解
2017/11/10 Javascript
详解Angular模板引用变量及其作用域
2018/11/23 Javascript
vue-cli+webpack项目打包到服务器后,ttf字体找不到的解决操作
2020/08/28 Javascript
用Python创建声明性迷你语言的教程
2015/04/13 Python
Python使用functools实现注解同步方法
2018/02/06 Python
Python使用pyh生成HTML文档的方法示例
2018/03/10 Python
python opencv设置摄像头分辨率以及各个参数的方法
2018/04/02 Python
Python多继承顺序实例分析
2018/05/26 Python
python logging模块的使用总结
2019/07/09 Python
用Python调用win命令行提高工作效率的实例
2019/08/14 Python
如何基于Python实现电子邮件的发送
2019/12/16 Python
Html5获取高德地图定位天气的方法
2019/12/26 HTML / CSS
Aquatalia官网:意大利著名鞋履品牌
2019/09/26 全球购物
IGK Hair官网:喷雾、洗发水、护发素等
2020/11/03 全球购物
预备党员思想汇报范文
2014/01/11 职场文书
安全生产月演讲稿
2014/05/09 职场文书
单位绩效考核方案
2014/05/11 职场文书
2014年乡镇个人工作总结
2014/12/03 职场文书
计算机专业自荐信范文
2015/03/26 职场文书
初级职称评定工作总结
2015/08/13 职场文书
护士年终工作总结不会写?各科护士模板总结
2020/01/02 职场文书