あなたがタイプミスのエントリを作るとき、グーグルは提案を出します、彼らはそれをどのように行いますか?
3 に答える
多分これらのリンクは役立つことができます
http://answers.google.com/answers/threadview?id=526503
http://googlesystem.blogspot.com/2007/04/simplified-version-of-googles-spell.html
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))(最も頻繁な単語を選択)の単語を検索します。驚いたことに、これは非常に高速で非常に正確です。移植されたものすべてについて、ブログへのリンクがあります。
編集:おっと、上記の回答のリンクが同じノーヴィグの作品へのポインターを指しているのを見た...
単語の頻度を数えるだけで十分です。機械学習でさえも、これには複雑な何かが必要だとは思いません。モデルを学ぶ必要はありません。奇妙なものを入力したがタイプミスではない場合、彼らもそれを「修正」しようとしていることに気付くでしょう。