根据数据库拼写替代方案?
我正在寻找一种有效的方法(将PHP与Mysql数据库一起使用)来建议查询的替代拼写。
我知道我可以使用Yahoo的"拼写建议"之类的服务,但我希望这些建议基于数据库中当前可用的内容。
例如:用户必须在"城市"字段中填写表格,并且我想确保每个人对所述城市使用相同的拼写,(因此,我不会在填写"匹兹堡"时最终有人他们的意思是"匹兹堡")。
这只是一个例子,但是,基本上,我想搜索数据库中已经存在的内容,以查找那些拼写与用户输入的内容非常接近的条目...
关于如何实现此目标的任何算法,教程或者想法?
解决方案
回答
我会按照用户的类型进行输入,并通过前缀建议(例如Google谷歌建议)。一个特里将对此很好。纠正拼写错误的首字母无济于事,但是那是很少见的。
回答
请看看Yahoo! UI库自动完成组件。我认为这正是我们想要的。 "使用数据源"部分说明了如何使用不同类型的数据源,包括基于服务器端的数据源,例如数据源。
回答
看一下Javascript Example,它列出了13种不同的自动完成字段代码。
我在一个网站上使用了类似的东西,实际上,我在文本框中设置了一个div层,当用户向我的SQL查询脚本键入基于Ajax的HTTP请求时,该查询会更新他们键入的每个字母。 div将使用用户可以单击以选择的任何匹配的数据库条目进行更新。
回答
MySQL有一个内置函数来查找Levenshtein的编辑距离,尽管它相当慢。我将使用上面提供的自动完成功能,或者仅在大约一周后事后编辑条目。
回答
也许这会帮助http://jquery.bassistance.de/autocomplete/demo/
它使用JQuery(客户端)和php(服务器端)。
该示例来自数组,但可以轻松修改,因此它将使用MySQL数据库。
回答
通常使用两个单词之间的Levenshtein距离来实现拼写替代(用户键入的单词,例如在数据库中输入的一个单词)
这是算法的伪代码
(来自维基百科):
int LevenshteinDistance(char s[1..m], char t[1..n]) // d is a table with m+1 rows and n+1 columns declare int d[0..m, 0..n] for i from 0 to m d[i, 0] := i for j from 0 to n d[0, j] := j for i from 1 to m for j from 1 to n { if s[i] = t[j] then cost := 0 else cost := 1 d[i, j] := minimum( d[i-1, j] + 1, // deletion d[i, j-1] + 1, // insertion d[i-1, j-1] + cost // substitution ) } return d[m, n]
在这里我们可以找到各种语言的真正实现:http://en.wikibooks.org/wiki/Algorithm_implementation/Strings/Levenshtein_distance
回答
我使用了pspell http://uk.php.net/pspell软件包来执行此操作。选择搜索词,检查拼写。如果不正常,PSPELL将提出建议。
我们甚至可以通过搜索运行建议,计算结果,然后说:搜索" foo"返回0个结果。我们是说" baz"(12个结果)还是" bar"(3个结果)。
如果我们担心性能,请仅在搜索返回0个结果时执行此操作。
回答
我相信SoundEx比Levenshtein距离更合适。
SoundEx是一项功能,可根据其英语发音生成单词/短语的哈希值。这对于帮助无法拼写匹配规范拼写的人非常有用。
我已经非常成功地使用它来查找何时两个人在数据库中注册了同一家公司,但名称却略有不同。
SoundEx内置在MySql中。这是一个有关其用法的教程。