我有一些带有一些文件名(LIST1)的泛型和另一个带有完整名称列表的大型通用(LIST2)。 我需要将LIST1中的名称与LIST2中的类似名称相匹配。例如
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行更好。
还有另一种比较类似字符串更好的方法吗?更灵活的东西?
答案 0 :(得分:5)
当比较为字符串时,“9.2”与“9.1”的“5.1”不是更好的匹配。如果要以数字方式评估版本号,则必须解析字符串,以便分别比较字符串部分和数字部分。
答案 1 :(得分:2)
有一个类似的问题here,也许某些答案会有相关性?
答案 2 :(得分:1)
您的相似性标准可能是其他几个标准的组合。一个可能是Levenshtein距离,其他可能是最长的共同子串或前缀/后缀。
最长的常见子字符串问题实际上是编辑距离的一种特殊情况,当禁止替换时,只有精确的字符匹配,插入和删除是允许的编辑操作(请参阅here)。
字符串相似度的进一步指标描述为here。
答案 3 :(得分:1)
可以使用正则表达式来获取与名称匹配的项目。可以在匹配中的正则表达式组中收集版本号,并将其解析为.net对象(例如十进制),您可以使用它来比较哪一个最接近。
答案 4 :(得分:1)
this SO question有一套相当详尽的答案。在底部是我为Soundex,双metaphone,PHP相似性和levenstein提供C#实现的链接。