【发布时间】:2012-11-07 17:57:07
【问题描述】:
我需要将一组字符串与另一组字符串进行比较,并找出哪些字符串相似(模糊字符串匹配)。 例如:
{ "A.B. Mann Incorporated", "Mr. Enrique Bellini", "Park Management Systems" }
and
{ "Park", "AB Mann Inc.", "E. Bellini" }
假设索引从零开始,则匹配项将是 0-1、1-2、2-0。显然,在这类事情上没有算法是完美的。
我有一个 Levenshtein-distance 算法的工作实现,但是使用它从每个集合中查找相似的字符串需要循环遍历两组字符串来进行比较,从而产生 O(n^2) 算法。即使是中等大小的集合,这也会运行得慢得令人无法接受。
我还尝试了使用叠瓦和 Jaccard 系数的 clustering algorithm。不幸的是,这也运行在 O(n^2) 中,即使进行位级优化,最终也会变得太慢。
有没有人知道更有效的算法(比 O(n^2) 更快),或者更好的是,已经用 C# 编写的库来完成这个?
【问题讨论】:
-
您是否针对要执行的任务对 LINQ 进行了基准测试?你有你想要做什么的示例 sn-ps 吗?这些数组有多大?
-
你需要从算法中返回什么?您是否需要知道 [bool valueMatchesInB = arrayB.Contains(arrayA[i])] 还是需要确切知道哪个索引与哪个索引匹配?
-
基本上,对于给定的字符串,算法需要返回一组字符串中的哪些成员在一定的容差范围内是模糊匹配的。
-
使用搜索功能,卢克。我在这里多次看到这个问题。也可以查找后缀树。
-
我进行了搜索,正如我在问题中说得很清楚的那样,典型的答案总是最终是 n^2。
标签: c# .net cluster-analysis levenshtein-distance similarity