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中序列与字典的相同和不同之处
Jan 19 Python
Python基于高斯消元法计算线性方程组示例
Jan 17 Python
如何在django里上传csv文件并进行入库处理的方法
Jan 02 Python
Python安装与基本数据类型教程详解
May 29 Python
python+webdriver自动化环境搭建步骤详解
Jun 03 Python
Python数据结构与算法(几种排序)小结
Jun 22 Python
Python图像处理之图片文字识别功能(OCR)
Jul 30 Python
python智联招聘爬虫并导入到excel代码实例
Sep 09 Python
Python列表删除元素del、pop()和remove()的区别小结
Sep 11 Python
Python 中@property的用法详解
Jan 15 Python
使用Keras预训练模型ResNet50进行图像分类方式
May 23 Python
Django项目创建及管理实现流程详解
Oct 13 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上传文件,创建递归目录的实例代码
2013/10/18 PHP
PHP程序员不应该忽略的3点
2015/10/09 PHP
PHP+MySQL实现无极限分类栏目的方法
2015/12/23 PHP
jQuery源码分析-02正则表达式 RegExp 常用正则表达式
2011/11/14 Javascript
js的image onload事件使用遇到的问题
2014/07/15 Javascript
jquery幻灯片插件bxslider样式改进实例
2014/10/15 Javascript
node.js中的fs.realpath方法使用说明
2014/12/16 Javascript
15个jquery常用方法、小技巧分享
2015/01/13 Javascript
JS DOM实现鼠标滑动图片效果
2020/09/17 Javascript
jQuery使用deferreds串行多个ajax请求
2016/08/22 Javascript
jquery对所有input type=text的控件赋值实现方法
2016/12/02 Javascript
Angularjs2不同组件间的通信实例代码
2017/05/06 Javascript
浅谈vue的踩坑路
2017/08/31 Javascript
解决vue+webpack打包路径的问题
2018/03/06 Javascript
bootstrap select2插件用ajax来获取和显示数据的实例
2018/08/09 Javascript
对vuejs的v-for遍历、v-bind动态改变值、v-if进行判断的实例讲解
2018/08/27 Javascript
vue+elementui通用弹窗的实现(新增+编辑)
2021/01/07 Vue.js
[41:20]2014 DOTA2华西杯精英邀请赛 5 24 NewBee VS DK
2014/05/26 DOTA
浅析python 内置字符串处理函数的使用方法
2014/06/11 Python
python中kmeans聚类实现代码
2018/02/23 Python
python求最大值最小值方法总结
2019/06/25 Python
简单了解Python3里的一些新特性
2019/07/13 Python
python检测服务器端口代码实例
2019/08/31 Python
Python3中configparser模块读写ini文件并解析配置的用法详解
2020/02/18 Python
使用AJAX和Django获取数据的方法实例
2020/10/25 Python
Html5 video标签视频的最佳实践
2020/02/26 HTML / CSS
实习教师自我鉴定
2013/12/09 职场文书
质量月活动总结
2014/08/26 职场文书
2014年物业管理工作总结
2014/11/21 职场文书
部门优秀员工推荐信
2015/03/24 职场文书
2015年乡镇工作总结范文
2015/04/22 职场文书
小学英语教学经验交流材料
2015/11/02 职场文书
大学生各类奖学金申请书
2019/06/24 职场文书
python学习之panda数据分析核心支持库
2021/05/07 Python
html+css实现滚动到元素位置显示加载动画效果
2021/08/02 HTML / CSS
Js类的构建与继承案例详解
2021/09/15 Javascript