背景知识:
(1)tf-idf
按照词TF-IDF值来衡量该词在该文档中的重要性的指导思想:如果某个词比较少见,但是它在这篇文章中多次出现,那么它很可能就反映了这篇文章的特性,正是我们所需要的关键词。
tf–idf is the product of two statistics, term frequency and inverse document frequency.
     //Various ways for determining the exact values of both statistics exist.
tf–idf= tf×idf
In the case of the term frequency tf(t,d), the simplest choice is to use the raw frequency of a term in a document, i.e. the number of times that term t occurs in document d.
Other possibilities include:
- Boolean "frequencies": tf(t,d) = 1 if t occurs in d and 0 otherwise;
- logarithmically scaled frequency: tf(t,d) = 1 + log f_t,d, or zero if ft,d is zero;
- augmented frequency, to prevent a bias towards longer documents, e.g. raw frequency divided by the maximum raw frequency of any term in the document:
          tf(t,d)=0.5+0.5*f_t,d/max(f_t'd)
The inverse document frequency is a measure of how much information the word provides, that is, whether the term is common or rare across all documents.
 

(2)余弦相似度
余弦值的范围在[-1,1]之间,值越趋近于1,代表两个向量的方向越接近;越趋近于-1,他们的方向越相反;接近于0,表示两个向量近乎于正交。
 

一般情况下,相似度都是归一化到[0,1]区间内,因此余弦相似度表示为cosineSIM=0.5cosθ+0.5


计算过程:
(1)使用TF-IDF算法,找出两篇文章的关键词;
(2)每篇文章各取出若干个关键词(为公平起见,一般取的词数相同),合并成一个集合,计算每篇文章对于这个集合中的词的词频
(注1:为了避免文章长度的差异,可以使用相对词频;注2:这一步选出的不同词的数量决定了词频向量的长度);
(3)生成两篇文章各自的词频向量(注:所有文章对应的词频向量等长,相同位置的元素对应同一词);
(4)计算两个向量的余弦相似度,值越大就表示越相似。
Note that: tf-idf值只在第一步用到。
举例说明:
文章A:我喜欢看小说。
文章B:我不喜欢看电视,也不喜欢看电影。
第一步: 分词
    文章A:我/喜欢/看/小说。
    文章B:我/不/喜欢/看/电视,也/不/喜欢/看/电影。
第二步,列出所有的词。
     我,喜欢,看,小说,电视,电影,不,也。
第三步,计算每个文档中各个词的词频tf。
  文章A:我 1,喜欢 1,看 1,小说 1,电视 0,电影 0,不 0,也 0。
  文章B:我 1,喜欢 2,看 2,小说 0,电视 1,电影 1,不 2,也 1。
第四步,计算各个词的逆文档频率idf。
  我 log(2/2)=0,喜欢 log(2/2)=0,看 log(2/2)=0,小说 log(2/1)=1,电视 log(2/1)=1,电影 log(2/1)=1,不 log(2/1)=1,也 log(2/1)=1。
第五步:计算每个文档中各个词的tf-idf值
  文章A:我 0,喜欢 0,看 0,小说 1,电视 0,电影 0,不 0,也 0。
  文章B:我 0,喜欢 0,看 0,小说 0,电视 1,电影 1,不 1,也 1。
第六步:选择每篇文章的关键词(这里选tf-idf排名前3的词作为关键词(至于并列大小的随机选))
  文章A:我 0,喜欢 0,小说 1
  文章B:电视 1,电影 1,不 1
第七步:构建用于计算相似度的词频向量(根据上一步选出的词:我,喜欢,小说,电视,电影,不)
   文章A:[1 1 1 0 0 0]
   文章B: [1 2 0 1 1 2]
第八步:计算余弦相似度值
     cosθ=3/sqrt(33)= 0.5222329678670935
   cosineSIM(A,B)=0.5222329678670935*0.5+0.5=0.7611164839335467
 
references:

<tf-idf + 余弦相似度> 计算文章的相似度的更多相关文章

  1. TF/IDF(term frequency/inverse document frequency)

    TF/IDF(term frequency/inverse document frequency) 的概念被公认为信息检索中最重要的发明. 一. TF/IDF描述单个term与特定document的相 ...

  2. Python简单实现基于VSM的余弦相似度计算

    在知识图谱构建阶段的实体对齐和属性值决策.判断一篇文章是否是你喜欢的文章.比较两篇文章的相似性等实例中,都涉及到了向量空间模型(Vector Space Model,简称VSM)和余弦相似度计算相关知 ...

  3. java算法(1)---余弦相似度计算字符串相似率

    余弦相似度计算字符串相似率 功能需求:最近在做通过爬虫技术去爬取各大相关网站的新闻,储存到公司数据中.这里面就有一个技术点,就是如何保证你已爬取的新闻,再有相似的新闻 或者一样的新闻,那就不存储到数据 ...

  4. java文章标题及文章相似度计算hash算法实现

    参看了 https://github.com/awnuxkjy/recommend-system 对方用了 余弦 函数实现相似度计算,我则用的是 hanlp+hash 算法(Hash算法总结) 再看服 ...

  5. 两矩阵各向量余弦相似度计算操作向量化.md

    余弦相似度计算: \cos(\bf{v_1}, \bf{v_2}) = \frac{\left( v_1 \times v_2 \right)}{||v_1|| * ||v_2|| } \cos(\b ...

  6. Spark Mllib里相似度度量(基于余弦相似度计算不同用户之间相似性)(图文详解)

    不多说,直接上干货! 常见的推荐算法 1.基于关系规则的推荐 2.基于内容的推荐 3.人口统计式的推荐 4.协调过滤式的推荐 协调过滤算法,是一种基于群体用户或者物品的典型推荐算法,也是目前常用的推荐 ...

  7. 转:Python 文本挖掘:使用gensim进行文本相似度计算

    Python使用gensim进行文本相似度计算 转于:http://rzcoding.blog.163.com/blog/static/2222810172013101895642665/ 在文本处理 ...

  8. 使用 TF-IDF 加权的空间向量模型实现句子相似度计算

    使用 TF-IDF 加权的空间向量模型实现句子相似度计算 字符匹配层次计算句子相似度 计算两个句子相似度的算法有很多种,但是对于从未了解过这方面算法的人来说,可能最容易想到的就是使用字符串匹配相关的算 ...

  9. TF/IDF计算方法

    FROM:http://blog.csdn.net/pennyliang/article/details/1231028 我们已经谈过了如何自动下载网页.如何建立索引.如何衡量网页的质量(Page R ...

随机推荐

  1. 扯一扯 C#委托和事件?策略模式?接口回调?

    早前学习委托的时候,写过一点东西,今天带着新的思考和认知,再记点东西.这篇文章扯到设计模式中的策略模式,观察者模式,还有.NET的特性之一--委托.真的,请相信我,我只是在扯淡...... 场景练习 ...

  2. 搭建Mac OS X下cocos2d-x的Android开发环境

    版本 Cocos2d-x: cocos2d-2.1beta3-x-2.1.1 OS X: 10.8 Android ADT Bundle: v21.1.0 Android NDK: android-n ...

  3. 筛选最新生成的报告——sort

    筛选出最新报告发送,返回报告路径 import os def filePath(path): return os.path.join(os.path.abspath(os.path.dirname(o ...

  4. NIO复习03

    SocketChannel: 1. Java NIO中的SocketChannel是一个连接到TCP网络套接字的通道.可以通过以下2种方式创建SocketChannel: 打开一个SocketChan ...

  5. hadoop12---java并发编程的一些总结

    java并发编程的一些总结 %.1.不应用线程池的缺点 有些开发者图省事,遇到需要多线程处理的地方,直接new Thread(...).start(),对于一般场景是没问题的,但如果是在并发请求很高 ...

  6. @RequestMapping映射请求,@PathVariable,@RequestParam,@RequestHeader的使用

    1.@RequestMapping Spring MVC 使用 @RequestMapping 注解为控制器指定可以处理哪些 URL 请求,在控制器的类定义及方法定义处都可标注. @RequestMa ...

  7. DATASTAGE中ODBC连接的配置

    修改2个配置文件: cat /mistel/IBM/InformationServer/Server/DSEngine/.odbc.ini cat /mistel/IBM/InformationSer ...

  8. java+opencv+intellij idea实现人脸识别

    首先当然是需要安装opencv了,我用的是opencv2.4.13.下载完之后就可以直接安装了,安装过程也很简单,直接下一步下一步就好,我就不上图了. 接下来在opencv下找到jar包,比如我直接安 ...

  9. linux 分析进程占用CPU过高

    重点是查看进程的线程中,哪个线程占用cpu过高,然后用gdb附加到进程,调试线程,看是否有死循环或者死锁等问题,步骤如下: 1 先用ps + grep找出该死的进程pid,比如 1706 2 top ...

  10. 我的nodejs 快速入门

    每行以封号结尾(可有可无) 变量定义没有类型 都用var 或者直接const log打印:console.log(db); 内置属性这样写法:__filename.__dirname等 functio ...