【问题标题】:Spelling Alternatives based on a Database?基于数据库的拼写替代方案?
【发布时间】:2010-09-10 00:13:35
【问题描述】:

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

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

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

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

关于如何实现这一点的任何算法、教程或想法?

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    我会在用户键入并按前缀建议时执行此操作(ala Google Suggest)。 trie 会很好。纠正拼写错误的首字母无济于事,但这种情况非常罕见。

    【讨论】:

    • AutoSuggest 绝对是一个有趣的选择!我很确定我已经考虑过了并出于某种原因拒绝了这个想法,但现在(凌晨 4 点 40 分)我似乎不记得那个原因了 :)
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      看看Javascript Examples,它列出了 13 个不同的自动完成字段代码。

      我在我的一个网站上使用了类似的东西,我基本上在文本框下设置了一个 div 层,因为用户将基于 Ajax 的 HTTP 请求输入到我的 SQL 查询脚本中,该脚本会更新他们的每个字母类型。用户可以单击以选择任何匹配的数据库条目来更新 div。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 我不知道 Levenshtein 距离(也可作为 php 函数使用!)谢谢! :)
        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

          拼写替代通常通过在两个单词之间使用Levenshtein distance 来实现(用户键入的单词,en 内部单词,例如,您的数据库)

          这里是算法的伪代码 (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]
          

          在这里你可以找到各种语言的 real 实现:http://en.wikibooks.org/wiki/Algorithm_implementation/Strings/Levenshtein_distance

          【讨论】:

            【解决方案7】:

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

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

            如果您担心性能,请仅在搜索返回 0 个结果时执行此操作。

            【讨论】:

              【解决方案8】:

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

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

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

              SoundEx 内置在 MySql 中。这是一个关于其use的教程。

              【讨论】:

                猜你喜欢
                • 2010-10-23
                • 2018-01-30
                • 1970-01-01
                • 2014-11-10
                • 1970-01-01
                • 2010-11-30
                • 1970-01-01
                • 2016-10-22
                • 2017-05-28
                相关资源
                最近更新 更多