都市、州、郵便番号、州などに分類する必要がある米国の住所のリストがあります。
住所の例:「16100サンドキャニオンアベニュー、スイート380アーバイン、カリフォルニア92618」
これを行うためのライブラリまたは無料のAPIを知っている人はいますか? Google/Yahooジオコーダーは、TOSが商用プロジェクトに使用することを禁じられています。
これを実行するpythonライブラリを見つけるのは素晴らしいことです。
Pyparsing
には、番地を解析するための機能がたくさんあります。この例をここで確認してください: http://pyparsing.wikispaces.com/file/view/streetAddressParser.py
これらの答えのかなりの数は、現在数年前のものです。
私が最近見た中で最も防弾ライブラリはusaddress
です: https://github.com/datamade/usaddress :
address
よりもはるかに正確です https://pypi.python.org/pypi/address/0.1.1 。上級者向けのヒント:これらすべてのライブラリで住所をテストするときは、1)住所にカンマを使用しない、2)複数の単語からなる都市名に「St」を付けることが望ましい。図書館が「通り」と「聖人」(セントルイスなど)を区別できるかどうかを確認するための名前、および3)不適切なケーシング。このコンボは通常、より優れたパーサーでさえも倒れます。
これをチェックしてくださいPythonパッケージ: https://github.com/SwoopSearch/pyaddress
また、解析するアドレスについて十分な詳細がわかっている場合は、柔軟性があります。
そのpyparsingライブラリは非常に興味深く見え、さまざまな例で素晴らしい仕事をしているようです。そして、これは生の正規表現よりも読みやすい代替手段だと思います(これはこの問題の実際には良い解決策ではありません)。
この種の解決策は、ある時点で、無効なアドレスを標準化することを意味することに注意してください...それらは単に有効に見えるだけです。住所が実際に、実際の(そしておそらく成果物である)かどうかをアプリケーションにとって重要である場合は、Delivery Point Validation(DPV)を使用するUSPS認定サービスを使用する必要があります。私は SmartyStreets の開発者です。これは、統合を容易にするSDKとともに、まさにそのようなサービスを提供します( ここに簡潔なサンプルがあります )。
応答は、USPS Publication28に従って標準化されて返されます。APIは使用率の低いユーザーには無料です。
私はこれが古い投稿であることを知っていますが、誰かがそれが役に立つと思うかもしれません: https://usaddress.readthedocs.io/en/latest/
>>> import usaddress
>>> usaddress.parse('Robie House, 5757 South Woodlawn Avenue, Chicago, IL 60637')
[('Robie', 'BuildingName'),
('House,', 'BuildingName'),
('5757', 'AddressNumber'),
('South', 'StreetNamePreDirectional'),
('Woodlawn', 'StreetName'),
('Avenue,', 'StreetNamePostType'),
('Chicago,', 'PlaceName'),
('IL', 'StateName'),
('60637', 'ZipCode')]
または:
>>> import usaddress
>>> usaddress.tag('Robie House, 5757 South Woodlawn Avenue, Chicago, IL 60637')
(OrderedDict([
('BuildingName', 'Robie House'),
('AddressNumber', '5757'),
('StreetNamePreDirectional', 'South'),
('StreetName', 'Woodlawn'),
('StreetNamePostType', 'Avenue'),
('PlaceName', 'Chicago'),
('StateName', 'IL'),
('ZipCode', '60637')]),
'Street Address')
>>> usaddress.tag('State & Lake, Chicago')
(OrderedDict([
('StreetName', 'State'),
('IntersectionSeparator', '&'),
('SecondStreetName', 'Lake'),
('PlaceName', 'Chicago')]),
'Intersection')
>>> usaddress.tag('P.O. Box 123, Chicago, IL')
(OrderedDict([
('USPSBoxType', 'P.O. Box'),
('USPSBoxID', '123'),
('PlaceName', 'Chicago'),
('StateName', 'IL')]),
'PO Box')
強力なオープンソースライブラリがあります libpostal このユースケースに非常にうまく適合します。さまざまなプログラミング言語へのバインディングがあります。 Libpostalは、統計NLPとオープンデータを使用して世界中の住所を解析/正規化するためのCライブラリです。このプロジェクトの目標は、あらゆる言語、あらゆる場所のロケーションベースの文字列を理解することです。
Pythonバインディングpypostalを使用して、簡単なDockerイメージを作成しました。スピンオフして非常に簡単に試すことができます pypostal-docker
データセットを注意深くチェックして、この問題がまだ処理されていないことを確認してください。
最初にかなりの時間を費やして、おそらく通りの名前で終わる分類法を作成しました。正規表現の条件を使用して、完全な住所文字列などから通りの番号を抽出しようとしましたが、シェープファイルの属性テーブルにalreadyこれらのコンポーネントをセグメント化しました。
アドレス文字列の解析プロセスを進める前に、必然的に奇妙なバリエーション(一部の区画アドレスは内陸の区画用であり、奇妙なアドレスがあるなど)のために常に少し面倒ですが、データセットがまだ作成されていないことを確認してくださいあなたのためにこれをしました!!!