Google如何表达“您的意思?” 算法工作?


436

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

我需要能够智能地进行用户查询,并不仅要响应原始搜索结果,还要响应“您是不是要这么做?” 当有非常可能的替代答案时的响应等

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

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

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

1
是Norvig拼写校正器的VB.NET版本。如果还不算太晚,您可能会发现它很有用!
拉尔夫·威格姆


我在非qwerty键盘(Colemak)上打字,但功能却不那么聪明。它肯定会从记录的错误校正对中学习,因此调整为qwerty。正如预期的那样,普通的拼写检查器可以很好地在我的键盘上工作-字符串编辑距离不受布局影响。
Panic Panic 2014年

Answers:


366

这是直接来自来源的解释(差不多)

搜索101!

在22:03分钟

值得一看!

基本上,根据Google前CTO Douglas Merrill的说法,它是这样的:

1)您在Google中写了一个(拼写错误的)单词

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

3)您意识到自己拼错了单词,因此在搜索框中重写了单词。

4)找到所需的内容(单击第一个链接)

此模式乘以数百万次,显示出最常见的错误拼写和最“常见”的更正。

这样,Google几乎可以即时提供每种语言的拼写校正功能。

这也意味着,如果所有人都在一夜之间开始拼写为“ nigth”,那么google会建议该单词代替。

编辑

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

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

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

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

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

观看此Google Wave演示(@ 44m 06s),该演示显示了如何考虑上下文以自动更正拼写。

此说明自然语言处理的工作方式。

最后,这是一个很棒的演示,介绍如何将自动机器翻译(@ 1h 12m 47s)添加到混合中。

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


但是该算法如何工作?Google如何从“我们收到数十亿个使用各种术语的搜索,而这些搜索就是”到“因此该术语必须是该术语的常见拼写错误”?他们解决了这个问题,但是我对如何解决感兴趣。他们如何确定两个搜索来自同一用户,哪个单词是另一个用户的“更正”,以及如何汇总数十亿次搜索呢?
thomasrutter

51
如果每个人都开始拼写“ night”……我相信他们已经被搜索“ Flickr”的人们所碰到。
Max Lybbert 09年

42
每个人拼写错误的问题在更严重的意义上已经发生:尝试在Google中输入“ fuscia”。谷歌说:“你是说紫红色吗?” 实际上,正确的拼写是“紫红色”,但是由于某种原因,没有人可以正确地拼写。在Dictionary.com上,问题更严重。如果在他们的搜索中输入“ fuschia”,它将为您显示“ fuschia没有结果。您是说'fuschia'吗?” (即,您的意思是您刚刚输入的内容吗?)
Daisy Sophia Hollman 2010年

8
我不认为他们仅使用拼写错误的数据-肯定存在Levenshtein距离或类似的错误-搜索“ Plack”(以及一个或多个其他单词),并且始终将其纠正为“ black”,这是极不可能的拼写错误/ typo
plusplus 2011年

4
@Jakub我认为自4年前我发表评论以来,他们已经解决了问题。确实,谷歌也已经解决了这个问题。搜索紫红色会自动包含紫红色的结果。
Daisy Sophia Hollman 2015年

104

我前段时间找到了这篇文章:如何编写拼写校正器,作者是Peter Norvig(Google Inc.的研究主管)。

这是有关“拼写更正”主题的有趣读物。这些示例是使用Python编写的,但是清楚易懂,我认为该算法可以轻松转换为其他语言。

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

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

最好的办法是您可以使用实际的搜索词及其出现方式。如果您没有,可以使用大量文本来代替。计算每个单词的出现(受欢迎程度)。

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

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

从上一步中选择最受欢迎的单词,并提出更正建议(如果不是单词本身)。


6
@Davide:“”“示例在python中,但是很清楚而且很容易理解”“”“:我不明白您对” but“的使用...我想说的是Python + Norvig的写作风格,”清晰而又简单易懂”是预期的结果。
约翰·马钦

20
出现“ but”是因为Harry在他的问题中说他是VB.NET开发人员,所以我认为他对python语言没有信心。
Davide Gualano,2009年

56

对于“您是不是要”算法的理论,您可以参考“信息检索简介”的第3章。它可以免费在线获得。第3.3节(第52页)准确地回答了您的问题。要专门回答您的更新,您只需要一个单词词典就可以了(包括数百万个用户)。


