文档章节

TF-IDF与余弦相似性的应用(二):找出相似文章

Airship
 Airship
发布于 2017/08/18 22:38
字数 1049
阅读 1
收藏 0
点赞 0
评论 0

作者: 阮一峰

日期: 2013年3月21日

上一次,我用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度,意味着方向正好相反。因此,我们可以通过夹角的大小,来判断向量的相似程度。夹角越小,就代表越相似。

以二维空间为例,上图的a和b是两个向量,我们要计算它们的夹角θ。余弦定理告诉我们,可以用下面的公式求得:

假定a向量是[x1, y1],b向量是[x2, y2],那么可以将余弦定理改写成下面的形式:

数学家已经证明,余弦的这种计算方法对n维向量也成立。假定A和B是两个n维向量,A是 [A1, A2, ..., An] ,B是 [B1, B2, ..., Bn] ,则A与B的夹角θ的余弦等于:

使用这个公式,我们就可以得到,句子A与句子B的夹角的余弦。

余弦值越接近1,就表明夹角越接近0度,也就是两个向量越相似,这就叫"余弦相似性"。所以,上面的句子A和句子B是很相似的,事实上它们的夹角大约为20.3度。

由此,我们就得到了"找出相似文章"的一种算法:

  (1)使用TF-IDF算法,找出两篇文章的关键词;

  (2)每篇文章各取出若干个关键词(比如20个),合并成一个集合,计算每篇文章对于这个集合中的词的词频(为了避免文章长度的差异,可以使用相对词频);

  (3)生成两篇文章各自的词频向量;

  (4)计算两个向量的余弦相似度,值越大就表示越相似。

"余弦相似度"是一种非常有用的算法,只要是计算两个向量的相似程度,都可以采用它。

下一次,我想谈谈如何在词频统计的基础上,自动生成一篇文章的摘要。

(完)

文档信息

© 著作权归作者所有

共有 人打赏支持
Airship
粉丝 34
博文 789
码字总数 18996
作品 0
南京
高级程序员
TF-IDF与余弦相似性

TF-IDF算法 将"词频"(TF)和"逆文档频率"(IDF)这两个值相乘,就得到了一个词的TF-IDF值。某个词对文章的重要性越高,它的TF-IDF值就越大。所以,排在最前面的几个词,就是这篇文章的关键词...

Nob ⋅ 2015/03/07 ⋅ 0

python比较文本相似度(not semantical)

statement:这里的文本相似度不是指语义相似度,仅仅指字符重叠度 sudo apt-get install python-Levenshtein 页可以根据余弦定理: TF-IDF与余弦相似性的应用(二):找出相似文章 http://w...

mickelfeng ⋅ 2016/08/16 ⋅ 0

Python 计算余弦相似度

以下代码用到了 numpy 包。代码实现的功能是计算两个向量之间的余弦相似度。 我们可以把两个向量想象成空间中的两条线段,都是从原点([0, 0, ...])出发,指向不同的方向。两条线段之间形成...

衣介书生 ⋅ 01/07 ⋅ 0

TF-IDF与余弦相似性的应用(二):找出相似文章

上一次,我用TF-IDF算法自动提取关键词。 今天,我们再来研究另一个相关的问题。有些时候,除了找到关键词,我们还希望找到与原文章相似的其他文章。比如,"Google新闻"在主新闻下方,还提供...

阮一峰 ⋅ 2013/03/21 ⋅ 0

TF-IDF与余弦相似性的应用(二):找出相似文章

作者: 阮一峰 上一次,我用TF-IDF算法自动提取关键词。 今天,我们再来研究另一个相关的问题。有些时候,除了找到关键词,我们还希望找到与原文章相似的其他文章。比如,"Google新闻"在主新...

最帅的刘先生 ⋅ 2016/12/21 ⋅ 0

使用spark计算文档相似度

1、TF-IDF文档转换为向量 以下边三个句子为例 经过分词后变为 经过词频(TF)计算后,词频=某个词在文章中出现的次数 262144为总词数,这个值越大,不同的词被计算为一个Hash值的概率就越小,...

penngo ⋅ 2016/12/17 ⋅ 2

TF-IDF与余弦相似性的应用(二):找出相似文章

转自:http://www.ruanyifeng.com/blog/2013/03/cosine_similarity.html 上一次,我用 TF-IDF 算法自动提取关键词。 今天,我们再来研究另一个相关的问题。有些时候,除了找到关键词,我们还...

