web-dev-qa-db-ja.com

テキスト比較アルゴリズム

プロジェクトでは、2つのテキスト(update1、update2)を比較し、変更された単語数と文数を定義するアルゴリズムを考え出す必要があります。

使用できるアルゴリズムはありますか?

コードも探していません。アルゴリズムがわかっていれば、Javaでコーディングできます。

30
java_mouse

通常、これは Longest Common Subsequence (一般にLCS問題と呼ばれます)を見つけることによって行われます。これがdiffのようなツールの機能です。もちろん、diffは行指向のツールであり、ニーズが多少異なるように思えます。ただし、単語と文を比較するための方法をすでに構築していると仮定します。

18
FatalError

An O(NP)シーケンス比較アルゴリズム は、Subversionのdiffエンジンで使用されます。

ちなみに、githubの次のページには、さまざまなプログラミング言語による実装が自分であります。

https://github.com/cubicdaiya/onp

13
cubicdaiya

wdiff など、ある種の差分バリアントが役立つ場合があります。

独自のアルゴリズムを考案する場合は、文が挿入された状況に対処する必要があります。たとえば、次の2つのドキュメントの場合:

The men are bad. I hate the men

そして

The men are bad. John likes the men. I hate the men

あなたのツールは、2番目にI hate the menJohn likes the menに置き換えられておらず、変更されておらず、新しい文がその前に挿入されていることを認識できるはずです。つまり、4つの単語の後に新しい文が続くのではなく、文の挿入を報告する必要があります。

8
Howard

Diffや他のほとんどの比較ユーティリティで使用される特定のアルゴリズムは、Eugene Myerの An O(ND)差分アルゴリズムとそのバリエーション です。Java Java-diff-utils パッケージで利用可能な実装です。

6
Zoë Peterson

以下は、一般的に「より良い」(例えば、より小さく、より意味のある)差異を出力する他のテキスト比較アルゴリズムを説明する2つの論文です。

最初の論文は2番目の論文を引用し、そのアルゴリズムについてこれに言及しています。

Heckel [3]は、LCS技術に関する同様の問題を指摘し、ブロックの動きを検出する線形ライムアルゴリズムを提案しました。文字列に重複するシンボルがほとんどない場合、アルゴリズムは適切に実行されます。ただし、そうでない場合、アルゴリズムの結果は良くありません。たとえば、2つの文字列aabbbbaaを指定すると、ヘッケルのアルゴリズムは失敗します一般的な部分文字列を検出します。

最初の論文は this answer で言及され、2番目の論文は this answer で言及されましたが、どちらも同様のSO質問:

5
Kenny Evitt

大きなファイルを効率的かつ優れたパフォーマンスで比較する場合、問題が生じます。したがって、Myersのバリエーションを実装しましたO(ND) diffアルゴリズム-非常によく正確に実行されます(正規表現に基づくフィルタリングをサポートしています):

アルゴリズムはここでテストできます: becke.ch比較ツールWebアプリケーション

そして、ホームページのもう少し情報: becke.ch比較ツール

1
becke.ch