为生产系统选择SimHash和MinHash

时间:2014-12-30 20:59:04

标签: minhash simhash

我熟悉SimHash和MinHash的LSH(Locality Sensitive Hashing)技术。 SimHash使用余弦相似性而不是实值数据。 MinHash计算二元向量的相似度。但我无法决定使用哪一种更好。

我正在为网站创建一个后端系统,以查找半结构化文本数据的近似副本。例如,每个记录将具有标题,位置和简短的文本描述(<500字)。

除了特定的语言实现,哪种算法最适合绿地生产系统?

2 个答案:

答案 0 :(得分:10)

Simhash 速度更快(非常快)并且通常需要更少的存储空间,但对两个文档的不同程度有严格限制,仍然可以检测为重复文件。如果您使用64位simhash(一种常见的选择),并且根据您能够存储的置换表的数量,您可能仅限于汉明距离低至3或可能高达6或7。小汉明距离!您将仅限于检测大多数相同的文档,即使这样,您可能需要仔细调整您选择进入simhash的功能以及您给予它们的权重。

谷歌获得了simhashes的专利权,但在实践中它们似乎至少允许非商业用途。

Minhash 使用更多内存,因为您通常每个文档存储50-400个哈希值,并且它不像simhash那样具有CPU效率,但它允许您找到相当远的相似性,例如:如果你愿意,估计相似度可低至5%。它比simhash更容易理解,特别是在表的工作方式方面。实现起来非常简单,通常使用带状疱疹,并且不需要进行大量调整即可获得良好的结果。它(据我所知)并不是专利。

如果您正在处理大数据,那么minhash方法中CPU占用最多的部分很可能是之后为您的文档生成了minhashes,当您正在搜索用于查找共享其某些哈希值的其他文档的表。可能存在数十或数十万个与其共享至少一个哈希的文档,并且您必须清除所有这些文档以找到共享的那些文档。至少一半的哈希值。 Simhash在这里要快得多。

正如Otmar在下面的评论中指出的那样,minhash的优化允许您在相似度估计值上达到相同的精度,每个文档的哈希值更少。这可以大大减少你必须做的除草量。

编辑:

我现在尝试superminhash。这是相当快的,虽然我的minhash using a single hash function plus bit-transformations to produce all the other hashes的实现对我来说更快。它提供了更准确的jaccard估计,在我测试的某些情况下大约提高了15%(尽管在其他情况下几乎没有差别)。这意味着您需要大约三分之一的哈希才能达到相同的准确度。在表中存储较少的哈希意味着需要较少的“除草”来识别近似重复项,从而显着提高速度。我不知道任何关于superminhash的专利。感谢Otmar!

答案 1 :(得分:6)

本文可能会为您提供有关这两种算法的一些想法。

http://jmlr.org/proceedings/papers/v33/shrivastava14.pdf