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

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

我需要能够智能地采取用户查询,不仅回应原始的search结果,而且与“你的意思是? 有很可能的备选答案等时的回应

[我正在开发ASP.NET (VB – 不要抱着它!)]

更新:好的,我怎样才能模仿这个没有数百万的“无偿用户”?

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

这里是从源头上直接解释(几乎)

search101!

在22:03分

值得一看!

基本上,根据谷歌前首席技术官道格拉斯·梅里尔(Douglas Merrill)的说法是这样的:

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

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

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

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

这种模式增加了数百万次,显示了最常见的错误,哪些是最常见的错误。

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

这也意味着,如果一夜之间所有人都开始拼写,那么“nigth”谷歌会提示这个词。

编辑

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

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

如果用户执行查询,只有10%的用户点击一个结果,90%返回并键入另一个查询(与纠正的单词),这次90%点击一个结果,然后他们知道他们已经find一个更正。

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

此外,他们现在将上下文纳入拼写检查,所以他们甚至可以根据上下文build议不同的单词。

看到这个谷歌演示 (@ 44m 06s),展示了如何考虑上下文来自动纠正拼写。

这里解释了自然语言处理是如何工作的。

最后这里是一个很棒的演示,可以将自动机器翻译 (@ 1h 12m 47s)添加到混音中。

我已经添加了分钟和秒钟的video直接跳到内容,如果他们不工作,尝试重新加载页面或手动滚动到标记。

前段时间我发现了这篇文章: http : //www.norvig.com/spell-correct.html 。

这是关于“拼写纠正”主题的一个有趣的阅读。 这些例子都是用Python编写的,但是它的理解很简单明了,我认为这个algorithm可以很容易的翻译成其他的语言。

下面是对algorithm的简短描述。 该algorithm由两个步骤组成,准备和字检查。

第一步:准备 – build立词库

最好是如果你可以使用实际的search词和他们的发生。 如果你没有那么多的文本可以用来代替。 计算每个单词的出现(stream行度)。

第二步:字检查 – find类似于被检查的单词

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

select上一步最stream行的单词,并将其作为更正(如果不是单词本身)。

对于“你是不是指”algorithm的理论,可以参考“信息检索概论”第三章。 它可以在线免费获得。 第3.3节 (第52页)完全回答你的问题。 而要专门回答你的更新,你只需要一个词的字典,没有别的(包括数百万用户)。

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

例如,他们有很多来自整个互联网的数据,他们可以计算一个三字序列发生的次数(称为三元组)。 所以如果他们看到这样的句子:“粉红色的frugr演唱会”,他们可以看到它没有几个点击,然后在他们的语料库中find最有可能的“粉红色音乐会”。

他们显然只是做了大卫Gualano说的变化,但是,所以一定要读这个链接。 谷歌当然使用它所知道的所有网页作为一个语料库,所以这使得它的algorithm特别有效。

我的猜测是,他们使用Levenshtein距离algorithm和他们收集的有关search的大量数据的组合。 他们可以从所input的searchstring中提取一列Levenshtein距离最短的search,然后选取结果最多的search。

正常情况下,拼写纠正器使用几种方法来提供拼写build议。 有些是:

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

  • 使用大量的文本或字典,大家都知道拼写正确。 这些很容易在网上find,比如LingPipe 。 然后要确定最好的build议,你要找一个基于几个措施最匹配的词。 最直观的是相似的字符。 通过研究和实验已经表明,两三个字符序列匹配更好地工作。 (bigrams和trigrams)。 为了进一步提高成绩,在比赛开始或结束时对比赛进行评分。 出于性能原因,将所有这些词汇索引为trigrams或bigrams,以便在执行查找时转换为n-gram,并通过散列表或trie查找。

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

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

  • 在每种情况下,您都必须从列表中select最佳的修正。 这可能是一个距离度量,如levenshtein,键盘度量等。

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

使用Levenshtein距离 ,然后创build一个Metric Tree(或Slim tree)来索引单词。 然后运行1-Nearest Neighbor查询,得到结果。

谷歌显然build议查询以最好的结果,而不是那些拼写正确。 但是在这种情况下,拼写纠正器可能更为可行。当然,您可以根据每个查询返回的好结果的度量来存储一些值。

所以,

  1. 你需要一本字典(英文或根据你的数据)

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

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

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

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

这是我发现的最好的答案 ,由Google的研究总监Peter Norvig实施并描述了拼写纠正器。

如果你想更多地了解这个背后的理论,你可以阅读他的书籍章节 。

该algorithm的思想是基于统计机器学习。

作为一个猜测…它可以1)search单词2)如果没有find使用一些algorithm来试图“猜”这个单词。 可能是像霍普菲尔德networking或反向传播networking,或其他“识别指纹”,恢复损坏的数据,或拼写更正像达维德已经提到的AI的东西…

关于你的问题如何模仿没有吨数据的行为 – 为什么不使用谷歌收集吨数据? 下载拼写错误的单词的谷歌search结果,并在HTML中search“您的意思是:”。

我想现在叫做mashup 🙂

几年前我看到了一些东西,所以可能已经改变了,但是显然他们是通过分析他们的日志来为同一个用户在短时间内提交非常相似的查询而开始的,并且基于用户如何纠正他们自己。

简单。 他们有大量的数据。 他们根据每次查询的频率统计每个可能的术语,以及它的变化通常会导致用户点击的结果…所以,当他们看到您input一个频繁的search字词拼写错误时,他们会提出build议更通常的答案。

实际上,如果拼写错误是最常用的search词,那么这个algorithm就会是正确的。

你的意思是说拼写检查? 如果它是一个拼写检查器,而不是一个完整的短语,那么我已经有一个关于拼写检查python开发algorithm的链接。 检查这个链接

同时,我也在研究包括使用文本search数据库的项目。 我想这会解决你的问题

最简单的方法就是Googledynamic编程。

这是一个从信息检索中借用的algorithm,在现代生物信息学中被大量使用,以查看两个基因序列是如何相似的。

最佳的解决scheme使用dynamic编程和recursion。

这是一个非常解决的问题,有很多解决scheme。 只是谷歌,直到你find一些开放源代码。

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

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

Apache Solr是一个全文search引擎,除了许多其他function还提供了拼写检查或查询build议。 从文档 :

默认情况下,Lucene拼写检查器首先根据string距离计算中的得分对build议进行sorting,然后根据索引中build议的频率(如果可用)进行sorting。

除了上述的答案之外,如果你想快速的自己实现一些东西,这里有一个build议 –

algorithm

你可以在我的GitHub项目中find这个algorithm的实现和详细的文档。

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