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 解析XML python模块xml.dom解析xml实例代码
Feb 07 Python
python的tkinter布局之简单的聊天窗口实现方法
Sep 03 Python
Python类的多重继承问题深入分析
Nov 09 Python
python模块之re正则表达式详解
Feb 03 Python
Python初学时购物车程序练习实例(推荐)
Aug 08 Python
利用标准库fractions模块让Python支持分数类型的方法详解
Aug 11 Python
浅谈flask中的before_request与after_request
Jan 20 Python
Python+Django搭建自己的blog网站
Mar 13 Python
Python3实现的简单验证码识别功能示例
May 02 Python
Python3 hashlib密码散列算法原理详解
Mar 30 Python
Python中BeautifulSoup通过查找Id获取元素信息
Dec 07 Python
pycharm 实现光标快速移动到括号外或行尾的操作
Feb 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
Laravel用户授权系统的使用方法示例
2018/09/16 PHP
PHP结合Ffmpeg快速搭建流媒体服务的实践记录
2018/10/31 PHP
用jquery存取照片的具体实现方法
2013/06/30 Javascript
jquery实现图片灯箱明暗的遮罩效果
2013/11/15 Javascript
使用ajaxfileupload.js实现ajax上传文件php版
2014/06/26 Javascript
js实现仿爱微网两级导航菜单效果代码
2015/08/31 Javascript
jQuery Real Person验证码插件防止表单自动提交
2015/11/06 Javascript
js简单倒计时实现代码
2016/04/30 Javascript
通过扫描二维码打开app的实现代码
2016/11/10 Javascript
JavaScript高阶函数_动力节点Java学院整理
2017/06/28 Javascript
浅谈Vue父子组件和非父子组件传值问题
2017/08/22 Javascript
AngularJS中controller控制器继承的使用方法
2017/11/03 Javascript
JavaScript中的一些隐式转换和总结(推荐)
2017/12/22 Javascript
利用js实现简易红绿灯
2020/10/15 Javascript
JavaScript实现网页跨年倒计时
2020/12/02 Javascript
原生jQuery实现只显示年份下拉框
2020/12/24 jQuery
Javascript中的奇葩知识,你知道吗?
2021/01/25 Javascript
[18:32]DOTA2 HEROS教学视频教你分分钟做大人-谜团
2014/06/12 DOTA
Python 字符串定义
2009/09/25 Python
Linux环境下MySQL-python安装过程分享
2015/02/02 Python
python根据出生日期返回年龄的方法
2015/03/26 Python
Python 中pandas.read_excel详细介绍
2017/06/23 Python
Python实现生成随机日期字符串的方法示例
2017/12/25 Python
Python解决两个整数相除只得到整数部分的实例
2018/11/10 Python
python 字符串只保留汉字的方法
2018/11/16 Python
对python条件表达式的四种实现方法小结
2019/01/30 Python
windows下numpy下载与安装图文教程
2019/04/02 Python
对django2.0 关联表的必填on_delete参数的含义解析
2019/08/09 Python
如何为Python终端提供持久性历史记录
2019/09/03 Python
python读取raw binary图片并提取统计信息的实例
2020/01/09 Python
Boda Skins皮衣官网:奢侈皮夹克,全球配送
2016/12/15 全球购物
美国办公用品折扣网站:Shoplet.com
2019/11/24 全球购物
大二学生职业生涯规划书
2014/02/05 职场文书
2015年会计人员工作总结
2015/05/22 职场文书
浅谈Mysql多表连接查询的执行细节
2021/04/24 MySQL
详解Python描述符的工作原理
2021/06/11 Python