10

嗯...我以为Google用他们庞大的数据集(互联网)来做一些严肃的NLP(自然语言处理)。

例如,他们拥有来自整个互联网的大量数据,因此他们可以计算出现三个单词的序列(称为trigram)的次数。因此,如果他们看到这样的句子:“粉红色节俭音乐会”,他们会发现它的点击率不高,然后在他们的语料库中找到最可能的“粉红色*音乐会”。

他们显然只是改变了Davide Gualano所说的话,因此一定要阅读该链接。Google当然会使用它已知的所有网页作为语料库,因此这使其算法特别有效。


7

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


6
假设您总共存储了数十亿个网页的单词。没有一个简单的方法来索引Levenshtein距离以快速检索附近的匹配项,而无需为查询的每个单词计算数十亿次Levenshtein距离。因此,在这种情况下,Levenshtein距离并没有多大用处,至少在第一阶段没有用,在第一阶段,Google需要将数十亿个现有单词的范围缩小到仅可能是当前单词的拼写错误的单词。一旦已经获取了可能的匹配,它绝对可以在以后的步骤中应用Levenshtein。
thomasrutter

6

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

  • 确定确定是否需要拼写更正的方法。这些可能包括结果不足,结果不够明确或不够准确(根据某种度量)等。然后:

  • 使用大块的文本或字典,其中所有或大部分已知拼写正确。这些可以在网上轻松找到,例如LingPipe。然后,要确定最佳建议,您需要根据几种度量寻找最匹配的单词。最直观的一个是相似字符。通过研究和实验表明,两个或三个字符序列匹配效果更好。(字母和字母)。为了进一步提高结果,请在单词的开头或结尾对比赛进行加权。出于性能原因,将所有这些词索引为三字母组或双字母组,以便在执行查找时转换为n-gram,然后通过哈希表或trie查找。

  • 根据字符位置,使用与潜在的键盘错误相关的试探法。因此,“ hwllo”应为“ hello”,因为“ w”接近“ e”。

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

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

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



4

Google显然建议查询结果最好,而不是拼写正确的查询。但是在这种情况下,拼写校正器可能会更可行。当然,您可以根据返回的结果的好坏来为每个查询存储一些值。

所以,

  1. 您需要字典(英语或根据您的数据)

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

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

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

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



3

几年前,我看到了一些东西,因此可能有所改变,但显然他们是通过分析同一用户的日志开始的,该用户在短时间内提交了非常相似的查询,并根据用户的纠正方式使用了机器学习他们自己。


3

猜测...可能

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

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


2

简单。他们数据。他们会针对每个可能的字词提供统计信息,具体取决于查询的频率以及用户查询该字词通常会产生什么变化……因此,当他们看到您为某个搜索字词输入了频繁的拼写错误时,他们会继续提出建议更常见的答案。

实际上,如果拼写错误实际上是搜索频率最高的术语,则算法会选择正确的单词。


1
没人怀疑Google是否拥有执行此操作所需的所有必要数据,但问题是询问有关Google如何在合理的时间内用大量数据来完成此操作的算法的详细信息。他们每天将进行数以百万计的搜索-如何轻松地确定一个搜索词是否是另一个新搜索词的“拼写更正”?哪些因素使Google决定一个术语拼写错误?这些是感兴趣的实现细节。
thomasrutter

2

关于您的问题,如何在没有大量数据的情况下模仿行为-为什么不使用Google收集的大量数据?下载拼写错误的单词的google搜索结果,然后在HTML中搜索“您的意思是:”。

我猜现在被称为mashup :-)


Google停止抓取您的漫游器需要多长时间?-还是这些天Google甚至不会注意到?
安德鲁·哈里

我认为他们不会注意到要求/秒不是太高。
Mauricio Scheffer

2

除了上述答案外,如果您想自己快速实施某些操作,还可以提出以下建议-

算法

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

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

1

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

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


1

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

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

默认情况下,Lucene拼写检查器会首先根据字符串距离计算中的分数对建议进行排序,然后再根据索引中建议的频率(如果有)对其进行排序。


0

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


-1

解决这个问题的最简单方法是使用Google动态编程。

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.