2010-08-06 97 views
3

我有一个在线Web应用程序,带有顶部菜单树,用于打开用于执行不同任务的不同小部件。随着应用程序越来越强大,该树已变得庞大且难以导航。我实现了一个搜索功能,用户只需键入菜单名称或其中的一部分,然后使用正则表达式查找菜单树中与用户输入内容相匹配的所有项目。我的正则表达式允许部分单词和交换单词,也限制搜索到每个单词的开头。它不允许的一件事是拼写错误的单词。我明白,为了允许拼写错误的单词,最好不要使用正则表达式,而是使用字符串距离方法,但我仍然希望允许部分单词和交换单词。这可能吗?Levenshtein只有部分字符串的距离(Java)

例如,如果菜单项是“财务费率维护”,则以下任何一项将与该菜单项匹配:“财务”,“财务报表”,“费率财务”等。比率“不匹配,因为”inance“不出现在该菜单项的任何单词的开头。我想要像“fnane rate”和“rate maintainance”这样的搜索,它们被拼写错误地匹配。

+2

但“inance率” ** **是轻微的拼写错误,没有比“fnane率”更糟糕(非常接近,其实) 。为什么它不匹配,而后者应该?这是没有意义的。 – 2010-08-06 19:14:14

+0

因为它目前的“入场率”不匹配,但我想象一旦实现了字符串距离,它会,但“比率”可能不会因为字符串距离太大。绑定到单词开头的原因是因为我有类似“vic”的搜索匹配到“地图服务”,这是不受欢迎的,因为有很多项目带有“service”这个词,但是当用户搜索“vic”他们通常搜索名为“VIC”的菜单项 – 2010-08-06 19:19:00

回答

1

我只是给每个选项添加一个单词列表,并同时维护一个包含所有单词的字典。然后,当用户键入他们的查询时,程序会检查他们输入的每个单词是否在字典中。如果不是,它会通过找到最接近的单词。字符串距离并更正单词。

最后,它可能会提示菜单选项的大部分单词与修正的输入单词相同。

拼写校正(在蟒蛇虽然)的一个很好的例子是在http://norvig.com/spell-correct.html

+1

总体思路看起来不错,但由于权限的缘故,菜单是在登录时动态生成的,因此我必须在登录时生成字典并将其存储在会话中。可以做到,也许是最好的答案,但我希望有更直接的一点 – 2010-08-06 19:20:12

+0

我明白你的意思了,看起来似乎是一个适当的工作来启动和运行。生成字典和搜索虽然不会在计算上花费太多。 – hb2pencil 2010-08-06 19:27:05