【问题标题】:C# comparing similar stringsC#比较相似的字符串
【发布时间】:2010-10-19 07:56:10
【问题描述】:

我有一个带有一些文件名的泛型 (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 行更好。

还有其他更好的方法来比较相似的字符串吗?更灵活的东西?

【问题讨论】:

    标签: c# string compare similarity


    【解决方案1】:

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

    【讨论】:

    • 我会说这取决于你如何定义相似性。如果您仅将相似性基于 Levenshtein 相似性,这是正确的。但是,如果一个度量标准定义了两个共享最长公共子字符串的字符串最相似呢?
    • (续) 还是拥有最多的 n-gram?有很多方法可以比较字符串,但是,可能没有万能的指标。
    【解决方案2】:

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

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

    更多关于字符串相似度的指标描述在here

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2011-10-20
          • 2011-08-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-31
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多