是否存在容忍微小差异的散列算法?

时间:2011-04-13 22:11:42

标签: algorithm caching web-crawler hash

我正在做一些网络爬行类型的东西,我正在寻找网页中的某些术语,并在页面上找到它们的位置,然后将其缓存以供以后使用。我希望能够定期检查页面是否有任何重大变化。只需将当前日期和时间放在页面上就可以挫败像md5这样的东西。

是否有任何散列算法适用于此类内容?

4 个答案:

答案 0 :(得分:11)

执行文档相似性的常用方法是shingling,这比散列更复杂。另外,请查看内容定义的分块以获得拆分文档的方法。

几年前我读了一篇关于使用Bloom filters进行相似性检测的论文。 Using Bloom Filters to Refine Web Search Results。这是一个有趣的想法,但我从来没有尝试过它。

答案 1 :(得分:3)

这可能是使用Levenshtein distance metric的好地方,{{3}}量化了将一个序列转换为另一个序列所需的编辑量。

这种方法的缺点是你需要保留每个页面的全文,以便以后比较它们。另一方面,使用基于散列的方法,您只需存储某种小的计算值,并且不需要先前的全文进行比较。

您也可以尝试某种混合方法 - 让哈希算法告诉您已经进行了任何更改,并将其用作检索文档的归档副本的触发器,以进行更严格的(Levenshtein)比较。 / p>

答案 2 :(得分:1)

http://www.phash.org/为图片做了类似的事情。 jist:拍摄图像,模糊图像,将其转换为灰度图像,进行离散余弦变换,并查看结果的左上象限(重要信息所在的位置)。然后为每个小于平均值的值记录0,为每个值记录大于平均值的1。结果非常适合小的变化。

Min-Hashing是另一种可能性。在文本中查找要素并将其记录为值。连接所有这些值以生成哈希字符串。

对于上述两种情况,请使用有利位置树,以便搜索近点击。

答案 3 :(得分:-4)

我很遗憾地说,但哈希算法正是如此。没有人能够容忍微小的差异。你应该采取另一种方法。