Google如何“你的意思是?”算法工作?

时间:2008-11-20 23:34:52

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

我一直在开发一个投资组合管理工具的内部网站。有很多文本数据,公司名称等。我对一些搜索引擎能够快速回复“你的意思是:xxxx”的查询感到非常满意。

我需要能够智能地进行用户查询并不仅回应原始搜索结果,还回答“你的意思是?”当有极有可能的替代答案等时作出回应

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

更新: 好吧,如果没有数百万“无偿用户”,我怎么能模仿这个?

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

18 个答案:

答案 0 :(得分:355)

这是直接来自源(几乎)的解释

Search 101!

分钟22:03

值得一看!

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

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

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

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

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

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

这样谷歌几乎可以瞬间完成各种语言的拼写纠正。

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

修改

@ThomasRutter:道格拉斯将其描述为“统计机器学习”。

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

如果用户执行查询,并且只有10%的用户点击结果,90%返回并输入另一个查询(带有更正后的单词),这次90%点击结果,那么他们知道他们发现了一个纠正。

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

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

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

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

最后,这是一个很棒的演示,可以做些什么来添加自动machine translation(@ 1h 12m 47s)。

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

答案 1 :(得分:102)

我前段时间发现了这篇文章:How to Write a Spelling Corrector,由Peter Norvig(谷歌公司研究总监)撰写。

这是关于“拼写纠正”主题的有趣读物。这些示例是在Python中,但它清晰易懂,我认为算法很容易 翻译成其他语言。

下面是该算法的简短描述。 该算法包括两个步骤,准备和单词检查。

第1步:准备 - 设置单词数据库

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

步骤2.单词检查 - 查找与检查的单词类似的单词

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

选择上一步中最受欢迎的单词并将其建议为更正(如果不是单词本身)。

答案 2 :(得分:54)

对于“你是说”算法的理论,你可以参考信息检索简介的第3章。免费提供onlineSection 3.3(第52页)完全回答了您的问题。并且要专门回答您的更新,您只需要一个单词词典而不需要其他内容(包括数百万用户)。

答案 3 :(得分:10)

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

例如,他们拥有来自整个互联网的大量数据,他们可以计算三字序列发生的次数(称为 trigram )。因此,如果他们看到像“粉红色的frugr音乐会”这样的句子,他们可以看到它几乎没有点击,然后在他们的语料库中找到最可能的“粉红色*音乐会”。

他们显然只是改变了Davide Gualano所说的内容,所以肯定会读到这个链接。谷歌当然会使用它所知道的所有网页作为语料库,因此这使得它的算法特别有效。

答案 4 :(得分:7)

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

答案 5 :(得分:6)

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

  • 决定确定是否需要拼写纠正的方法。这些可能包括结果不充分,结果不够具体或不够准确(根据某些措施)等。然后:

  • 使用大量文本或字典,其中所有或大多数已知拼写正确。这些很容易在网上找到,例如LingPipe。然后,为了确定最佳建议,您需要根据多个度量查找最接近匹配的单词。最直观的是类似的角色。通过研究和实验证明,两个或三个字符的序列匹配效果更好。 (双胞胎和三卦)为了进一步改善结果,在比赛的开头或结尾处加一个较高的分数。出于性能原因,将所有这些单词索引为三元组或双字母组,以便在执行查找时,转换为n-gram,并通过哈希表或trie进行查找。

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

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

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

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

答案 6 :(得分:6)

使用Levenshtein distance,然后创建度量树(或修剪树)来索引单词。 然后运行1-Nearest Neighbor查询,得到结果。

答案 7 :(得分:4)

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

所以,

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

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

  3. 添加解码器以使用您的格子计算最小误差距离。当然,在计算距离时,您应该注意插入和删除。有趣的是QWERTY键盘最大化距离,如果你碰到彼此靠近的键。(cae会转车,cay会变成猫)

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

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

答案 8 :(得分:4)

以下是Google的研究总监Peter Norvig实施和描述的best answer I found拼写纠正器。

如果您想了解更多有关此背后理论的信息,请阅读his book chapter

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

答案 9 :(得分:3)

猜测......可能

  1. 搜索单词
  2. 如果没有找到,请使用某种算法尝试“猜测”该单词。
  3. 可能是像Hopfield网络或反向传播网络这样的AI,或其他“识别指纹”,恢复损坏数据或拼写更正的内容,正如Davide所提到的那样......

答案 10 :(得分:2)

几年前我看到了这个,所以可能已经改变了,但显然他们通过分析他们的日志来启动它,以便在短时间内提交非常相似的查询的相同用户,并根据如何使用机器学习用户已经纠正了自己。

答案 11 :(得分:2)

简单。他们有的数据。他们根据查询的频率对每个可能的术语进行统计,并且它通常会产生用户点击的结果... ...因此,当他们看到您为搜索词输入频繁拼写错误时,他们会继续提议更常见的答案。

实际上,如果拼写错误实际上是最频繁的搜索词,那么algorythm将把它作为正确的词。

答案 12 :(得分:2)

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

我想现在称为mashup: - )

答案 13 :(得分:1)

除了上述答案之外,如果你想快速实施一些事情,这里有一个建议 -

算法

您可以在 GitHub上找到此算法的实施和详细文档。

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

答案 14 :(得分:1)

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

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

  

默认情况下,Lucene Spell检查器首先按照排序建议   从字符串距离计算中得分,然后按频率得分   (如果有的话)索引中的建议。

答案 15 :(得分:1)

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

与此同时,我也在开展包括使用文本搜索数据库的项目。我想这可以解决你的问题

答案 16 :(得分:0)

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

答案 17 :(得分:-1)

最简单的解决方法是Google动态编程。

这是一种借鉴信息检索的算法,在现代生物信息学中被大量使用,以了解两种基因序列是如何相似的。

最佳解决方案使用动态编程和递归。

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