将相似文档映射到相同值的文本文档的哈希函数

数据挖掘 类似文件
2022-03-04 19:57:13

我有一个处理用户提交的文本文档(通常为 10-100 页)的网站。每次用户提交文档时,我都想存储文档的哈希值,但我希望类似的文档映射到相同的哈希值。我本质上想知道用户是重新提交稍微更改的文档还是新文档。

我不存储文档,所以我只能比较哈希值,而不能相互比较文档。

我已经阅读了大量有关 MinHash 和 LSH 的内容,但这些似乎都是基于拥有大量文档的语料库,然后在语料库中找到类似的文档。我认为这些对我不起作用,因为我需要一次在单个文档上计算我的哈希向量,而无需对其他文档一无所知。

在某些方面,我觉得这应该是一个简单的问题。类似于计算词袋向量的哈希值,但我正在努力寻找一种好方法来做到这一点。

我的比较是基于文本而不是意义,所以我不需要像词嵌入这样的东西。

2个回答

散列任何东西的唯一副本,包括文档,通常称为指纹

选择指纹哈希函数取决于您的用例。对于您的用例,选择一个滚动的非加密哈希函数。最简单的例子之一是Rabin–Karp 算法一旦应用,相似的文档将具有相似的哈希值。

另一个问题是比较哈希值以识别近似重复。精确的最近邻算法效果最好,但不可扩展。近似最近邻算法是可扩展的,但可能有错误。局部敏感散列 (LSH) 是近似最近邻搜索算法的一个示例。您必须在规模和潜在错误之间做出权衡。

你在这里看到的是一个模糊匹配练习!它看起来不太像,因为模糊匹配通常在短字符串之间完成,但您要实现的是匹配两个几乎相同(尽管很长)的字符串。我建议您使用此处描述的方法,它的速度足以比较整个文档。它通过为文档创建字符 ngram 计数向量并通过余弦相似度比较文档来工作。您可以设置余弦相似度阈值,以在两个文档的余弦相似度过高时发出警告。它涉及使用 scikit-learn 的 TfidfVectorizer,您可以在适当语言的任何文档组上拟合一次,因为矢量化器只需要了解哪些字符 n 克是不寻常的。