背景知识:
(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. Python 一行代码实现并行

    需求 给定一个list   针对list 中每个元素执行一定的操作(这个操作很费时间,例如爬数据的时候调用某个网站的接口),返回操作后的list 例如 给定 1-10个数,在每个数字后面加个字母a 方 ...

  2. 利用TokyoTyrant构建兼容Memcached协议、支持故障转移、高并发的分布式Key-value持久存储系统(转)

    Tokyo Cabinet 是日本人 平林幹雄 开发的一款 DBM 数据库,该数据库读写非常快,哈希模式写入100万条数据只需0.643秒,读取100万条数据只需0.773秒,是 Berkeley D ...

  3. SVN插件下载地址及更新地址

    SVN插件下载地址及更新地址,你根据需要选择你需要的版本.现在最新是1.8.xLinks for 1.8.x Release:Eclipse update site URL: http://subcl ...

  4. 每天学点Linux命令之grep 和 wc命令 ---(6/25)

    Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来.grep全称是Global Regular Expression Print,表示全局正则表达 ...

  5. ajax 事件使用

    error: function (XMLHttpRequest, textStatus, errorThrown) { alert(XMLHttpRequest.status); alert(XMLH ...

  6. 数字图像处理,图像锐化算法的C++实现

    http://blog.csdn.net/ebowtang/article/details/38961399 之前一段我们提到的算法都是和平滑有关, 经过平滑算法之后, 图像锐度降低, 降低到一定程度 ...

  7. 重置root密码后仍然不能登陆

    一.忘记密码:二.输入正确用户名和密码时依旧无法登录. 一.忘记密码 进入单用户模式重置密码: 开机启动时,按‘E’键(倒计时结束前)进入界面 选择第二项,按‘E’键再次进入 在最后一行添加‘ 1’( ...

  8. c++的格式控制

    1: 每个iostream对象维持一个控制IO格式化细节的格式状态.标准库定义了一组操纵符来修改对象的格式状态.所谓操纵符是可用作输入或输出操作符的函数或对象.iostream和iomanip头文件中 ...

  9. redis_入门网址

    redis中文网: http://www.redis.cn/ 可以 试用 以及 下载 redis百度百科:http://baike.baidu.com/link?url=MEkE5MpGAOfJ7ci ...

  10. 做Webservice时报错java.util.List是接口, 而 JAXB 无法处理接口。

    Caused by: com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExc ...