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语言技巧之三元运算符使用介绍
Mar 04 Python
Python单元测试框架unittest简明使用实例
Apr 13 Python
Python编程求解二叉树中和为某一值的路径代码示例
Jan 04 Python
Go/Python/Erlang编程语言对比分析及示例代码
Apr 23 Python
python实现将一个数组逆序输出的方法
Jun 25 Python
python交换两个变量的值方法
Jan 12 Python
IDLE下Python文件编辑和运行操作
Apr 25 Python
Python通过Pillow实现图片对比
Apr 29 Python
Python中无限循环需要什么条件
May 27 Python
Python识别验证码的实现示例
Sep 30 Python
Python中免验证跳转到内容页的实例代码
Oct 23 Python
用Python提取PDF表格的方法
Apr 11 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笔记 字符串处理
2010/10/19 PHP
php5.4传引用时报错问题分析
2016/01/22 PHP
PHP addcslashes()函数讲解
2019/02/03 PHP
laravel 字段格式化 modle 字段类型转换方法
2019/09/30 PHP
JavaScript 编程引入命名空间的方法与代码
2007/08/13 Javascript
javascript 动态加载 css 方法总结
2009/07/11 Javascript
用html+css+js实现的一个简单的图片切换特效
2014/05/28 Javascript
一个支持任意尺寸的图片上下左右滑动效果
2014/08/24 Javascript
JavaScript父子窗体间的调用方法
2015/03/31 Javascript
简化版手机端照片预览组件
2015/04/13 Javascript
为什么JS中eval处理JSON数据要加括号
2015/04/13 Javascript
JS实现超简单的仿QQ折叠菜单效果
2015/09/21 Javascript
javascript实现网页端解压并查看zip文件
2015/12/15 Javascript
javascript基础知识
2016/06/07 Javascript
关于数据与后端进行交流匹配(点亮星星)
2016/08/03 Javascript
原生js实现无缝轮播图效果
2017/01/11 Javascript
微信小程序云开发之数据库操作
2019/05/18 Javascript
vue 集成 vis-network 实现网络拓扑图的方法
2019/08/07 Javascript
JS实现放烟花效果
2020/03/10 Javascript
Javascript幻灯片播放功能实现过程解析
2020/05/07 Javascript
简单上手Python中装饰器的使用
2015/07/12 Python
Python实现的RSS阅读器实例
2015/07/25 Python
Python入门学习指南分享
2018/04/11 Python
python 利用栈和队列模拟递归的过程
2018/05/29 Python
推荐10款最受Python开发者欢迎的Python IDE
2018/09/16 Python
Python实现账号密码输错三次即锁定功能简单示例
2019/03/29 Python
python如何停止递归
2020/09/09 Python
Joe Fresh官网:加拿大时尚品牌和零售连锁店
2016/11/30 全球购物
Booking.com西班牙:全球酒店预订
2018/03/30 全球购物
澳大利亚儿童鞋在线:The Trybe
2019/07/16 全球购物
Edwaybuy西班牙:小米在线商店
2019/12/04 全球购物
高中同学聚会邀请函
2014/01/11 职场文书
《角的度量》教学反思
2016/02/18 职场文书
2016年6.5世界环境日宣传活动总结
2016/04/01 职场文书
python3 字符串str和bytes相互转换
2022/03/23 Python
彻底卸载VMware虚拟机的超详细步骤记录
2022/07/15 Servers