simhash算法实现--查找文件相似度

一、Simhash简介

SimHash是用来网页去重最常用的hash方法,速度很快。Google采用这种算法来解决万亿级别的网页去重任务。

SimHash算法的主要思想是降维。将高维的特征向量映射成一个低维的特征向量,通过两个向量的Hamming Distance来确定文章是否重复或者高度近似。

在simhash的发明人Charikar的论文中并没有给出具体的simhash算法和证明,“量子图灵”得出的证明simhash是由随机超平面hash算法演变而来的。

参考文献:《Detecting Near-Duplicates for Web Crawling 》

二、Simhash和传统hash的区别

传统hash函数解决的是生成唯一值,比如md5,hashmap等。Md5是用于生成唯一签名串,只要稍微多加一个字符,md5的两个数字看起来相差甚远。而我们的目的是解决文本相似度计算,要比较的是两个文章是否相似。而simhash对相似文本的哈希映射结果也相似。

传统的hash算法只负责将原始内容尽量均匀随机地映射为一个签名值,原理上相当于伪随机数产生算法。产生的两个签名,如果相等,说明原始内容在一定概率下是相等的;如果不相等,除了说明原始内容不相等外,不再提供任何信息,因为即使原始内容只相差一个字节,所产生的签名也很可能差别极大。从这个意义上来说,要设计一个hash算法,对相似的内容产生的签名也相近,是更为艰难的任务,因为它的签名值除了提供原始内容是否相等的信息外,还能额外提供不相等的原始内容的差异程度的信息。

而Google的simhash算法产生的签名,可以用来比较原始内容的相似度。

三、简单应用场景

从文件夹res1366x768x565中,查找与OSDTbl_ATV_c.inl文件相似的所有文件。

四、simhash算法实现步骤

1、分词

1)、把需要判断的文本进行分词,形成这个文章的特征单词。

2)、最后形成去掉噪音词的单词序列,并为每个单词加上权重。

2、生成传统hash值

通过传统hash算法,对文章的每个特征单词产生一个f位的签名b。

3、降维过程

1)、加权

通过步骤2中生成的hash值,需要按照单词的权重形成加权数字串。

2)、合并

把步骤3中第一步各个单词算出来的序列值对应位累加,变成只有一个序列串。

3)、降维

把步骤2中第三步算出来的序列串变成0 1串,形成我们最终的simhash签名。

通过以上操作的转换,我们把库里的文本都转换为simhash代码,并转换为string类型存储,空间大大减少。接下来我们通过海明距离(Hamming distance)计算两个simhash到底相不相似。

海明距离简介

两个码字的对应比特取值不同的比特数称为这两个码字的海明距离。

举例如下: 1010100110 从第一位开始依次有第一位、第四、第五位不同,则海明距离为3。

计算海明距离的普遍算法为:

对于二进制字符串的a和b,海明距离为a,b做异或操作(a XOR b)后,结果中1的个数。

异或: 只有在两个比较的位不同时其结果是1 ,否则结果为 0

到此,我们完成了simhash算法的所有步骤。

总结simhash算法的步骤:

1、生成每个文件的simhash值

2、计算两个文件的Hamming distance

五、Simhash适用情境

simhash用于比较大文本,比如500字以上效果都还蛮好,距离小于3的基本都是相似,误判率也比较低。但是如果我们处理的是微博信息,最多也就140个字,使用simhash的效果并不那么理想。看如下图,在距离为3时是一个比较折中的点,在距离为10时效果已经很差了,不过我们测试短文本很多看起来相似的距离确实为10。如果使用距离为3,短文本大量重复信息不会被过滤,如果使用距离为10,长文本的错误率也非常高,如何解决?

参考资料:《simHash 简介以及 java 实现》http://www.open-open.com/lib/view/open1375690611500.html

simhash算法实现--查找文件相似度

时间: 2024-10-12 21:13:17

simhash算法实现--查找文件相似度的相关文章

海量数据相似度计算之simhash短文本查找

在前一篇文章 <海量数据相似度计算之simhash和海明距离> 介绍了simhash的原理,大家应该感觉到了算法的魅力.但是随着业务的增长 simhash的数据也会暴增,如果一天100w,10天就1000w了.我们如果插入一条数据就要去比较1000w次的simhash,计算量还是蛮大,普通PC 比较1000w次海明距离需要 300ms ,和5000w数据比较需要1.8 s.看起来相似度计算不是很慢,还在秒级别.给大家算一笔账就知道了: 随着业务增长需要一个小时处理100w次,一个小时为3600

