Google a une suggestion à faire quand vous faites une faute de frappe, comment font-ils?Apprentissage automatique des fautes de frappe
Répondre
est juste assez d'avoir le nombre de fréquence des mots, je ne pense pas que vous avez besoin somehthing compliqué pour cela, même pas la machine apprentissage. Pas besoin d'apprendre un modèle. Si vous avez entré quelque chose d'étrange mais pas une faute de frappe, vous remarquerez qu'ils essaient de le "corriger" aussi.
Peter Norvig (directeur de la recherche chez Google) a écrit un petit morceau d'introduction sur en utilisant des heuristiques statistiques.
C'est une excellente lecture, et montre comment utiliser l'heuristique statistique d'une manière très simple. Il pourrait être porté sur C# (avec LINQ) assez facilement (les listes de Python sont très proches des expressions Linq).
La partie principale de cet extrait est d'avoir toutes les fautes de frappe simples pour un mot (fonction edit1) C# équivalent est le suivant
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();}
où Paire est un pauvre homme tuple (code évident non inclus) et RSlice est une chaîne seule pauvre homme épissage droite:
public static class Extensions {
public static string RSlice (this string input, int i)
{
if (i > input.Length - 1)
return "";
return input.Substring (i);
}}
une fois que vous avez obtenu les modifications pour un mot, vous recherchez le mot dans le dictionnaire ou les mots existants des modifications (en sélectionnant le mot le plus fréquent) ou les mots pour edits1 (edits1 (mot)) (en sélectionnant le mot le plus fréquent). Étonnamment, cela peut être assez rapide et assez précis. Je vais avoir un lien vers mon blog pour tout le contenu porté.
Edit: oops juste vu qu'un lien dans une réponse a ci-dessus pour un pointeur sur le même morceau de Norvig ...
Allez-vous vraiment poster une version C#? heee man Je voulais juste savoir, mais si vous êtes un as hey bien que puis-je dire – abmv
Je viens de terminer un port brut. C'est un peu moche et les horloges à ~ 100 lignes au lieu de ~ 20 originales (hey C# 4, qu'en est-il de l'oubli de l'interopérabilité et des tranches dans les listes?) –
+1 pour la traduction en C#. Très agréable et utile pour "le reste d'entre nous". –
même question: http://stackoverflow.com/questions/307291/how-does- the-google-did-you-mean-algorithm-work – seb