類似しているが順序が異なるコンテンツを持つ2つの大きなテキストコーパスの違いを見つけるための効率的な方法は何ですか?


8

英語のテキストの段落を含む2つの大きなファイルがあります。

  1. 最初のテキストは約200ページの長さで、ページあたり約10段落(各段落は5文長)です。
  2. 2番目のテキストには、最初のテキストとほぼ同じ段落とテキストが含まれています。また、ページ数は200ページで、1ページに10段落あります。ただし、最初のテキストと比較すると、段落はランダム化され、順序が異なります。また、大部分の段落では、類似の段落と比較して、表現にわずかな変更があります。たとえば、最初のテキストの段落には次のようなLike Jimmy, I wanted to go to the palace文があり、2番目のテキストの段落の対応する文にはがありますLike Jimmy, I really wanted to go to the castle

私は、追加のような、ここで変更を取得できるようにしたいreallyとの削除palaceが置換されましたcastle。段落がおおまかに揃っている場合、テキストを比較する方法はたくさんあるので、これはかなり簡単です。ただし、段落が揃っていないため、そうではありません。

ファイルが小さい場合(数段落)、レーベンシュタイン距離はおそらくうまく機能しますが、ファイルが大きいため、テキスト1の各段落をテキスト2の各段落と比較して、一致する段落を見つけるのは非効率的です。

この問題を効率的に処理するには、他にどのようなアプローチがありますか?


段落は少なくとも互いに近接していますか、10程度の「半径」の範囲内ですか。一般的なアイデアは、何らかの方法で前処理することです。たとえば、めったに変更されない単語(名前?)を見つけ、少なくともこれらを共有する単語のみを比較します。
ラファエル

クローン検出ツールを試すことができます。これらはプログラミング言語で使用することを目的としていますが、それ以外はこの問題用に設計されています。CCFinderはおそらく機能します。
reinierpost

3
:ここではいくつかの答えと同様の問題だcs.stackexchange.com/questions/47794/...
wvxvw

1
コマンドラインユーティリティ「diff」を試しましたか?
usul

@Raphaelここで前処理することで、あなたが意味するところを拡張できますか?また、段落はドキュメントの「セクション」にあり、セクションはかなり長く(50〜60段落のように)、順序付けされていない場合があります。
vikram7

回答:


1

2000段落と2000段落を比較すると、400万回の比較になります。

問題の鍵は、レーベンシュタイン距離を計算する関数を使用するのではなく、距離が特定のしきい値未満の場合はレーベンシュタイン距離を計算する関数を使用し、距離が次の場合は失敗する(または、むしろ+∞を返す)ことです。しきい値より大きい。

これは、よく似た段落にのみ関心があるためです。無関係であるほど十分に異なる段落間の正確な距離にはまったく関心がありません。したがって、距離が不必要になるほど高くなるとすぐに、関数はすぐに終了できます。そして、これは実際には関数の実行中の非常に早い段階でほとんど発生します。

しきい値が高いほど、実行時間が長くなりますが、偽陰性の割合は小さくなります。

ドキュメントについて何か知っている場合(各段落が他のドキュメントの多くても1つの段落と一致する場合など)、低いしきい値で1つのパスを作成し、一致した段落を追加の検討から除外して、現在の削減されたものを1回パスすることができますより高いしきい値を持つコーパス、それらの削減された段落を除外する、など。

実装の詳細:おそらく、文字ではなく単語のレーベンシュタイン距離を計算します。その場合は、最初に各単語に番号を割り当てる必要があります。たとえば、コーパス全体を並べ替え、最初の単語を「1」、2番目の単語を「2」というように呼び出します。そうすれば、段落比較は単語ではなく数値を比較することによって行われ、より高速になります。


-1

複合的なアプローチを使用することが可能かもしれません。おそらく誰かがこれに基づいて構築できます...

わずかな違いしかない段落が同様のハッシュを持つような方法で段落の内容をハッシュし、ハッシュを順序付けして、より正確な方法(diffまたは類似の何か)で比較する段落を決定します。

たとえば、初歩的なハッシュアルゴリズムとして、文字のASCII値を合計し、その合計を2,000,000,000のような大きな数でモジュロするとどうなるでしょうか。これにより、わずかな数の単語が追加または削除された2つの段落のハッシュ値は、非常に異なる単語の段落よりも近い可能性が高く、したがって、非常に異なる段落よりもリスト上で非常に近くなります(たとえば、この場合、近くのハッシュは必要ですが、同様の段落には十分ではありません)。明らかに、モジュロによって引き起こされるラップアラウンドを考慮に入れて、ハッシュ値が1,999,999,999の段落は、値が0の段落からの距離が1だけであると考える必要があります。

その結果、実行する必要がある段落間の比較の数を大幅に減らすことができます(1つのテキストの各段落を他のテキストのすべての段落と比較する必要はありません)。テキスト2の段落は、ハッシュが近い順に(最も近いハッシュ値のハッシュを最初に実行して)、ここでより高価なアルゴリズムを呼び出して、同じと見なされる「十分に類似」しているかどうかを判断します。


2
テキストの段落について話している場合、ASCII値の合計20億は、ASCII値の合計です。段落が約800万文字を超えない限り、つまり...この答えは、当時考えていたものに基づいて、かなりハッキングされているように見えます。あなたが提案するアプローチが効果的であるという証拠はありますか?実験や公表された研究によって裏付けられていますか?
David Richerby
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.