【问题标题】:How to choose a fuzzy matching algorithm?如何选择模糊匹配算法?
【发布时间】:2019-10-03 11:15:23
【问题描述】:

我需要知道使模糊算法在这 3 个之间彼此不同的标准:

Levenshtein 距离算法

Levenshtein distance 是一个字符串度量,用于测量两个序列之间的差异。通俗地说,两个单词之间的 Levenshtein 距离是将一个单词更改为另一个单词所需的最小单字符编辑(即插入、删除或替换)次数。

达默劳-列文斯坦距离

Damerau–Levenshtein 距离是两个字符串之间的距离(字符串度量),即符号的有限序列,通过计算将一个字符串转换为另一个字符串所需的最小操作数给出,其中定义了一个操作作为单个字符的插入、删除或替换,或两个相邻字符的转置。

由 Wu 和 Manber 修改的 Bitap 算法

位图算法是一种近似的字符串匹配算法。该算法判断给定文本是否包含与给定模式“近似相等”的子字符串,其中近似相等是根据 Levenshtein 距离定义的——如果子字符串和模式彼此在给定距离 k 内,则算法认为他们是平等的。

我的文档是一个公司名称的表格,有些公司因为拼写错误而出现了两次或三次。在这种特殊情况下,如何通过匹配来对公司进行分组?选择哪种算法,为什么?在文件中,我有 100k 行,而且还在增长。

【问题讨论】:

  • 你好,你试过什么?也许最好从最复杂的算法开始,如果它不符合您的喜好,则降级。也许网上有人有同样的问题,你检查过吗?
  • @reportgunner 我会换一种方式,从不太复杂的开始并升级,如果它不起作用。此外,PHP 提供了 levenshtein 方法:php.net/manual/de/function.levenshtein.php
  • 谢谢,为什么要使用 PHP ?我认为 Python 是最好的方法(对于海量数据、ML 和其他库......)
  • @TTeaTie:谷歌搜索 python levenshtein 提供了足够的结果,因此如果您比 PHP 更了解 Python,则可以使用 Python。
  • DL 通过交换相邻字母扩展 L。 Bitap 是一个近似 L。我倾向于使用 L 的 q-gram 过滤近似,因为它简单快速。

标签: python algorithm fuzzy-comparison


【解决方案1】:

如果您使用的是 Google 表格,请尝试使用 Flookup。您说您的列表有超过 100K 行,因此根据 Google 的(定时)执行限制,这可能会带来一些挑战,但我仍然鼓励您尝试一下。 您可能感兴趣的一项功能是:

FLOOKUP(lookupValue, tableArray, lookupCol, indexNum, [threshold], [rank])

完全披露:我为 Google 工作表创建了 Flookup

【讨论】:

    【解决方案2】:

    如果您想对公司进行分组,您可以使用局部敏感散列法或聚类方法,例如 K-medoids 聚类,并以 Levenshtein 编辑距离作为指标。或者,您可以使用SymSpell

    Levenshtein- 和 Damerau-Levenshtein 距离都是衡量字符串相似度的好指标,但请确保使用快速实现。 Github 上有太多流行且速度极慢的实现。我所知道的最好的是PolyLeveneditdistance

    【讨论】:

      猜你喜欢
      • 2011-07-04
      • 2010-10-04
      • 2011-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多