我对检测类似文档的技术有一个合理的理解 包括首先计算他们的minhash签名(来自他们的带状疱疹,或 n-gram),然后使用基于LSH的算法有效地聚类它们 (即避免二次复杂性,这将导致成对的天真 详尽的搜索)。
我想要做的是桥接三种不同的算法,我认为这些算法 所有这些都与这个minhash + LSH框架相关,但是以非显而易见的方式:
(1)在大规模数据集挖掘(Rajaraman和Ullman)一书的Section 3.4.3 of Chapter 3中描绘的算法,这似乎是对minhashing的规范描述
(2)Ryan Moulton的Simple Simhashing文章
(3)Charikar所谓的SimHash算法,在this article中描述
我发现这令人困惑,因为我假设虽然(2)使用了这个词 “simhashing”,它实际上是以类似于(1)的方式进行minhashing,但是 集群只能用单个表示的关键区别 签名(甚至可能涉及艰难的多个哈希函数),而两个 文件有更多机会与(1)相似,因为签名 可以在多个“乐队”中发生碰撞。 (3)看起来像一个不同的野兽,在 根据汉明距离和LSH来比较签名 技术意味着对签名进行多次排序,而不是对它们进行绑定。一世 还看到(在其他地方)这最后一项技术可以包含一个概念 加权,可用于更加强调某些文档部分,以及 在(1)和(2)中似乎缺乏。
最后,我的两个问题是:
(a)是否有(令人满意的)方式来桥接这三种算法?
(b)有没有办法将这个权重概念从(3)导入(1)?
答案 0 :(得分:0)
第2条实际上是在讨论minhash,但错误地将其称为simhash。这可能就是为什么现在将其删除(已将其存档here)的原因。此外,令人困惑的是,它谈论“连接”多个小杂项,正如您正确观察到的那样,它减少了找到两个相似文档的机会。似乎规定了仅产生单个“带”的方法,这将产生非常差的结果。
算法可以桥接/组合吗?
可能不是。要了解原因,您应该了解不同哈希的属性是什么,以及它们如何用于避免在文档之间进行n 2 比较。
minhash和simhash的属性:
本质上, minhash每个文档都会生成多个哈希,并且当有两个相似的文档时,这些哈希的一部分很可能相同。 Simhash每个文档生成一个哈希,并且在有两个相似文档的情况下,它们的相似性可能会相似(汉明距离很小)。
他们如何解决n 2 问题:
使用minhash可以将所有哈希索引到包含它们的文档中;因此,如果您要为每个文档存储100个散列,则对于每个新收到的文档,您需要在索引中查找其100个散列中的每个散列,并找到共享至少50%(例如)的所有文档。这可能意味着要建立大型临时记录,因为成千上万的文档可以共享至少一个哈希。
使用simhash,有一种巧妙的技术可以将每个文档的哈希以多种排列的形式存储在多个排序的表中,这样,任何类似的哈希都可以达到一定的汉明距离(3、4、5,可能高达6或7,具体取决于哈希值和表结构)至少可以在这些表中的至少一个表中找到,只是低序位有所不同。这样可以高效地搜索相似的文档,但仅限于查找很多相似的文档。
因为minhash和simhash的用法是如此不同,所以我看不到桥接/组合它们的方法。从理论上讲,您可以使用minhash生成1位哈希并将它们连接为类似simhash的东西,但是我看不出有什么好处。
可以在minhash中使用加权吗?
是的。可以将杂项视为插槽:如果每个文档存储100项杂项,则可以填充100个插槽。这些插槽不必全部由相同的文档功能选择来填充。您可以将一定数量的槽分配给仅根据特定特征计算出的哈希值(但是应始终选择特征,以便在相似文档中选择相同特征)。
因此,例如,如果您要处理期刊文章,则可以为文档标题的小写分配一些插槽,为文章摘要的小写分配一些插槽,为文档正文的小写分配其余的插槽。您甚至可以为个人哈希直接预留一些位置,例如作者的姓氏,而不必担心minhash算法。
它并不像simhash那样优雅,实际上,您只是在创建所有单个特征散列的按位加权平均值,然后将每个位四舍五入为1或向下舍入为0。但这是很可行的。