住所のあいまい一致を行う方法


14

住所の形式が異なる場合、または住所の1つが間違っている場合の住所の照合方法を知りたい。

これまでのところ、さまざまなソリューションを見つけましたが、それらはかなり古く、あまり効率的ではないと思います。より良い方法がいくつかあると確信しているので、もしあなたが私が読むための参考文献を持っているなら、それは複数の人に興味があるかもしれない主題であると確信しています。

私が見つけた解決策(例はRにあります):

  • レーベンシュタイン距離。1つの単語を別の単語に変換するために挿入、削除、または変更する必要がある文字数に相当します。

    agrep("acusait", c("accusait", "abusait"), max = 2, value = TRUE) ## [1] "accusait" "abusait"

  • 音素の比較

    library(RecordLinkage) soundex(x<-c('accusait','acusait','abusait')) ## [1] "A223" "A223" "A123"

  • スペルコレクター(最終的にはPeter Norvigのようなベイジアンコレクター)を使用しますが、アドレスではあまり効率的ではないと思います。

  • Googleの提案を使用することを考えましたが、同様に、個人の郵便住所ではあまり効率的ではありません。

  • 機械学習の教師ありアプローチを使用することは想像できますが、ユーザーのスペルミスのリクエストを保存する必要がありますが、これは私にとって選択肢ではありません。


ファジー文字列マッチングをサポートする実際のデータベースを使用することをお勧めします:posgres。効率的です。
エマー

米国のみ、カナダ、英国、フランス語、日本語、複数の国...?おそらくそれぞれについて、それがどの言語と国であるかを最初に決定/推測し、次に国固有の分類子を適用しますか?トレーニングセットはありますか?もしあれば、国の分布はどうですか?
smci 16

これでどこに行きましたか?私たちが考案したソリューションは、住所と場所の名前をスクラブして強化し、GoogleジオコーディングとWeb APIを配置し、大まかな計算を行って生データと比較して正しい結果を決定することでした。少し不格好ですが、動作しますが、住所と場所/場所を正規化するよりエレガントな方法が必要です。
クリススミス

回答:


9

Rを使用しているので、計算に使用できるstringdistパッケージとJaro-Winkler距離メトリックを調べてください。これは、米国国勢調査局でリンクのために開発されました。

このジャーナルのJaroとJaro-Winklerの距離の詳細については、を参照してください。

さまざまなマッチング手法の比較については、このペーパーをお読みください


4

レーベンシュタイン距離を延長してより完全な画像を表示するための賢い方法がたくさんあります。「と呼ばれる(Python用)かなり便利なモジュールの簡単なイントロファジィWuzzyは」ですここ SeatGeekのチームで。

できることは、部分的な文字列の類似性です(長さの異なる文字列がある場合、m&nがm <nの場合)、m文字のみ一致します。また、文字列をトークン(個々の単語)に分割し、トークンのセットがどのように一致するかを確認したり、アルファベット順に並べて並べたりすることもできます。


4

部分的な文字列の一致を検出するためのもう1つの一般的な手法は(通常はドキュメントレベルですが)シングリングです。本質的には、ターゲットワード/ドキュメントのn-gramのセットを抽出し、それらをJaccard係数を介して他のワード/ドキュメントのn-gramのセットと比較するムービングウィンドウアプローチです。マニングと同僚(2008)は、情報検索のコンテキストでのほぼ重複とシングリングについて議論しています。


4

Pythonで一般的な確率論的ファジーマッチャーを作成しました。これは、あらゆるタイプのデータを一致させる合理的な仕事をします。

https://github.com/robinl/fuzzymatcher

これはメモリ内にあるため、約10万行を超えるデータセットとの一致には使用しないでしょう。

また、英国の住所に固有の同様のプロジェクトを作成しましたが、これはAddressbase Premiumにアクセスできることを前提としています。これはメモリ内にないため、100mほどの英国の住所に対して使用されています。こちらをご覧ください:

https://github.com/RobinL/AddressMatcher

これをすぐに実行したい場合は、libpostalを使用してアドレスを正規化し、それらを一般的なfuzzymatcher(pip install fuzzymatcher)にフィードすることをお勧めします。

ここで使用例を見つけることができます。


こんにちはロビン、あなたのAddressMatcherライブラリに興味があります。それを使用する方法についてのドキュメントがありますか?私はこの正確な問題を抱えています-1セットのアドレス(厄介な)を別のアドレス(公式の郵便アドレス)に一致させる必要があります。ありがとう
-SCool

1
悲しいことに、アドレスマッチャーではまったく些細なことではなく、適切なドキュメントがありません。必要な主なことは、商用製品であるaddressbase premiumをpostgresqlにロードすることです。
RobinL

OK、私に戻ってくれてありがとう。私は、Eircodeと呼ばれるアイルランド語版のAddressbaseプレミアムと互換性がないと考えています。ファジーマッチャーは、実稼働環境のアドレスマッチングのタスクに任せると思いますか?郵便番号を持たないデータの住所に郵便番号を追加するだけです。たとえば、Eircodeデータベース'1 Main Street, Some Town, County'を検索し、一致する場合は郵便番号を戻します。
SCool

1
ファジーマッチャー-はい、絶対に行く価値があると思います。少数のアドレスのリストが、強烈なマシン上の権限のあるアドレスの大規模なリスト(eircode)内で見つけることは、かなりうまく機能するはずです。別のオプションは、Rのfastlink
パッケージです
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.