我已经阅读了很多讨论基于编辑距离的模糊搜索的主题,像Elasticsearch/Lucene这样的工具提供了开箱即用的功能,但是我的问题有点不同。假设我有字的字典,{“猫”,“担架床”,“催化剂”},以及字符相似关系F(X,Y)如何模糊搜索字典单词?
f(x, y) = 1, if characters x and y are similar
= 0, otherwise
(这些“相似性”可以通过指定程序员)
这样,比方说,
f('t', 'l') = 1
f('a', 'o') = 1
f('f', 't') = 1
但是,
f('a', 'z') = 0
etc.
现在,如果我们有一个查询 'cofatyst',该algorit hm应报告以下匹配:
3210其中number是找到的匹配的从0开始的索引。我已经尝试过Aho-Corasick algorithm,虽然它对于精确匹配非常有用,并且在一个角色的“相似”字符数量相对较少的情况下,它的性能会随着我们增加角色类似字符的数量而呈指数级下降。任何人都可以指出我更好的方式吗?模糊性是绝对必要的,它必须考虑到字符相似性(即不要盲目依赖编辑距离)。
有一点需要注意的是,在野外,字典将会非常大。
我玩过它,但我不确定这是如何有助于如果字典是巨大的 - 我仍然必须匹配字典单词与查询逐一。 BITAP似乎工作得很好,当你有一些大文本和一个模式从该文本grep。 – 2013-05-03 10:44:24
我用JSON测试了7个属性和约420行的表。更大的文本grep肯定会提高性能,但即使使用简单的2字符,性能也令人满意..这是我的测试完成。希望这些信息有帮助。 – 2013-05-04 06:16:07