【问题标题】:How do you implement a "Did you mean"? [duplicate]你如何实现“你的意思是”? [复制]
【发布时间】:2010-09-07 16:07:50
【问题描述】:

可能重复:
How does the Google “Did you mean?” Algorithm work?

假设您的网站中已有搜索系统。您如何像 Google 在某些 search queries 中那样实现“您的意思是:<spell_checked_word>”?

【问题讨论】:

标签: nlp


【解决方案1】:

我建议查看SOUNDEX 以在您的数据库中找到相似的单词。

您还可以使用Google API spelling suggestion request 访问谷歌自己的字典。

【讨论】:

  • +1 用于指向 Google API 的链接,这似乎正是提问者所寻找的,即使选择的答案更深入并回答了 Google 的“为什么”和“如何”实施。
【解决方案2】:

Soundex 适用于语音匹配,但最适合用于人名(最初是为人口普查数据开发的)

也可以看看Full-Text-Indexing,语法和谷歌逻辑不同,但是速度很快,可以处理类似的语言元素。

【讨论】:

  • soundex 的坏处之一是它过于以英语为中心
  • 它被开发成英文名称,所以 Smith 和 Schmidt 应该在其中匹配。 Metaphone 更好,但也有类似的问题。任何语音算法都将依赖于语言。
【解决方案3】:

Soundex 和“Porter 词干提取”(soundex 很简单,不确定 porter 词干提取)。

【讨论】:

【解决方案4】:

查看this 维基百科上关于 Levenshtein 距离的文章。请务必仔细查看可能的改进。

【讨论】:

  • 最常见的编辑距离计算。执行此操作的常用方法是 Wagner-Fischer 算法。
【解决方案5】:

实际上,Google 所做的事情非常重要,而且起初也违反直觉。他们不做任何检查字典之类的事情,而是利用统计信息来识别返回比您的查询更多结果的“相似”查询,确切的算法当然是未知的。

这里有不同的子问题需要解决,作为所有自然语言处理统计相关的基本基础,有一本必读的书:Foundation of Statistical Natural Language Processing

具体来说,为了解决单词/查询相似性问题,我使用Edit Distance 取得了很好的效果,这是一种字符串相似度的数学度量,效果非常好。我曾经使用过 Levenshtein,但其他的可能值得研究。

Soundex - 根据我的经验 - 是垃圾。

实际上,有效地存储和搜索大量拼写错误的单词并进行亚秒级检索并非易事,最好的办法是利用现有的全文索引和检索引擎(即不是您的数据库的引擎),其中Lucene 是目前最好的之一,巧合地移植到许多平台。

