algorithm - 查找相似字符串的优化方法

标签 algorithm search optimization

假设我有一个很大的单词列表。 (大约 4-5 千,并且还在增加)。有人搜索了一个字符串。不幸的是,在单词列表中找不到该字符串。现在找到与输入字符串相似的单词的最佳和优化方法是什么?我首先想到的是计算词表的每个条目与输入字符串之间的 Levenshtein 距离。但这是做到这一点的优化方法吗?

(请注意,这不是特定于语言的问题)

最佳答案

编辑:新解决方案

是的,计算输入和单词列表之间的 Levenshtein 距离可能是一种合理的方法,但需要很多时间。 BK 树可以改善这一点,但随着 Levenshtein 距离变大,它们会很快变慢。看来我们可以使用 trie 加快 Levenshtein 距离计算,如这篇出色的博客文章中所述:

Fast and Easy Levenshtein distance using a Trie

它依赖于 Levenshtein 距离的动态规划查找表在不同调用中具有公共(public)行,即 levenshtein(kate,cat)levenshtein(凯特,猫)

使用 TWL06 运行该页面上给出的 Python 程序字典给出:

> python dict_lev.py HACKING 1
Read 178691 words into 395185 nodes
('BACKING', 1)
('HACKING', 0)
('HACKLING', 1)
('HANKING', 1)
('HARKING', 1)
('HAWKING', 1)
('HOCKING', 1)
('JACKING', 1)
('LACKING', 1)
('PACKING', 1)
('SACKING', 1)
('SHACKING', 1)
('RACKING', 1)
('TACKING', 1)
('THACKING', 1)
('WHACKING', 1)
('YACKING', 1)
Search took 0.0189998 s

这真的很快,而且在其他语言中会更快。大部分时间花在构建 trie 上,这是无关紧要的,因为它只需要完成一次并存储在内存中。

唯一的小缺点是尝试会占用大量内存(可以使用 DAWG 减少内存,但会牺牲一些速度)。

另一种方法:Peter Norvig 有一篇关于拼写纠正的很棒的文章(带有完整的源代码)。

http://norvig.com/spell-correct.html

我们的想法是构建可能的单词编辑,然后选择最有可能对该单词进行拼写更正。

关于algorithm - 查找相似字符串的优化方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20034396/

相关文章:

sql-server-2005 - 有关查询优化的提示和技巧 [SQL Server 2005]

python - Python CSV 行和列中的精确匹配

python - 找到给定范围内的所有 A^x

algorithm - 负权重的 Dijkstra

c# - 冒泡排序最坏的例子是 O(n*n),怎么样?

mysql - 与带有重音符号、变音符号等的单词匹配 mysql/php

ruby-on-rails - 在 Ruby on Rails 中搜索的最佳选择是什么?

haskell - 在 Haskell 中有条件地折叠列表的简洁语法

algorithm - 证明 g(n) 是 O(g(n)) 以下每一个

java - 当你有小段时,如何显示每条可能采取的路径?