我目前正在开发一个生成大量文本内容的流式API。正如所料,API提供了大量重复项,我们还有业务要求来过滤接近重复的数据。
我对数据流中的重复检测做了一些研究,并阅读了Stable Bloom Filters。稳定布隆过滤器是数据流中重复检测的数据结构,具有误报率的上限。
但是,我想识别附近的重复项,我还查看了最近邻问题和近似重复检测中使用的哈希算法,如LSH和MinHash。
我有点陷入困境,并寻找关于如何继续以及我可以看到的论文/实施的指示?
答案 0 :(得分:6)
首先,将文本规范化为所有小写(或大写)字符,将所有非字母替换为空格,将所有多个空格压缩为1,删除前导和尾随空格;为了速度,我会在文本的一个传递中执行所有这些操作。接下来获取结果字符串的MD5
哈希(或更快)。对表中的MD5
哈希(作为两个64位整数)进行数据库查找(如果存在),它是完全重复,如果不是,则将其添加到表中并继续到下一步。您可能希望根据时间或内存使用情况使旧哈希老化。
要查找近似重复项,需要将规范化字符串转换为潜在的签名(子串的哈希值),请参阅Greg Linden撰写的SpotSigs
论文和blog post。假设例程Sigs()
对给定字符串执行该操作,也就是说,给定规范化字符串x
,Sigs(x)
返回一小组(1-5)64位整数。您可以使用类似SpotSigs
算法的内容来选择签名文本中的子字符串,但如果您对数据有所了解,那么使您自己的选择方法可以表现得更好。您可能还想查看simhash算法(代码为here)。
鉴于Sigs()
,有效查找近似重复项的问题通常称为set similarity joins问题。 SpotSigs
论文概述了一些启发式算法,以便将新集合需要与simhash
方法进行比较。
答案 1 :(得分:1)