如何比较文件与Simhash算法的相似性?

时间:2018-04-13 15:14:44

标签: duplicates simhash

我目前正在创建一个程序,可以在一组文本文档(+5000个文档)中计算近似重复的分数。 我使用Simhash生成文档的uniq足迹(感谢这个github repo) 我的数据是: data = {     1:我正在测试simhash算法。',     2:你对simhash算法的测试',     3:你'这是simhash测试。', } 这给了我这样的3个哈希: 00100110101110100011111000100010010101011001000001110000111001011100110101001101111010100010001011001011000110000100110101100110 00001001110010000000011000001000110010001010000101010000001100000100100011100100110010100000010000000110001001010110000010000100 10001110101100000100101010000010010001011010001000000000101000101100001100100000110011000000011001000000000110000000100110000000 而现在,如何比较这三个哈希?我知道我必须将它们分成块但没有确切的方法吗? 我想要做的是输出所有重复文档(> 70%)及其ID和重复文档的ID。 有人可以帮忙吗?

2 个答案:

答案 0 :(得分:4)

在回答您的问题之前,请务必记住:

  1. Simhash非常有用,因为它可以检测到接近重复的内容。这意味着附近的重复项最终将使用相同的哈希值。
  2. 对于完全重复,您可以简单地使用任何一种方式,一致的散列机制(例如md5)
  3. 您在此处粘贴的示例太小,并且考虑到它们的大小,它们的差异很大。该算法适用于处理大型Web文档而非小句。
  4. 现在,我已回复了您提出的关于Github问题的问题here

    作为参考,这里有一些示例代码,您可以使用它们在散列后打印最终的近似重复文档。

    # assuming that you have a dictionary with document id as the key and the document as the value: 
    # documents = { doc_id: doc } you can do:
    
    from simhash import simhash
    
    def split_hash(str, num):
        return [ str[start:start+num] for start in range(0, len(str), num) ]
    
    hashes = {}
    for doc_id, doc in documents.items():
        hash = simhash(doc)
    
        # you can either use the whole hash for higher precision or split into chunks for higher recall
        hash_chunks = split_hash(hash, 4)
    
        for chunk in hash_chunks:
            if chunk not in hashes:
                hashes[chunk] = []
            hashes[chunk].append(doc_id)
    
    # now you can print the duplicate documents:
    for hash, doc_list in hashes:
        if doc_list > 1:
            print("Duplicates documents: ", doc_list)
    

    如果不清楚,请告诉我。

答案 1 :(得分:0)

进一步了解备忘录的答案,如果要检测> = 70%的相似性,则不能使用simhash。 Simhash仅允许检测到很小的汉明距离,一次最多可检测到约6或7位的差异,具体取决于您的主体大小。对于70%的相似性,您必须允许19位的差异,这在任何正常情况下都是不可能的。 您应该改用minhash。

如果您有兴趣,这里有一个广泛的explanation of simhash