【讨论】:

    【解决方案6】:

    【讨论】:

    • 如果您的链接死于链接腐烂或猖獗的删除主义,您能否对此进行扩展?锚已经死了……
    【解决方案7】:

    如果您有行业特定的翻译,您可能需要一个词库。例如,我在珠宝行业工作,我们的描述中有缩写,例如 kt - 克拉,rd - 圆形,cwt - 克拉重量...... Endeca(该工作的搜索引擎)有一个词库可以从常见翻译拼写错误,但确实需要人工干预。

    【讨论】:

      【解决方案8】:

      我认为这取决于你的网站有多大。在我们大约 500 名员工使用的本地 Intranet 上,我只需查看返回零结果的搜索词组,然后将该搜索词组与新的建议搜索词组一起输入到 SQL 表中。

      如果没有返回搜索结果,我会调用该表,但是,这仅适用于站点相对较小并且我只针对最常见的搜索短语进行此操作。

      您可能还想看看我对类似问题的回答:

      【讨论】:

        【解决方案9】:

        您可能需要查看 Peter Norvig 的“How to Write a Spelling Corrector”文章。

        【讨论】:

          【解决方案10】:

          我相信 Google 会记录所有查询并识别何时有人进行了拼写更正。然后,当其他人提供相同的第一个查询时,可能会建议进行此更正。这适用于任何语言,实际上是任何字符的任何字符串。

          【讨论】:

          • 确实如此。这有助于他们轻松学习新单词——他们得到了数百万人的帮助。
          • 是的,这实际上是正确的答案。根据《In the Plex》一书,Google 会寻找某人搜索某物并获得结果,然后立即稍微调整其搜索字词的情况。
          【解决方案11】:

          Google 的 Norvig 博士概述了它的工作原理;他甚至给出了一个 20 多行的 Python 实现:

          http://googlesystem.blogspot.com/2007/04/simplified-version-of-googles-spell.html

          http://www.norvig.com/spell-correct.html

          Norvig 博士还在this excellent talk 中讨论了“您的意思是”。 Norvig 博士是 Google 的研究主管 - 当被问及“您的意思是”如何实施时,他的回答是权威

          所以它的拼写检查,大概是从其他搜索甚至实际的互联网短语等构建的动态字典。但这仍然是拼写检查

          SOUNDEX 和其他猜测不要进去,伙计们!

          【讨论】:

          • 博士。 Norvig 提供了这个概念的玩具示例;为网络提供“您的意思是”还不够准确。例如:“barak”不产生建议; “巴拉克奥巴马”确实如此(因为他们知道“巴拉克”经常出现在奥巴马身上,并且可以推断出可能的更正
          • 从他的玩具拼写检查器转到可以处理您的示例并且效果很好的东西并不难。要记住的重要一点是,他正在展示一个拼写检查器,它与查询建议器有微妙但显着的不同。用以前的查询而不是英文文本来训练它是一个很好的起点。
          • 肯定不仅仅是拼写检查。一方面,我看到我输入的内容和建议的替换都不是“字典单词”。
          • @Kyralessa:你认为他们的字典是某种语言的静态词,还是基于互联网上的词和常见搜索词的动态词?它不是它仍然不是字典检查。 Novig 博士毕竟是谷歌的研究负责人——当被问及“你的意思是”是如何实现的时,他的回答是权威的。
          【解决方案12】:

          有一种叫做 aspell 的东西可能会有所帮助: http://blog.evanweaver.com/files/doc/fauna/raspell/classes/Aspell.html

          它有一个 ruby​​ gem,但我不知道如何从 python 与它交谈 http://blog.evanweaver.com/files/doc/fauna/raspell/files/README.html

          这是 ruby​​ 实现的引述

          用法

          Aspell 可让您检查单词并提出更正建议。例如:

            string = "my haert wil go on"
          
            string.gsub(/[\w\']+/) do |word|
              if !speller.check(word)
                # word is wrong
                puts "Possible correction for #{word}:"
                puts speller.suggest(word).first
              end
            end
          

          这个输出:

          对 haert 的可能更正: 心 可能的修正: 会

          【讨论】:

            【解决方案13】:

            以有效的方式为搜索引擎实施拼写纠正并非易事(您不能只计算每个可能单词的编辑/编辑距离)。 Introduction to Information Retrieval(全文可在线获取)中描述了基于 k-gram 索引的解决方案。

            【讨论】:

              【解决方案14】:

              我用LuceneSpell Checker 来做。

              【讨论】:

                【解决方案15】:

                有人询问如何为搜索引擎创建最先进的拼写建议系统,这让我感到惊喜。我为一家搜索引擎公司研究这个主题已经一年多了,我可以指出关于这个主题的公共领域的信息。

                正如在前一篇文章中提到的,Google(以及 Microsoft 和 Yahoo!)不使用任何预定义的字典,也不雇用大量语言学家来思考查询可能的拼写错误。由于问题的规模,这将是不可能的,而且还因为不清楚人们是否能够正确识别查询何时以及是否拼写错误。

                相反,有一个简单且相当有效的原则,它也适用于所有欧洲语言。获取搜索日志上的所有唯一查询,计算所有查询对之间的编辑距离,假设参考查询是计数最高的查询。

                这个简单的算法适用于许多类型的查询。如果你想把它提升到一个新的水平,那么我建议你阅读微软研究院关于该主题的论文。你可以找到它here

                这篇论文有一个很好的介绍,但之后您需要熟悉隐马尔可夫模型等概念。

                【讨论】:

                  【解决方案16】:

                  你可以使用 ngram 进行比较:http://en.wikipedia.org/wiki/N-gram

                  使用python ngram模块:http://packages.python.org/ngram/index.html

                  import ngram
                  
                  G2 = ngram.NGram([  "iis7 configure ftp 7.5",
                                      "ubunto configre 8.5",
                                      "mac configure ftp"])
                  
                  print "String", "\t", "Similarity"
                  for i in G2.search("iis7 configurftp 7.5", threshold=0.1):
                      print i[1], "\t", i[0]
                  

                  你得到:

                  >>> 
                  String  Similarity
                  0.76    "iis7 configure ftp 7.5"    
                  0.24    "mac configure ftp"
                  0.19    "ubunto configre 8.5"   
                  

                  【讨论】:

                    【解决方案17】:

                    你的意思是在你的代码中为什么不使用谷歌。关于如何看这里 http://narenonit.blogspot.com/2012/08/trick-for-using-googles-did-you-mean.html

                    【讨论】:

                    • 找不到页面了... :'(
                    猜你喜欢
                    • 2011-05-27
                    • 1970-01-01
                    • 2011-10-19
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2012-11-02
                    • 1970-01-01
                    相关资源
                    最近更新 更多