simhash和minhash实现理解

文本相似度算法

minhash

minhash

1. 把文档A分词形成分词向量L
2. 使用K个hash函数,然后每个hash将L里面的分词分别进行hash,然后得到K个被hash过的集合
3. 分别得到K个集合中的最小hash,然后组成一个长度为K的hash集合
4. 最后用Jaccard index求出两篇文档的相似度

simhash

1. 把文档A分词形成分词向量L,L中的每一个元素都包涵一个分词C以及一个分词的权重W
2. 对L中的每一个元素的分词C进行hash,得到C1,然后组成一个新的向量L1
3. 初始化一个长度大于C1长度的向量V,所有元素初始化为0
4. 分别判断L1中的每一个元素C1的第i位,如果C1i是1,那么Vi加上w,否则Vi减去w
5. 最后判断V中的每一项,如果第i项大于0,那么第i项变成1,否则变成0
6. 两篇文档a,b分别得到aV,bV
6. 最后求出aV和bV的海明距离,一般距离不大于3的情况下说明两篇文档是相似的

中文文档simhash值计算
simhash算法原理及实现
GoSimhash 是 中文 simhash 去重算法库,Golang版本。
simhash算法的原理
simhash与Google的网页去重

转载于:https://www.cnblogs.com/bergus/p/simhash-heminhash-shi-xian-li-jie.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MinHash是一种用于近似集合相似度计算的技术。下面是一个用Python实现MinHash的示例代码: ```python import numpy as np import hashlib class MinHash: def __init__(self, num_perm): self.num_perm = num_perm self.permutations = self._generate_permutations() def _generate_permutations(self): np.random.seed(0) minhash_permutations = np.random.randint(low=0, high=np.iinfo(np.int64).max, size=(self.num_perm, 2), dtype=np.int64) return minhash_permutations def _hash_value(self, value): return hashlib.sha1(value.encode()).hexdigest() def compute_hash(self, value): hash_value = self._hash_value(value) hash_code = int(hash_value, 16) return hash_code def compute_signature(self, document): signature = np.inf * np.ones(self.num_perm, dtype=np.int64) for word in document.split(): hash_code = self.compute_hash(word) for i in range(self.num_perm): a, b = self.permutations[i] hash_value = (a * hash_code + b) % np.iinfo(np.int64).max signature[i] = min(signature[i], hash_value) return signature def compute_similarity(self, signature1, signature2): return np.mean(signature1 == signature2) # 示例用法 document1 = "This is a document about cats" document2 = "This is a document about dogs" minhash = MinHash(num_perm=128) signature1 = minhash.compute_signature(document1) signature2 = minhash.compute_signature(document2) similarity = minhash.compute_similarity(signature1, signature2) print(f"Similarity between the documents: {similarity}") ``` 在上述示例代码中,我们首先定义了一个MinHash类,它接受参数`num_perm`,表示要使用的哈希函数数量。在初始化时,我们生成了一组随机排列用于哈希计算。 `_hash_value`方法使用SHA1算法对输入值进行哈希计算,并返回哈希值的十六进制表示。 `compute_hash`方法将字符串值转换为哈希码。 `compute_signature`方法计算给定文档的MinHash签名。对于文档中的每个词,我们计算其哈希值,并将其与每个哈希函数的参数相乘并取模。然后,我们将每个哈希函数的最小值作为文档的签名。 `compute_similarity`方法计算两个文档的相似度。它简单地计算两个签名之间相等哈希函数的比例。 在示例用法中,我们创建了两个文档,并使用MinHash计算它们的签名。然后,我们计算了两个签名之间的相似度,并打印了结果。 请注意,此处的示例代码是简化版的MinHash实现,并且可能不适用于大规模数据集。在实际应用中,您可能需要使用更高效的数据结构和算法来处理大量数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值