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 27 Python
Python下载指定页面上图片的方法
May 12 Python
Python金融数据可视化汇总
Nov 17 Python
Python socket实现的简单通信功能示例
Aug 21 Python
windows下搭建python scrapy爬虫框架步骤
Dec 23 Python
python程序运行进程、使用时间、剩余时间显示功能的实现代码
Jul 11 Python
超简单的Python HTTP服务
Jul 22 Python
JupyterNotebook设置Python环境的方法步骤
Dec 03 Python
python super用法及原理详解
Jan 20 Python
将tensorflow模型打包成PB文件及PB文件读取方式
Jan 23 Python
如何编写python的daemon程序
Jan 07 Python
http通过StreamingHttpResponse完成连续的数据传输长链接方式
Feb 12 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 date函数参数详解
2006/11/27 PHP
PHP实现获取某个月份周次信息的方法
2015/08/11 PHP
使用Zttp简化Guzzle 调用
2017/07/02 PHP
php爬取天猫和淘宝商品数据
2018/02/23 PHP
php的命名空间与自动加载实现方法
2019/08/25 PHP
Laravel框架实现文件上传的方法分析
2019/09/29 PHP
解读IE和firefox下JScript和HREF的执行顺序
2008/01/12 Javascript
js取滚动条的尺寸的函数代码
2011/11/30 Javascript
javascript 进阶篇1 正则表达式,cookie管理,userData
2012/03/14 Javascript
jquery实现的随机多彩tag标签随机颜色和字号大小效果
2014/03/27 Javascript
Javascript验证Visa和MasterCard信用卡号的方法
2015/07/27 Javascript
AngularJS中处理多个promise的方式
2016/02/02 Javascript
关于javascript获取内联样式与嵌入式样式的实例
2017/06/01 Javascript
基于hover的用法实例(推荐)
2017/07/04 Javascript
trackingjs+websocket+百度人脸识别API实现人脸签到
2018/11/26 Javascript
vue路由守卫及路由守卫无限循环问题详析
2019/09/05 Javascript
JavaScript事件循环及宏任务微任务原理解析
2020/09/02 Javascript
Vue Object.defineProperty及ProxyVue实现双向数据绑定
2020/09/02 Javascript
[03:06]3分钟带你回顾DOTA2完美盛典&完美大师赛
2017/12/06 DOTA
Win7 64位下python3.6.5安装配置图文教程
2020/10/27 Python
pandas or sql计算前后两行数据间的增值方法
2018/04/20 Python
python中如何使用分步式进程计算详解
2019/03/22 Python
python面试题Python2.x和Python3.x的区别
2019/05/28 Python
windows 10 设定计划任务自动执行 python 脚本的方法
2019/09/11 Python
Python绘图之柱形图绘制详解
2020/07/28 Python
使用tensorflow进行音乐类型的分类
2020/08/14 Python
python飞机大战游戏实例讲解
2020/12/04 Python
HTML5的Video标签有部分MP4无法播放的问题解析(多图)
2017/08/18 HTML / CSS
巴西女装购物网站:Eclectic
2018/04/24 全球购物
校运会入场式解说词
2014/02/10 职场文书
幼儿园优秀教师事迹
2014/02/13 职场文书
2016自主招生校长推荐信范文
2015/03/23 职场文书
2015年度物业公司工作总结
2015/04/27 职场文书
2016年小学生清明节广播稿
2015/12/17 职场文书
《小摄影师》教学反思
2016/02/18 职场文书
Android Gradle 插件自定义Plugin实现注意事项
2022/06/16 Java/Android