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中import reload __import__的区别详解
Oct 16 Python
Python安装模块的常见问题及解决方法
Feb 05 Python
python3获取当前文件的上一级目录实例
Apr 26 Python
python 列表递归求和、计数、求最大元素的实例
Nov 28 Python
Python在图片中插入大量文字并且自动换行
Jan 02 Python
python调用并链接MATLAB脚本详解
Jul 05 Python
简单了解django orm中介模型
Jul 30 Python
pytorch实现mnist数据集的图像可视化及保存
Jan 14 Python
解决jupyter notebook显示不全出现框框或者乱码问题
Apr 09 Python
python 利用Pyinstaller打包Web项目
Oct 23 Python
Python中相见恨晚的技巧
Apr 13 Python
Pycharm 如何设置HTML文件自动补全代码或标签
May 21 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 PDO中文乱码解决办法
2009/07/20 PHP
《PHP编程最快明白》第四讲:日期、表单接收、session、cookie
2010/11/01 PHP
PHP中header函数的用法及其注意事项详解
2016/06/13 PHP
微信开发之获取JSAPI TICKET
2017/07/07 PHP
visual studio code 调试php方法(图文详解)
2017/09/15 PHP
PHP实现求连续子数组最大和问题2种解决方法
2017/12/26 PHP
详解thinkphp中的volist标签
2018/01/15 PHP
PHP实现的多维数组排序算法分析
2018/02/10 PHP
JavaScript对象链式操作代码(jquery)
2010/07/04 Javascript
js修改地址栏URL参数解决url参数问题
2012/12/15 Javascript
让复选框只能选择一项的方法
2013/10/08 Javascript
调用jQuery滑出效果时闪烁的解决方法
2014/03/27 Javascript
关于js里的this关键字的理解
2015/08/17 Javascript
解决bootstrap导航栏navbar在IE8上存在缺陷的方法
2016/07/01 Javascript
JavaScript获取ul中li个数的方法
2017/02/13 Javascript
Bootstrap table简单使用总结
2017/02/15 Javascript
JS请求servlet功能示例
2017/06/01 Javascript
JS实现HTML页面中动态显示当前时间完整示例
2018/07/30 Javascript
JS常见构造模式实例对比分析
2018/08/27 Javascript
Vue组件之高德地图地址选择功能的实例代码
2019/06/21 Javascript
在Python中操作文件之truncate()方法的使用教程
2015/05/25 Python
Python卸载模块的方法汇总
2016/06/07 Python
python3.5 tkinter实现页面跳转
2018/01/30 Python
python 获取sqlite3数据库的表名和表字段名的实例
2019/07/17 Python
pycharm下配置pyqt5的教程(anaconda虚拟环境下+tensorflow)
2020/03/25 Python
python绘制趋势图的示例
2020/09/17 Python
python实现猜拳游戏项目
2020/11/30 Python
英国领先的独立时装店:Van Mildert
2019/10/28 全球购物
办理信用卡工作证明
2014/01/11 职场文书
校园活动宣传方案
2014/03/28 职场文书
工业自动化专业自荐信范文
2014/04/10 职场文书
入股协议书
2014/04/14 职场文书
校长师德师风自我剖析材料
2014/09/29 职场文书
2015年乡镇安全生产工作总结
2015/05/19 职场文书
2015年语文教师工作总结
2015/05/25 职场文书
Redis5之后版本的高可用集群搭建的实现
2021/04/27 Redis