首页 > 其他分享 >局部敏感哈希LSH(SimHash与MinHash)

局部敏感哈希LSH(SimHash与MinHash)

时间:2023-06-27 16:56:49浏览次数:44  
标签:hash 相似 LSH 算法 MinHash 哈希 集合 simhash 文本

SimHash

1.算法思想

假设我们有海量的文本数据,我们需要根据文本内容将它们进行去重。对于文本去重而言,目前有很多NLP相关的算法可以在很高精度上来解决,但是我们现在处理的是大数据维度上的文本去重,这就对算法的效率有着很高的要求

而局部敏感hash算法可以将原始的文本内容映射为数字(hash签名),而且较为相近的文本内容对应的hash签名也比较相近。于是simhash算法就闪亮登场了,它是由 Charikar 在2002年提出来的,也是被Google公司进行海量网页去重的高效算法。

SimHash算法通过将原始的文本映射为64位 (可以根据实际情况调整,比如128位)的二进制数字串,然后通过比较二进制数字串的差异进而来表示原始文本内容的差异

2.流程实现

整体流程主要分为以下五步:

(注:具体的事例摘自Lanceyan的博客《海量数据相似度计算之simhash和海明距离》)

  • 分词

把需要判断文本分词形成这个文章的特征单词。最后形成去掉噪音词的单词序列并为每个词加上权重,我们假设权重分为5个级别(1~5)。

比如:“ 美国“51区”雇员称内部有9架飞碟,曾看见灰色外星人 ” ==> 分词后为 “ 美国(4) 51区(5) 雇员(3) 称(1) 内部(2) 有(1) 9架(3) 飞碟(5) 曾(1) 看见(3) 灰色(4) 外星人(5)”,括号里是代表单词在整个句子里重要程度,数字越大越重要。

  • hash

通过hash算法把每个词变成hash值,比如“美国”通过hash算法计算为 100101,“51区”通过hash算法计算为 101011。这样我们的字符串就变成了一串串数字。

  • 加权

通过 2步骤的hash生成结果,需要按照单词的权重形成加权数字串,比如“美国”的hash值为“100101”,通过加权计算为“4 -4 -4 4 -4 4”;“51区”的hash值为“101011”,通过加权计算为 “ 5 -5 5 -5 5 5”。

  • 合并

把上面各个单词算出来的序列值累加,变成只有一个序列串。比如 “美国”的 “4 -4 -4 4 -4 4”,“51区”的 “ 5 -5 5 -5 5 5”, 把每一位进行累加, “4+5 -4+-5 -4+5 4+-5 -4+5 4+5” ==》 “9 -9 1 -1 1 9”。这里作为示例只算了两个单词的,真实计算需要把所有单词的序列串累加。

  • 降维

把4步算出来的 “9 -9 1 -1 1 9” 变成 0 1 串,形成我们最终的simhash签名。如果每一位大于0 记为 1,小于0 记为 0。最后算出结果为:“1 0 1 0 1 1”。

3.相似度计算 

我们把库里的文本都转换为simhash签名,并转换为long类型存储,空间大大减少,但是如何计算两个simhash的相似度呢

难道是比较两个simhash的01有多少个不同吗?其实也就是这样,我们通过海明距离(Hamming distance)就可以计算出两个simhash到底相似不相似。两个simhash对应二进制(01串)取值不同的数量称为这两个simhash的海明距离。海明距离越小,相似度越大。

举例个例子:10101 和 00110 从第一位开始依次有第一位、第四、第五位不同,则海明距离为3。对于二进制字符串的a和b,海明距离为等于在a XOR b运算结果中1的个数(普遍算法)。

4.我们如何应用?

虽然simhash是针对文档去重的应用提出来的,但它的思想完全可以用在其他大规模规模样本的聚类上,我们只需要准备好特征及权重即可。在安全领域也不例外,比如针对恶意代码聚类,可以选取样本的多个特征,并为每个特征赋予经验权重。然后按照simhash算法的流程进行hash、加权、合并、降维,最后对每一个样本都生成对应的simhash签名。

这个时候问题来了,如果样本量大的话,两两对比simhash签名也是不小的工作量,为了解决这个问题,我们又使用了minhash进行分桶处理。

三、MinHash

1.算法思想

在数据挖掘中,一个最基本的问题就是比较两个集合的相似度。通常通过遍历这两个集合中的所有元素,统计这两个集合中相同元素的个数,来表示集合的相似度,也就是Jaccard相似度。

