【问题标题】:Is there a library for parsing US addresses?有解析美国地址的库吗?
【发布时间】:2012-03-16 20:01:50
【问题描述】:

我有一份美国地址列表,我需要将其划分为城市、州、邮政编码、州等。

示例地址:“16100 Sand Canyon Avenue, Suite 380 加利福尼亚州欧文市 92618"

有没有人知道一个库或免费的 API 可以做到这一点? TOS 禁止将 Google/Yahoo 地理编码器用于商业项目。

如果能找到一个可以执行此操作的 python 库,那就太棒了。

【问题讨论】:

  • 你必须告诉我们(字符串?)数据的(确切)格式。

标签: python parsing street-address


【解决方案1】:

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

【讨论】:

【解决方案2】:

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

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

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

【讨论】:

【解决方案3】:

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

如果您知道要解析的地址的足够详细信息,它还可以提供灵活性。

【讨论】:

  • 不幸的是,该项目似乎已被放弃。最新的提交是从 2013 年 4 月开始的。
【解决方案4】:

仔细检查您的数据集以确保尚未为您处理此问题。

我花了相当多的时间首先创建一个可能街道名称结尾的分类法,使用正则表达式条件尝试从完整的地址字符串和所有内容中提取街道编号,结果发现我的 shapefile 的属性表有已经细分了这些组件。

在继续解析地址字符串的过程之前,由于不可避免的奇怪变化(一些包裹地址用于内陆包裹并且有奇怪的地址等),这总是有点麻烦,请确保您的数据集没有'还没有为你做这个!!!

【讨论】:

    【解决方案5】:

    其中不少答案已经有几年历史了。

    我最近看到的最防弹的库是usaddress:https://github.com/datamade/usaddress:

    专业提示:在所有这些库中测试地址时,请使用 1)您的地址中没有逗号,2)多词城市名称最好使用“St”。在名称中查看库是否可以区分“street”和“Saint”(例如,St. Louis),以及 3)不正确的大小写。这种组合通常会使更好的解析器崩溃。

    【讨论】:

    【解决方案6】:

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

    【讨论】:

      【解决方案7】:

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

      我用 Python 绑定 pypostal 创建了一个简单的 Docker 映像,你可以分拆并非常轻松地尝试pypostal-docker

      【讨论】:

        猜你喜欢
        • 2011-10-20
        • 2013-06-14
        • 1970-01-01
        • 1970-01-01
        • 2021-12-08
        • 2010-11-25
        • 1970-01-01
        • 2012-01-24
        • 1970-01-01
        相关资源
        最近更新 更多