错别字的机器学习

时间:2009-06-04 10:28:57

标签: c# machine-learning

当你输入拼写错误时,Google会提出建议,他们是如何做到的?

3 个答案:

答案 0 :(得分:3)

答案 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)

只有单词的频率计数就足够了,我不认为你需要一些复杂的东西,甚至机器学习。无需学习模型。 如果你输入了一些奇怪但不是拼写错误的东西,你会注意到他们也试图“纠正”它。