minhash函数可以用来衡量原始集合之间的Jaccard相似度,因此可以用来快速估算两个集合的相似度。跟simhash一样,minhash也是LSH的一种,由Andrei Broder提出,最初用于在搜索引擎中检测重复网页,也可以应用于大规模聚类问题。

2.流程实现

假设集合A、B是两个特征向量:

  • 使用一组随机的hash函数h(x)对集合A和B中的每个元素进行hash。

  • hmin(A)、hmin(B)分别表示分别hash后集合A和集合B的最小值的向量。

  • Jaccard距离来衡量相似度。

详情可参考这篇文章:

https://blog.csdn.net/liujan511536/article/details/47729721

3.我们如何应用?

既然minhash算法可以用来快速估算两个集合的相似度,那么我们就采用它来实现我们的分桶策略。接着前面应用部分的内容讲,我们对多个样本计算好simhash签名后,因为要两两比较相似度,样本多的情况下,计算量会比较大,这个时候minhash算法就闪亮登场了。

在得到每个样本的simhash签名后,采用minhash函数对它继续降维,将样本分入不同的桶中,然后再对同一个桶中的样本计算simhash相似度,这样既减少了计算量,又保证了准确性。

 

标签:hash,相似,LSH,算法,MinHash,哈希,集合,simhash,文本
From: https://www.cnblogs.com/luxiaoxun/p/17509330.html

相关文章

  • 浅谈字符串哈希
    哈希HASH哈希是对于字符串的一种操作。在日常的百度搜索什么的都是根据关键字来查找,我们可以利用hash来加速这个过程。哈希的思想哈希其实是所有字符串操作中,最简单的操作了。哈希的过程,其实可以看作对一个串的单向加密过程,并且需要保证所加的密不能高概率重复,通过这种方式......
  • 一致性哈希算法
    请求和后端ip地址计算hash值%2^32。把请求转给按顺时针找到的后端IP。如果后端IP挂了,原本转给其他后端IP的请求不变。为了增强均衡性,可以增加虚拟节点。参考资料nginx负载均衡/一致性哈希......
  • 记录一下coolshare历史性时刻
      ......
  • [Leetcode] 0706. 设计哈希映射
    706.设计哈希映射点击跳转至leetcode题目描述不使用任何内建的哈希表库设计一个哈希映射(HashMap)。实现MyHashMap类:MyHashMap()用空映射初始化对象voidput(intkey,intvalue)向HashMap插入一个键值对(key,value)。如果key已经存在于映射中,则更新其对应的值v......
  • 考前复习——字符串哈希与哈希表
    点击查看代码#include<bits/stdc++.h>usingnamespacestd;#defineN1005#defineULLunsignedlonglong#defineBase13331intn;ULLh[N][N],q[N];charch[N][N];inlineintread(){ intx=0; boolf=1; charch=getchar(); for(;!isdigit(ch);ch=getcha......
  • 【剑指 Offer】数组中重复的数字(C++_Easy_遍历/哈希/快排/原地)
    题目在一个长度为n的数组nums里的所有数字都在0~n-1的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。测试样例输入:[2,3,1,0,2,5,3]输出:2或3限制2<=n<=100000题解题解一:遍历对vector容器......
  • 1.redis常见数据类型-字符串String、列表List、集合Set、Hash哈希、Zset有序集合
    背景:这里说的数据类型是value的数据类型,key的类型都是字符串。命令不区分大小写,而key的值是区分大小写的 help@+数据类型会出现命令提示比如help@string,help@list常见命令:keys*查看当前库所有key(匹配:keys*1)existskey判断某个key是否存在typekey查看你的......
  • 使用Windows自带命令校验文件哈希值
    文章目录CertutilGet-FileHashCertutilCertutil是一个windows预装的CLI程序,主要作用是转储和显示证书颁发机构(CA),配置信息,证书服务,CA组件的备份和还原以及验证证书、密钥对和证书链,它作为证书服务的一部分安装。可用于校验文件MD5、SHA1、SHA256,下载恶意文件和免杀。这里记录如......
  • BMZCTF:TallShanBen
    http://bmzclub.cn/challenges#TallShanBen图片看起来高度有点问题,加上题目名称Tall估计是要修改这个jpg的图片高度,使用010Editor打开把高度改高一点flag{Sh4n_B3n}......
  • 哈希表
    哈希表=散列表key:value键值对python的哈希表就是字典,c++是std::map哈希碰撞:两个不同的key通过同一个哈希函数得到了相同的内存地址哈希表中不存在访问搜索O(1)如果发生哈希碰撞他的时间复杂度就是O(K)k是碰撞的元素个数插入O(1)删除O(1)常用操作:1.创建哈希表2.添加元素3.删......