我知道这个问题的重复:
这些问题对算法实际如何运作感兴趣。我的问题更像是:让我们假设谷歌不存在或者这个功能可能不存在而且我们没有用户输入。如何实现此算法的近似版本?
为什么这很有趣?
确定。尝试在Google中输入“qualfy”,它会告诉您:
您的意思是: 限定
足够公平。它使用统计机器学习对从数十亿用户收集的数据进行此操作。但现在尝试在Google中输入“Trytoreconnectyou”,它会告诉您:
您的意思是: 尝试重新连接
现在这是更有趣的部分。 Google如何确定这一点?有一本方便的字典,并使用用户输入再次猜测最可能的单词?它如何区分拼写错误的单词和句子?
现在考虑到大多数程序员无法访问数十亿用户的输入,我正在寻找实现此算法的最佳近似方式以及可用的资源(数据集,库等)。有什么建议吗?
答案 0 :(得分:9)
假设您有一个单词词典(在最坏的情况下出现在词典中的所有单词,在最佳情况下出现在系统中的数据中的所有短语),并且您知道各种单词的相对频率单词,您应该能够通过similarity of the word和相似单词的点击次数的某种组合来合理地猜测用户的意思。权重显然需要一些试验和错误,但通常用户会更热衷于一个流行的结果,这个结果在语言上远离他们输入的字符串,而不是在语言上更接近但只有一个或两个的有效单词点击你的系统。
第二种情况应该更直接一些。你找到所有开始字符串的有效单词(“T”无效,“Tr”无效,“Try”是单词,“Tryt”不是单词等),对于每个有效单词,你重复剩余字符串的算法。假设您的字典已编入索引,这应该很快。如果您找到一个结果,您可以将长字符串分解为一组没有剩余字符的有效字,那么这就是您的建议。当然,如果您是Google,您可能会修改算法以查找与实际单词相当接近的字符串的子字符串,并且您有一些逻辑来处理字符串可以通过宽松的拼写检查以多种方式读取的情况(可能使用打破平局的结果数量。)
答案 1 :(得分:7)
从马的口中:How to Write a Spelling Corrector
这里有趣的是你如何需要一堆查询日志来近似算法。您可以使用大多数正确文本的语料库(就像Project Gutenberg的一堆书)。
答案 2 :(得分:3)
我认为可以使用spellchecker
和N-grams
来完成此操作。
对于Trytoreconnectyou
,我们首先检查所有1克(所有字典单词)并找到最接近的匹配,这非常糟糕。所以我们尝试2克(可以通过从长度为2的短语中删除空格来构建),然后是3克等等。当我们尝试4克时,我们发现有一个与我们的搜索词距离0的短语。由于我们不能做得更好,我们将回答作为建议。
我知道这是非常低效的,但Peter Norvig的帖子here清楚地表明Google使用拼写纠正器来生成它的建议。由于Google具有大规模的并行化功能,因此可以非常快速地完成此任务。
答案 3 :(得分:2)
令人印象深刻的tutroail如何在http://alias-i.com/lingpipe-3.9.3/demos/tutorial/querySpellChecker/read-me.html找到它的工作。
简而言之,它是对查询修改(在字符或单词级别)与增加搜索文档覆盖率的权衡。例如“aple”导致2mln文档,但“apple”导致60mln并且修改只有一个字符,因此很明显你的意思是苹果。
答案 4 :(得分:2)
可能有用的数据集/工具:
您可以将WordNet用作简单的术语词典,并且可以使用从语料库中提取的频繁术语来提高它。
你可以使用前面提到的Peter Norvig链接作为第一次尝试,但是使用大字典时,这不是一个好的解决方案。
相反,我建议你使用像locality sensitive hashing(LSH)这样的东西。这通常用于检测重复文档,但它也可以用于拼写纠正。您需要一个从您的数据中提取的术语和字符串列表,您认为人们可能会搜索这些术语和字符串 - 您必须为字符串选择截止长度。或者,如果您有一些人们实际搜索的数据,您可以使用它。对于每个术语字符串,您生成一个向量(可能是字符双字母组或三字符组可以完成此操作)并将其存储在LSH中。
给定任何查询,您可以在Charikar描述的LSH上使用近似最近邻搜索来查找可能匹配项中最近的邻居。
注意:由于我是新用户,因此删除了链接 - 抱歉。
答案 5 :(得分:1)
@Legend - 考虑使用Soundex algorithm的其中一种变体。它有一些已知的缺陷,但它在大多数需要接近拼写错误的单词的应用程序中都能很好地工作。
编辑(2011-03-16):
我突然想起了几年前我遇到的另一种类似Soundex的算法。在this Dr. Dobb's article中,劳伦斯飞利浦讨论了他的Metaphone算法的改进,被称为Double Metaphone。
您可以在同一网站here找到此算法here的Python实现,以及更多实现。
同样,这些算法与Google使用的算法不同,但对于英语单词,它们应该让你非常接近。您还可以查看Phonetic Algorithms的维基百科页面,了解其他类似算法的列表。
答案 6 :(得分:0)