首页 > 技术文章 > simhash

do-your-best 2018-10-24 21:09 原文

公司在文本相似度比较上也有业务场景,以下是对其中核心的算法simHash的一些理解:

1、simHash也可以叫做文本指纹,其是一种局部敏感型的hash算法。

局部敏感的举例:

两个相差只有一个字符的文本串,“你妈妈喊你回家吃饭哦,回家罗回家罗” 和 “你妈妈叫你回家吃饭啦,回家罗回家罗”。

通过simhash计算结果为:

1000010010101101111111100000101011010001001111100001001011001011

1000010010101101011111100000101011010001001111100001101010001011

通过 hashcode计算为:

101000001100110100111011011110

1010010001111111110010110011101

大家可以看得出来,相似的文本只有部分 01 串变化了,而普通的hashcode却不能做到,这个就是局部敏感哈希的魅力。

 

2、应用场景一般是对文本大于500+的内容提前指纹做相似度比较,如果文本较短的话,相似度就会有较大的偏差。

 这一点比较好理解的,下面会提到其核心算法是分词后分别计算分词的hash:

    a、如果词数很多,其中某一个词的变更权重相对就小(对结果的影响小)

    b、如果分词很少,比如就2个词,其中一个词的改变(词占的词频较大,权重大),肯定对结果影响很大 

 

3.simHash的算法概要:

 分词 》分别Hash 》向量加权 》向量合并 》 降维

下图会有一个清晰的展示过程:

   

4. 相似度中不能不理解之 汉明距离

概念:在信息编码中,两个合法代码对应位上编码不同的位数称为码距,又称汗(海)明距离。

其他参考:https://blog.csdn.net/chouisbo/article/details/54906909

本质是:a替换为b所需要进行的最小替换次数。

5. 其他相似性算法介绍:

    a、余弦相似性算法:

  

      非常好的文章,建议阅读:TF-IDF与余弦相似性的应用

             http://www.ruanyifeng.com/blog/2013/03/tf-idf.html

      http://www.ruanyifeng.com/blog/2013/03/cosine_similarity.html

    b、其它的还有jaccard相似度,欧氏距离,马氏距离,闵可夫斯基距离等,这里不做一一介绍,大家有兴趣可以自行了解。

6. 真实的业务场景和SimHash应用

真实的业务场景往往有海量的文本,比如千万级,搜索网站都是亿级别,如果选择余弦相似性,那么其计算过程如下:

计算输入的文本向量A > 千万级的余弦相似性向量计算。

若网站qps大,可以想象这个计算压力是大的惊人啊!

以下介绍Simhash在大文本相似性比较的绝妙想法:

 

 

 

 

 

 

参考文章:

http://www.lanceyan.com/tech/arch/simhash_hamming_distance_similarity.html

http://www.lanceyan.com/tech/arch/simhash_hamming_distance_similarity2-html.html

https://mp.weixin.qq.com/s/NVZ8VoIJEhY6XsngkUNltw

https://mp.weixin.qq.com/s/G3c-h_29w4AwjqsPpHPuAw

推荐阅读