【问题标题】:How does the Google "Did you mean?" Algorithm work? [closed]谷歌“你的意思是什么?”算法工作? [关闭]
【发布时间】:2010-09-23 08:46:32
【问题描述】:

我一直在为投资组合管理工具开发一个内部网站。有很多文本数据、公司名称等。一些搜索引擎能够非常快速地响应“您的意思是:xxxx”的查询,这给我留下了深刻的印象。

我需要能够智能地接受用户查询,并且不仅可以使用原始搜索结果,还可以使用“您的意思是吗?”进行响应。当有一个很可能的替代答案等时响应

[我正在ASP.NET 开发(VB - 不要反对我!)]

更新: 好的,如果没有数百万“未付费用户”,我该如何模仿?

  • 为每个“已知”或“正确”术语生成拼写错误并执行查找?
  • 其他更优雅的方法?

【问题讨论】:

标签: algorithm machine-learning nlp spell-checking text-search


【解决方案1】:

这里直接从源头解释(差不多)

Search 101!

至少 22:03

值得一看!

根据 Douglas Merrill 的前谷歌首席技术官的说法,基本上是这样的:

1) 你在谷歌上写了一个(拼错的)单词

2) 你没有找到你想要的(不要点击任何结果)

3) 你意识到你拼错了这个词,所以你在搜索框中重写了这个词。

4) 你找到你想要的(你点击第一个链接)

这种模式成倍增加了数百万次,显示了最常见的拼写错误和最“常见”的更正。

通过这种方式,Google 几乎可以立即为每种语言提供拼写纠正。

这也意味着如果一夜之间每个人都开始拼写“夜”,谷歌会建议这个词。

编辑

@ThomasRutter:Douglas 将其描述为“统计机器学习”。

他们知道谁更正了查询,因为他们知道哪个查询来自哪个用户(使用 cookie)

如果用户执行查询,并且只有 10% 的用户点击了一个结果,而 90% 的用户返回并键入另一个查询(使用更正的单词),而这次 90% 的用户点击了一个结果,那么他们知道他们找到了更正。

他们还可以知道这些是否是两个不同的“相关”查询,因为他们有他们显示的所有链接的信息。

此外,他们现在将上下文包含在拼写检查中,因此他们甚至可以根据上下文建议不同的单词。

请参阅此demo of google wave (@ 44m 06s),它显示了如何考虑上下文以自动更正拼写。

Here 解释了自然语言处理的工作原理。

最后,这是一个很棒的演示,展示了将自动 machine translation ( @ 1h 12m 47s ) 添加到混合中可以做什么。

我已经在视频中添加了分钟和秒的锚点以直接跳到内容,如果它们不起作用,请尝试重新加载页面或手动滚动到标记处。

【讨论】:

  • 算法是如何工作的?谷歌是如何从“我们收到数十亿次搜索,其中包含各种术语,这些就是这些搜索”到“因此该术语必须是该术语的常见拼写错误”?他们已经解决了这个问题,但我对如何解决感兴趣。他们如何确定两个搜索来自同一用户,哪个词是另一个词的“更正”,以及如何将这些搜索汇总到数十亿次?
  • 如果每个人都开始拼错“night”......我相信他们已经在搜索“Flickr”的人中遇到了这个问题。
  • 每个人拼写错误的问题已经在更严重的意义上发生了:尝试在 Google 中输入“fuscia”。谷歌说“你是说紫红色吗?”事实上,正确的拼写是“fuchsia”,但由于某种原因,没有人能正确拼写它。 Dictionary.com 上的问题更严重。如果你在他们的搜索中输入“fuschia”,它会给你“没有关于 fuschia 的结果。你是说 'fuschia' 吗?” (即,您的意思是您刚刚输入的内容吗?)
  • 我不相信他们只使用拼写错误的数据 - 肯定存在一些 Levenshtein 距离或类似情况 - 搜索“Plack”(以及一个或多个其他词),它总是被更正为“黑色” ',这是一个非常不可能的拼写错误/错别字
  • @Jakub 我认为自从我 4 多年前发表该评论以来,他们已经解决了这个问题。事实上,谷歌也解决了这个问题。对 fuschia 的搜索会自动包含 fuchsia 的结果。
【解决方案2】:

我前段时间发现了这篇文章:How to Write a Spelling Corrector,作者是Peter Norvig(Google Inc. 研究总监)。

这是一本关于“拼写更正”主题的有趣读物。示例是用 Python 编写的,但它清晰易懂,我认为该算法可以很容易 翻译成其他语言。

下面是对该算法的简短描述。 该算法由准备和单词检查两个步骤组成。

第一步:准备——建立词库

