2012-02-27 39 views
19

Tôi có một danh sách các địa chỉ Mỹ tôi cần phải đột nhập vào thành phố, tiểu bang, mã zip, tiểu bang, vvcó thư viện nào để phân tích cú pháp địa chỉ ở Hoa Kỳ không?

dụ địa chỉ: "16100 Sand Canyon Avenue, Suite 380 Irvine, CA 92.618"

Liệu ai biết thư viện hoặc API miễn phí để làm điều này? Google/Yahoo geocoder Cấm sử dụng bởi TOS cho các dự án thương mại ..

Nó sẽ là tuyệt vời để tìm thấy một thư viện python mà Preforms này ...

Cảm ơn

+1

Bạn cần phải cho chúng tôi biết (chính xác) định dạng đó (string?) dữ liệu đang ở. –

Trả lời

16

Pyparsing có một loạt các chức năng để phân tích cú pháp địa chỉ đường phố, hãy xem ví dụ về điều này tại đây: http://pyparsing.wikispaces.com/file/view/streetAddressParser.py

+2

Cảm ơn, tôi đã kiểm tra điều này. – WeaselFox

+1

Thư viện này dựa trên tập lệnh được đề cập trong câu trả lời này: https://github.com/pnpnpn/street-address – zengr

5

Thư viện pyparsing đó trông rất thú vị và có vẻ là một công việc tốt với nhiều ví dụ khác nhau. Và tôi nghĩ đó là giải pháp thay thế dễ đọc hơn đối với các biểu thức chính quy thô (thực sự không phải là giải pháp tốt cho vấn đề này).

Hãy lưu ý rằng loại giải pháp đó ngụ ý rằng, tại một số thời điểm, hãy chuẩn hóa địa chỉ không hợp lệ ... chúng sẽ chỉ xuất hiện hợp lệ. Nếu biết liệu địa chỉ có thực tế hay không, thực tế (và có thể phân phối) quan trọng đối với đơn đăng ký của bạn thì bạn nên sử dụng dịch vụ được chứng nhận USPS sử dụng Xác thực điểm phân phối (DPV). Tôi là nhà phát triển cho SmartyStreets, chỉ cung cấp dịch vụ như vậy, cùng với SDK giúp việc tích hợp trở nên dễ dàng (here's a succinct sample).

Câu trả lời trở lại được chuẩn hóa theo USPS Ấn phẩm 28. API miễn phí cho người dùng sử dụng ít.

+0

Liên kết tốt hơn, có thể: https://github.com/smartystreets/smartystreets-python-sdk – bogeymin

+0

Tốt point @bogeymin - Tôi sẽ cập nhật câu hỏi. – mdwhatcott

8

Kiểm tra gói Python này: https://github.com/SwoopSearch/pyaddress

Nó cũng cho phép sự linh hoạt nếu bạn biết đủ chi tiết về các địa chỉ để được phân tích.

+1

Thật không may, dự án đó dường như bị bỏ rơi. Cam kết mới nhất là từ tháng 4 năm 2013. –

0

Kiểm tra cẩn thận tập dữ liệu của bạn để đảm bảo rằng vấn đề này chưa được xử lý cho bạn.

Tôi đã dành một khoảng thời gian hợp lý để tạo phân loại có thể là tên đường phố, sử dụng điều kiện regexp để thử lấy số đường phố từ chuỗi địa chỉ đầy đủ và mọi thứ và hóa ra bảng thuộc tính cho shapefiles của tôi đã có đã phân đoạn các thành phần này.

Trước khi bạn tiếp tục với quá trình phân tích chuỗi địa chỉ, luôn luôn là một công việc vặt do các biến thể không thể tránh khỏi (một số địa chỉ bưu kiện dành cho bưu kiện không có địa chỉ và địa chỉ lạ, v.v.), đảm bảo tập dữ liệu của bạn chưa làm điều này cho bạn !!!

19

Khá một vài trong số các câu trả lời này hiện đã được vài năm.

Thư viện đạn nhất mà tôi đã nhìn thấy thời gian gần đây là usaddress: https://github.com/datamade/usaddress:

  • Viễn chính xác hơn address mà chúng tôi muốn được sử dụng cho một năm nay https://pypi.python.org/pypi/address/0.1.1.
  • Tuy nhiên, để xem nó thất bại trên một địa chỉ
  • Tuy được cam kết như các văn bản này

Pro tip: khi kiểm tra các địa chỉ trong tất cả các thư viện, sử dụng 1) không có dấu phẩy trong địa chỉ của bạn, 2) tên thành phố nhiều từ tốt hơn với "St." trong tên để xem liệu thư viện có thể phân biệt giữa "đường phố" và "Saint" (ví dụ: St. Louis) và 3) không đúng cách. Kết hợp này thường sẽ làm cho các trình phân tích cú pháp tốt hơn rơi xuống.

+2

Đã cố gắng thực hiện điều này và hoạt động rất tốt. Nếu quốc gia không được bao gồm trong địa chỉ, nó thậm chí còn hoạt động cho các địa chỉ ở Canada. – JeromeParadis

+1

Liên kết ở trên hiện trả về 404 do, điều tôi đoán là cập nhật/giám sát. http://datamade.us/blog/parsing-addresses-with-usaddress – Ryan

+1

https://github.com/datamade/usaddress – Justas

1

Tôi biết đây là một bài cũ nhưng ai đó có thể tìm thấy nó hữu ích: 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')] 

Hoặc:

>>> 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') 
Các vấn đề liên quan