3

問題は、データベースに約 20,000 件の顧客レコードがあり、エントリの重複を避けるために最善を尽くしたいということです。データベースは Microsoft SQL Server 2005 で、そのデータベースを維持するアプリケーションは Microsoft Dynamics/SL です。そのデータベースと対話する ASP.NET Web サービスを作成しています。私のサービスは、顧客レコードをデータベースに挿入したり、データベースからレコードを読み取ったり、それらのレコードを変更したりできます。Web サービス、MS Dynamics、または Sql Server のいずれかで、ユーザーが新しいレコードの追加を確認する前に、可能な一致のリストを提供したいと考えています。

したがって、ユーザーはレコードを送信し、それが一意であると思われる場合、レコードは保存され、新しい ID が返されます。重複の可能性がある場合、ユーザーは「はい、重複の可能性があります。これは新しいレコードであり、送信したいです」という確認とともに再送信できます。

句読点やスペースだけの場合 (たとえば、「Company, Inc.」と入力し、データベースに「Company Inc.」がある場合、「Company Corp.」などのわずかな変更がある場合は簡単です)。 "Company Inc" の代わりに、または "Cmpany, Inc." のような太い指のスペルミスがある場合、そのようなレコードをリストに返すことさえ可能ですか? 絶対に不可能な場合は、私が対処します重複のためにレコードをマージする必要がある場合、後でより多くの作業が発生するだけです。

4

4 に答える 4

5

どのアルゴリズムが最適に機能するかは、ドメインによって大きく異なります。そのため、いくつかの異なるアルゴリズムを試してみることをお勧めします。最適な結果を得るには、いくつかを組み合わせる必要がある場合もあります。略語、特にドメイン固有のものは、前処理または標準化も必要になる場合があります。

名前については、おそらく発音を考慮した音声アルゴリズムを使用するのが最善でしょう。言葉を言うときに混乱しやすいので、これらはスミスとシュミットに近いスコアを付けます。Double Metaphoneは最初の選択肢として適しています。

ファット フィンガリングの場合は、編集距離アルゴリズムを使用した方がよいでしょう。これにより、2 つの単語の「違い」が得られます。これらは、Smith と Smoth をほぼ一緒にスコア付けします - 2 つが音声検索をすり抜ける可能性がありますが。

T-SQLにはSOUNDEXとDIFFERENCEがありますが、かなり貧弱です。レーベンシュタインのバリアントが標準的な選択肢ですが、他にも良い選択肢があります。適切にライセンスされた実装が見つからない場合、そのほとんどは C# で簡単に実装できます。

これらはすべて、T-SQL よりも C# からコーディング/使用する方がはるかに簡単です (ただし、 SQL で機能する可能性のある T-SQL の恐ろしい乱用で二重メタフォンを見つけました)。

この例は Access にありますが (私は実際にコードを見たり、実装を使用したりしたことはありません)、含まれているプレゼンテーションは、最終的に何をする必要があるかについてかなり良いアイデアを与えてくれます。コードはおそらく一見の価値があり、おそらく VBA からの移植です。

于 2008-10-21T20:10:39.330 に答える
1

Lucene.NETをソリューションに統合できる場合は、ぜひ試してみてください。

于 2008-10-21T18:50:41.567 に答える
1

SQL Server 内のSOUNDEXingを調べます。探している可能性のある一致のあいまいさが得られると思います。

SOUNDEX@MSDN

SOUNDEX @ ウィキペディア

于 2008-10-21T18:28:42.170 に答える
0

FreeText (または FreeTextTable) 関数で全文検索を使用して、可能な一致を見つけようとすることができます。

于 2008-10-21T18:32:03.257 に答える