【问题标题】:String similar to a set of strings类似于一组字符串的字符串
【发布时间】: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


【解决方案1】:

不是对 O(N^2) 的直接回答,而是对 N1 算法的评论。

这是示例数据,但都是干净的。这不是我会使用 Levenstien 的数据。 Incriminate 与 Incorporated 的距离比 Inc. 更近。E. 与 Enrique 的匹配度不高。

Levenshtein-distance 擅长捕捉关键输入错误。
它也适用于匹配 OCR。

如果您有干净的数据,我会使用词干提取和其他自定义规则。
Porter 词干分析器可用于 C#,如果您有干净的数据
例如
消除 。和其他标点符号
删除停用词 (the)

解析每个列表一次并为每个唯一的词干分配一个 int 值
在 int 上进行匹配
仍然是 N^2 但现在 N1 更快
您可以在单个大写字母中添加匹配以大写字母开头的单词获得部分分数
还需要考虑字数
匹配 3 的两组 5 应高于匹配 4 的两组 10

我会为每个短语创建 Int 哈希集,然后相交并计数。

不确定你是否能摆脱 N^2。
但我建议你看看N1。

Lucene 是一个具有短语匹配功能的库,但它并没有真正为批处理设置。
以多次使用的意图创建索引,以便索引搜索速度在索引创建时间上得到优化。

【讨论】:

    【解决方案2】:

    在给定的例子中,至少有一个词总是匹配的。一种可能的方法是使用多重映射(一个能够为每个键存储多个条目的字典)或Dictionary<TKey,List<TVlaue>>。第一组中的每个字符串都将被拆分为单个单词。这些词将用作多图中的键,整个字符串将存储为值。

    现在您可以将第二组中的字符串拆分为单个单词,并对每个单词进行 O(1) 查找,即对所有单词进行 O(N) 查找。这会产生第一个原始结果,其中每个匹配项至少包含一个匹配词。最后,您必须通过应用其他规则(例如搜索首字母或缩写词)来优化这个原始结果。

    【讨论】:

    • "In the given examples at least one word is always matching" 取决于假设,但我认为这不适用于fuzzy-string matching
    【解决方案3】:

    这个问题,称为“字符串相似性连接”,最近在研究界进行了很多研究。我们发布了一个名为 Flamingo 的 C++ 源代码包,它实现了这种算法http://flamingo.ics.uci.edu/releases/4.1/src/partenum/。如果您的数据集对于单台机器来说太大,我们还在 http://asterix.ics.uci.edu/fuzzyjoin/ 提供基于 Hadoop 的实现。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-08
      • 1970-01-01
      • 1970-01-01
      • 2019-10-03
      • 2021-10-25
      • 1970-01-01
      • 1970-01-01
      • 2021-05-06
      相关资源
      最近更新 更多