【发布时间】:2015-04-14 09:05:21
【问题描述】:
我寻求一种最先进的算法来近似字符串匹配。 你给我提供参考(文章,论文,...)? 谢谢你
【问题讨论】:
标签: string pattern-matching approximate
我寻求一种最先进的算法来近似字符串匹配。 你给我提供参考(文章,论文,...)? 谢谢你
【问题讨论】:
标签: string pattern-matching approximate
您可能已经得到了答案,但我想就近似字符串匹配表达我的观点,以便其他人可能受益。我是根据我在解决云服务问题以处理真正大规模需求的经验时说的。
如果我们只想谈论近似字符串匹配算法,那么还有很多。 其中很少有: Jaro-Winkler、编辑距离(Levenshtein)、Jaccard 相似度、基于 Soundex/Phonetics 的算法等。 一个简单的谷歌搜索就会给我们所有的细节。
具有讽刺意味的是,当您尝试匹配两个给定的输入字符串时,它们会起作用。理论上可以,并演示模糊或近似字符串匹配的工作方式。
然而,严重低估的一点是,我们如何在生产设置中使用它。在我所知道的寻找近似字符串匹配算法的人中,并不是每个人都知道他们如何在生产环境中解决同样的问题。
假设我们有一个包含数百万个名称的列表,如果我们想使用上述标准算法之一针对列表中的所有条目搜索给定的输入名称,那将意味着灾难。
典型的编辑距离算法的时间复杂度为 O(N^2),其中 N 是字符串中的字符数。要扫描大小为 M 的列表,复杂度将是 O(M * N^2)。这将意味着非常高的硬件要求,无论您想要堆叠多少硬件,它都对您不利。
这是我们必须开始考虑其他方法的地方。 在生产环境中解决此类问题的常用方法之一是使用标准搜索引擎,例如 - Apache Lucene。
Lucene 索引引擎索引参考数据(称为文档),并且可以针对引擎触发输入查询。返回的结果根据它们与输入的接近程度进行排名。 这与谷歌搜索引擎的工作方式很接近。 Google 会抓取整个网络并将其编入索引,但您应该有一个模仿 Google 所做的微型系统。
这适用于大多数情况,包括名字、中间名和姓氏互换的复杂名称匹配。
您可以根据 Lucene 发出的分数来选择您的结果。
当您的角色成熟时,您将开始考虑使用托管解决方案,例如为您包装 Solr 和 ElastiSearch 的 Amazon Cloudsearch。当然,它在下面使用 Lucene,并且由于用于索引的参考数据较大,因此您可以不受索引的潜在大小的影响。
【讨论】:
您可能想了解 Levenshtein 距离。
【讨论】: