我有一个美国地址列表,我需要打入城市,州,邮政编码,州等等。
示例地址:“16100 Sand Canyon Avenue,Suite 380 Irvine,CA 92618“
有没有人知道要执行此操作的库或免费API?禁止谷歌/雅虎地理编码器使用TOS进行商业项目..
找到一个预先形成这个的python库真是太棒了......
由于
答案 0 :(得分:23)
这些答案中有不少是现在几年了。
我最近见过的最防弹的图书馆是usaddress
:https://github.com/datamade/usaddress:
address
更加准确,我们现在已经使用了https://pypi.python.org/pypi/address/0.1.1。专业提示:在测试所有这些库中的地址时,请使用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)
仔细检查数据集,确保尚未处理此问题。
我花了相当多的时间首先创建一个可能街道名称结尾的分类,使用正则表达式条件试图从完整的地址字符串中取出街道号码,然后结果是我的shapefile的属性表已经已经细分了这些组件。
在你继续解析地址字符串的过程之前,由于不可避免的奇怪变化(一些包裹地址用于内陆地块并且有奇怪的地址等)总是有点苦差事,所以确保你的数据集没有我已经为你做了这个!!!
答案 6 :(得分:0)
有一个强大的开源库libpostal非常适合此用例。有绑定到不同的编程语言。 Libpostal是一个C库,用于使用统计NLP和开放数据来解析/规范世界各地的街道地址。该项目的目标是在世界各地理解每种语言的基于位置的字符串。
我用Python绑定pypostal创建了一个简单的Docker映像,您可以将其剥离并轻松尝试pypostal-docker