【问题标题】:Improving performance of fuzzy string matching against a dictionary提高模糊字符串匹配字典的性能
【发布时间】:2011-02-09 13:47:55
【问题描述】:

所以我目前正在使用SecondString 进行模糊字符串匹配,我有一个大字典可以比较(字典中的每个条目都有一个关联的非唯一标识符)。我目前正在使用 hashMap 来存储这个字典。

当我想进行模糊字符串匹配时,我首先检查字符串是否在 hashMap 中,然后遍历所有其他潜在键,计算字符串相似度并存储 k,v 对相似度最高。根据我使用的字典,这可能需要很长时间(12330 - 1800035 个条目)。有什么办法可以加快速度或加快速度吗?我目前正在编写一个记忆函数/表格作为加快速度的一种方式,但是其他人能想出更好的方法来提高速度吗?也许是不同的结构或其他我缺少的东西。

非常感谢,

内森

【问题讨论】:

标签: java data-structures


【解决方案1】:

您要寻找的是结合 Levenshtein 距离算法的 BKTree(BK-Tree)。 BKtree 中的查找性能取决于您的搜索有多“模糊”。其中,模糊定义为搜索词和匹配项之间的距离(编辑)数。

这是一个关于这个主题的好博客: http://blog.notdot.net/2007/4/Damn-Cool-Algorithms-Part-1-BK-Trees

关于性能的一些说明: http://www.kafsemo.org/2010/08/03_bk-tree-performance-notes.html

http://en.wikipedia.org/wiki/Levenshtein_distance 算法的注意事项。

另外,这是一个用 Java 编写的 BK-Tree。应该让您对界面有所了解:http://code.google.com/p/java-bk-tree/

【讨论】:

    【解决方案2】:

    或者您也可以使用 Java Fuzzy HashMap(允许模糊搜索的 java hashMap 的扩展):http://sourceforge.net/projects/fuzzyhashmap/ 我认为这正是您所需要的。这里有完整的数据结构说明:http://ieeexplore.ieee.org/xpl/freeabs_all.jsp?arnumber=5565628

    【讨论】:

    • 对此有一点需要注意——如果搜索关键字少于 5 个字符,它不会返回任何内容。您可以修改源代码,但有一条评论说它在测试少于 5 个字母的键时准确性较差。
    • 另外,虽然 BK-tree 将返回一个紧密匹配的列表,但 FuzzyHashMap 只返回一个模糊匹配。同样,我认为这很容易解决。
    【解决方案3】:

    不同模糊字符串匹配的解释和比较见这篇优秀的文章: http://ntz-develop.blogspot.com/2011/03/fuzzy-string-search.html

    java 源代码可在 https://code.google.com/p/fuzzy-search-tools/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-26
      • 2012-02-14
      • 2014-11-02
      • 2018-01-09
      • 2021-07-06
      • 2018-05-31
      • 2021-04-19
      • 1970-01-01
      相关资源
      最近更新 更多