2

あなたがタイプミスのエントリを作るとき、グーグルは提案を出します、彼らはそれをどのように行いますか?

4

3 に答える 3

3

多分これらのリンクは役立つことができます

http://answers.google.com/answers/threadview?id=526503

http://googlesystem.blogspot.com/2007/04/simplified-version-of-googles-spell.html

http://en.wikipedia.org/wiki/Spell_checker

于 2009-06-04T10:32:44.940 に答える
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))(最も頻繁な単語を選択)の単語を検索します。驚いたことに、これは非常に高速で非常に正確です。移植されたものすべてについて、ブログへのリンクがあります。

編集:おっと、上記の回答のリンクが同じノーヴィグの作品へのポインターを指しているのを見た...

于 2009-06-04T11:10:30.103 に答える
1

単語の頻度を数えるだけで十分です。機械学習でさえも、これには複雑な何かが必要だとは思いません。モデルを学ぶ必要はありません。奇妙なものを入力したがタイプミスではない場合、彼らもそれを「修正」しようとしていることに気付くでしょう。

于 2009-06-04T10:32:49.883 に答える