博客:https://www.cnblogs.com/enhaofrank/,公众号:生信AI区块链科技前沿,github:https://github.com/enhaofrank

功不唐捐 玉汝于成

simhash文本去重算法

SimHash 是为了计算任意多篇文档之间的相似度存在的,通过simhash算法可以计算出文档的simhash值,通过各个文档计算出的二进制值来计算文档之间的汉明距离,然后根据汉明距离来比较文档之间的相似度。

汉明距离是指两个相同长度的字符串相同位置上不同的字符的个数。

两个码字的对应比特取值不同的比特数称为这两个码字的海明距离。在一个有效编码集中,任意两个码字的海明距离的最小值称为该编码集的海明距离。举例如下:10101和00110从第一位开始依次有第一位、第四、第五位不同,则海明距离为3。

在介绍 SimHash 算法之前,我们先简单介绍下局部敏感哈希是什么。局部敏感哈希的基本思想类似于一种空间域转换思想,LSH 算法基于一个假设,如果两个文本在原有的数据空间是相似的,那么分别经过哈希函数转换以后的它们也具有很高的相似度;相反,如果它们本身是不相似的,那么经过转换后它们应仍不具有相似性。

传统的Hash算法只负责将原始内容尽量均匀随机地映射为一个签名值,原理上仅相当于伪随机数产生算法。即便是两个原始内容只相差一个字节,所产生的签名也很可能差别很大,所以传统的Hash是无法在签名的维度上来衡量原内容的相似度。而SimHash本身属于一种局部敏感hash,其主要思想是降维,将高维的特征向量转化成一个f位的指纹(fingerprint),通过算出两个指纹的海明距离(hamming distince)来确定两篇文章的相似度,海明距离越小,相似度越低(根据 Detecting Near-Duplicates for Web Crawling 论文中所说),一般海明距离为3就代表两篇文章相同。

simhash也有其局限性,在处理小于500字的短文本时,simhash的表现并不是很好,所以在使用simhash前一定要注意这个细节。

SimHash 算法分为5个步骤:分词、hash、加权、合并、降维

具体过程如下所述:

1)分词

给定一段语句,进行分词,得到有效的特征向量,然后为每一个特征向量设置1-5等5个级别的权重(如果是给定一个文本,那么特征向量可以是文本中 的词,其权重可以是这个词出现的次数)。例如给定一段语句:“CSDN博客结构之法算法之道的作者July”,分词后为:“CSDN 博客 结构 之 法 算法 之 道 的 作者 July”,然后为每个特征向量赋予权值:CSDN(4) 博客(5) 结构(3) 之(1) 法(2) 算法(3) 之(1) 道(2) 的(1) 作者(5) July(5),其中括号里的数字代表这个单词在整条语句中的重要程度,数字越大代表越重要。

2)hash

通过hash函数计算各个特征向量的hash值,hash值为二进制数01组成的n-bit签名。比如“CSDN”的hash值Hash(CSDN)为100101,“博客”的hash值Hash(博客)为“101011”。就这样,字符串就变成了一系列数字。

3)加权

在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,其余特征向量类似此般操作。

4)合并

将上述各个特征向量的加权结果累加,变成只有一个序列串。

拿前两个特征向量举例,例如“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”。

5)降维

对于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签名。

 

SimHash 算法优缺点

优点:

1)算法高效,非常适用于大规模网页去重

2)算法非常容易使用在MapReduce等分布式计算中

3)对于每篇文档来说,算法消耗空间非常小

缺点:

1)对于长文档和短文档同时存在的情况,只依靠算法本身尚不能完美解决网页去重的问题

2)对于两篇看似完全不相关的文档来说,其海明距离甚至有可能为0,但出现这种情况的概率极小

3)对于短文本准确率不高

 

参考资料:

1、https://segmentfault.com/a/1190000022467863

2、https://blog.csdn.net/madujin/article/details/53152619

3、https://github.com/1e0ng/simhash

4、https://leons.im/posts/a-python-implementation-of-simhash-algorithm/

5、https://geek.digiasset.org/pages/affiliate/text-simhash-good-re-process-deep_21Apr03114628313403/

6、https://www.infoq.cn/article/how-web-article-utomatically-determine-plagiarism

7、https://zhuanlan.zhihu.com/p/43640234

8、https://zhuanlan.zhihu.com/p/270322911

9、https://www.shuzhiduo.com/A/x9J263gZJ6/

10、https://www.biaodianfu.com/simhash.html

posted on 2022-05-27 11:16  enhaofrank  阅读(307)  评论(0编辑  收藏  举报

导航