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解析excel文件存入sqlite数据库的方法
Nov 15 Python
Python使用内置json模块解析json格式数据的方法
Jul 20 Python
轻量级的Web框架Flask 中模块化应用的实现
Sep 11 Python
对Python+opencv将图片生成视频的实例详解
Jan 08 Python
python实现Dijkstra静态寻路算法
Jan 17 Python
python实现趣味图片字符化
Apr 30 Python
python selenium登录豆瓣网过程解析
Aug 10 Python
pytorch 指定gpu训练与多gpu并行训练示例
Dec 31 Python
Python多重继承之菱形继承的实例详解
Feb 12 Python
python实现飞机大战项目
Mar 11 Python
Python如何获取文件路径/目录
Sep 22 Python
Python识别验证码的实现示例
Sep 30 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
thinkphp如何获取客户端IP
2015/11/03 PHP
详解PHP使用日期时间处理器Carbon人性化显示时间
2017/08/10 PHP
PHP解析url并得到url参数方法总结
2018/10/11 PHP
IE和Firefox下event事件杂谈
2009/12/18 Javascript
JQuery优缺点分析说明
2010/06/09 Javascript
JavaScript实现的内存数据库LokiJS介绍和入门实例
2014/11/17 Javascript
js由下向上不断上升冒气泡效果实例
2015/05/07 Javascript
使用JavaScript和CSS实现文本隔行换色的方法
2015/11/04 Javascript
JQuery EasyUI的使用
2016/02/24 Javascript
基于MVC方式实现三级联动(JavaScript)
2017/01/23 Javascript
bootstrap弹出层的多种触发方式
2017/05/10 Javascript
node中的cookie的具体使用
2018/09/13 Javascript
webpack自动打包和热更新的实现方法
2019/06/24 Javascript
JavaScript 斐波那契数列 倒序输出 输出100以内的质数代码实例
2019/09/11 Javascript
前端深入理解Typescript泛型概念
2020/03/09 Javascript
JavaScript进阶(三)闭包原理与用法详解
2020/05/09 Javascript
[03:58]2014DOTA2国际邀请赛 龙宝赛后解密DK获胜之道
2014/07/14 DOTA
[06:11]2014DOTA2国际邀请赛 专访团结一心的VG战队
2014/07/21 DOTA
[01:31:02]TNC vs VG 2019国际邀请赛淘汰赛 胜者组赛BO3 第一场
2019/08/22 DOTA
Python编程实现数学运算求一元二次方程的实根算法示例
2017/04/02 Python
python+django加载静态网页模板解析
2017/12/12 Python
python文字和unicode/ascll相互转换函数及简单加密解密实现代码
2019/08/12 Python
pd.DataFrame统计各列数值多少的实例
2019/12/05 Python
Python实现迪杰斯特拉算法过程解析
2020/09/18 Python
Python第三方库安装缓慢的解决方法
2021/02/06 Python
SKECHERS官方旗舰店:美国舒适运动休闲品牌
2017/12/22 全球购物
街头时尚在线:JESSICABUURMAN
2019/06/16 全球购物
当我正在为表建立索引的时候,SQL Server 会禁止对表的访问吗
2014/04/28 面试题
史上最全面的Java面试题汇总!
2015/02/03 面试题
校长就职演讲稿
2014/01/06 职场文书
应急管理培训方案
2014/06/12 职场文书
广告艺术设计专业自荐书
2014/07/08 职场文书
值班管理制度范本
2015/08/06 职场文书
公司员工违法违章行为检讨书
2019/06/24 职场文书
八年级作文之感悟亲情
2019/11/20 职场文书
python基础之//、/与%的区别详解
2022/06/10 Python