1

我有一个带有一些文件名的泛型(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 行返回 distance=1。但在我的情况下,第 3 行比第 2 行更好。

有没有更好的方法来比较相似的字符串?更灵活的东西?

4

4 回答 4

5

当作为字符串比较时,“9.2”并不比“5.1”更好地匹配“9.1”。如果您希望以数字方式评估版本号,则必须解析字符串,以便可以分别比较字符串部分和数字部分。

于 2009-04-14T12:00:01.473 回答
1

您的相似性标准可以是其他几个标准的组合。一个可能是 Levenshtein 距离,其他可能是最长的公共子串或前缀/后缀。

最长公共子串问题实际上是编辑距离的一种特殊情况,当禁止替换并且只有完全匹配的字符匹配、插入和删除是允许的编辑操作时(参见此处)。

此处描述了字符串相似性的更多指标。

于 2009-04-14T12:12:36.623 回答
1

可以使用正则表达式来获取与名称匹配的项目。版本号可以在匹配的正则表达式组中收集并解析为.net 对象(例如十进制),您可以使用该对象来比较哪个最接近。

于 2009-04-14T12:14:11.300 回答
1

这个 SO question有一套相当详尽的答案。在底部是我为 soundex、双变音、PHP 相似性和 levenstein 提供的 C# 实现的链接。

于 2009-04-14T12:30:12.743 回答