当你输入拼写错误时,Google会提出建议,他们是如何做到的?
答案 0 :(得分:3)
也许这些链接可以提供帮助
http://answers.google.com/answers/threadview?id=526503
http://googlesystem.blogspot.com/2007/04/simplified-version-of-googles-spell.html
答案 1 :(得分:2)
Peter Norvig(Google研究总监)使用统计启发式方法撰写了一篇关于spell checking in Python的介绍性文章。
这是一个很好的阅读,并展示了如何以一种非常简单的方式使用统计启发式。它可以很容易地移植到C#(使用LINQ)(Python的列表推导与Linq表达式非常接近)。
这个片段的核心部分是一个单词的所有简单拼写错误(edit1函数) C#等价物如下
public static IEnumerable<string> Edit1(string word){
const string alphabet = "abcdefghijklmnopqrstuvwxyz";
var s = from i in Enumerable.Range (0, word.Length - 1)
select new Pair<string>(word.Substring (0, i), word.RSlice(i));
var deletes = from p in s
select p.First + p.Second.RSlice (1);
var transposes = from p in s
let b1 = p.Second
where b1.Length > 2
select p.First + b1 [1] + b1 [0] + b1.RSlice (2);
var replaces = from p in s
let b = p.Second
where b.Length > 0
from c in alphabet select p.First + c + b.RSlice (1);
var inserts = from p in s
from c in alphabet
select p.First + c + p.Second;
return deletes.Concat (transposes).Concat( replaces)
.Concat(inserts).Distinct ();}
其中Pair是一个穷人元组(明显的代码不包括在内)而RSlice是一个穷人字符串唯一正确的拼接:
public static class Extensions {
public static string RSlice (this string input, int i)
{
if (i > input.Length - 1)
return "";
return input.Substring (i);
}}
获得单词的编辑后,您会在字典中查找单词或编辑的现有单词(选择最常用的单词)或编辑单词1(edits1(word))(选择最常用的单词)字)。令人惊讶的是,这可以非常快速且非常准确。 我将有一个链接到我的博客,用于移植所有内容。
编辑:oops刚看到上面答案中的一个链接指向同一个Norvig的作品的指针......
答案 2 :(得分:1)