假设您的网站中已有搜索系统。如何在某些search queries中实现“您的意思是:<spell_checked_word>
”,就像Google一样?
答案 0 :(得分:83)
实际上,谷歌所做的事情非常重要,而且最初也是反直觉的。他们没有做任何事情,比如检查字典,而是他们利用统计数据来识别返回比查询更多结果的“类似”查询,确切的算法当然不知道。
这里要解决不同的子问题,作为所有相关自然语言处理统计数据的基础,必须有一本书:Foundation of Statistical Natural Language Processing。
具体地说,为了解决单词/查询相似性的问题,我使用Edit Distance得到了很好的结果,Lucene是字符串相似性的数学度量,效果出奇的好。我曾经使用Levenshtein,但其他人可能值得研究。
Soundex - 根据我的经验 - 是废话。
实际上有效地存储和搜索拼写错误的单词的大型字典并进行次级检索也是非常重要的,最好的办法是利用现有的全文索引和检索引擎(即不是数据库的一个),其中{{3}}目前是最好的,巧合地移植到许多平台上。
答案 1 :(得分:34)
Google的Norvig博士概述了它的运作方式;他甚至给出了一个20行的Python实现:
http://googlesystem.blogspot.com/2007/04/simplified-version-of-googles-spell.html
http://www.norvig.com/spell-correct.html
Norvig博士还在this excellent talk中讨论了“你的意思”。 Norvig博士是Google的研究负责人 - 当被问及“你的意思”是如何实施时,他的答案是 授权 。
所以它的拼写检查,大概是从其他搜索或甚至实际的互联网短语等动态字典构建。但那仍然是拼写检查。
SOUNDEX和其他猜测没有看到,人们!
答案 2 :(得分:12)
在维基百科上查看有关Levenshtein距离的this文章。确保你仔细研究可能的改进。
答案 3 :(得分:12)
有人问我如何为搜索引擎创建最先进的拼写建议系统,我感到非常惊喜。我已经为一家搜索引擎公司工作了一年多这个主题,我可以指出有关该主题的公共领域的信息。
正如前一篇文章中所提到的,谷歌(以及微软和雅虎)不会使用任何预定义的词典,也不会聘请成群的语言学家来思考可能的拼写错误。由于问题的严重性,这是不可能的,但也因为人们无法确切地确定何时以及查询是否拼写错误,这是不可能的。
相反,有一个简单而有效的原则也适用于所有欧洲语言。获取搜索日志上的所有唯一查询,计算所有查询对之间的编辑距离,假设参考查询是具有最高计数的查询。
这种简单的算法适用于许多类型的查询。如果你想把它提升到一个新的水平,那么我建议你阅读微软研究院关于该主题的论文。你可以找到它here
本文有一个很好的介绍,但之后你需要了解隐藏马尔可夫模型等概念。
答案 4 :(得分:6)
我建议您查看SOUNDEX以查找数据库中的相似字词。
访问谷歌自己的词典答案 5 :(得分:6)
你可能想看看Peter Norvig的“How to Write a Spelling Corrector”文章。
答案 6 :(得分:6)
我相信Google会记录所有查询,并确定何时进行拼写更正。然后,当其他人提供相同的第一查询时,可以建议该校正。这适用于任何语言,实际上是任何字符串。
答案 7 :(得分:4)
答案 8 :(得分:4)
我认为这取决于您的网站有多大。在大约500名工作人员使用的本地Intranet上,我只查看返回零结果的搜索短语,并将新建议的搜索短语输入该搜索短语到SQL表中。
如果没有返回任何搜索结果,他们会在该表上调用,但是,这仅在网站相对较小时才有效,而且我只对最常见的搜索短语执行此操作。
您可能还想查看我对类似问题的回答:
答案 9 :(得分:2)
如果您有特定行业的翻译,则可能需要同义词库。例如,我在珠宝行业工作,在我们的描述中有缩写,如kt - karat,rd - round,cwt - carat weight ... Endeca(该工作的搜索引擎)有一个词库,将从常见翻译拼写错误,但确实需要人工干预。
答案 10 :(得分:1)
我是通过Lucene的Spell Checker来完成的。
答案 11 :(得分:0)
为什么不使用谷歌,你的意思是在你的代码中。如何看到这里 http://narenonit.blogspot.com/2012/08/trick-for-using-googles-did-you-mean.html
答案 12 :(得分: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"
答案 13 :(得分:0)
以有效的方式为搜索引擎实施拼写纠正并非易事(您不能只计算每个可能单词的编辑/ levenshtein距离)。 Introduction to Information Retrieval中描述了基于k-gram索引的解决方案(在线提供全文)。
答案 14 :(得分: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的可能更正: 心 可能的纠正: 将
答案 15 :(得分:0)
Soundex和“Porter stemming”(soundex是微不足道的,不确定搬运工干预)。
答案 16 :(得分:0)
Soundex适用于语音匹配,但最适合人们的名字(最初是为人口普查数据开发的)
同时查看全文索引,语法与Google逻辑不同,但它非常快,可以处理类似的语言元素。