假设它们是预先加载的股票代码,键入文本框。我正在寻找可以复制的代码,而不是要安装的库。
这是受这个问题的启发:
Are there any Fuzzy Search or String Similarity Functions libraries written for C#?
Levenstein距离算法似乎运行良好,但计算需要时间。 当用户输入额外的字母时,是否需要重新运行查询这一事实是否有任何优化?我有兴趣最多显示每个输入的前10个匹配。
答案 0 :(得分:5)
您需要确定字符串周围的匹配规则。什么决定了'类似的字符串'
我已经完成了很多字符串匹配算法的工作,还没有找到任何符合我特定要求的现有库或代码。检查它们,从它们那里借鉴想法,但你总是需要自定义和编写自己的代码。
Levenstein算法虽然好但有点慢。史密斯 - 沃特曼和史密斯都取得了一些成功。 Jaro-Winkler算法,但我发现的最好的是Monge(来自内存)。然而,阅读原始研究并确定他们编写算法和目标数据集的原因是值得的。
如果你没有正确定义你想要匹配和测量的内容,那么你会发现意外匹配得分高,预期匹配得分低。字符串匹配是非常域特定的。如果你没有正确定义你的域名,那么你就像一个没有线索的渔夫,扔钩子并希望最好。
答案 1 :(得分:1)
This blog post描述了Lucene在这方面的一些工作。他们能够非常有效地使用有限状态传感器(自动机)实现Levenshtein距离模糊匹配,编码距离为2.尽管它是开源的,但代码全部都是Java编写的,有点复杂。
但基本的想法很简单:把你的字典想象成一个巨大的字母状态树。在state0,你没有信件。在state1,您承认任何可能是单词首字母的字母。 State2受state1的限制;如果第一个字母是'x',则下一个州只允许跟随x的字母(位置2)。等
现在对于Levenshtein匹配,你遍历字母树,同时允许一些错误:删除,插入(一个字母的通配符),以及可能的转座(Levenshtein的一个很好的扩展是将转置视为单个编辑而不是2) 。您必须保持状态才能跟踪允许的编辑数量。这可以非常有效地完成 - 当然,对于交互式“当你输入”拼写建议时,它足够快。