据我了解,LSH 方法的主要功能之一是数据减少,甚至超出了底层哈希(通常是 minhashes)。我一直textreuse
在 R 中使用这个包,我对它生成的数据的大小感到惊讶。textreuse
是一个经过同行评审的ROpenSci包,所以我认为它可以正确地完成它的工作,但我的问题仍然存在。
假设我分别为我的 minhash 和 LSH 函数使用 256 个排列和 64 个波段 - 通常用于检测相对确定性(~98%) 相似性低至 50% 的实际值。
如果我使用 (256 perms) 散列一个随机文本文件TextReuseTextDocument
并将其分配给trtd
,我将拥有:
object.size(trtd$minhashes)
> 1072 bytes
现在让我们为这个对象(64 个波段)创建 LSH 存储桶并将其分配给l
,我将拥有:
object.size(l$buckets)
> 6704 bytes
因此,LSH 存储桶中保留的哈希值是原始 minhashes 的六倍。我理解这是因为textreuse
使用 md5 摘要来创建存储桶哈希。
但这不是太浪费/矫枉过正,我不能改进它吗?我们的数据缩减技术最终膨胀到这种程度是否正常?根据原始哈希(类似于 perms = 256 和bands = 256)匹配文档然后使用阈值清除误报不是更有效吗?
请注意,我已经查看了诸如Mining of Massive Datasets之类的典型文本,但这个问题仍然是关于这个特定实现的。另请注意,这个问题不仅出于好奇,而且出于需要。当您拥有数百万或数十亿个哈希值时,这些差异就会变得很重要。