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写asp详细讲解
Dec 16 Python
Python docx库用法示例分析
Feb 16 Python
Django框架orM与自定义SQL语句混合事务控制操作
Jun 27 Python
python二进制文件的转译详解
Jul 03 Python
Python实现语音识别和语音合成功能
Sep 20 Python
Python3并发写文件与Python对比
Nov 20 Python
python os模块常用的29种方法使用详解
Jun 02 Python
Python json格式化打印实现过程解析
Jul 21 Python
分享一枚pycharm激活码适用所有pycharm版本我的pycharm2020.2.3激活成功
Nov 20 Python
python二维图制作的实例代码
Dec 03 Python
python 通过 pybind11 使用Eigen加速代码的步骤
Dec 07 Python
Python编程super应用场景及示例解析
Oct 05 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/07/07 PHP
memcached 和 mysql 主从环境下php开发代码详解
2010/05/16 PHP
destoon实现底部添加你是第几位访问者的方法
2014/07/15 PHP
yii2高级应用之自定义组件实现全局使用图片上传功能的方法
2016/10/08 PHP
win10 apache配置虚拟主机后localhost无法使用的解决方法
2018/01/27 PHP
Referer原理与图片防盗链实现方法详解
2019/07/03 PHP
非常棒的10款jQuery 幻灯片插件
2011/06/14 Javascript
仿中关村在线首页弹出式广告插件(jQuery版)
2012/05/03 Javascript
js动态添加事件并可传参数示例代码
2013/10/21 Javascript
使表格的标题列可左右拉伸jquery插件封装
2014/11/24 Javascript
jquery插件star-rating.js实现星级评分特效
2015/04/15 Javascript
javascript常用方法总结
2015/05/14 Javascript
jQuery实现仿QQ在线客服效果的滚动层代码
2015/10/15 Javascript
学习JavaScript设计模式之单例模式
2016/01/19 Javascript
ES6新特性之解构、参数、模块和记号用法示例
2017/04/01 Javascript
nodejs中sleep功能实现暂停几秒的方法
2017/07/12 NodeJs
Vue组件实例间的直接访问实现代码
2017/08/20 Javascript
VueJS 集成 Medium Editor的示例代码 (自定义编辑器按钮)
2017/08/24 Javascript
angularjs结合html5实现拖拽功能
2018/06/25 Javascript
vue 使用高德地图vue-amap组件过程解析
2019/09/07 Javascript
在vue中使用防抖和节流,防止重复点击或重复上拉加载实例
2019/11/13 Javascript
layui写后台表格思路和赋值用法详解
2019/11/14 Javascript
python3序列化与反序列化用法实例
2015/05/26 Python
深度定制Python的Flask框架开发环境的一些技巧总结
2016/07/12 Python
pycharm运行和调试不显示结果的解决方法
2018/11/30 Python
Python 运行 shell 获取输出结果的实例
2019/01/07 Python
Python通过递归获取目录下指定文件代码实例
2019/11/07 Python
selenium+python实现自动登陆QQ邮箱并发送邮件功能
2019/12/13 Python
pytorch点乘与叉乘示例讲解
2019/12/27 Python
Python正则表达式高级使用方法汇总
2020/06/18 Python
挪威户外活动服装和装备购物网站:Bergfreunde挪威
2016/10/20 全球购物
互动出版网:专业书籍
2017/03/21 全球购物
文员岗位职责范本
2014/03/08 职场文书
中等生评语大全
2014/05/04 职场文书
工作求职自荐信
2014/06/13 职场文书
Java服务调用RestTemplate与HttpClient的使用详解
2022/06/21 Java/Android