【问题标题】:Near Duplicate Detection in Data Streams数据流中的近重复检测
【发布时间】:2012-05-08 02:25:46
【问题描述】:

我目前正在开发一个可以生成大量文本内容的流式 API。正如预期的那样,API 给出了很多重复数据,我们也有过滤接近重复数据的业务需求。

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

但是,我想识别近似重复,我还研究了用于最近邻问题和近似重复检测的散列算法,如 LSH 和 MinHash。

我有点卡住,正在寻找关于如何进行的指示以及我可以查看的文件/实施?

【问题讨论】:

  • 你能提供一些关于文本内容的信息吗?内容是大文档还是小文档(100-1K 字符),是只有英文,还是混合语言,是文本还是 html 或 xml 还是...,每小时生成多少文档,时间窗口多长你需要重复数据删除吗?
  • 您好,文字内容只是小文字!可能少于 200 个字符。每秒大约有 100-200 个文档。希望有帮助

标签: streaming duplicates filtering bloom-filter


【解决方案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 方法进行比较的新集合的数量。

【讨论】:

    【解决方案2】:

    【讨论】:

      猜你喜欢
      • 2012-09-27
      • 2021-03-12
      • 2010-11-05
      • 2019-01-19
      • 1970-01-01
      • 1970-01-01
      • 2021-10-28
      • 2019-06-21
      • 2019-01-04
      相关资源
      最近更新 更多