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

Posted

技术标签:

【中文标题】使用 levenshtein 距离和 euristics 匹配字符串【英文标题】:Matching string using levenshtein distance and 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(我正在分类的字符串的拆分词与类别中的主导词之间不匹配)。价值最高的类别“获胜”。

简而言之,我的算法是:

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

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

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

以上是关于使用 levenshtein 距离和 euristics 匹配字符串的主要内容,如果未能解决你的问题,请参考以下文章

Levenshtein distance 编辑距离算法

编辑距离算法(Levenshtein)

如何调整 Levenshtein 距离算法以将匹配限制为单个单词?

Python:使用 scikit-learn 的 dbscan 进行字符串聚类,使用 Levenshtein 距离作为度量:

在 Java 中使用 Levenshtein 距离改进搜索结果

尝试在 T-SQL 查询中使用 Levenshtein 距离 - 请帮助优化