我有一个美国地址列表,我需要打入城市,州,邮政编码,州等。
示例地址:“16100 Sand Canyon Avenue,Suite 380 Irvine,CA 92618”
有没有人知道一个库或一个免费的API来做到这一点?禁止谷歌/雅虎地理编码器使用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库看起来很有趣,似乎用各种各样的例子做得很好。而且我认为这是原始正则表达式的一种更具可读性的替代方法(对于这个问题来说,这不是一个很好的解决方案)。
请注意,这种解决方案意味着您将在某些时候标准化无效的地址......它们才会显得有效。如果知道地址是否实际上,真实(并且可能是可交付的)对您的应用程序很重要,那么您应该使用使用交付点验证(DPV)的USPS认证服务。我是SmartyStreets的开发人员,它提供这样的服务,以及使集成变得容易的SDK(here's a succinct sample)。
根据USPS出版物28,回复标准化。对于低使用率的用户,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')
仔细检查数据集以确保尚未处理此问题。
我花了相当多的时间首先创建一个可能街道名称结尾的分类,使用正则表达式条件试图从完整的地址字符串中取出街道编号和所有内容,结果发现我的shapefile的属性表已经分段了这些组件。
在你继续解析地址字符串的过程之前,由于不可避免的奇怪变化(一些包裹地址用于内陆地块并且有奇怪的地址等),这一直是一件苦差事,确保你的数据集还没有为你完成这个!!!
有强大的开源库libpostal非常适合这个用例。有绑定到不同的编程语言。 Libpostal是一个C库,用于使用统计NLP和开放数据解析/规范世界各地的街道地址。该项目的目标是在任何地方理解每种语言的基于位置的字符串。
我用Python绑定pypostal创建了一个简单的Docker镜像,你可以旋转并轻松地尝试pypostal-docker