我寻求最先进的算法来近似字符串匹配。 你给我提供参考(文章,论文,......)? 谢谢
答案 0 :(得分:2)
你可能已经得到了答案,但我想传达我对大致字符串匹配的观点,以便其他人可能会受益。我是根据我的经验来解决云服务问题以处理真正大规模的需求。
如果我们只是想谈谈近似字符串匹配算法,那么有很多。 其中很少是: Jaro-Winkler,编辑距离(Levenshtein),Jaccard相似度,基于Soundex / Phonetics的算法等。 一个简单的谷歌搜索将给我们所有的细节。
反讽是,当你尝试匹配两个给定的输入字符串时,它们会工作。理论上很好,并证明模糊或近似字符串匹配的工作方式。
但是,粗略低调的一点是,我们如何在生产设置中使用相同的内容 。并非所有我知道谁在寻找近似字符串匹配算法的人都知道如何在生产环境中解决这个问题。
假设我们有一个包含数百万个名字的列表,如果我们想要使用上述标准算法之一搜索列表中所有条目的给定输入名称,则意味着灾难。
典型的编辑距离算法的时间复杂度为O(N ^ 2),其中N是字符串中的字符数。要扫描大小为M的列表,复杂度将为O(M * N ^ 2)。这意味着非常高的硬件要求,无论你想要多少h / w,它都不会对你有利。
这是我们必须开始考虑其他方法的地方。 在生产环境中解决此类问题的常见方法之一是使用标准搜索引擎,如 - Apache Lucene。
Lucene索引引擎索引引用数据(称为文档),并且可以针对引擎触发输入查询。返回结果,根据它们与输入的接近程度进行排序。 这与谷歌搜索引擎的工作方式非常接近。谷歌搜索并索引整个网络,但你应该有一个模仿谷歌所做的微型系统。
这适用于大多数情况,包括复杂的名称匹配,其中第一个,中间名和最后一个名称互换。
您可以根据Lucene发布的分数选择结果。
当您的角色成熟时,您将开始考虑使用托管解决方案,例如Amazon Cloudsearch,它将为您提供Solr和ElastiSearch。当然,它使用Lucene,并且由于用于索引的较大参考数据,使您不依赖于索引的潜在大小。
答案 1 :(得分:0)
您可能想了解Levenshtein距离。