【问题标题】:Get all variations of a string using Levenshtein distance使用 Levenshtein 距离获取字符串的所有变体
【发布时间】:2021-10-02 04:54:10
【问题描述】:

我发现有很多实现在 2 个字符串之间计算 Levenshtein,但是有没有任何实现可以使用 Levenshtein 距离(最大 2)为一个给定字符串生成所有变体。

原因是,我正在使用 ElasticSearch 执行一些模糊搜索,但是由于我有大量查询,我遇到了一些性能问题,因为 ELK 每次都会计算这些可能性,我想将这些值存储一次。

【问题讨论】:

  • 您是否打算通过插入诸如? 之类的通配符或所有字符来生成字符串?因为后者会产生大量的字符串。
  • “可以为一个给定的字符串生成所有变体 [...]” 到底是什么意思?为给定字符串生成最大距离为 2 的所有字符串?那将是海量的数据。考虑“单词”,仅仅替换一个字符给你100个新单词,添加一个字符给你130个新单词,替换2个字符给你大约3700个新单词,替换一个和添加一个给你??新词,...都在 Levenshtein 距离 2 ...
  • 是的,就像@derpirscher 提到的那样,我想“为给定字符串生成最大距离为 2 的所有字符串”;我知道这有很多可能性,但这就是模糊在 ElasticSeach 中的工作方式,但是我不想让 ELK 做模糊,而是想预先计算所有可能性,并要求 ELK 与所有预先计算的可能性做一个简单的比较.
  • 您的意思是您想向 Elasticsearch 发送数百万个搜索词(如果您在早期以某种方式进一步过滤它们以免超出内存限制),而不是使用 Elasticsearch 的内置功能?得到什么?

标签: c# algorithm levenshtein-distance


【解决方案1】:

最常被引用的用于生成编辑距离的参考实现是在 Python 中,你可以看到它in this answer

原作者在其博客底部的标题Other Computer Languages 下链接了其他语言的后续实现。 C# 中有 4 个实现,this one in particular 是功能性的(我不确定这些实现是在什么许可下发布的,所以我不会将它们转录到这个线程中)。

但是在 ElasticSearch 中使用通配符搜索是正确的方法。引擎将尽可能高效地实现approximate string matching - 可以基于许多不同的算法,最佳选择取决于您的数据结构等。

您可以通过自己生成编辑距离来简化使用,但在大多数情况下,如果您使用的是数据库或引擎,它们的实现将具有更好的性能。 (这是一项计算量很大的任务,没有办法解决。)

【讨论】:

    猜你喜欢
    • 2012-07-25
    • 2017-05-01
    • 2012-10-24
    • 2011-10-01
    • 2018-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多