LSH 即时装箱

LSH Binning On-The-Fly

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

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

据我了解,LSH "just" 计算 MinHashes 的哈希值。所以应该可以吧?

我发现一个很有前途的实现是datasketch。在知道所有文档的 MinHash 后,我可以查询 LSH 以查找与给定文档相似的文档。但是,在了解其他文档之前,我看不出有什么方法可以获取单个文档的桶。 https://ekzhu.github.io/datasketch/index.html

LSH 不会存储整个文档,也不会存储单个最小哈希值。相反,它包含 'bands' 个 minhashes。

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

每个波段的哈希是使用廉价的哈希函数(例如 FNV-1a)从其构成的最小哈希计算得出的。这会丢失一些信息,这就是为什么 LSH 据说 降低了数据的维度 。生成的哈希值就是桶。

因此,无需了解任何其他波段或任何其他文档,即可计算文档中每个最小哈希值波段的存储桶。

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

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

这里是a good explanation of LSH