5

次の方法を探しています。

String 内の空白で区切られたトークンを取得します。提案された単語を返す


つまり、
Google 検索は"fonetic wrd nterpreterr"を取得でき
、結果ページの上部に"もしかして: phonetic word interpreter"と表示されます。

C* 言語または Java でのソリューションが望ましいでしょう。


そのような機能を実行する既存のオープン ライブラリはありますか?

または、Google API を利用して提案された単語を要求する方法はありますか?

4

8 に答える 8

2

まだ誰も言及していないので、検索するフレーズをもう1つ挙げます。「距離の編集」(たとえば、リンクテキスト)。これは、文字が入れ替わったり、欠落したり、追加されたりするタイプミスであると想定して、最も近い一致を見つけるために使用できます。

しかし、通常、これはある種の関連性情報とも結びついています。単純な人気(最も一般的に使用される十分に近い一致が正しい単語である可能性が最も高いと想定する)、またはコンテキストの可能性(前の正しい単語に続く単語、または前にある単語)のいずれかによって。これは情報検索に入ります。開始する1つの方法は、バイグラムとトリグラム(一緒に見られる単語のシーケンス)を調べることです。Googleには、これらのデータセットが非常に豊富に用意されています。

単純な初期ソリューションの場合、レーベンシュタインベースのマッチャーを備えた辞書の組み合わせは驚くほどうまく機能します。

于 2009-04-02T18:17:08.653 に答える
2

ここで yahoo Web サービスを使用できます: http://developer.yahoo.com/search/web/V1/spellingSuggestion.html

ただし、それは単なるWebサービスです...(つまり、他の言語用のAPIはありません..)が、JSONまたはXMLを出力するため、...どの言語にも簡単に適応できます...

于 2008-09-25T20:23:47.547 に答える
2

Google API を使用してスペル チェックを行うこともできます。ここには ASP の実装があります(ただし、これを信用するつもりはありません)。

于 2009-03-30T12:12:26.390 に答える
2

最初に:

お好きな方をご利用ください。スペル チェック エンジンに対して、単語制限が 1 つだけのクエリを実行すると思われます。クエリ全体が有効な場合は何もしません。そうでない場合は、各単語をその単語の最適な一致に置き換えます。つまり、次のアルゴリズム (空の戻り文字列は、クエリに問題がなかったことを意味します):

startup()
{
   set the spelling engines word suggestion limit to 1
}

option 1()
{
   int currentPosition = engine.NextWord(start the search at word 0, querystring);

   if(currentPosition == -1)
      return empty string; // Query is a-ok.

   while(currentPosition != -1)
   {
       queryString = engine.ReplaceWord(engine.CurrentWord, queryString, the suggestion with index 0);
       currentPosition = engine.NextWord(currentPosition, querystring);
   }

   return queryString;
}
于 2009-04-01T21:01:44.653 に答える
2

レーベンシュタイン距離法を実装する辞書機能を持つ Lucene をプラグインできます。

これは Wiki の例で、2 は距離です。

String[] l=spellChecker.suggestSimilar("sevanty", 2);
//l[0] = "seventy"
于 2009-04-05T09:01:56.310 に答える
1

Google SOAP Search APIがそれを行います。

于 2009-04-04T11:36:57.647 に答える
1

辞書をトライとして保存している場合、文字を挿入、削除、または置換できる最も一致するエントリを見つけるかなり簡単な方法があります。

void match(trie t, char* w, string s, int budget){
  if (budget < 0) return;
  if (*w=='\0') print s;
  foreach (char c, subtrie t1 in t){
    /* try matching or replacing c */
    match(t1, w+1, s+c, (*w==c ? budget : budget-1));
    /* try deleting c */
    match(t1, w, s, budget-1);
  }
  /* try inserting *w */
  match(t, w+1, s + *w, budget-1);
}

アイデアは、最初にゼロの予算で呼び出し、何かを出力するかどうかを確認することです。次に、予算を 1 に設定してみてください。一致するものがいくつか出力されるまで続けます。予算が大きいほど、時間がかかります。予算を 2 まで上げたいと思うかもしれません。

追加: 一般的なプレフィックスとサフィックスを処理するためにこれを拡張することはそれほど難しくありません。たとえば、「un」、「anti」、「dis」などの英語の接頭辞を辞書に登録し、辞書の先頭にリンクすることができます。「ism」、「's」、「ed」などの接尾辞については、接尾辞だけを含む別のトライがあり、ほとんどの単語はその接尾辞トライにリンクできます。そうすれば、「反国有化」などの奇妙な言葉を扱うことができます。

于 2009-04-01T21:17:51.243 に答える