5

類似度スコアに基づいて、重複する住所を見つける方法を考え出そうとしています。次の重複アドレスを検討してください。

addr_1 = '# 3 FAIRMONT LINK SOUTH'
addr_2 = '3 FAIRMONT LINK S'

addr_3 = '5703 - 48TH AVE'
adrr_4 = '5703- 48 AVENUE'

NORTH -> N のように、すべてのスペース、コンマ、ダッシュ、ポンド記号を削除して、長い単語を省略形にするために、文字列変換を適用することを計画しています。さて、この出力が得られたら、どうすれば addr_3 を残りのアドレスと比較し、同様のものを検出できますか? 何パーセントの類似性が安全でしょうか? このための簡単なpythonコードを提供できますか?

addr_1 = '3FAIRMONTLINKS'
addr_2 = '3FAIRMONTLINKS'

addr_3 = '570348THAV'
adrr_4 = '570348AV'

感謝している、

エドゥアルド

4

6 に答える 6

2

まず、すべての空白を各単語間の 1 つのスペースにまとめ、すべてを小文字 (または必要に応じて大文字) にすることで、アドレス文字列を簡素化します。

adr = " ".join(adr.tolower().split())

次に、「41st Street」の「st」や「42nd Street」の「nd」などを削除します。

adr = re.sub("1st(\b|$)", r'1', adr)
adr = re.sub("([2-9])\s?nd(\b|$)", r'\1', adr)

2 番目の sub() は "2" と "nd" の間のスペースで機能しますが、最初の sub() はそのように設定していません。"41 St Ave" と "41 St" の違いをどのように見分けることができるかわかりません (2 つ目は "41 Street" の省略形です)。

re モジュールのすべてのヘルプを必ず読んでください。それは強力ですが不可解です。

次に、あなたが残したものを単語のリストに分割し、Soundex アルゴリズムを適用して、数字のように見えない項目をリストします。

http://en.wikipedia.org/wiki/Soundex

http://wwwhomes.uni-bielefeld.de/gibbon/Forms/Python/SEARCH/soundex.html

adrlist = [word if word.isdigit() else soundex(word) for word in adr.split()]

次に、リストを操作するか、リストを結合して文字列に戻すことができます。

Soundex の全体的なアイデアは、スペルミスのあるアドレスを処理することです。それはあなたが望むものではないかもしれません.その場合、このSoundexのアイデアは無視してください.

幸運を。

于 2009-09-02T21:54:37.133 に答える
2

これは、略語の辞書を作成するのに役立ちます。

https://pe.usps.com/text/pub28/28apc_002.htm

于 2009-09-02T19:27:55.730 に答える
2

スペース、カンマ、ダッシュを削除すると、あいまいになります。それらを単一のスペースに置き換える方が良いでしょう。

例えばこんなアドレス

56 5th avenue

この

5, 65th avenue

あなたの方法では、両方とも次のようになります。

565THAV

できることは、適切なアドレス短縮アルゴリズムを作成し、文字列比較を使用して重複を検出することです。これは、一般的なケースで重複を検出するのに十分なはずです。一般的な類似性アルゴリズムは機能しません。1 つの数値の違いがアドレスの大きな変化を意味する可能性があるためです。

アルゴリズムは次のようになります。

  1. すべてのカンマ ダッシュをスペースに置き換えます。そのために翻訳方法を使用してください。
  2. 単語とその省略形で辞書を作成する
  3. TH番号に続いていた場合は、その部分を削除します。
于 2009-09-02T18:33:46.820 に答える
1

これを正しく行うには、USPS標準に従って住所を標準化する必要があります(住所の例は米国ベースのようです)。住所のCASS (コーディング精度サポートシステム)認証を提供する多くのダイレクトマーケティングサービスプロバイダーがあります。CASSプロセスは、すべての住所を標準化し、それらにzip+4を追加します。配達できない住所にはフラグが付けられ、それが目的であれば、郵便料金がさらに削減されます。すべてのアドレスが標準化されると、重複を排除するのは簡単です。

于 2009-12-18T10:52:44.560 に答える
1

私は勤務先の住所が重複していないか定期的に検査していますが、Soundex は非常に不適切であると言わざるを得ません。遅すぎて、物事を一致させるには熱心すぎます。レーベンシュタイン距離にも同様の問題があります。

私にとって最もうまくいったのは、アドレスをサニタイズしてトークン化し(句読点を取り除き、単語に分割する)、一致するトークンの数を確認することです. 通常、アドレスには複数のトークンがあるため、(1) 一致したトークンの数、(2) 一致した数値トークンの数、および (3) 使用可能なトークンの数の組み合わせに関して、信頼度を高めることができます。たとえば、短いアドレスのすべてのトークンが長いアドレスにある場合、一致の信頼度は非常に高くなります。同様に、数値のトークンを少なくとも 1 つ含む 5 つのトークンに一致する場合、それぞれのアドレスに 8 つのアドレスがある場合でも、一致の信頼性は高くなります。

いくつかの一般的な略語を置き換えるなど、微調整を行うことは間違いなく便利です。USPS のリストは役に立ちますが、私はそれらすべてを実施しようと大騒ぎするつもりはなく、最も価値のある代替品のいくつかはそれらのリストにはありません. たとえば、「JFK」は「JOHN F KENNEDY」と一致する必要があり、「MARTIN LUTHE KING JR」を短縮する一般的な方法がいくつかあります。

言うまでもないことかもしれませんが、完全を期すために言います。より複雑なことをいじる前に、アドレス全体に対して単純な文字列比較を行うことを忘れないでください。これは非常に安価なテストであるため、おそらく簡単な最初のパスです。

明らかに、(プログラミング/テストと実行時間の両方に) より多くの時間を費やすことができ、より多くのことを行うことができます。ファジー文字列マッチング手法 (レーベンシュタインよりも高速で一般化されていない種類) は、トークン アプローチとは別のパスとして役立ちます (個々のトークンを相互にファジー マッチングしようとはしません)。あいまいな文字列の一致では、アドレスへの支出に対して十分な効果が得られないことがわかりました (ただし、名前には使用します)。

于 2009-09-04T05:07:04.220 に答える
0

私はこれを一度しなければなりませんでした。すべてを小文字に変換し、各住所から他のすべての住所までのレーベンシュタイン距離を計算し、結果を並べ替えました。非常にうまく機能しましたが、かなり時間がかかりました。

大規模なデータ セットがある場合は、Python ではなく C でレーベンシュタインの実装を使用することをお勧めします。私のは数万で、実行するのにほぼ 1 日かかったと思います。

于 2009-09-03T11:18:35.820 に答える