6


6

私は2つの別々のテーブルにあるアドレスのリストを持っていますが、それらは一致することができるためにわずかにずれています。 たとえば、同じ住所を複数の方法で入力できます。

  • 110テストセント

  • 110テストセント

  • 110テストストリート

単純ですが、より複雑な状況で状況を想像することができます。 キーとして上記のアドレスを一致させることができるだろう簡単なアルゴリズムを開発しようとしています。

例えば。 キーは "11TEST"かもしれません - 110の最初の2つ、テストの最初の2つとストリートバリアントの最初の2つ。 完全一致キーには、郵便番号の最初の5文字も含まれるため、上記の例では、完全キーは "11TEST44680"のようになります。

私はこれを開発するとき考慮すべき点として私が見ることができる効果的なアルゴリズムやリソースのためのアイデアを探しています。 どのようなアイデアでも、疑似コードにすることも、自分の選択した言語にすることもできます。

私達は米国の住所だけに関係しています。 実際には、オハイオ州とミシガン州からの250の郵便番号からの住所だけを見ています。 費用対効果の高い解決策のアイデアは公開されていますが、私たちは郵便ソフトウェアにアクセスすることもできません(基本的に1回限りの使用になります)。 これは政府の情報源からのデータの初期ダンプであることに注意してください。ユーザーがそれをクリーンアップする方法についての提案は、アプリケーションを作成するときに役立ちますが、可能な限り最高です。

7 Answer


5


私たちが話すのと同じようなアルゴリズムに取り組んでいます、それは私がした時までにカナダ、アメリカ、メキシコとイギリスのアドレスを扱うべきです。 私が直面している問題は、彼らが私たちのデータベースに3フィールドの平文フォーマットであるということです。 、州対 州対 郡、郵便番号対 郵便番号、つづりの間違いは、小さく簡単な作業ではありません。

特にフランス語の名前を使う国に行くとき - 間違いなくスペルミスだけではありません - セント、セント、セント、セント、セント、セント、セント、グランド、グランデ、グラン、グラン、グランドハイフンの有無名前の大部分はパフォーマンスの問題の終わりを引き起こさない - 特にStが聖_通りを意味する可能性があり、正しい文脈で入力されていてもいなくてもよい場合(すなわち 女性対 男性的)。 住所の大部分が正しく入力されたが、州または郵便番号が正しくない場合はどうなりますか?

検索を開始する場所の1つは、 * Levenstein距離アルゴリズム*です。これは、スペルミスの大部分を排除するのに非常に便利です。 それ以降は、キーワードを検索して郵便データベースと比較することがほとんどです。

私はこれを行うためのツールを現在開発中の誰かと共同作業することに本当に興味があるでしょう。 私はすでにそこにいる方法の一部であり、私がこれまでに述べたすべての問題を克服しました、同じ問題に他の誰かが取り組むことはアイデアを反撃するために本当に役に立ちます。

乾杯 - [afsinc dot caでベン]


2


開発したくない場合は、ここに記載されている多くのテクノロジを使用する市販の製品を使用してください。http://www.melissadata.com/dqt/matchup-api.htm

_免責事項:私はその開発とその会社での仕事に携わっていました。


1


英国では、私たちは使うでしょう:

  • 家の名前または番号(名前にはアパートのフラット番号が含まれます)

  • 郵便番号

あなたは確かに郵便番号を使うべきですが、米国ではあなたの郵便番号は英国の郵便番号と比較して非常に広い地域をカバーすると私は信じています。 したがって、あなたは通りと街を使う必要があるでしょう。

あなたの例は11 Test Street、110 - 119 Test Streetなどを区別しないでしょう。

あなたの会社が住所検索システムにアクセスできる場合は、それを介してすべてのデータを実行し、一貫性のある形式でデータを取得します。おそらく、照合に使用できる住所キーを使用します。


1


これに亀裂があるのなら、あらかじめ定義された操作順序を使って各アドレス文字列をツリーに変換します。

