116

可能重复:
谷歌“你的意思是什么?” 算法工作?

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

4

17 回答 17

87

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

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

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

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

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

于 2008-09-03T10:55:12.740 回答
35

谷歌的诺维格博士概述了它的工作原理;他甚至给出了 20 行 Python 实现:

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

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

Norvig 博士还在这次精彩的演讲中讨论了“你的意思是” 。Norvig 博士是Google的研究负责人——当被问及“你的意思是”如何实施时,他的回答是权威的。

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

SOUNDEX和其他猜测不要进去,人!

于 2008-11-03T10:33:23.033 回答
12

查看维基百科上关于 Levenshtein 距离的这篇文章。确保您仔细查看可能的改进。

于 2008-09-03T10:49:29.137 回答
11

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

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

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

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

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

于 2009-05-05T07:06:38.463 回答
6

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

您还可以使用Google API 拼写建议请求访问 google 自己的字典。

于 2008-09-03T10:39:05.650 回答
6

您可能想查看 Peter Norvig 的“如何编写拼写校正器”文章。

于 2008-11-01T06:45:29.767 回答
6

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

于 2008-11-03T09:41:24.247 回答
4

http://en.wikipedia.org/wiki/N-gram#Google_use_of_N-gram

于 2008-09-03T11:00:42.977 回答
4

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

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

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

于 2008-09-03T13:11:22.867 回答
2

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

于 2008-09-03T13:04:31.730 回答
1

我用Lucene拼写检查器来做。

于 2009-05-05T06:27:35.217 回答
0

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

另请查看 Full-Text-Indexing,语法与 Google 逻辑不同,但速度非常快,可以处理类似的语言元素。

于 2008-09-03T10:41:35.520 回答
0

Soundex 和“Porter stemming”(soundex 是微不足道的,不确定 porter 词干)。

于 2008-09-03T10:46:57.533 回答
0

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

有一个红宝石宝石,但我不知道如何从 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 的可能修正:heart 对 wil 的可能修正:Will

于 2008-11-19T17:37:01.280 回答
0

以有效的方式为搜索引擎实施拼写校正并非易事(您不能只计算每个可能单词的编辑/编辑距离)。信息检索简介(在线提供全文)中描述了基于 k-gram 索引的解决方案。

于 2009-01-16T22:20:48.720 回答
0

您可以使用 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"   
于 2010-10-08T07:35:30.857 回答
0

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

于 2012-08-20T12:30:21.977 回答