最好是您可以使用实际的搜索词及其出现。 如果您没有这样的大量文本,则可以改用。 统计每个单词的出现次数(流行度)。

第 2 步。单词检查 - 查找与所检查的单词相似的单词

相似意味着编辑距离小(通常为0-1或0-2)。编辑距离是将一个单词转换为另一个单词所需的最小插入/删除/更改/交换次数。

从上一步中选择最流行的单词并建议将其作为更正(如果不是单词本身)。

【讨论】:

  • @Davide: """这些例子是在 python 中,但它很清楚和易于理解""": 我不明白你对 "but" 的使用......我会说给定 Python + Norvig 的写作风格,“清晰易懂”是预期的结果。
  • 出现“但是”是因为 Harry 在他的问题中说他是 VB.NET 开发人员,所以我认为他对 python 语言没有信心。
【解决方案3】:

关于“你的意思是”算法的理论可以参考信息检索导论第3章。它是免费的onlineSection 3.3(第 52 页)完全回答了您的问题。并且要专门回答您的更新,您只需要一个单词字典就可以了(包括数百万用户)。

【讨论】:

    【解决方案4】:

    嗯...我认为谷歌使用他们庞大的数据语料库(互联网)来做一些严肃的 NLP(自然语言处理)。

    例如,他们拥有来自整个互联网的大量数据,以至于他们可以计算出三个单词序列(称为 trigram)出现的次数。因此,如果他们看到类似“pink frugr concert”这样的句子,他们可以看到它的点击率很少,然后在他们的语料库中找到最有可能的“pink * Concert”。

    不过,他们显然只是对 Davide Gualano 所说的话做了一个变体,所以一定要阅读那个链接。谷歌当然会使用它所知道的所有网页作为语料库,因此它的算法特别有效。

    【讨论】:

      【解决方案5】:

      我的猜测是,他们使用了Levenshtein distance 算法和他们收集的有关正在运行的搜索的大量数据的组合。他们可以从输入的搜索字符串中提取一组 Levenshtein 距离最短的搜索,然后选择结果最多的搜索。

      【讨论】:

      • 假设您总共存储了数十亿网页的字词。如果不对查询的每个单词计算数十亿次的 Levenshtein 距离,就没有简单的方法来索引 Levenshtein 距离以快速检索接近的匹配项。因此,Levenshtein 距离在这种情况下没有多大用处,至少在第一阶段,谷歌需要从数十亿现有单词缩小到可能是当前单词拼写错误的那些单词。一旦它已经获取了可能的匹配项,它肯定可以将 Levenshtein 作为后续步骤应用。
      【解决方案6】:

      通常,生产拼写校正器会利用多种方法来提供拼写建议。有些是:

      • 决定确定是否需要进行拼写更正的方法。这些可能包括结果不足、结果不够具体或不够准确(根据某种衡量标准)等。然后:

      • 使用大量文本或字典,其中所有或大部分已知拼写正确。这些很容易在网上找到,例如LingPipe。然后,要确定最佳建议,您需要根据几个度量来寻找最接近匹配的单词。最直观的是相似的字符。通过研究和实验表明,两个或三个字符序列匹配效果更好。 (二元组和三元组)。为了进一步改善结果,请在单词开头或结尾的匹配项上权衡更高的分数。出于性能原因,将所有这些单词索引为 trigrams 或 bigrams,以便在执行查找时转换为 n-gram,并通过 hashtable 或 trie 进行查找。

      • 使用与基于字符位置的潜在键盘错误相关的启发式方法。所以“hwllo”应该是“hello”,因为 'w' 接近于 'e'。

      • 使用语音键(Soundex、Metaphone)来索引单词并查找可能的更正。在实践中,这通常会返回比使用 n-gram 索引更差的结果,如上所述。

      • 在每种情况下,您都必须从列表中选择最佳校正。这可能是距离度量,例如 levenshtein、键盘度量等。

      • 对于多词短语,只有一个词可能拼写错误,在这种情况下,您可以使用剩余的词作为上下文来确定最佳匹配。

      【讨论】:

        【解决方案7】:

        使用Levenshtein distance,然后创建一个度量树(或 Slim 树)来索引单词。 然后运行 ​​1-Nearest Neighbor 查询,您就得到了结果。

        【讨论】:

          【解决方案8】:

          Google 显然会建议具有最佳结果的查询,而不是拼写正确的查询。但在这种情况下,可能一个拼写校正器会更可行,当然你可以为每个查询存储一些值,基于它返回的结果有多好。

          所以,

          1. 您需要一本字典(英文或基于您的数据)

          2. 使用您的字典生成一个单词格子并计算转换的概率。

          3. 添加一个解码器以使用您的网格计算最小误差距离。当然,在计算距离时应该注意插入和删除。有趣的是,QWERTY 键盘可以最大限度地提高距离,如果您将按键彼此靠近。(cae 会转动汽车,cay 会变成猫)

          4. 返回距离最小的单词。

          5. 然后您可以将其与您的查询数据库进行比较,并检查其他紧密匹配是否有更好的结果。

          【讨论】:

            【解决方案9】:

            这是best answer I found,由 Google 研究总监 Peter Norvig 实施和描述的拼写校正器。

            如果你想了解更多关于这背后的理论,你可以阅读his book chapter

            该算法的思想基于统计机器学习。

            【讨论】:

              【解决方案10】:

              几年前我在这方面看到了一些东西,所以可能从那以后发生了变化,但显然他们是通过分析他们的日志来为在短时间内提交非常相似的查询的相同用户开始的,并根据如何使用机器学习用户已经更正了自己。

              【讨论】:

                【解决方案11】:

                作为猜测......它可以

                1. 搜索词
                2. 如果找不到,请使用某种算法尝试“猜测”这个词。

                可能是来自 AI 的东西,比如 Hopfield 网络或反向传播网络,或者是其他东西“识别指纹”、恢复损坏的数据或拼写更正,正如 Davide 已经提到的......

                【讨论】:

                  【解决方案12】:

                  简单。他们有的数据。他们有每个可能的术语的统计数据,基于它被查询的频率,以及它的哪些变体通常会产生用户点击的结果......所以,当他们看到你为搜索词输入了一个频繁的拼写错误时,他们会继续并提出建议更常见的答案。

                  实际上,如果拼写错误实际上是最常见的搜索词,算法会认为它是正确的。

                  【讨论】:

                  • 没有人怀疑谷歌拥有所有必要的数据来做到这一点,但问题是谷歌如何想出一个算法来做到这一点的详细信息,有这么多数据,在一个合理的多少时间。他们一天会有无数次搜索——他们如何轻松识别一个搜索词是否是另一个最近的“拼写更正”?是什么因素使 Google 决定一个术语是另一个术语的拼写错误?这些是感兴趣的实现细节。
                  【解决方案13】:

                  关于如何在没有大量数据的情况下模仿行为的问题 - 为什么不使用谷歌收集的大量数据?下载 misspelled word 的 google 搜索结果并在 HTML 中搜索“您的意思是:”。

                  我猜现在这叫做混搭 :-)

                  【讨论】:

                  • 谷歌要多久才能阻止你的机器人抓取? - 或者这些天谷歌甚至不会注意到?
                  • 如果请求/秒不是太高,我认为他们不会注意到。
                  【解决方案14】:

                  除了上面的答案,如果你想自己快速实现一些东西,这里有一个建议 -

                  算法

                  你可以在 GitHub找到这个算法的实现和详细文档。

                  • 使用比较器创建优先级队列。
                  • 创建一个 Ternay 搜索树并插入所有英文单词(来自 Norvig's post)及其频率。
                  • 开始遍历 TST,对于 TST 中遇到的每个单词,从 input_word 计算其 Levenshtein 距离(LD)
                  • 如果 LD ≤ 3,则将其放入优先队列。
                  • 最后从优先队列中提取 10 个单词并显示。

                  【讨论】:

                    【解决方案15】:

                    你是说拼写检查?如果它是拼写检查器而不是整个短语,那么我有一个关于拼写检查的链接,该算法是在 python 中开发的。检查this link

                    同时,我还在从事包括使用文本搜索数据库的项目。我想这会解决你的问题

                    【讨论】:

                      【解决方案16】:

                      这是一个老问题,我很惊讶没有人建议使用 Apache Solr 的 OP。

                      Apache Solr 是一个全文搜索引擎,除了许多其他功能外,它还提供拼写检查或查询建议。来自documentation

                      默认情况下,Lucene 拼写检查器首先按 字符串距离计算得分,频率得分第二 (如果有的话)索引中的建议。

                      【讨论】:

                        【解决方案17】:

                        有一种特定的数据结构——三元搜索树——自然支持部分匹配和近邻匹配。

                        【讨论】:

                          【解决方案18】:

                          最简单的方法是谷歌动态编程。

                          这是一种从信息检索中借来的算法,并在现代生物信息学中大量使用,以查看两个基因序列的相似程度。

                          最佳解决方案使用动态规划和递归。

                          这是一个非常解决的问题,有很多解决方案。只需 google 一下,直到找到一些开源代码。

                          【讨论】:

                            猜你喜欢
                            • 2020-06-09
                            • 1970-01-01
                            • 2021-01-07
                            • 2010-12-29
                            • 2014-09-20
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 2016-05-18
                            相关资源
                            最近更新 更多