web-dev-qa-db-ja.com

最も近いファイルの一致?

ファイルのセットを特定のファイルと比較する方法を探しています。各比較で「近さ」の指標が得られます。次に、メトリックに基づいて注文して、最も近いファイルを見つけることができるはずです。私はdiffの使用を検討しましたが、これは特定の行が一致するかどうかについてのみ「はい」または「いいえ」を提供します。これは私の目的には大きすぎます。私の目的では、テキスト行の単語の変更は完全に異なる行よりも近いです。 diffは、両方の場合に不一致を返します。

100行以上のファイルでsoundexを効果的に使用できますか、それともより良いアルゴリズムがありますか?また、類似した行が大幅に異なる行番号にある場合に正の一致を提供するメトリックはありますか?

ありがとう

5
Gruffputs

Diffを使用して、異なる行の数を数えることができます。

diff f1.txt f2.txt | wc -l

これにより、数値範囲が得られます

3
Martin York

私は以前に レーベンシュタイン距離 を使用して効果を上げました。ここでいくつかの言語の例を見つけることができます: http://en.wikibooks.org/wiki/Algorithm_implementation/Strings/Levenshtein_distance

このアルゴリズムは、2つのデータセットがどれだけ離れているかを示すために0より大きい数値を提供します。0は、セットが同一であることを意味します。

3
JohnL

ベクトル空間モデル

ドキュメント全体を比較する一般的な方法は、 ベクトル空間モデル です。これは、各単語をベクトルとして表し、それらのベクトルを別のドキュメントと比較して類似性を測定できるようにします。

これにより、同じようなコンテンツのドキュメントが増えますが、必ずしも同じようなテキストである必要はありません。そのためには、通常、 レーベンシュタイン距離 と呼ばれるものを使用しますが、ドキュメント全体で実行可能かどうかはわかりません(主に文字列で使用されます)

this も参照してください

1
Homde

diffで大いに役立つと思います。差分アルゴリズムを見ると、ラインレベルごとよりもきめ細かくすることができるかもしれません

http://c2.com/cgi/wiki?DiffAlgorithm

1
svrist

すべての文字が別々の行に表示されるように入力を変更する場合でも、diffを使用できます。

_diff <(sed 's/\(.\)/\1\n/g' <file1) <(sed 's/\(.\)/\1\n/g' <file2) | wc -l
_

<(...)構文にはbashが必要であり、概念的には「_..._を実行し、出力をどこかの一時ファイルに送信し、<(...)構文を名前に置き換えることを意味します。この一時ファイルの、後で削除します」(ただし、実際の一時ファイルの代わりに、利用可能な場合はFIFOを使用します)。これは、プロセスの出力をプログラムの名前付き入力ファイルとして使用するための優れた方法です。これは、消費するプログラムがstdinから読み取れない場合、または2つの別個の入力ソースが必要な場合に必要です(diff ここに)。

1
j_random_hacker