2009-04-14 13 views
1

私はいくつかのファイル名(LIST1)と完全な名前リスト(LIST2)を持つもう一つの大きな名前のジェネリックを持っています。 LIST1の名前とLIST2の名前を同じにする必要があります。例C#類似の文字列を比較する

LIST1 
- **MAIZE_SLIP_QUANTITY_3_9.1.aif** 

LIST 2 
1- TUTORIAL_FAILURE_CLINCH_4.1.aif 
2- **MAIZE_SLIP_QUANTITY_3_5.1.aif** 
3- **MAIZE_SLIP_QUANTITY_3_9.2.aif** 
4- TUTORIAL_FAILURE_CLINCH_5.1.aif 
5- TUTORIAL_FAILURE_CLINCH_6.1.aif 
6- TUTORIAL_FAILURE_CLINCH_7.1.aif 
7- TUTORIAL_FAILURE_CLINCH_8.1.aif 
8- TUTORIAL_FAILURE_CLINCH_9.1.aif 
9- TUTORIAL_FAILURE_PUSH_4.1.aif 

のために私は約Levenshtein distanceを読んだとフレームワーク(SignumFramework Utilities)での実装を使用していました。 それはライン2と3で私の距離= 1を返します。しかし、私の場合、3行目は2行目

よりも良い試合が似た文字列を比較するために、より良い別の方法がありますか?もっと柔軟なもの?

答えて

5

文字列として比較すると、「9.2」は「9.1」の「5.1」よりもよく一致しません。バージョン番号を数値で評価するには、文字列部分と数値部分を別々に比較できるように文字列を解析する必要があります。

+0

私はそれが類似性をどのように定義するかによって異なります。 Levenshteinの類似性にのみ基づいて類似性がある場合、これは正しいです。しかし、最も類似した部分文字列を共有する2つの文字列を定義するメトリックはどうでしょうか? –

+0

(続き)または、最も多くのnグラムを共有していますか?ストリングを比較できる方法はたくさんありますが、おそらくオールスーツはありません。すべてのメトリックです。 –

2

simlarの質問hereがありましたが、おそらくいくつかの回答が関連していますか?

+1

+1。あなたのような人がもっと必要です。 –

1

あなたの類似性基準は、いくつかの他の基準の組み合わせである可能性があります。 1つはLevenshtein距離であり、他のものは例えば最も長い共通部分文字列または接頭辞/接尾辞である。

最も一般的な部分文字列の問題は、実際には置換が禁止され、正確な文字の一致、挿入、および削除のみが許容される編集操作(hereを参照)である編集距離の特殊なケースです。

さらに、文字列類似性のメトリックはhereと記載されています。

1

正規表現を使用して、名前に一致する項目を取得することができます。バージョン番号は、一致の正規表現グループに集められ、どのオブジェクトが最も近いかを比較するために使用できる.netオブジェクト(例:10進数)に解析されます。

1

this SO questionには、かなり網羅的な回答があります。一番下のリンクは、私はsoundex、ダブルメタフォン、PHPの類似性とlevensteinのためのC#の実装に置いています。