私は、2つの類似したソースコードファイルを比較するための差分テキストツールを作成中です。
そのような「差分」ツールはたくさんありますが、私のものは少し改善されるでしょう:
一連の行が両側で(つまり、両方のファイルで)不一致であることがわかった場合、それらの行を強調表示するだけでなく、これらの行の個々の変更も強調表示します(ここではこの行間比較と呼びます)。
私のやや機能するソリューションの例:
代替テキストhttp://files.tempel.org/tmp/diff_example.png
現在行われていることは、不一致の行のセットを取得し、それらの単一の文字をもう一度差分アルゴに通して、ピンクのハイライトを生成することです。
ただし、「元の2」を含む2番目の不一致のセットにはさらに作業が必要です。ここでは、最初の2つの右側の行(「追加された行a / b」)が追加され、3番目の行は左側の変更されたバージョンです。私のソフトウェアが、可能性のある変更と可能性のある改行の間のこの違いを検出することを望みます。
この単純な例を見ると、このケースをかなり簡単に検出できます。
レーベンシュタインのようなアルゴリズムでは、3から5のセットのすべての右の行の中で、5行目が左の3行目に最もよく一致することがわかりました。したがって、右側の3行目と4行目が追加されたことを差し引いて、インターを実行できます。 -左の行3と右の行5の行の比較。
ここまでは順調ですね。しかし、私はまだこれをこの目的のためのより一般的なアルゴリズムに変える方法に固執しています。
より複雑な状況では、一連の異なる線が両側に線を追加し、その間にいくつかの密接に一致する線がある可能性があります。これは非常に複雑になります。
左側の最初の行を右側の最良の行に一致させるだけでなく、その逆も同様に、他のすべての行と一致させる必要があります。基本的に、左側のすべての行を右側のすべての行と一致させる必要があります。最悪の場合、これにより交差が均等になる可能性があるため、新しく挿入された行と変更された行が簡単に明確になりません(注:実際に単純化されない限り、このようなブロックで移動された可能性のある行を処理したくありませんアルゴリズム)。
確かに、これが完璧になることは決してありませんが、私は今よりも良くしようとしています。あまり理論的ではないが実用的である(抽象的なアルゴリズムをよく理解していない)提案はありがたいです。
アップデート
私はLCSアルゴがどのように機能するかさえ理解していないことを認めなければなりません。文字列の2つの配列をフィードするだけで、一致しないシーケンスのリストが表示されます。私は基本的にここからのコードを使用しています:http://www.incava.org/projects/java/java-diff
コードを見ると、2行が一致するかどうかをアルゴリズムに伝える役割を担う1つの関数equal()が見つかります。Pavelが提案したことに基づいて、それが私が変更を加える場所であるかどうか疑問に思います。しかし、どのように?この関数はブール値のみを返します。一致の品質を識別できる相対値は返しません。そして、同様の線がまだ等しいと見なされるかどうかを決定する固定のレーベンシュタイン配給を単純に使用することはできません-問題の線のセット全体に自己採用するものが必要になります。
つまり、基本的に言っているのは、(完全に)一致しない線の相対的な類似性に関連するファジー値をどこに適用するかがまだわからないということです。