Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.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
Algorithm 请推荐一种智能静态单词补全算法_Algorithm_Language Agnostic_Autocomplete_String Matching_Levenshtein Distance - Fatal编程技术网

Algorithm 请推荐一种智能静态单词补全算法

Algorithm 请推荐一种智能静态单词补全算法,algorithm,language-agnostic,autocomplete,string-matching,levenshtein-distance,Algorithm,Language Agnostic,Autocomplete,String Matching,Levenshtein Distance,这不是家庭作业;我试图简化和增强一个现有的笨重的GUI界面,该界面是用C#/Winform/SQLServer2008编写的。如果你能建议一些特定于这些技术的东西,那就太酷了,但如果你能给我指出一些其他的东西,比如Java/MySql解决方案,那么我也会很高兴的 有人问了一个类似的问题,但问题/答案不如我所想的那么先进: 假设我有一个包含书籍信息的表:标题、作者姓名、描述。我知道,这三个表不一定属于同一个表,但让我们假设这样做是有意义的。因此,当用户在文本框/组合框或某个自定义控件中键入某个内容

这不是家庭作业;我试图简化和增强一个现有的笨重的GUI界面,该界面是用C#/Winform/SQLServer2008编写的。如果你能建议一些特定于这些技术的东西,那就太酷了,但如果你能给我指出一些其他的东西,比如Java/MySql解决方案,那么我也会很高兴的

有人问了一个类似的问题,但问题/答案不如我所想的那么先进:

假设我有一个包含书籍信息的表:标题、作者姓名、描述。我知道,这三个表不一定属于同一个表,但让我们假设这样做是有意义的。因此,当用户在文本框/组合框或某个自定义控件中键入某个内容(比如“Hari po”)时,他们应该得到的第一个建议可能是“Harry Potter”,以及相应的描述和作者。为了保持问题的简单性,让我们将搜索限制为仅搜索标题。请注意,我不在乎“哈里”听起来像“哈里”——该应用程序不是针对非母语人士的,但我在乎的是,“哈里·波”离“哈里·波”只有几下键盘。所以,我想到了这一点,但这并不是我所需要的,因为我希望在我开始打字的时候就得到有意义的结果(想想谷歌的建议有不同的目的)。我需要某种改进的Levenshtein距离算法,该算法可以很好地处理部分匹配,并且不会假设我输入的内容应该在我试图匹配的文本的开头。例如,这本书可能被称为《哈利波特男孩如何影响我们的社会》,我确实希望在搜索中出现这个标题,但是,我希望看到像《哈利波特与凤凰社》这样的东西出现在顶部,因为我的问题是从这个开始的

我可以对查询长度+/-2的所有可能的子字符串多次尝试Levenshtein距离,然后根据子字符串“sort off”在字符串中出现的位置对它们进行加权,然后选择最大匹配系数。我第一个担心的是这样做效率低下。第二,必须有办法取得更好的结果,即使速度不是问题。第三,以前肯定有人做过类似的事情,那么为什么要重新发明轮子呢

数据库中的唯一行数将最多为20000。我所追求的有点像谷歌搜索建议,或者Visual Studio 2010 IntelliSense(代码自动完成),只是它不应该试图记住用户过去键入的内容,并根据这些内容调整建议。不需要进行查询扩展;只是处理实际内容。从用户的角度来看,它的工作原理应该与谷歌搜索和智能感知类似,例如,它应该给出一些排名的选择,还应该提出一种智能的方法,在正确的位置将列表切掉(例如,如果没有任何内容真正匹配查询,则不建议任何内容,而不是显示最差匹配中的最佳部分),而且,如果前几个结果排名很靠前,但随后的结果相对于排名靠前的结果排名要弱得多,那么可能会隐藏较弱的结果

也许您知道一个大小合理的开源工具/库,其中包含公开的、可读的源代码,我可以从中获得想法

我的下一个问题是如何最好地处理这样的情况:搜索词可以应用于标题、作者和/或描述,但我怀疑我当前的问题已经加载


如果对我的目标不清楚,请提出明确的问题。

我建议好好看看。它支持多种查询类型,包括(我认为)增量、近似搜索。另外,它是开源和免费的。:)

也许你想找一个三角搜索?三角图搜索需要创建输入的3个字母的所有可能值,并在匹配中查找类似的字符串

对于简单的完成算法,您可以将KWIC索引与基数树相结合

基本上,您获取每个索引字符串,确定“重要”的潜在起始点,并基于这些潜在起始点生成字符串的N个旋转副本

然后在字符串上建立一个基数树,这样当您键入“Harry”时,您将找到“Harry”之后所有可能的后续单词

虽然这听起来像是真的会爆炸你的分贝的大小,但实际上它只是它的两倍,这取决于你如何选择“重要的”起点。(除了进行高效搜索外,基数树比单独存储每一行要紧凑一些。)

如果在谷歌中键入“hari po”,顶部附近的建议将正确地显示为“harry potter”,谷歌使用“该死的酷算法”。Levenhstein编辑距离不远:谷歌正在使用BK树IIRC

据我所知,它基本上是由Levenhstein编辑距离构建的树

到目前为止,关于这个问题可能已有几篇论文。我第一次读到它是在几年前,在一个名为“该死的酷算法”的博客上:


但是您必须知道,尽管Levenhstein编辑距离很小(它可以在大约20行代码中实现),但bk树似乎是另一个需要开发的野兽……

您可能想看看Solr/Lucene。它支持运行良好的自动完成功能。运行时性能也很好。@Hamish Grubijan:在Google中键入“hari po”,第二条和第三条建议对我来说是“哈利波特”。)谷歌使用了一种“该死的酷算法”。Levenhstein编辑距离不远:谷歌正在使用BK树IIRC。据我所知,它基本上是由Levenhstein编辑距离构建的树。你可以在这里读到它:顺便说一句,尽管列文斯坦编辑距离很小,但bk树看起来像一头野兽…@user988052,th