1

私は、新しいドキュメントが作成されるたびに、約500.000レコードのデータベースで重複を検出して破棄する必要があるドキュメントシステムを開発しています。

今のところ、私は検索エンジンを使用して、最も類似した20のドキュメントを取得し、それらを作成しようとしている新しいドキュメントと比較しています。問題は、新しいドキュメントが類似しているかどうかを確認する必要があることです(similar_textを使用すると簡単です)。または、他のテキスト内に含まれている場合でも、テキストがユーザーによって部分的に変更されている可能性があることを考慮して、このすべての操作を行います(これは問題)。どうすればそれができますか?

例えば:

<?php

$new = "the wild lion";

$candidates = array(
  'the dangerous lion lives in Africa',//$new is contained into this one, but has changed 'wild' to 'dangerous', it has to be detected as duplicate
  'rhinoceros are native to Africa and three to southern Asia.'
);

foreach ( $candidates as $candidate ) {
  if( $candidate is similar or $new is contained in it) {
       //Duplicated!!
  }
}

もちろん、私のシステムでは、ドキュメントは3ワードより長くなっています:)

4

2 に答える 2

1

これは私が使用している一時的な解決策です:

function contained($text1, $text2, $factor = 0.9) {
    //Split into words
    $pattern= '/((^\p{P}+)|(\p{P}*\s+\p{P}*)|(\p{P}+$))/u';
    $words1 = preg_split($pattern, mb_strtolower($text1), -1, PREG_SPLIT_NO_EMPTY);
    $words2 = preg_split($pattern, mb_strtolower($text2), -1, PREG_SPLIT_NO_EMPTY);

    //Set long and short text
    if (count($words1) > count($words2)) {
        $long = $words1;
        $short = $words2;
    } else {
        $long = $words2;
        $short = $words1;
    }

    //Count the number of words of the short text that also are in the long
    $count = 0;
    foreach ($short as $word) {
        if (in_array($word, $long)) {
            $count++;
        }
    }

    return ($count / count($short)) > $factor;
}
于 2012-06-22T19:46:46.427 に答える
0

潜在的に着手またはさらに調査できるいくつかのアイデアは次のとおりです。

  1. ドキュメントにインデックスを付けてから、類似したドキュメントを検索します。そのため、 SolrSphinxZendSearchLuceneなどのオープンソースのインデックス作成/検索システムが役立つ可能性があります。

  2. simハッシュアルゴリズムまたはshinglingを使用できます。簡単に言うと、simhashアルゴリズムを使用すると、類似したドキュメントの類似したハッシュ値を計算できます。したがって、この値を各ドキュメントに対して保存し、さまざまなドキュメントがどの程度類似しているかを確認できます。


いくつかのアイデアを得るのに役立つと思われる他のアルゴリズムは次のとおりです。

1。レーベンシュタイン距離

2。ベイジアンフィルタリング-ベイジアンフィルタリングに関するSOの質問。このリスト項目の最初のリンクは、Wikiのベイジアンスパムフィルタリングの記事を指していますが、このアルゴリズムは、実行しようとしていることに適合させることができます。

于 2012-06-16T11:09:00.460 に答える