如何实现一个“你是想说”的功能?(用于IT技术)

117

@pek:我之前也有同样的想法... 你考虑过使用HTML抓取工具,以谷歌作为纠错的源吗? - Ande Turner
请参见 https://dev59.com/rG865IYBdhLWcg3wivKj。 - John
17个回答

87

实际上,Google所做的是非常不平凡且一开始令人感到反直觉的。他们并不像检查词典那样进行任何操作,而是利用统计学来识别“相似”的查询,这些查询返回的结果比您的查询更多,具体算法当然不为人知。

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

具体来说,为了解决单词/查询相似性问题,我使用编辑距离取得了良好的效果,这是一种数学测量字符串相似性的方法,它的表现出乎意料地好。我曾经使用Levenshtein,但其他算法可能也值得考虑。

Soundex - 按我的经验 - 是垃圾。

实际上,有效地存储和搜索大量拼写错误的单词字典并在子秒级别内检索是非常不平凡的,您最好利用现有的全文索引和检索引擎(即不是数据库的索引和检索引擎),其中Lucene目前是最好的,并巧合地被移植到了许多平台。


35

谷歌的Norvig博士概述了它是如何工作的;他甚至给出了一个约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和其他猜测没有得到考虑,人们!


4
Norvig博士提供了一个概念的玩具示例;它不够准确,无法为Web提供“您是不是要找”功能。例如:“barak”没有提供建议;而“barak obama”有(因为他们知道“barack”经常与Obama一起出现,并可以推断出可能的更正)。 - SquareCog
2
从他的玩具拼写检查器转向处理您的示例并且能够良好工作并不难。重要的是要记住,他展示的拼写检查器与查询建议器略有不同但显著不同。使用先前的查询进行训练而不是英文文本是一个很好的起点。 - jshen
肯定不仅仅是拼写检查。举个例子,我见过情况,既没有我输入的单词,也没有建议的替换单词是“字典单词”。 - Ryan Lundy
1
@Kyralessa:你认为他们的词典是某种语言中的静态单词,还是基于互联网上的单词和常见搜索术语的动态词典?这并不意味着它不是一个词典检查。毕竟,Novig博士是谷歌研究部门的负责人——当被问及“你是如何实现‘你是指’的”时,他的回答是权威的。 - Will

12

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


最常见的编辑距离计算。一种常见的方法是使用Wagner-Fischer算法。 - Giuliano

11

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

正如之前的帖子中提到的,Google(还有Microsoft和Yahoo!)不使用任何预定义的词典,也没有大量的语言学家考虑可能的查询拼写错误。这是不可能的,因为问题的规模非常大,而且人们无法确定查询是否拼写错误。

相反,有一个简单而相当有效的原则,对所有欧洲语言都适用。获取搜索日志上的所有唯一查询,在假定参考查询为计数最高的查询的情况下,计算所有查询对之间的编辑距离。

这个简单的算法对许多类型的查询都非常有效。如果您想将其提升到下一个级别,那么我建议您阅读Microsoft Research关于该主题的论文。您可以在这里找到它。

这篇论文有一个很棒的介绍,但之后您需要了解隐马尔可夫模型等概念。


6

6

我相信谷歌会记录所有的搜索请求,并且会识别出当有人进行拼写更正时。这个更正可能会在其他人提供相同的第一个查询时建议使用。实际上,这对于任何语言,事实上是任何字符的字符串都适用。


确实如此。这有助于他们轻松地学习新单词——他们可以得到数百万人的帮助。 - A. Rex
2
是的,这实际上是正确的答案。根据《In the Plex》一书,Google会寻找那些搜索某些内容、得到结果,然后立即微调搜索词的情况。 - Joel Spolsky

5

1
+1 针对 Google API 的链接似乎正是提问者所寻找的,即使所选答案更深入并回答了 Google 实现的“为什么”和“如何”。 - dimo414

4

你能否详细说明一下,以防你的链接死亡或者被频繁删除?链接已经失效了... - Michael Paulukonis

4
我认为这取决于你的网站有多大。在我们的本地Intranet上,约有500名员工使用,我只查看返回零结果的搜索短语,并将该搜索短语与新建议的搜索短语输入到SQL表中。
如果没有返回搜索结果,我会从该表中调用它,但是,这仅适用于网站相对较小且仅针对最常见的搜索短语。
您还可以查看我的类似问题的答案:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接