是否有用于解析美国地址的库?

时间:2012-02-27 10:29:36

标签: python parsing street-address

我有一个美国地址列表,我需要打入城市,州,邮政编码,州等等。

示例地址:“16100 Sand Canyon Avenue,Suite 380 Irvine,CA 92618“

有没有人知道要执行此操作的库或免费API?禁止谷歌/雅虎地理编码器使用TOS进行商业项目..

找到一个预先形成这个的python库真是太棒了......

由于

7 个答案:

答案 0 :(得分:23)

这些答案中有不少是现在几年了。

我最近见过的最防弹的图书馆是usaddresshttps://github.com/datamade/usaddress

专业提示:在测试所有这些库中的地址时,请使用1)地址中没有逗号,2)多字城市名称,最好使用" St。"在名称中查看图书馆是否可以区分" street"和#34;圣" (例如,圣路易斯),和3)不正确的套管。这个组合通常会使更好的解析器崩溃。

答案 1 :(得分:17)

Pyparsing有许多用于解析街道地址的功能,请在此处查看示例:http://pyparsing.wikispaces.com/file/view/streetAddressParser.py

答案 2 :(得分:8)

查看此Python包: https://github.com/SwoopSearch/pyaddress

如果您了解有关要解析的地址的详细信息,它还可以提供灵活性。

答案 3 :(得分:5)

那个pyparsing库看起来很有趣,似乎用各种各样的例子做得很好。而且我认为这是原始正则表达式的一种更具可读性的替代方法(对于这个问题来说,这不是一个很好的解决方案)。

请注意,这种解决方案意味着您将在某个时候标准化无效的地址......它们只会显得有效。如果知道地址是否实际上,真实(并且可能是可交付的)对您的应用程序很重要,那么您应该使用使用交付点验证(DPV)的USPS认证服务。我是SmartyStreets的开发人员,它提供了这样的服务,以及简化集成的SDK(here's a succinct sample)。

根据USPS出版物28,回复标准化。对于低使用率的用户,API是免费的。

答案 4 :(得分:1)

我知道这是一篇旧帖子,但有人可能觉得它很有用: 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')

答案 5 :(得分:0)

有一个强大的开源库libpostal非常适合此用例。有绑定到不同的编程语言。 Libpostal是一个C库,用于使用统计NLP和开放数据来解析/规范世界各地的街道地址。该项目的目标是在世界各地理解每种语言的基于位置的字符串。

我用Python绑定pypostal创建了一个简单的Docker映像,您可以将其剥离并轻松尝试pypostal-docker

答案 6 :(得分:0)

仔细检查数据集,确保尚未处理此问题。

我花了相当多的时间首先创建一个可能街道名称结尾的分类,使用正则表达式条件试图从完整的地址字符串中取出街道号码,然后结果是我的shapefile的属性表已经已经细分了这些组件。

在你继续解析地址字符串的过程之前,由于不可避免的奇怪变化(一些包裹地址用于内陆地块并且有奇怪的地址等)总是有点苦差事,所以确保你的数据集没有我已经为你做了这个!!!