2012-02-27 21 views
19

Mam listę adresów USA muszę się włamać do miasta, stanu, kod pocztowy, stanu itpCzy istnieje biblioteka do analizowania adresów US?

przykład adres: "16100 Sand Canyon Avenue, Suite 380 Irvine, CA 92618"

Does Czy ktoś wie o bibliotece lub darmowym API do tego? Google/Yahoo geocoder Zabronione jest używanie przez TOS dla projektów komercyjnych ..

Byłoby niesamowite znaleźć biblioteki Pythona, który preform to ...

Dzięki

+1

Trzeba powiedzieć nam (dokładne) format (string?) dane są w. –

Odpowiedz

5

Ta biblioteka pyparsingowa wygląda bardzo interesująco i wygląda na dobrą pracę z wieloma przykładami. I myślę, że jest to bardziej czytelna alternatywa dla surowych wyrażeń regularnych (które nie są tak naprawdę dobrym rozwiązaniem dla tego problemu).

Należy pamiętać, że tego rodzaju rozwiązanie oznacza, że ​​w pewnym momencie ustandaryzuje się niepoprawne adresy ... po prostu będą prawidłowe. Jeśli wiesz, czy adres jest rzeczywiście rzeczywisty (i być może dostarczalny) jest ważny dla twojej aplikacji, powinieneś używać usługi certyfikowanej przez USPS, która używa metody sprawdzania punktów dostawy (DPV). Jestem programistą dla SmartyStreets, który zapewnia właśnie taką usługę, wraz z pakietami SDK, które ułatwiają integrację (here's a succinct sample).

Odpowiedzi wracają do normy zgodnie z Publikacją 28 USPS. Interfejs API jest bezpłatny dla użytkowników o niskim poziomie wykorzystania.

+0

Lepszy link, być może: https://github.com/smartystreets/smartystreets-python-sdk – bogeymin

+0

Dobry point @bogeymin - zaktualizuję pytanie. – mdwhatcott

8

Sprawdź to pakiet Pythona: https://github.com/SwoopSearch/pyaddress

Pozwala także elastyczność, jeśli wiesz wystarczająco dużo szczegółów na temat adresów być analizowany.

+1

Niestety, ten projekt wydaje się być porzucony. Ostatnie zatwierdzenie pochodzi z kwietnia 2013 roku. –

0

Dokładnie sprawdź swój zestaw danych, aby upewnić się, że ten problem nie został już rozwiązany.

Spędziłem sporo czasu najpierw tworząc taksonomię prawdopodobnie kończącą nazwę ulicy, używając warunkow regexp, aby spróbować wyrwać numer ulicy z pełnych ciągów adresu i wszystkiego i okazało się, że tablica atrybutów dla moich plików kształtów miał już posegmentował te komponenty.

Zanim przejdziesz do przodu z procesem analizowania ciągów adresów, co zawsze jest przykrym obowiązkiem ze względu na nieuchronnie dziwne odmiany (niektóre adresy paczek dotyczą paczek bez dostępu do morza i mają dziwne adresy itp.), Upewnij się, że twój zestaw danych jeszcze tego nie zrobiłeś dla Ciebie !!!

19

Dość kilka z tych odpowiedzi ma teraz kilka lat.

Najbardziej kuloodporne biblioteka widziałem ostatnio jest usaddress: https://github.com/datamade/usaddress:

Pro wskazówka: podczas testowania adresów we wszystkich tych bibliotek, należy użyć 1) brak przecinków w adresie, 2) wielowyrazowe nazwy miast najlepiej z "St." w nazwie, aby sprawdzić, czy biblioteka potrafi odróżnić "ulicę" od "świętego" (np. St. Louis) i 3) niewłaściwą obudowę. Ta kombinacja zazwyczaj powoduje spadek wydajności nawet lepszych analizatorów.

+2

Wypróbowałem to i zadziwiająco dobrze. Jeśli kraj nie jest podany w adresie, działa nawet dla adresów kanadyjskich. – JeromeParadis

+1

Powyższy link zwraca teraz 404 z powodu, jak przypuszczam, aktualizacji/niedopatrzenia. http://datamade.us/blog/parsing-addresses-with-usaddress – Ryan

+1

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

1

Wiem, że to stary post, ale ktoś może się przydać: 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')] 

Lub:

>>> 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') 
Powiązane problemy