泳泳啊泳泳 ⋅ 01/07 ⋅ 0

余弦定理的应用:基于文字的文本相似度计算

最近由于工作项目,需要判断两个txt文本是否相似,于是开始在网上找资料研究,因为在程序中会把文本转换成String再做比较,所以最开始找到了这篇关于 距离编辑算法 Blog写的非常好,受益匪浅...

xrzs ⋅ 2013/03/24 ⋅ 5

文本相似度——基于TF-IDF与余弦相似性

本篇博客,主要是描述一种计算文本相似度的算法,基于TF-IDF算法和余弦相似性。算法的描述请务必看阮一峰的博客,不然看不懂本篇博客,地址: http://www.ruanyifeng.com/blog/2013/03/tf-id...

刘太刚 ⋅ 01/12 ⋅ 0

Python文本挖掘-PDF和脚本见附件

课程要点 •分词以及词权重 •文本分类算法 •文本检索和LDA 常国珍《Python数据科学:全栈技术详解》 3 课程大纲 1)文本挖掘介绍 2)中文分词 3)文本特征提取与相关性的度量 4)文本分类 5)主...

Ben_Chang ⋅ 05/01 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

微信小程序接口文档

API接口文档:http://developers.weixin.qq.com/miniprogram/dev/api/

熊二的爸爸是谁 ⋅ 31分钟前 ⋅ 0

优先考虑类型安全的异构容器(29)

1、泛型常用于集合(Set、Map)以及单元素容器(ThreadLocal、AtomicReference) 被参数化的容器:只能有固定数目的类型参数 2、Class 类在jdk 1.5 之后被泛型化了 String.class 属于Class<S...

职业搬砖20年 ⋅ 40分钟前 ⋅ 0

Linux下date格式化

最近在编辑一个脚本时,发现对Linux下时间的命令理解的不是很透彻,看到一篇关于date时间格式化的文章,遂摘录了下来。 本文取自:Linux下date命令,格式化输出,时间设置 一、date命令 [ro...

blackfoxya ⋅ 41分钟前 ⋅ 0

动手---sbt (1)

1:https://github.com/ucb-bar/chisel3 下载源码 2:Chisel-Tutorial文件夹下的readme.md文件中有说明: a)需要先测试是否安装了sbt并做一个hello工程 joe@joe-Aspire-Z3730:/media/sdb4/dow...

whoisliang ⋅ 42分钟前 ⋅ 0

Micropython实例之TPYBoardv102位数码管显示实验

import pybfrom pyb import Pin #数码管a~g dp对应的开发板引脚d_Pins=[Pin(i,Pin.OUT_PP) for i in ['X1','X2','X3','X4','X5','X6','X7','X8']]#数码管位段1 2 3 4对应的引脚w...

bodasisiter ⋅ 45分钟前 ⋅ 0

Java WebService接口生成和调用 图文详解

webservice简介: Web Service技术, 能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件, 就可相互交换数据或集成。依据Web Service规范实施的应用之间, 无论它们所...

Dylan1009 ⋅ 49分钟前 ⋅ 0

iOS类大小的测量

iOS中,测量类的大小可以用函数malloc_size (头文件#import <malloc/malloc.h>) 比如我们新建一个继承与object的类 代码: testObjest *test = [testObjest alloc]; NSLog(@"-----%...

RainOrz ⋅ 50分钟前 ⋅ 0

android支付宝首页、蚂蚁森林效果、视频背景、校园电台、载入收缩动画等源码

Android精选源码 android实现蚂蚁森林效果源码 android仿支付宝首页应用管理(拖拽排序,添加删除) android校园网络电台客户端源码 android实现按钮伸缩效果源码 一款仿iOS的PickerView控件,...

逆鳞龙 ⋅ 57分钟前 ⋅ 0

阿里云Apsara Block Storage企业级分布式块存储产品

摘要: Apsara Block Storage是阿里云推出的一款企业级分布式块存储产品,帮助企业市场头部客户构建高性能、弹性、可靠的大规模横向扩展云存储服务平台。可对接各种类型计算平台,包括阿里云...

阿里云云栖社区 ⋅ 今天 ⋅ 0

spring AOP

1. 添加MAVEN <!-- https://mvnrepository.com/artifact/org.springframework/spring-aop --> <dependency> <groupId>org.springframework</groupId> <artifactId>sprin......

BobwithB ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部