例えば。 110テストストリート空港3。 どこでもカリフォルニア90210 ⇒

  1. 住所の種類を取得します。 たとえば、番地の住所は田舎の路線の住所とは形式が異なり、国によっても異なります。

  2. これが番地であると仮定して、番地の種類を表す文字列を取得し、それを列挙型に変換します(eBoulevard、eRoadなど)。

  3. これが番地であることを考えて、番地を取り出します(小文字で格納します)。

  4. これが番地であることを考えると、番地を引き出す

  5. これが番地であることを考えれば、任意のアパート番号を探します(ダッシュが付いた番地の前、 "Apt。"の後など)。

eStreet //1。可能なアドレスタイプの列挙 eStreet、eRuralRoute、... | eStreet //2.anストリートタイプの列挙 eStreet、eBlvd、eWay、... / | \

名前番号| |テスト110 3

例えば。 RR#3どこでもカリフォルニア90210 ⇒

  1. 住所の種類を取得します。

  2. これが田舎のルートアドレスであることを考えて、ルート番号を取得します。

eRuralRoute | 3

あなたは国の州と郵便番号の情報のために同様のことをする必要があるでしょう。

それから結果として生じる木を比較しなさい。

これにより比較が非常に簡単になりますが、ツリーを生成するコードは非常にトリッキーです。 あなたは何千ものアドレスでそれからがらくたをテストしたいと思うでしょう。 それがあなたが気にかけている米国の住所だけであれば、あなたの問題はより単純です。すでに述べたようにイギリスの住所はかなり異なっています、そしてカナダの住所はそれらにフランス語があるかもしれません(例えば。 Place D’Arms、Rue Laurentなど


1


あなたの会社が独自のアドレス正規化ツールを書くことが費用対効果が高いならば、私は USPSアドレス標準から始めることをお勧めします。 あるいは、アドレスを正規化、修正、検証するためのサーバーサイドツールやWebサービスを提供しているベンダーはいくつもあります。

私の会社はこの目的のために AccuMail Goldを使用します。 社内でツールを開発するための1週間分の給与のコストさえ考慮すると、既製の製品を購入するという選択は明白でした。


0


既存のシステムを使用したくない場合は、次のようにします。

  • 住所行から数字を抽出する

  • 一般的なストリートワードを空白に置き換えます

  • 一致文字列を作成する

例: "555 Canal Street":

  • 抽出数は "555" "キャナルストリート"になります

  • 通りの言葉を置き換えると「555」「運河」になります

  • マッチ文字列を作成すると "555Canal"

"Canal st 555"は同じマッチ文字列を与えます。

ストリートワードとは、あなたの言語における「ストリート」の単語や略語を意味します。例えば、「st」、「st。」、「blv」、「ave」、「avenue」などはすべて文字列から削除されます。

数字を抽出して文字列から分離することによって、それらが最初か最後かは関係ありません。


0


*主キーにIDを使用します。*これは常に一意であり、後で複製をマージするのが簡単になります。

ユーザーインターフェイスで適切なデータ入力を強制します。 各コンポーネントをそれぞれのテキストボックスに入力するようにします。 住居番号は自分のボックスに、通りの名前は自分のボックスに、街の名前は自分のボックスに、州は選択リストからの状態などで入力されます。 これにより、試合の検索が簡単になります

「保存」という2つのプロセスがあります。

  • 最初の保存の後、マッチを探すために検索をして、新しいマッチと同様に可能なマッチのリストを提示します。

  • 新しいIDを選択した後、既存のIDを選択した場合はそのIDを使用して保存します。

データを消去してください。 "street"、 "st"、 "drive"などを取り除き、適切な略語を含むテーブルへのFKを使用するStreetType char(1)として格納してみてください。そうすれば、ストリートを構築できます。

SOUNDEXと違いを調べてください

私はmailinigリストを管理する大企業で働いていました、そして、彼らはそれを自動的にやろうとしませんでした、彼らはそれがするのがとても難しいので人々をdupsから除外するのに使いました。 重複が発生したときに手動で重複をマージし、PKを介して値をリップルできるように、マージ機能を計画します。

あなたはグーグルマップのAPIを調べて、あなたがあなたの住所を渡して試合に戻ることができるかどうかを確かめるかもしれません。 私はそれに精通していない、これは単なる憶測です。