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+Pika+RabbitMQ环境部署及实现工作队列的实例教程
Jun 29 Python
python getopt详解及简单实例
Dec 30 Python
Python 类的继承实例详解
Mar 25 Python
python 容器总结整理
Apr 04 Python
Win10下python3.5和python2.7环境变量配置教程
Sep 18 Python
用Pycharm实现鼠标滚轮控制字体大小的方法
Jan 15 Python
python操作日志的封装方法(两种方法)
May 23 Python
python 利用浏览器 Cookie 模拟登录的用户访问知乎的方法
Jul 11 Python
Python Gitlab Api 使用方法
Aug 28 Python
Python如何通过Flask-Mail发送电子邮件
Jan 29 Python
python实现猜数游戏
Mar 27 Python
Python Selenium模块安装使用教程详解
Jul 09 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
数据库相关问题
2006/10/09 PHP
多文件上传的例子
2006/10/09 PHP
计数器详细设计
2006/10/09 PHP
批量去除PHP文件中bom的PHP代码
2012/03/13 PHP
PHP编程中的__clone()方法使用详解
2015/11/27 PHP
PHP微信API接口类
2016/08/22 PHP
php is_executable判断给定文件名是否可执行实例
2016/09/26 PHP
php生成条形码的图片的实例详解
2017/09/13 PHP
Yii框架中用response保存cookie,用request读取cookie的原理解析
2019/09/04 PHP
Laravel validate error处理,ajax,json示例
2019/10/25 PHP
jQuery 表单验证扩展代码(二)
2010/10/20 Javascript
Jquery常用技巧收集整理篇
2010/11/14 Javascript
各浏览器对click方法的支持差异小结
2011/07/31 Javascript
纯js网页画板(Graphics)类简介及实现代码
2012/12/24 Javascript
javascript中的self和this用法小结
2014/02/08 Javascript
浅析jquery的js图表组件highcharts
2014/03/06 Javascript
jQuery DateTimePicker 日期和时间插件示例
2017/01/22 Javascript
babel基本使用详解
2017/02/17 Javascript
浅谈原生JS实现jQuery的animate()动画示例
2017/03/08 Javascript
[50:22]完美盛典-2018年度红毯走秀
2018/12/16 DOTA
[49:30]DOTA2-DPC中国联赛正赛 Dragon vs Dynasty BO3 第二场 3月4日
2021/03/11 DOTA
基于python 处理中文路径的终极解决方法
2018/04/12 Python
Python机器学习之scikit-learn库中KNN算法的封装与使用方法
2018/12/14 Python
python 图像处理画一个正弦函数代码实例
2019/09/10 Python
对python中各个response的使用说明
2020/03/28 Python
五分钟带你搞懂python 迭代器与生成器
2020/08/30 Python
pycharm 的Structure界面设置操作
2021/02/05 Python
台湾网友喜爱的综合型网路购物商城:Yahoo! 奇摩购物中心
2018/03/10 全球购物
求职者应聘的自我评价
2013/10/16 职场文书
2014年学习厉行节约反对浪费思想汇报
2014/09/10 职场文书
财务总监岗位职责
2015/02/03 职场文书
少先队入队仪式主持词
2015/07/04 职场文书
大学校园餐饮创业计划书
2019/08/07 职场文书
golang slice元素去重操作
2021/04/30 Golang
仅仅使用 HTML/CSS 实现各类进度条的方式汇总
2021/11/11 HTML / CSS
vue实现可以快进后退的跑马灯组件
2022/04/08 Vue.js