SimHash算法原理

原创 2016年08月29日 19:42:26

刚到公司项目中用到了simhash,但没有详细的了解,后来被问到原理,结果就狗带了。。

下面是自己查资料和自己的一些理解,不愧是google出品,比较符合google的风格,简单实用。

先贴一张网上的图片:

解释一下图片:这里feature可以指一篇文档分词后的某个词,即将文档中的某个词作为一个特征。weight是这个词的权重,这里可以是这个词在这个句子中出现的次数。

这里的hash算法就是传统的hash算法,通过调用一个hash函数实现的。

simhash是为了计算一篇文档之间的相似度存在的,通过simhash算法可以计算出文档的simhash值,通过各个文档计算出的二进制值来计算文档之间的汉明距离,然后根据汉明距离来比较文档之间的相似度。汉明距离是指两个相同长度的字符串相同位置上不同的字符的个数。

simhash算法分为5个步骤:分词、hash、加权、合并、降维,具体过程如下所述:

  • 分词
    • 给定一段语句,进行分词,得到有效的特征向量,然后为每一个特征向量设置1-5等5个级别的权重(如果是给定一个文本,那么特征向量可以是文本中 的词,其权重可以是这个词出现的次数)。例如给定一段语句:“CSDN博客结构之法算法之道的作者July”,分词后为:“CSDN 博客 结构 之 法 算法 之 道 的 作者 July”,然后为每个特征向量赋予权值:CSDN(4) 博客(5) 结构(3) 之(1) 法(2) 算法(3) 之(1) 道(2) 的(1) 作者(5) July(5),其中括号里的数字代表这个单词在整条语句中的重要程度,数字越大代表越重要。
  • hash
    • 通过hash函数计算各个特征向量的hash值,hash值为二进制数01组成的n-bit签名。比如“CSDN”的hash值Hash(CSDN)为100101,“博客”的hash值Hash(博客)为“101011”。就这样,字符串就变成了一系列数字。
  • 加权
    • 在hash值的基础上,给所有特征向量进行加权,即W = Hash * weight,且遇到1则hash值和权值正相乘,遇到0则hash值和权值负相乘。例如给“CSDN”的hash值“100101”加权得 到:W(CSDN) = 100101*4 = 4 -4 -4 4 -4 4,给“博客”的hash值“101011”加权得到:W(博客)=101011*5 = 5 -5 5 -5 5 5,其余特征向量类似此般操作。
  • 合并
    • 将上述各个特征向量的加权结果累加,变成只有一个序列串。拿前两个特征向量举例,例如“CSDN”的“4 -4 -4 4 -4 4”和“博客”的“5 -5 5 -5 5 5”进行累加,得到“4+5 -4+-5 -4+5 4+-5 -4+5 4+5”,得到“9 -9 1 -1 1”。
  • 降维
    • 对于n-bit签名的累加结果,如果大于0则置1,否则置0,从而得到该语句的simhash值,最后我们便可以根据不同语句simhash的海 明距离来判断它们的相似度。例如把上面计算出来的“9 -9 1 -1 1 9”降维(某位大于0记为1,小于0记为0),得到的01串为:“1 0 1 0 1 1”,从而形成它们的simhash签名。
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lihaitao000/article/details/52355704

OO,OO以后,及其极限(2)

OO,OO以后,及其极限(2)请作者与我们联系(本文转载自软件工程专家网www.21cmm.com,不代表gigix观点)3 维特跟斯坦(Wittgenstein)与OO  维特跟斯坦是本世纪乃至人类...
  • gigix
  • gigix
  • 2002-03-25 09:32:00
  • 1432

simhash算法原理及实现

simhash是google用来处理海量文本去重的算法。 google出品,你懂的。 simhash最牛逼的一点就是将一个文档,最后转换成一个64位的字节,暂且称之为特征字,然后判断重复只需要判断他们...
  • cgl1079743846
  • cgl1079743846
  • 2016-03-08 22:02:48
  • 3820

浅谈simhash及其python实现

讲述了simhash的基本原理和步骤,并用python实现了simhash
  • madujin
  • madujin
  • 2016-11-13 21:52:31
  • 5414

简单易懂讲解simhash算法 hash 哈希

通过 采集系统 我们采集了大量文本数据,但是文本中有很多重复数据影响我们对于结果的分析。分析前我们需要对这些数据去除重复,如何选择和设计文本的去重算法?常见的有余弦夹角算法、欧式距离、Jaccard相...
  • le_le_name
  • le_le_name
  • 2016-06-09 00:01:49
  • 7289

Simhash学习笔记

文档如果直接使用MD5做hash这种方式进行去重操作,对于一些相似文档的处理就无能为力了,简单的一个字符的变化,hash值就会发生变化,Simhash简单来说就是类似文档所产生的hash值也是类似的,...
  • j13sj13s
  • j13sj13s
  • 2016-08-01 16:47:17
  • 1452

simHash 简介以及 java 实现

simHash 简介以及 java 实现
  • makang110
  • makang110
  • 2016-05-27 17:05:03
  • 709

[转]文档去重算法:SimHash和MinHash

simhash与重复信息识别来源:http://grunt1223.iteye.com/blog/964564在工作学习中,我往往感叹数学奇迹般的解决一些貌似不可能完成的任务,并且十分希望将这种喜悦分...
  • heiyeshuwu
  • heiyeshuwu
  • 2015-03-07 16:47:24
  • 44757

simhash原理及使用

1. 简介simhash是一种局部敏感hash。那什么叫局部敏感呢,假定两个字符串具有一定的相似性,在hash之后,仍然能保持这种相似性,就称之为局部敏感hash。普通的hash是不具有这种属性的。s...
  • qq_16912257
  • qq_16912257
  • 2017-05-15 15:59:33
  • 548

Simhash相似哈希算法

前言最近在阅读吴军博士的>这门书,得到了很多的启发和思考,里面提到了一个概念---信息指纹。一般正常人提到这个概念,第一个想到的词应该是哈希映射算法,将任何对象都映射成一个独立的变量,一般这个变量是一...
  • Androidlushangderen
  • Androidlushangderen
  • 2015-07-29 22:26:06
  • 4576

Java实现simHash算法

  • 2015年05月21日 00:05
  • 6KB
  • 下载
收藏助手
不良信息举报
您举报文章:SimHash算法原理
举报原因:
原因补充:

(最多只允许输入30个字)