重複するメールアドレスを見つけるための戦略
-
21-09-2019 - |
質問
類似性スコアに基づいて重複アドレスを見つける方法を考え出そうとしています。次の重複アドレスを考慮してください。
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'
感謝している、
エドゥアルド
解決
まず、すべての空白を各単語間の 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 のアイデアを無視してください。
幸運を。
他のヒント
除空間、カンマ区切ダッシュする曖昧なものです。しておくとよいでしょう置き換えます。
例えば、このアドレス
56 5th avenue
この
5, 65th avenue
付方法ととしておこなわれたものである:
565THAV
よくお使いいただくためには、書アドレスに短縮アルゴリズムを使用して文字列比較検重複している。これで十分検出の重複をさらに一般の場合.一般的な類似アルゴリズムなります。が一番違い大きな変化のスしています。
このアルゴリズムでこのように:
- 交換すべてのカンマ区切ダッシュ。を使う 翻訳 方法。
- を辞書で単語とその省略形
- を削除し
TH
一部また以下の数字です。
この略語の辞書を構築する上で有用である必要があります:
は、この権利を行うためには、あなたは(あなたの住所の例は、米国ベースのように見える)USPS標準に従ってあなたのアドレスを標準化する必要があります。郵便住所の CASSする(コーディング精度支援システム)の認証を提供する多くのダイレクトマーケティングサービスプロバイダがあります。 。 CASSプロセスは、彼らにあなたのアドレスと追記ZIP + 4の全てを標準化します。どれでも配送できないアドレスは、それはあなたの意思であれば、さらに、あなたの郵送コストを削減しますどのフラグが付けられます。あなたのアドレスの全てが標準化されると、重複を排除することは簡単になります。
私はこの一度をしなければなりませんでした。私は、小文字にすべてを変換し、他のすべてのアドレスに、各アドレスのレーベンシュタイン距離を計算し、結果を命じました。それは非常によく働いたが、それはかなり時間がかかりました。
あなたが大規模なデータセットを持っている場合はCではなく、Pythonでレーベンシュタインの実装を使用したいと思います。鉱山は、数千人の数十だったと実行するために一日の大半を取った、私は考えてます。
私はSoundexのは非常に不適当見つけ、私は定期的に、私は仕事複製用のアドレスを調べ、と私は言っています。これは、両方の遅すぎると物事を一致させるにはあまりにも熱心です。私はレーベンシュタイン距離と同様の問題を持っています。
私にとって最高の仕事をしている何サニタイズにあると(句読点を取り除く、単語に分割されたものまで)のアドレスをトークン化してからちょうどトークンが一致どのように多くの参照してください。アドレスは、典型的には、いくつかのトークンを持っているので、あなたは一致していたどのように多くのトークン(1)の組み合わせの面で信頼性のレベルを開発することができ、(2)どのように多くのの数値のトークンが一致していた、そして(3)どのように多くのトークンが利用可能です。短いアドレス内のすべてのトークンが長いアドレスである場合、例えば、試合の信頼はかなり高いです。同様に、あなたはまだ高い信頼マッチのアドレスをそれぞれが8を持っている場合でも数値だ少なくとも一つを含む5つのトークンを、一致した場合。
これは、いくつかの一般的な略語を代入するように、いくつかの調整を行うことが間違いなく便利です。 USPSリストヘルプは、私はそれらのすべてを実装しようとGUNG-HO行かないだろうが、最も価値のある置換のいくつかは、これらのリストにはありません。たとえば、「JFK」は「JOHN F KENNEDY」の試合になるはずですし、「MARTIN LUTHER KING JR」を短縮するための一般的ないくつかの方法があります。
多分それは言うまでもないが、私は完全を期すため、とにかくそれを言うだろう:Doがちょうどより複雑なものをいじり前に、アドレス全体のストレート文字列比較を行うことを忘れないで!これは非常に安いテストすること、そしておそらく誰でも思いつきそう最初のパスである必要があります。
もちろん、あなたが(両方のプログラミング/テストで、実行時に)喜んと過ごすことができるしている多くの時間、より良いあなたが行うことができるでしょう。ファジー文字列照合技術(レーベンシュタインより速く、より少ない一般種類)トークンアプローチ(私は互いに対してファジーマッチ個々のトークンしようとしないであろう)とは別のパスとして、有用であり得ます。 I(私は名前の上にそれを使用しますが)ファジー文字列マッチングは、私のアドレスに私のバックのための十分な強打を与えていないことが判明ます。