网页内容相似度之SimHash算法

抓取的网页内容中,有大部分会是相似的,抓取时就要过滤掉,开始考虑用VSM算法,后来发现不对,要比较太多东西了,然后就发现了simHash算法,这个算法的解释我就懒得copy了,simhash算法对于短数据的支持不好,但是,我本来就是很长的数据,用上! 源码实现网上也有不少,但是貌似都是同样的,里面写得不清不楚的,虽然效果基本能达到,但是不清楚的东西,我用来做啥? 仔细研究simhash算法的说明后,把里面字符串的hash算法换成的fvn-1算法,这个在http://www.isthe.com/c

基于局部敏感哈希的协同过滤算法之simHash算法

搜集了快一个月的资料,虽然不完全懂,但还是先慢慢写着吧,说不定就有思路了呢. 开源的最大好处是会让作者对脏乱臭的代码有羞耻感. 当一个做推荐系统的部门开始重视[数据清理,数据标柱,效果评测,数据统计,数据分析]这些所谓的脏活累活,这样的推荐系统才会有救. 求教GitHub的使用. 简单不等于傻逼. 我为什么说累:我又是一个习惯在聊天中思考前因后果的人,所以整个大脑高负荷运转.不过这样真不好,学习学成傻逼了. 研一的最大收获是让我明白原来以前仰慕的各种国家自然基金项目,原来都是可以浑水摸鱼忽悠过去

MLlearning(2)——simHash算法

这篇文章主要讲simHash算法.这是一种LSH(Locality-Sensitive Hashing,局部敏感哈希)的简单实现.它是广泛用于数据去重的算法,可以用于相似网站.图片的检索.而且当两个样本差别并不大时,算法仍能起效.值得一提的是,该算法的时空复杂度不存在与维度有关的项,所以不会遭遇维度灾难,也可以在维数较高时优化kNN算法. 特征 此算法(LSH)具有双重性,它们似乎是相悖的: 对于几组不同的特征,hash相同(即冲突)的可能性要尽可能小.这也是hash基本的特征. 对于几组相似的

海量数据去重之SimHash算法简介和应用

SimHash是什么 SimHash是Google在2007年发表的论文<Detecting Near-Duplicates for Web Crawling >中提到的一种指纹生成算法或者叫指纹提取算法,被Google广泛应用在亿级的网页去重的Job中,作为locality sensitive hash(局部敏感哈希)的一种,其主要思想是降维,什么是降维? 举个通俗点的例子,一篇若干数量的文本内容,经过simhash降维后,可能仅仅得到一个长度为32或64位的二进制由01组成的字符串,这一点

(转)simhash算法原理及实现

simhash是google用来处理海量文本去重的算法. google出品,你懂的. simhash最牛逼的一点就是将一个文档,最后转换成一个64位的字节,暂且称之为特征字,然后判断重复只需要判断他们的特征字的距离是不是<n(根据经验这个n一般取值为3),就可以判断两个文档是否相似. 原理 simhash值的生成图解如下: 大概花三分钟看懂这个图就差不多怎么实现这个simhash算法了.特别简单.谷歌出品嘛,简单实用. 算法过程大概如下: 将Doc进行关键词抽取(其中包括分词和计算权重),抽取出

三种不同查找算法实际查找性能的对比

   一.查找问题的介绍 查找问题就是在给定的集合(或者是多重集,它允许多个元素具有相同的值)中找寻一个给定的值,我们称之为查找键.有许多查找算法可供选择,其中既包括直截了当的顺序搜索,也包括效率极高但应用受限的折半查找,还有那些将原集合用另一种形式表示以方便查找的算法.最后一类算法对于现实应用具有特别重要的价值,因为它们对于大型数据库的信息存取来说是不可或缺的. 对于查找来说,没有一种算法在任何情况下都是最优的.有些算法速度比其他算法快,但需要较多的存储空间:有些算法速度非常快,但仅适用于有序

simhash算法:海量千万级的数据去重

simhash算法:海量千万级的数据去重 simhash算法及原理参考: 简单易懂讲解simhash算法 hash 哈希:https://blog.csdn.net/le_le_name/article/details/51615931 simhash算法及原理简介:https://blog.csdn.net/lengye7/article/details/79789206 使用SimHash进行海量文本去重:https://www.cnblogs.com/maybe2030/p/5203186

查找算法-二分查找

查找算法-二分查找 标题 二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法.但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列. 过程 首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功:否则利用中间位置记录将表分成前.后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表.重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找