LSH即时分类

时间:2019-06-01 08:25:20

标签: python minhash lsh

我想使用MinHash LSH将大量文档分类到相似文档的存储桶中(Jaccard相似性)。

问题:是否可以在不了解其他文档的MinHash的情况下计算MinHash的存储桶?

据我了解,LSH“只是”计算MinHashes的哈希值。这样应该有可能吗?

我觉得很值得推荐的一种实现是datasketch。在知道所有文档的MinHash之后,我可以查询LSH中与给定文档相似的文档。但是,在了解其他文档之前,我看不到要获取单个文档的方法。 https://ekzhu.github.io/datasketch/index.html

1 个答案:

答案 0 :(得分:1)

LSH不会存储整个文档,也不会存储单个小杂项。相反,它会散布“带状”的斑点。

LSH既可以减少每个文档中存储的哈希数,又可以减少使用这些哈希搜索相似文档时发现的匹配数。它通过将多个小杂凑组合到单个哈希中来实现此目的。因此,例如,您可以将它们分成四个频段,而不是每个文档存储200个哈希,以产生50个局部敏感哈希。

使用便宜的哈希函数(例如FNV-1a),根据其组成的哈希值计算每个波段的哈希。这会丢失一些信息,这就是为什么据说LSH会降低数据的维数的原因。产生的哈希是存储桶。

因此,无需了解其他任何条带或任何其他文件,就可以计算出文档中每个散列带的存储桶。

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

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

这里是a good explanation of LSH