当您输入错字时,Google 会提出建议,他们是如何做到的?
问问题
668 次
3 回答
2
Peter Norvig(Google 研究总监)写了一篇关于使用统计启发式在 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);
}}
一旦你得到一个词的编辑,你在字典中寻找这个词或编辑的现有词(选择最常见的词)或edits1(edits1(word))的词(选择最常见的词)。令人惊讶的是,这可能非常快速且非常准确。我将有一个指向我的博客的链接,以获取移植的全部内容。
编辑:哎呀,刚刚看到上面答案中的链接指向了指向同一个 Norvig 作品的指针......
于 2009-06-04T11:10:30.103 回答
1
仅仅有单词的频率就足够了,我认为你不需要复杂的东西,甚至不需要机器学习。无需学习模型。如果您输入了一些奇怪但不是错字的内容,您会注意到他们也尝试“纠正”它。
于 2009-06-04T10:32:49.883 回答