5

私は自分のウェブサイトに内部検索を実装しようとしています。これは、単語を間違って入力した場合にユーザーを正しい方向に向けることができます。

そのような検索を行う方法を知っている人はいますか? ユーザーが検索しようとしていると想定する単語またはフレーズの関連性をどのように確立できますか?

  • FTS(fullTextSearch)でasp.netとSQLサーバー2005を使用しています

ありがとうございました

4

5 に答える 5

4

文字列の類似性を判断するアルゴリズムを使用して、特定の違いまで検索インデックスから他の文字列を提案できます。

これらのアルゴリズムの 1 つがレーベンシュタイン距離です。

ただし、既存のソリューションを検索することを忘れないでください。たとえば、 Luceneには類似した文字列を検索する機能があると思います。

ところで、このトピックに関する関連記事は次のとおりです。アルゴリズムの仕事?

于 2009-01-15T22:27:54.513 に答える
2

これは、フレーズに一致する最も近いキーワードを正規表現で照会して行われます。

ここにあなたを助けるかもしれない素晴らしい記事があります。

于 2009-01-15T22:22:43.680 に答える
0

google power を使わないのはなぜですか?, あなたは彼らの提案サービスを利用することができます

ここにc#の例があります

于 2011-09-16T03:33:53.043 に答える
0

T-SQL を使用するSOUNDEXと、単語を音声学的に比較する関数を使用できます。

ユーザーの入力を取得し、soundex コードでデータベース内の他の単語と比較すると、「もしかして」のリストを作成できるはずです。言葉。

例えば

select SOUNDEX('andrew')
select SOUNDEX('androo')

どちらも同じ出力 (A536) を生成します。

最近はより良いアルゴリズムがありますが、soundex は SQL サーバーに組み込まれています。

于 2009-01-15T22:28:05.247 に答える
0

私が考えることができる最も簡単な方法は、2 つの単語間の不一致の程度を返す関数を作成し、すべての単語をループして最適な単語を見つけることです。

私はこれを分岐限定法で行いました。コードを掘り下げてみましょう:

bool matchWithinBound(char* a, char* b, int bound){
  // skip over matching characters
  while(*a && *b && *a == *b){a++; b++;}
  if (*a==0 && *b==0) return true;
  // if bound too low, quit
  if (bound <= 0) return false;
  // try assuming a has an extra character
  if (*a && matchWithinBound(a+1, b, bound-1)) return true;
  // try assuming a had a letter deleted
  if (*b && matchWithinBound(a, b+1, bound-1)) return true;
  // try assuming a had a letter replaced
  if (*a && *b && matchWithinBound(a+1, b+1, bound-1)) return true;
  // try assuming a had two adjacent letters swapped
  if (a[0] && a[1]){
    char temp;
    int success;
    temp = a[0]; a[0] = a[1]; a[1] = temp;
    success = matchWithinBounds(a, b, bound-1);
    temp = a[0]; a[0] = a[1]; a[1] = temp;
    if (success) return true;
  }
  // can try other modifications
  return false;
}

int DistanceBetweenWords(char* a, char* b){
  int bound = 0;
  for (bound = 0; bound < 10; bound++){
    if (matchWithinBounds(a, b, bound)) return bound;
  }
  return 1000;
}
于 2009-01-15T22:22:30.390 に答える