我正在做一些网络爬行类型的东西,我正在寻找网页中的某些术语,并在页面上查找它们的位置,然后将其缓存以供以后使用。我希望能够定期检查页面是否有任何重大更改。简单地把当前的日期和时间放在页面上就可以挫败像md5这样的东西。是否有一种容忍细微差别的哈希算法?
是否有任何哈希算法适用于这样的事情?
我正在做一些网络爬行类型的东西,我正在寻找网页中的某些术语,并在页面上查找它们的位置,然后将其缓存以供以后使用。我希望能够定期检查页面是否有任何重大更改。简单地把当前的日期和时间放在页面上就可以挫败像md5这样的东西。是否有一种容忍细微差别的哈希算法?
是否有任何哈希算法适用于这样的事情?
执行文件相似性的常用方法是shingling,它比散列更有意义。同时查看内容定义的组块来分割文档。
我几年前读了一篇关于使用Bloom filters进行相似性检测的论文。 Using Bloom Filters to Refine Web Search Results。这是一个有趣的想法,但我从来没有尝试过。
我很遗憾地说,但哈希算法正是。 Theres没有能力容忍微小的差异。你应该采取另一种方法。
好的,也许它不会被称为哈希算法。但这听起来并不像我想要的那样混乱。只有它是否应该被称为哈希算法。 – 2011-04-13 22:32:45
我刚刚回答你的问题。你问:“是否有一种容忍细微差别的哈希算法?”我说没有。也许你应该问另一件事。 – 2011-04-14 00:10:06
这可能是一个使用Levenshtein distance metric的好地方,它可以量化将一个序列转换为另一个序列所需的编辑量。
这种方法的缺点是您需要保留每个页面的全文,以便以后可以进行比较。另一方面,使用基于散列的方法,您只需存储某种小型计算值,而不需要先前的全文进行比较。
您也可以尝试某种混合方法 - 让散列算法告诉您已做出任何更改,并将其用作触发器以检索文档的存档副本以进行更严格的(Levenshtein)比较。
http://www.phash.org/做了这样的图像。 jist:拍摄图像,模糊图像,将其转换为灰度图,进行离散余弦变换,然后查看结果的左上象限(重要信息在哪里)。然后为每个小于平均值的值记录一个0,为每个值记录一个大于平均值的值。对于小的变化,结果相当不错。
Min-Hashing是另一种可能性。在文本中查找功能并将其记录为值。将所有这些值连接起来构成一个哈希字符串。
对于上述两者,请使用有利位置树,以便搜索近点。
不,这就是所有哈希算法的重点,当输入只改变一点时,它们会改变很多。 – halfdan 2011-04-13 22:13:23
@halfdan - [Wikipedia will not beagree with you](http://en.wikipedia.org/wiki/Hash_function#Finding_similar_records)。太糟糕了,他们没有提到任何算法,但声学指纹识别除此之外。 – 2011-04-13 22:43:50
[Hashing Similarity]的可能重复(http://stackoverflow.com/questions/4834301/hashing-similarity) – 2011-04-13 23:45:11