2008-08-28 2 views
14

私は単純な連絡先データベースを持っていますが、重複したデータを入力するユーザーには問題があります。私は単純なデータの比較を実装しましたが、残念ながら入力されている重複したデータは全く同じではありません。たとえば、名前の綴りが間違っているか、1人が「Bill Smith」に入れられ、もう1人が同じ人物のために「William Smith」に入れられます。重複するデータを検出するにはどうすればよいですか?

エントリが他のエントリとどれほど類似しているかをパーセンテージで表すことができるアルゴリズムがありますか?

答えて

3

アルゴリズムはありませんが、私の最初の措置は、新しい連絡先を入力するプロセスを見てみることです。おそらくユーザーは、探している連絡先を簡単に見つける方法がありません。 Stack Overflowの新しい質問フォームと同じように、新しい連絡先画面に既に存在する連絡先を示唆することができます。

4

私はこの問題をよく理解していることを想像するが、どのような最初の読み取りに私に起こることです:

  • は試合の可能性が緩い定義については(一致し、そしておそらく計量するものを数える
  • 個別のフィールドを比較します異なったフィールド)人間の介入のための
  • 存在

がために良い最初の推測を取得するために、既存のデータベースを使用して、いくつかのしきい値を渡す任意の例あなたが経験を積み重ねるにつれて正しいと判断します。

少なくとも最初は、誤検出に対してかなり強い偏見が好まれる場合があります。

5

Levenshtein distanceと名前を比較できます。名前が同じ場合、距離は0です。そうでない場合は、ある文字列をもう一方の文字列に変換するために必要な操作の最小数で与えられます。

+2

これはBill = Williamをどのように検出しますか?彼の問題は重複であり、正確な重複で間違いがない。 –

2

これはしてもしなくてもよい関連している可能性がありますが、マイナーなスペルミスがSoundex searchによって検出されるかもしれないが、例えば、これはあなたが重複としてブリトニー・スピアーズ、ブリタニースペア、およびBritnyスピアーズを考慮することができるようになります。

ニックネームの収縮は、しかし、重複として考慮することが困難であり、それが賢明である場合、私は疑問です。ビル・スミスとウィリアム・スミスという複数の人がいて、チャールズ、ロバート、ボブなどと繰り返す必要があります。

また、イスラム教徒のユーザー、問題はより難しくなります(例えば、ムハンマド/モハマドと呼ばれるムスリムが多すぎます)。

+0

Mohammed/Mohammad/Mohdに入ることは、あなたがアラビア語からそれを翻訳していない限り問題ではなく、ほとんどの方が優先され、常にその方法で書く。 アラビア語の名前を検索することは別の問題であり、難しいです。 –

+0

イスラム教徒のユーザーを特に孤立させるのはむしろ不安定です。シフ祖先を持つ人は、家族の名前[Singh](http://en.wikipedia.org/wiki/Singh)を採用した祖父を抱えています。スウェーデンの電話帳のJohanssonsとAnderssonsとSvenssonsの数は単なる驚異的なものです。 Johan、Anders、Göranなどのスウェーデン人の最初の名前を持つMxN。私は "?"私が絶対に1つを持っていることを必要とするアメリカのシステムでは、ミドルイニシャルとして(しかし、彼らはしばしばそれも拒否します)。 JesúsとMariaは、多くのスペイン語の国で非常に名誉ある名字です。等。 – tripleee

0

私はそれがニックネームの問題VS名のために働くだろうわからないんだけど、地域のこの種の中で最も一般的なアルゴリズムはedit distance/Levenshtein distanceアルゴリズムになります。それは基本的に別のものに一つの項目を回すために必要な文字の変更、追加と削除の数のカウントです。名前については

、私はあなたが純粋にアルゴリズム的なアプローチで良い結果を取得するつもりだか分からない - あなたが本当にデータの塊である必要なもの。たとえば、Googleのスペル候補が通常のデスクトップアプリケーションのものよりどれだけ優れているかを考えてみましょう。これは、Googleが何十億ものウェブクエリを処理し、どのようなクエリが互いにつながっているのか、実際にクリックされたリンクなどを調べることができるからです。

名前の一致に特化した会社国家の安全と詐欺の適用のため)。私が覚えていることは、Search Software Americaはこれらの人物であるhttp://www.informatica.com/products_services/identity_resolution/Pages/index.aspxによって買収されたようだが、私はこれらのソリューションのどれもが連絡先アプリケーションにとってはるかに高価になると思う。

3

文字列フィールドを含む大きなデータベースを使用している場合、simhashアルゴリズムを使用すると、非常にすばやく多くの重複を見つけることができます。

7

ので 同様のエントリが他にどれだけのための割合を与えることができ、アルゴリズム のいくつかの並べ替えはありますか?

SoundexとEditの距離(前の記事で示唆されている)としてのアルゴリズムは、いくつかの問題を解決することができます。ただし、データのクリーニングについて真剣に考えているなら、これでは十分ではありません。他の人が言っているように、 "Bill"は "William"のような音を出さない。

私が見つけた最良の解決策は、削減アルゴリズムとテーブルを使用して名前をルート名に減らすことです。あなたの通常のアドレステーブルに

、名前のルート・バージョンを追加し、例えば 人(ファーストネーム、RootFirstName、姓、Rootsurname ....)今

、マッピングテーブルを作成します。で FirstNameMappings(PRIMARY KEYファーストネーム、ルート名)

あなたのマッピングテーブルを移入:FirstNameMappings

に挿入がIGNORE は(人からのファーストネーム、「UNDEFINED」を選択)これは、あなたの人のテーブルに持っているすべてのfirstnamesが追加されます「未定義」のルート名と一緒に

悲しいことに、唯一のすべての一意の名前を調べ、それらをRootNameにマップする必要があります。たとえば、「Bill」、「Billl」、「Will」はすべて「William」に翻訳されます。 これは非常に時間がかかりますが、データの品質が本当に重要な場合は、これが最良の方法の1つだと思います。

新しく作成したマッピングテーブルを使用して、Personテーブルの "Rootfirstname"フィールドを更新します。姓と住所について繰り返す。これが完了したら、スペルミスを起こさずに重複を検出できるはずです。

0

確率的マッチングを調べることもできます。

1

FullContact.comにはこれを解決できるAPIがあります。詳しくはhttp://www.fullcontact.com/developer/docs/?category=nameをご覧ください。

名前の正規化(Bill into William)、名前推論(生のテキストのための)、名前の類似性(2つの名前の比較)のAPIを持っています。

すべてのAPIは現時点で無料です。開始するには良い方法です。

関連する問題