上一次,我用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)计算两个向量的余弦相似度,值越大就表示越相似。

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

转自:http://www.ruanyifeng.com/blog/2013/03/cosine_similarity.html

余弦相似性:找出相似文章相关推荐

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

    FROM:http://www.ruanyifeng.com/blog/2013/03/cosine_similarity.html 作者: 阮一峰 日期: 2013年3月21日 上一次,我用TF-I ...

  2. python求反余弦_余弦相似度计算公式:python代码找出相似文章

    余弦相似度计算公式:python代码找出相似文章 用TF-IDF算法可以自动提取关键词.除了找到关键词,怎么找到与原文章相似的其他文章.比如,"百科TA说"在词条最下方,还提供多条 ...

  3. TF-IDF结合余弦相似性 判断文章相似性

    摘自:阮一峰的网络日志(http://www.ruanyifeng.com/blog/2013/03/cosine_similarity.html) 为了找出相似的文章,需要用到"余弦相似性 ...

  4. MATLAB余弦相似性学习

    根据余弦相似性原理判断两篇文章的相似程度.原理很简单,大致就是利用几个关键字组成一个特征向量,然后统计两篇文章各自对应的特征向量的值.最后计算两个特征矢量点积后的结果,即利用余弦值.如果值为1,表示两 ...

  5. TF-IDF与余弦相似性的应用

    阮一峰老师的博客写的相当详细了,非常佩服,在这里记录一下链接 一):自动提取关键词 url: http://www.ruanyifeng.com/blog/2013/03/tf-idf.html 笔记 ...

  6. bat从数组中找出相同数字并删除_全网把Map中的hash()分析的最透彻的文章,别无二家...

    原文地址:https://mp.weixin.qq.com/s/qCHkzs4JPOipB-ZzqrfbeQ 作者: Hollis 你知道HashMap中hash方法的具体实现吗? 你知道HashTa ...

  7. 推荐算法和机器学习系列 - 协同过滤推荐算法和余弦相似性算法

    协同过滤算法 协同过滤(CF)推荐算法通过在用户活动中寻找特定模式来为用户产生有效推荐.它依赖于系统中用户的惯用数据,例如通过用户对其阅读过书籍的评价可以推断出用户的阅读偏好.这种算法的核心思想就是: ...

  8. TF-IDF与余弦相似性的应用(一):自动提取关键词 - 阮一峰的网络日志

    TF-IDF与余弦相似性的应用(一):自动提取关键词 - 阮一峰的网络日志 TF-IDF与余弦相似性的应用(一):自动提取关键词 作者: 阮一峰 日期: 2013年3月15日 这个标题看上去好像很复杂 ...

  9. TF-IDF与余弦相似性的应用(一):自动提取关键词

    http://www.ruanyifeng.com/blog/2013/03/tf-idf.html 作者: 阮一峰 日期: 2013年3月15日 这个标题看上去好像很复杂,其实我要谈的是一个很简单的 ...

最新文章

  1. Linux下查看在线用户及用户进程
  2. [Joomla] 利用joomla内置的表单验证功能
  3. 江苏信息考试access_2016年江苏省信息技术学业水平测试Access操作题
  4. 五十四、Java日期Date,LocalDate类以及格式化输出
  5. 2016 Top 10 Android Library
  6. 解决 invalid input detected at ‘^’ marker的问题
  7. 嵌套矩形——DAG上的动态规划
  8. arcgis两点之间连线_使用ArcGIS制作城市关系强度图(附数据下载)
  9. 让AI打工!搜狗全体员工于3月12日狗胜节放假一天
  10. 《Python网络程序设计(微课版)》223道习题参考答案
  11. ERROR: The environment variable VG_GNU_PACKAGE must be set. Aborting.
  12. c语言程序关键字查询,C语言关键字大全(共32个)
  13. 下载小红书无水印照片
  14. windows-由于系统的默认编码不一致导致解压后的文件名显示乱码
  15. Android 显示软键盘输入法和强制隐藏软键盘输入法
  16. Windows Azure 解决方案系列: Real World Windows Azure: 与微软杰出工程师, Sean Nolan的访谈
  17. c语言ifmn除2余1,C语言编程题及答案 2
  18. 关于苹果ARKit的功能梳理和展望
  19. 美团网创始人王兴专访:我现在的事业十分和谐
  20. 小姐姐非要给大家推荐的硬核网站

热门文章

  1. 机器学习(周志华著)习题 第03章 线性模型
  2. 英语学习思路【罗肖尼Shawney】
  3. Jenkins 配置邮件通知
  4. Java多线程编程:交替打印数字1234和字母abcd
  5. 容器安全03:NIST.SP.800-190容器安全指南
  6. 开源的烽火 “烽火”的开源
  7. 社区版pyCharm创建Django项目
  8. R中的假设检验(二)方差分析
  9. 微软开放技术云浪生:微软开源.NET是民心之所向
  10. 2022数维杯问题 C:如何利用大脑结构特征和认知行为特征诊断阿尔茨海默病-多思路+代码分享