为什么 R 中的 textreuse 包使 LSH 桶比原来的 minhash 大得多?

Why does textreuse packge in R make LSH buckets way larger than the original minhashes?

据我了解,LSH 方法的主要功能之一是数据缩减甚至超出底层哈希(通常是最小哈希)。我一直在 R 中使用 textreuse 包,我对它生成的数据大小感到惊讶。 textreuse 是一个经过同行评审的 ROpenSci 软件包,所以我认为它正确地完成了它的工作,但我的问题仍然存在。

假设我分别为我的 minhash 和 LSH 函数使用了 256 个排列和 64 个波段——通常用于检测具有 相对确定性 (~98%) 相似性的实际值低至 50%。

如果我使用 TextReuseTextDocument(256 perms)散列一个随机文本文件并将其分配给 trtd,我将有:

object.size(trtd$minhashes)
> 1072 bytes

现在让我们为这个对象创建 LSH 桶(64 个波段)并将其分配给 l,我将有:

object.size(l$buckets)
> 6704 bytes

因此,LSH 桶中保留的哈希值是原始最小哈希值的六倍。我知道发生这种情况是因为 textreuse uses a md5 digest 来创建存储桶哈希。

但这不是太浪费/矫枉过正了吗,我不能改进它吗?我们的数据缩减技术最终膨胀到这种程度是否正常?并且根据原始哈希(类似于perms = 256和bands = 256)匹配文档,然后使用阈值来剔除误报不是更有效吗?

请注意,我已经查看了 Mining of Massive Datasets 等典型文本,但是这个问题仍然是关于这个特定实现的。另请注意,这个问题不仅是出于好奇,而且是出于需要。当您拥有数百万或数十亿个哈希值时,这些差异就会变得很明显。

包的作者在这里。是的,使用超过您需要的 hashes/bands 会很浪费。 (但请记住,我们在这里谈论的是千字节,这可能比原始文档小得多。)

问题是,你需要什么?如果您只需要查找接近相同的匹配项(即 Jaccard 分数接近 1.0),那么您不需要特别敏感的搜索。但是,如果您需要可靠地检测仅共享部分重叠(即 Jaccard 分数接近 0)的潜在匹配项,那么您需要更多 hashes/bands.

既然你读过 MMD,你可以在那里查找方程式。但是包里有两个函数,documented here,可以帮你算出你需要多少个hashes/bands。 lsh_threshold() 将计算将被检测到的阈值 Jaccard 得分;而 lsh_probability() 会告诉您检测到具有给定 Jaccard 分数的一对文档的可能性有多大。尝试使用这两个函数,直到获得最适合您的搜索问题的 hashes/bands 数量。