接近数据流中的重复检测

时间:2012-04-27 10:24:11

标签: streaming duplicates filtering bloom-filter

我目前正在开发一个生成大量文本内容的流式API。正如所料,API提供了大量重复项,我们还有业务要求来过滤接近重复的数据。

我对数据流中的重复检测做了一些研究,并阅读了Stable Bloom Filters。稳定布隆过滤器是数据流中重复检测的数据结构,具有误报率的上限。

但是,我想识别附近的重复项,我还查看了最近邻问题和近似重复检测中使用的哈希算法,如LSH和MinHash。

我有点陷入困境,并寻找关于如何继续以及我可以看到的论文/实施的指示?

2 个答案:

答案 0 :(得分:6)

  1. 首先,将文本规范化为所有小写(或大写)字符,将所有非字母替换为空格,将所有多个空格压缩为1,删除前导和尾随空格;为了速度,我会在文本的一个传递中执行所有这些操作。接下来获取结果字符串的MD5哈希(或更快)。对表中的MD5哈希(作为两个64位整数)进行数据库查找(如果存在),它是完全重复,如果不是,则将其添加到表中并继续到下一步。您可能希望根据时间或内存使用情况使旧哈希老化。

  2. 要查找近似重复项,需要将规范化字符串转换为潜在的签名(子串的哈希值),请参阅Greg Linden撰写的SpotSigs论文和blog post。假设例程Sigs()对给定字符串执行该操作,也就是说,给定规范化字符串xSigs(x)返回一小组(1-5)64位整数。您可以使用类似SpotSigs算法的内容来选择签名文本中的子字符串,但如果您对数据有所了解,那么使您自己的选择方法可以表现得更好。您可能还想查看simhash算法(代码为here)。

  3. 鉴于Sigs(),有效查找近似重复项的问题通常称为set similarity joins问题。 SpotSigs论文概述了一些启发式算法,以便将新集合需要与simhash方法进行比较。

答案 1 :(得分:1)