版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。
版权
算法专栏收录该内容
17 篇文章0 订阅
订阅专栏
simhash的背景
simhash广泛的用于搜索领域中,也许在面试时你会经常遇到这样的问题,如果对抓取的网页进行排重,如何对搜索结果进行排重等等。随着信息膨胀时代的来临,算法也在不断的精进,相似算法同样在不断的发展,接触过lucene的同学想必都会了解相似夹角的概念,那就是一种相似算法,通过计算两个向量的余弦值来判断两个向量的相似性,但这种方式需要两两进行计算向量的余弦夹角,计算量比较大,不能用于实时计算或是大数据量的运算,比如在做搜索结果的相似性排重时,需要对上千条结果进行相似性排重,如果两两比对的话,最少也需要进行上千次的向量余弦值计算,其中涉及到分词,特征提取,余弦值计算等,很难满足性能的需要。
jaccard相似度也是一种相似算法,它的计算方式比较直观,就是sim(x,y)= (x∩y) / (x∪y),例如:
若S={a, d},T={a, c, d}
则Jaccard_Sim(S, T) = |{a, d}|/|{a, c, d}| = 2/3
也是一种需要实时生成特征向量并且进行计算的算法。
那么
什么是simhash呢?
Simhash 是一种用单个哈希函数得到文档最小哈希签名的方法,过程为:
将一个f维的向量V初始化为0;f位的二进制数S初始化为0;对每一个特征:用传统的hash算法对该特征产生一个f位的签名b。对i=1到f:如果b的第i位为1,则V的第i个元素加上该特征的权重;否则,V的第i个元素减去该特征的权重。如果V的第i个元素大于0,则S的第i位为1,否则为0;输出S作为签名。
对两篇文档,它们的Simhash值之间不同位的个数越少(即海明距离越小),它们之间的Jaccard相似度越高。
什么是局部敏感性哈希呢?
局部敏感哈希(LSH)是指这样的哈希方法:对两篇文档,如果它们相似,则它们的哈希值有较高的概率是相同的。有了文档的最小哈希签名,我们就能实现这种哈希方法。直观的做法是,将包含b×r个值最小哈希签名分为b等份,每份r个,对两个文档,定义P为两个文档至少含有1个相同份的概率