3

(user_id、name)を持つSQLiteデータベースがあります。ユーザーが名前でシステムに既に存在するかどうかを検出したい。問題は、名前のスペルが間違っている可能性があることを意味するユーザーからの名前であるか、名前の代替バージョンである可能性があることです: "Tim" 対 "Timothy". したがって、入力に最も近い一致を見つけ、一致があるかどうかを判断するための類似性の信頼を与える関数が必要です。信頼度は 0 から 1 の間である必要があります (意味のあるカットオフを設定できるようにするため)。

テーブル:

1 | ティム・ベスト
2 | ロジャー・トーマス
3 | ローパーバー
  • ユーザーが入力した場合Timothy Bert、関数は返されます1 | Tim Best | 0.8(0.8 が信頼度でした)。
  • ユーザーRoper Thomasが関数に入ると、戻ります2 | Roger Thomas | 0.6
  • ユーザーTim Taylorが関数に入ると、戻ります1 | Tim Best | 0.3
  • ユーザーFoo Taylorが関数に入ると、戻ります2 | Roper Thomas | 0.0

理想的には、これを行うために SQLite でクエリを記述できれば最高ですが、それが不可能な場合は、ac ソリューションも使用します。

4

1 に答える 1

1

ファジー文字列マッチングを解決するための試みがいくつかあります。グーグルはあなたに多くのことを教えてくれますし、ウィキペディアもそうです。最も人気があるのはレーベンシュタインです。他の興味深いアプローチは、Jaro-WinlerおよびTrigram マッチングです。

私の個人的な経験では、存在するアルゴリズムをいじる必要があると言っています。「FirstName LastName」と「LastName、FirstName」を一致させるのに問題がありました。私のニーズに適した唯一のアルゴリズムは、提供されたリンクから開発した修正された Trigram でした。

必要に応じて、名前の略語の辞書を保持して、それぞれの短い形式をその基本的な名前に変換してから、あいまい比較を実行できるようにする必要があります。ただし、これは失敗する可能性が高く、たとえば、'Tin' のつづりが間違っている "Tin Taylor" は 'Tim' の綴りが 'Timothy Taylor' につながらないためです。

それをカバーするには、「学習」できるルックアップが必要です。つまり、人間によって編集されます。

于 2012-11-26T22:05:52.723 に答える