8

テキストボックスに入力された、事前に読み込まれた銘柄記号であるとしましょう。インストールするライブラリではなく、コピーできるコードを探しています。

これはこの質問に触発されました:

C#用に作成されたあいまい検索または文字列類似関数ライブラリはありますか?

レーベンシュタイン距離アルゴリズムはうまく機能しているようですが、計算には時間がかかります。ユーザーが余分な文字を入力したときにクエリを再実行する必要があるという事実に関する最適化はありますか?各入力の上位10件の一致を表示することに興味があります。

4

2 に答える 2

6

文字列に関する一致規則を決定する必要があります。「類似文字列」を決定するもの

  • 一致する文字数
  • 一致しない文字の数
  • 似たような長さ
  • タイプミスまたは音声エラー
  • ビジネス固有の略語
  • 同じ部分文字列で始まる必要があります
  • 同じ部分文字列で終わる必要があります

私は文字列マッチング アルゴリズムを使ってかなり多くの作業を行ってきましたが、特定の要件を満たす既存のライブラリやコードをまだ見つけていません。それらを確認し、そこからアイデアを借りますが、常にカスタマイズして独自のコードを作成する必要があります。

Levenstein アルゴリズムは優れていますが、少し遅いです。Smith-Waterman アルゴリズムと Jaro-Winkler アルゴリズムの両方である程度の成功を収めましたが、私の目的に最も適しているのは Monge (記憶から) でした。ただし、元の研究を読み、アルゴリズムとターゲット データセットを作成した理由を判断することには価値があります。

何を照合して測定するかを適切に定義しないと、予期しない一致で高いスコアが表示され、予想される一致で低いスコアが表示されることがあります。文字列の一致はドメイン固有です。ドメインを適切に定義しないと、手がかりのない漁師のようになり、フックを投げつけて最善を尽くします。

于 2011-05-12T01:44:57.927 に答える
1

このブログ投稿では、この分野でLuceneに導入されたいくつかの作業について説明しています。彼らは、有限状態トランスデューサー(オートマトン)を使用して、編集距離2までのレーベンシュタイン距離ファジーマッチングを非常に効率的に実装できました。コードはすべてJavaであり、オープンソースですが少し複雑です。

しかし、基本的な考え方は非常に単純です。辞書を文字状態の巨大なツリーと考えてください。state0では、文字はありません。state1では、単語の最初の文字になる可能性のあるすべての文字を許可します。State2はstate1によって条件付けられます。最初の文字が「x」の場合、次の状態では、xに続く可能性のある文字(位置2)のみが許可されます。等

ここで、レーベンシュタインのマッチングでは、いくつかのエラーを許可しながら文字ツリーをトラバースします:削除、挿入(1文字のワイルドカード)、および場合によっては転置(Levenshteinの優れた拡張は、転置を2ではなく単一の編集と見なすことです)。許可された編集の数を追跡するには、状態を維持する必要があります。これは非常に効率的に実行できます。インタラクティブな「入力中」のスペル提案者にとっては確かに十分な速度です。

于 2011-10-04T01:35:42.477 に答える