在Solr中接近重复检测

时间:2012-10-07 05:17:51

标签: php solr lucene duplicates dataimporthandler

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

问题:用户通常会向数据库报告相同的商家信息,有时会对其商家信息发布进行细微更改,以避免被轻易检测为重复帖子。

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

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

  1. 当用户提交列表(此处使用PHP)
  2. 从MySQL导入数据到Solr
  3. 从MySQL导入数据后
  4. 正在进行搜索
  5. 建议的方法是什么?谢谢!

1 个答案:

答案 0 :(得分:3)

我不熟悉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