拼写基于数据库的替代品?

时间:2008-09-17 08:10:26

标签: php mysql

我正在寻找一种有效的方法(使用带有Mysql数据库的PHP)来为查询建议替代拼写。

我知道我可以使用Yahoo's Spelling Suggestion之类的服务,但我希望这些建议基于数据库中当前可用的内容。

例如:用户必须填写一个带有“城市”字段的表单,并且我想确保每个人都将使用相同的拼写为所述城市,(所以我最终不会有人填写“ Pitsburgh“当他们的意思是”匹兹堡“)。

这只是一个例子,但基本上我想搜索数据库中已有的拼写与用户输入的内容非常接近的条目......

关于如何实现这一目标的任何算法,教程或想法?

8 个答案:

答案 0 :(得分:1)

我会按用户键入并按照前缀(ala Google Suggest)建议。 trie对此很好。它无法纠正拼写错误的第一个字母,但这些很少见。

答案 1 :(得分:1)

MySQL有一个内置函数来查找Levenshtein编辑距离,但它很慢。我会使用上面提供的自动完成功能,或者只是在每周左右之后编辑条目。

答案 2 :(得分:1)

也许这会有所帮助http://jquery.bassistance.de/autocomplete/demo/ 它使用JQuery(客户端)和php(服务器端)。 该示例从数组中提供,但可以轻松修改,因此它将使用MySQL数据库。

答案 3 :(得分:1)

拼写替代方法通常是在两个单词之间使用Levenshtein distance(用户输入的单词,内部单词,例如您的数据库)

这是算法的伪代码 (from wikipedia):

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

答案 4 :(得分:1)

我已经使用了pspell http://uk.php.net/pspell包来执行此操作。使用搜索词,检查拼写。如果不行,PSPELL会提出建议。

您甚至可以通过搜索运行建议,计算结果,然后说:您对“foo”的搜索返回0结果。你的意思是“baz”(12个结果)或“bar”(3个结果)。

如果您担心性能,只有在搜索返回0结果时才执行此操作。

答案 5 :(得分:0)

请查看Yahoo! UI Library Autocomplete Component。我认为这正是你正在寻找的。 “使用DataSources”一节解释了如何使用不同类型的数据源,包括像您这样的基于服务器端的数据源。

答案 6 :(得分:0)

查看Javascript Examples它列出了13种不同的自动填充字段代码。

我在我的一个网站上使用了类似的东西,我基本上在文本框下面设置了一个div层,因为用户将基于Ajax的HTTP请求的火灾键入我的SQL查询脚本,该脚本会更新每个字母类型。使用任何匹配的DB条目更新div,用户可以单击该条目以进行选择。

答案 7 :(得分:0)

我相信SoundEx比Levenshtein距离更合适。

SoundEx是一个函数,它根据它用英语发出的声音产生一个单词/短语的哈希值。它非常适合帮助那些无法拼写规范拼写的人。

我已经非常成功地使用它来查找两个人在一个数据库中注册同一家公司的情况,名称上的变体略有不同。

SoundEx内置于MySql中。以下是use的一个教程。