2009-06-04 12 views
2

Google hat Vorschlag kommen, wenn Sie einen Tippfehler machen, wie machen sie es?Machine Learning für Tippfehler

+0

gleiche Frage: http://stackoverflow.com/questions/307291/how-does- Die-google-did-you-mean-Algorithmus-Arbeit – seb

Antwort

1

nur Frequenzzahl von Wörtern, die genug ist, ich glaube nicht, dass Sie für diese komplizierte brauchen somehthing, nicht einmal Maschine Lernen. Keine Notwendigkeit, ein Modell zu lernen. Wenn Sie etwas seltsames, aber kein Tippfehler eingegeben haben, werden Sie bemerken, dass sie versuchen, es auch zu "korrigieren".

2

Peter Norvig (Forschungsdirektor bei Google) hat eine kleine Einleitung zu spell checking in Python mit statistischen Heuristiken geschrieben.

Es ist ein großartiger Lesevorgang und zeigt, wie statistische Heuristiken auf eine sehr einfache Art und Weise verwendet werden können. Es könnte ziemlich leicht nach C# (mit LINQ) portiert werden (Pythons Listenkompressentierungen sind sehr nahe an Linq-Ausdrücken).

Der Kernteil dieser Schnipsel wird für ein Wort (edit1 Funktion) der C# Äquivalent ist die folgende

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();} 

dem Paar einen armen Mannes Tupel (offensichtliche Code nicht enthalten) alle einfachen Fehler aufweist, ist und RSlice ist ein schlechter Mann String-nur rechts Spleißen:

public static class Extensions { 
    public static string RSlice (this string input, int i) 
    { 
     if (i > input.Length - 1) 
      return ""; 
     return input.Substring (i); 
    }} 

Nachdem Sie die Änderungen für ein Wort bekam, man sucht das Wort im Wörterbuch oder die vorhandenen Wörter der Änderungen (das häufigste Wort Auswahl) oder die Wörter für edits1 (edits1 (word)) (Wählen Sie das häufigste Wort). Überraschenderweise kann dies ziemlich schnell und ziemlich genau sein. Ich werde einen Link zu meinem Blog für das ganze Zeug portiert haben.

Edit: oops gerade gesehen, dass ein Link in einer Antwort oben auf einen Zeiger auf das gleiche Norvig des Stück wies ...

+0

Werden Sie wirklich eine C# Version veröffentlichen? heee man wollte ich nur wissen, aber wenn du ein Ass bist hey gut was soll ich sagen – abmv

+0

Ich habe gerade einen rohen Port fertig. Es ist ein bisschen hässlich und Uhren bei ~ 100 Zeilen statt der ~ 20 ursprünglichen (hey C# 4, was ist mit dem Vergessen schöne COM-Interop und Scheiben in Listen?) –

+0

+1 für C# Übersetzung. Sehr nett und nützlich für "den Rest von uns". –

Verwandte Themen