【问题标题】:Near duplicate detection in SolrSolr 中的近重复检测
【发布时间】:2012-09-27 19:03:04
【问题描述】:

Solr 被用于搜索用户生成列表的数据库。这些清单通过 DataImportHandler 从 MySQL 导入到 Solr。

问题:很多时候,用户向数据库报告相同的列表,有时会对其列表帖子进行细微更改以避免被轻易检测为重复帖子。

我应该如何使用 Solr 实现近似重复检测?我不介意在 Solr 索引中有几乎重复的列表,只要搜索结果不包含这些近似重复的列表。

我猜有 4 个可能的地方可以进行这种近乎重复的检测

  1. 当用户提交列表时(这里使用的是PHP)
  2. 数据从 MySQL 导入 Solr 期间
  3. 从 MySQL 导入数据后
  4. 搜索完成时

推荐的方法是什么?谢谢!

【问题讨论】:

  • 在紧要关头,您可以使用 solr 的“更像这样”功能为审阅者标记内容,这可能是您工作流程的第 3 步。它返回一个完美匹配的系数 1.0。

标签: php solr lucene duplicates dataimporthandler


【解决方案1】:

我不熟悉 Solr,我会在用户提交列表时实现“近乎重复”。有很多不同的算法可以检测类似Jaccard Indexing 的近似重复。

我做了一个小脚本来看看相似系数之间的差异:

<?php

$input1 = "Hello there, this is a test 1, you see it's almost the same";
$input2 = "Hello there, this is a test 2, you saw it, it's almost the same";
$input3 = "this is very different from the others, but who knows ?";

echo jackard($input1, $input1) . "<br />"; // results 1

echo jackard($input1, $input2) . "<br />"; // results 0.81481481481481

echo jackard($input1, $input3) . "<br />"; // results 0.25

echo jackard($input2, $input3); // results 0.24


function jackard($a, $b){
    $a_arr = explode(" ", $a);
    $b_arr = explode(" ", $b);
    $intersect_a_b = array_intersect($a_arr,$b_arr);
    return((count($intersect_a_b)/(count($a_arr)+count($b_arr)))*2);
}
?>

您可能会看到,如果结果为 1,则表示它是同一个句子,或者它以不同的顺序使用相同的单词。 但是,值越小,“句子”就越独特。这是一个相当简单的实现。您可以设置一个限制值,例如 0.4。如果超过此限制,则将“请求”设置在队列中。然后手动查看清单。这不是“有效的”。但是我给了你这个想法,由你来开发一个更复杂和自动化的系统/算法。也许你也应该看看here

【讨论】:

  • 谢谢,这让我大开眼界。如果我想要类似 craigslist 的近乎重复检测,您是否认为通过 Jaccard 之类的算法运行表中的每个列表(200,000 行)是一个严重的瓶颈,处理能力很小,比如服务器上只有 4 个内核?
  • 呃,这就是问题所在,我尝试了一些 lorem ipsum 文本(每个变量 5 个句子),并尝试了 for 循环 200.000 次,在四核 2.67Ghz 上花了大约 20 秒(这是没有连接到数据库,这会使进程变慢)
  • 我查了一下,发现 Spotsig 和 LSH(Locality Sensitive Hashing)用于近似重复检测。找不到任何可以实现它们的 PHP 库。我想知道 Craigslist 是如何做到的
猜你喜欢
  • 2021-03-12
  • 2010-11-05
  • 2019-01-19
  • 2012-05-08
  • 1970-01-01
  • 2019-06-21
  • 2019-01-04
  • 1970-01-01
  • 2017-08-07
相关资源
最近更新 更多