【问题标题】:Matching string using levenshtein distance and euristics使用 levenshtein 距离和 euristics 匹配字符串
【发布时间】:2017-05-01 22:06:15
【问题描述】:

我在“类别”中有字符串模式(“规则”)。例如:

类别 1

  • lorem ipsum dolor sit amet
  • consectetur adipiscing 精英
  • fusce sat amet ante nisi
  • lorem ut sem interdum molestie
  • suspendisse non lorem ut sem interdum molestie

类别 2

  • vivamus porta non metus egestas finibus
  • nam convallis augue nec laoreet pretium
  • turpis velit cursus enim ac suscipit risus turpis in metus

现在,我希望能够根据这些规则对字符串进行“分类”。假设我们想找出字符串fusce laoreet amet ante nisi 属于哪个类别。我当前的实现将使用levenshtein distance 实现并发现字符串大多“看起来像”fusce sit amet ante nisi,因此,类别是Category1

假设我们要对vivamus vel lorem imperdiet sit 进行分类。因为我在levenshtein distance 算法上设置了字符串长度的 1/5 阈值(即字符串必须与其匹配至少 80% 相似),所以字符串将保持“未分类”。

在这种情况下,我将继续使用以下算法...

从每个类别中,我将提取“常用词”——即在类别内的规则之间重复的词。在某种程度上,这些是该类别中的主导词。所以,我们将有:

类别 1

  • lorem: 3
  • 坐:2
  • amet: 2
  • sem: 2
  • interdum: 2
  • 骚扰:2

类别 2

  • 梅图斯:2
  • turpis: 2

现在我将逐字拆分vivamus vel lorem imperdiet sit 字符串,并根据类别的“主导词”中存在多少字符串词为每个类别分配一个值。即:

Category1 的值为 3 (lorem) + 2 (sit),Category2 的值​​为 0(我正在分类的字符串的拆分词与类别中的主导词之间不匹配)。价值最高的类别“获胜”。

简而言之,我的算法是:

  1. 使用 levenshtein 距离和允许 1/5 的字符串变化的阈值,以找到最接近的匹配规则。
  2. 如果失败,请将我们要分类的字符串拆分为单词,并针对每个单词检查该单词在每个类别中的“主导”程度,从而为该类别创建一个值。最高价值的类别是我们的最佳猜测。

有没有更好的方法来做到这一点?你觉得这个算法有问题吗?有什么建议吗?

【问题讨论】:

    标签: algorithm language-agnostic string-comparison levenshtein-distance


    【解决方案1】:

    我认为算法没有问题。但是,我确实认为这个问题背后可能存在问题。

    只要正确实施,任何算法本身都不会出现问题。我们在特定的情况下使用它们会产生适当或不适当的结果。

    因此,我建议您在考虑的特定情况下将算法付诸实践,而不是试图找到您能想到的最佳算法。正是这种练习,而不是作为孤立实体的算法,将为您提供有关给定解决方案的局限性和优势的见解。换句话说,不要事先追求抽象的完美。实施可能可行的最简单的解决方案,然后随着您的了解不断改进。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-25
      • 1970-01-01
      • 2019-05-27
      • 2011-07-03
      • 2012-05-11
      • 1970-01-01
      • 2011-10-01
      • 2012-10-24
      相关资源
      最近更新 更多