2

当您输入错字时,Google 会提出建议,他们是如何做到的?

4

3 回答 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 回答