記事または投稿が重複しているかどうかを検出するには、どのアルゴリズムを使用できますか?


17

記事またはフォーラムの投稿がデータベース内の重複エントリかどうかを検出しようとしています。私はこれにいくつかの考えを与えました、コンテンツを複製する誰かが3つのうちの1つを使用してそうするという結論に達しました(検出するのが困難な降順で):

  1. 単純なコピーはテキスト全体を貼り付けます
  2. テキストの一部をコピーして貼り付け、独自のテキストとマージします
  3. 外部サイトから記事をコピーし、自分のものになりすます

分析のためのテキストの準備

基本的に異常。目標は、テキストを可能な限り「純粋」にすることです。より正確な結果を得るために、テキストは次のように「標準化」されます。

  1. 重複する空白を取り除き、先頭と末尾をトリミングします。
  2. 改行は\ nに標準化されます。
  3. HTMLタグが削除されます。
  4. Daring Fireball URLと呼ばれるRegExの使用は取り除かれます。
  5. 私はアプリケーションでBBコードを使用しているので、そうなります。
  6. (ä)セント語および外国語(英語以外)は、外国語以外の形式に変換されます。

各記事に関する情報は、(1)統計表と(2)キーワード表に保存します。

(1)統計表 次の統計がテキストコンテンツについて保存されます(この投稿と同様)。

  1. テキストの長さ
  2. 文字数
  3. 単語数
  4. 文数
  5. 文ごとの平均単語
  6. 自動可読性インデックス
  7. 霧吹きのスコア

ヨーロッパ言語の場合、音節のカウントを使用しないため、コールマン・リアウおよび自動可読性インデックスを使用する必要があります。したがって、かなり正確なスコアを生成する必要があります。

(2)キーワード表

キーワードは、「the」、「a」、「of」、「to」などのストップワード(一般的な単語)の膨大なリストを除外することによって生成されます。

サンプルデータ

  • text_length、3963
  • letter_count、3052
  • word_count、684
  • センテンスカウント、33
  • word_per_sentence、21
  • gunning_fog、11.5
  • auto_read_index、9.9
  • キーワード1、殺された
  • キーワード2、役員
  • キーワード3、警察

記事が更新されると、上記の統計はすべて再生成され、まったく異なる値になる可能性があることに注意してください。

上記の情報を使用して、初めて公開される記事がデータベース内に既に存在するかどうかを検出するにはどうすればよいですか?


私が設計するものは完璧ではないことを知っています。最大のリスクは、(1)重複していないコンテンツに重複のフラグが立てられることです(2)システムは重複したコンテンツを許可します。

そのため、アルゴリズムは、0から重複リスクなし、5が重複可能、10が重複であるリスク評価番号を生成する必要があります。5を超えると、コンテンツが重複している可能性が高くなります。この場合、コンテンツにフラグを付け、重複する可能性のある記事にリンクし、人間が削除するか許可するかを決定できます。

前に言ったように、記事全体のキーワードを保存していますが、段落ごとに同じことができるかどうか疑問に思います。これは、DB内のデータをさらに分離することも意味しますが、最初の投稿で(2)を検出するのも簡単になります。

私は統計間の加重平均を考えていますが、どのような順序で、どのような結果になるでしょうか...


完全に一致する場合は、フィールドを一意に設定するだけで済みます。そうでない場合は、どの時点でテキストをコピーまたは密接に派生した作品と見なすことができるかを決める必要があります。
ジェームズP.

2
この種の分析には多くの方向性があります。人々はこの種のトピックについて本全体を書きます。「相対的な近さ」を判断することが目標である場合、自然言語処理機械学習と呼ばれるものを掘り下げる以外に選択肢はほとんどありません。それはコンピューター科学者がそれを呼ぶものですが、それは本当に高度な統計分析です。良い出発点は、レベンシュタイン距離を調べることかもしれませんが、単語/文のカウントのような「ダム」統計はほとんど役に立たないでしょう。
rdlowrey

1
それはSOから移行された前に、あなたは、PHPのネイティブチェックアウトするかもしれないので、また、これは、[PHP]タグ付けされたレーベンシュタイン機能
rdlowrey

人間のチェックを重複させる可能性があります!7以上が重複し、6以下が異なり、人間が6または7のスコアのみをチェックするように自動的に決定できる場合があります。スパム識別では、どちらのカテゴリも知らない。複製に近いものとオリジナルの作品の間の灰色の領域は、できる限り最善の判断を下すことです。
グレンペターソン

@rdlowrey-レーベンシュタインアルゴリズムは、C#で行った同様のプロジェクトで使用したものです。私は同意します、それは始めるのに良い場所であり、十分かもしれません。
jfrankcarr

回答:


4

NLPのドキュメントの類似性を扱う多くのアルゴリズムがあります。これは、さまざまなアルゴリズムを説明する独創的な論文です。また、ウィキペディアにはより大きなコレクションがあります。私はJaro Winkler尺度を支持し、それを凝集型クラスタリング手法の大学院プロジェクトに使用しました。


6

Rabin-Karp algborithmを見てください。rsyncが使用するローリングハッシュを使用して、同期中に送信されるバイトを最小限に抑えます。ハッシュに使用するウィンドウのサイズを調整することにより、多かれ少なかれ敏感にすることができます。RKは、とりわけ盗作の検出に使用されます。盗作の検出は、基本的に一種のduを探しています。


4
OPが説明する問題は、盗作の検出とまったく同じように思われ、ヘルプを探す最初の場所としてそれを提案します。(ソースを特定してください!)
カレブ

4

これに最初に取り組むのは、文(またはその他の合理的なデータブロック)を検出することかもしれません。これらのブロックを取得し、meteデータ、htmlランダムホワイトスペース、リターンなどを取り除きます。次に、これらのブロックと照合して一致を見つけようとします。

これが機能しない場合は、n-gramを試してみてください。ここでは、ページ上の各単語の1つのエントリが必要ですが、かなり良い一致を与えることができるはずです。

http://en.wikipedia.org/wiki/N-gram


n-gramベースのメジャーは、特にhtmlなどの半構造化データの場合、md5ハッシュよりもはるかに優れています。
キャンディッド

1

正確な数学的数学のために、ハッシュを保存してから比較します。

試験に使用されるシステムは、単語のグループを測定し、次に各サイズのグループの頻度を測定すると思います。たとえば、コピーされた30個の単語のチェーンは5つのリスクポイントを獲得し、10個の単語チェーンの5つの出現は5ポイントを獲得します。その後、500ワードにつき30ポイントのしきい値を保持します。

実際には、「また」や「および」などの単語が同じものとして解析されるように、セマンティックアルゴリズムが必要です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.