使用levenshtein距离和euristics匹配字符串

时间:2016-12-16 06:53:10

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

我在'类别'中有字符串模式('规则')。 e.g:

组别

  • lorem ipsum dolor sit amet
  • consectetur adipiscing elit
  • fusce sit 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%相似),所以字符串将保持“未分类”。

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

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

组别

  • lorem:3
  • 坐:2
  • amet:2
  • sem:2
  • interdum:2
  • molestie:2

类别2

  • metus:2
  • turpis:2

现在我将逐字逐句地分割vivamus vel lorem imperdiet sit字符串,我会给每个类别一个值,具体取决于该类别的“主导词”中存在多少个字符串字。即:

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

简而言之,我的算法是:

  1. 使用levenshtein距离,其阈值允许更改字符串的1/5,以找到最接近的匹配规则。
  2. 如果失败,请将我们分类的字符串拆分为单词并将每个单词拆分,检查每个类别中该单词的“支配”,为该类别创建一个值。最高价值类别是我们最好的猜测。
  3. 有更好的方法吗?你看到这个算法有问题吗?有什么建议吗?

1 个答案:

答案 0 :(得分:1)

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

没有算法,只要它们被正确实现,本身就会出现问题。这是我们在特定的情况下使用它们会产生适当或不适当的结果。

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