Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 100k以上的快速动态模糊搜索&x2B;C中的字符串#_C#_Algorithm_.net 4.0_Fuzzy Search_Text Search - Fatal编程技术网

C# 100k以上的快速动态模糊搜索&x2B;C中的字符串#

C# 100k以上的快速动态模糊搜索&x2B;C中的字符串#,c#,algorithm,.net-4.0,fuzzy-search,text-search,C#,Algorithm,.net 4.0,Fuzzy Search,Text Search,假设它们是预加载的股票符号,输入到文本框中。我正在寻找我可以复制的代码,而不是要安装的库 这是受到这个问题的启发: Levenstein距离算法似乎运行良好,但计算起来需要时间。 当用户键入额外的字母时,查询需要重新运行,这一事实是否有任何优化?我对每个输入最多显示前10个匹配项感兴趣。您需要确定字符串周围的匹配规则。什么决定了“相似字符串” 匹配字符数 不匹配字符数 相似长度 拼写错误 业务专用缩写 必须以相同的子字符串开头 必须以相同的子字符串结尾 我已经在字符串匹配算法方面做了很多工

假设它们是预加载的股票符号,输入到文本框中。我正在寻找我可以复制的代码,而不是要安装的库

这是受到这个问题的启发:

Levenstein距离算法似乎运行良好,但计算起来需要时间。
当用户键入额外的字母时,查询需要重新运行,这一事实是否有任何优化?我对每个输入最多显示前10个匹配项感兴趣。

您需要确定字符串周围的匹配规则。什么决定了“相似字符串”

  • 匹配字符数
  • 不匹配字符数
  • 相似长度
  • 拼写错误
  • 业务专用缩写
  • 必须以相同的子字符串开头
  • 必须以相同的子字符串结尾
我已经在字符串匹配算法方面做了很多工作,但还没有找到任何符合我特定要求的现有库或代码。回顾它们,借鉴它们的想法,但您必须定制并编写自己的代码

Levenstein算法很好,但有点慢。我在Smith-Waterman和Jaro-Winkler算法方面都取得了一些成功,但我发现最适合我的算法是Monge(来自内存)。然而,阅读原始研究并确定他们编写算法和目标数据集的原因是值得的

如果您没有正确定义您想要匹配和度量的内容,那么您将发现意外匹配的高分和预期匹配的低分。字符串匹配是非常特定于域的。如果你没有正确地定义你的领域,那么你就像一个没有线索的渔夫,到处抛鱼钩,希望一切都好。

描述了Lucene在这方面的一些工作。他们能够使用有限状态传感器(自动机)高效地实现Levenshtein距离模糊匹配,编辑距离可达2。虽然代码都是Java的,但是有点复杂,尽管它是开源的

但基本思想很简单:把你的字典想象成一棵巨大的字母状态树。在state0,您没有字母。在state1,你承认任何可能是单词第一个字母的字母。State2受state1的制约;如果第一个字母是“x”,则下一个州只允许在x之后出现字母(位置2)。等等


现在,对于LevsHeTin匹配,你遍历了字母树,同时允许一些错误:删除、插入(一个字母通配符)和可能的转位(LevsTein的一个很好的扩展是考虑作为单个编辑的转置而不是2)。您必须保持状态,以便跟踪允许的编辑数量。这可以非常有效地完成-当然足够快的互动“当你键入”拼写提示

阿福日有一些模糊的东西,但从来没有详细阅读过。谢谢。我在这里找到了一篇相关的论文: