0

我想使用 MinHash LSH 将大量文档放入相似文档的桶中(Jaccard 相似度)。

问题:是否可以在不知道其他文档的 MinHash 的情况下计算 MinHash 的桶?

据我了解,LSH“只是”计算 MinHashes 的哈希值。所以应该可以吧?

我觉得很有希望的一种实现是datasketch。在知道所有文档的 MinHash 后,我可以在 LSH 中查询与给定文档相似的文档。但是,在了解其他文档之前,我认为没有办法获取单个文档的存储桶。 https://ekzhu.github.io/datasketch/index.html

4

1 回答 1

1

LSH 不会存储整个文档,也不会存储单个 minhashes。相反,它会存储 minhashes 的“乐队”。

LSH 是一种既可以减少每个文档存储的哈希数,又可以减少使用这些哈希搜索相似文档时找到的命中数的方法。它通过将多个 minhashes 组合成一个散列来实现这一点。因此,例如,不是每个文档存储 200 个 minhash,而是可以将它们组合成四个带状,以产生 50 个局部敏感散列。

每个波段的散列是使用 FNV-1a 等廉价散列函数从其组成的 minhash 计算出来的。这会丢失一些信息,这就是为什么说 LSH 可以降低数据的维度。生成的哈希是桶。

因此,无需了解任何其他带区或任何其他文档即可计算文档中每个 minhash 带的存储桶。

使用 LSH 哈希查找相似文档很简单:假设您要查找与文档 A 相似的文档。首先为文档 A 生成(例如)50 个 LSH 哈希。然后在您的哈希字典中查找共享一个或多个文档的所有其他文档这些哈希值。它们共享的哈希值越多,估计的 jaccard 相似度就越高(尽管这不是线性关系,就像使用普通 minhashes 时一样)。

每个文档存储的总哈希值越少,估计的 jaccard 相似度误差就越大,丢失相似文档的机会就越大。

是 LSH 的一个很好的解释

于 2019-07-09T02:32:47.967 回答