2009-04-14 103 views
1

我有一個通用的一些文件名(LIST1)和另一個帶有完整名稱列表(LIST2)的biggeneric。 我需要將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相似性的相似性,這是正確的。但是如何定義一個共享最長公共子串的兩個字符串最接近的度量標準呢? – 2009-04-14 12:15:03

2

有一個類似的問題here,也許一些答案會有相關的?

+1

+1。 SO需要更多像你這樣的人。 – 2009-04-14 12:38:28

1

您的相似性標準可能是其他幾個標準的組合。一個可能是Levenshtein距離,其他可能是最長的公共子字符串或前綴/後綴。

最長的公共子串問題實際上是編輯距離的一種特殊情況,當禁止替換時,只有精確的字符匹配,插入和刪除是允許的編輯操作(請參閱here)。

描述了字符串相似性的其他指標here

1

正則表達式可用於獲取與名稱匹配的項目。版本號可以在匹配的正則表達式組中收集並解析成一個.NET對象(例如十進制),您可以使用它來比較哪一個對象最接近。

1

this SO question有一套相當詳盡的答案。底部是鏈接,我接受了C#實現soundex,雙重metaphone,PHP相似性和levenstein。