Google検索スタイルを提供するStringTokenパーサー“もしかして:”提案

StackOverflow https://stackoverflow.com/questions/135777

  •  02-07-2019
  •  | 
  •  

質問

メソッドのシーク:

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


ie:
Google検索では、" fonetic wrd nterpreterr"
結果ページの上部に"という意味ですか?:音声単語通訳&

C *言語またはJavaのいずれかのソリューションが推奨されます。


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

または、Google APIを利用して、提案された単語をリクエストする方法はありますか

役に立ちましたか?

解決

彼の記事スペルコレクターの書き方では、Peter NorvigがGoogle-スペルチェッカーなどを実装できます。この記事には、Pythonでの20行の実装と、C、C ++、C#、およびJavaのいくつかの再実装へのリンクが含まれています。抜粋を次に示します。

  

の詳細   工業用スペルコレクター   グーグルがもっと混乱するように   啓発するよりも、私はそれを考え出した   飛行機の飛行機で   コードのページ、私はおもちゃを書くことができます   80を達成するスペルコレクターまたは   処理速度が90%の精度   1秒あたり少なくとも10ワード。

Norvigのコードとこのテキストトレーニングセットとして、次の結果が得られます。

>>> import spellch
>>> [spellch.correct(w) for w in 'fonetic wrd nterpreterr'.split()]
['phonetic', 'word', 'interpreters']

他のヒント

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

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

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

まず:

選択したものを使用します。単語制限が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;
}

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

しかし、通常これは何らかの関連情報とも結びついています。単純な人気(最も一般的に使用される十分に近い一致が正しい単語である可能性が最も高いと仮定する)、またはコンテキスト尤度(前の正しい単語に続く、または1つ前に来る単語)のいずれかです。これにより、情報の取得が行われます。開始する1つの方法は、バイグラムとトライグラム(一緒に見られる単語のシーケンス)を調べることです。 Googleには、これらの非常に広範な自由に利用可能なデータセットがあります。

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

Levenshtein distanceメソッドを実装する辞書機能を備えたLuceneをプラグインできます。

Wikiの例です。2は距離です。

String[] l=spellChecker.suggestSimilar("sevanty", 2);
//l[0] = "seventy"

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

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

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

アイデアは、まず予算を0にして呼び出して、何も印刷されないかどうかを確認することです。次に、1の予算を試して、一致するものが出力されるまで続けます。予算が大きいほど時間がかかります。予算を2に増やすこともできます。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top