【问题标题】:Where is a good Address Parser [closed]好的地址解析器在哪里[关闭]
【发布时间】:2009-02-05 22:12:08
【问题描述】:

我正在寻找一个很好的工具,它可以获取完整的邮寄地址、格式化显示或与邮寄标签一起使用,并将其转换为结构化对象。

例如:

// Start with a formatted address in a single string
string f = "18698 E. Main Street\r\nBig Town, AZ, 86011";

// Parse into address
Address addr = new Address(f);

addr.Street; // 18698 E. Main Street
addr.Locality; // Big Town
addr.Region; // AZ
addr.PostalCode; // 86011

现在我可以使用 RegEx 来做到这一点。但棘手的部分是让它足够通用以处理世界上的任何地址!

我相信肯定有什么东西可以做到。

如果有人注意到,这实际上是opensocial.address 对象的格式。

【问题讨论】:

  • 骗人的:stackoverflow.com/questions/16413/… 我假设您的意思是美国地址。
  • 当您将国际地址加入混合时,这是一个难题。我知道Japanese addresses 不遵循您提出的 street1/street2/city/state/zip 模型。他们以与典型的美国地址不同的方式下到街道、街区和建筑。欧洲的其他地址也不同。那个正则表达式最好是 Unicode,因为我们的字母表是不够的。这不是一个简单的问题,IMO。

标签: c# parsing opensocial street-address


【解决方案1】:

Googlemaps API 非常适合这一点。例如,假设给定字符串“120 w 45 st nyc”。将其传递到 Googlemaps API 中,如下所示:http://maps.google.com/maps/geo?q=120+w+45+st+nyc,您会得到以下响应:

{
  "name": "120 w 45 st nyc",
  "Status": {
    "code": 200,
    "request": "geocode"
  },
  "Placemark": [ {
    "id": "p1",
    "address": "120 W 45th St, New York, NY 10036, USA",
    "AddressDetails": {"Country": {"CountryNameCode": "US","CountryName": "USA","AdministrativeArea": {"AdministrativeAreaName": "NY","Locality": {"LocalityName": "New York","Thoroughfare":{"ThoroughfareName": "120 W 45th St"},"PostalCode": {"PostalCodeNumber": "10036"}}}},"Accuracy": 8},
    "ExtendedData": {
      "LatLonBox": {
        "north": 40.7603883,
        "south": 40.7540931,
        "east": -73.9807141,
        "west": -73.9870093
      }
    },
    "Point": {
      "coordinates": [ -73.9838617, 40.7572407, 0 ]
    }
  } ]
}

【讨论】:

  • 我想我想知道 Google 是如何做到的。
  • 请注意,您可能会得到多个结果。如果您出于“标准化”目的而这样做,那么您将不得不使结果失败。非常惊讶它的运行速度有多快
  • 每天有大约 15,000 个请求的限制。所以要尊重和小心并检查使用条款econym.org.uk/gmap/geomulti.htm
  • 这适用于已关闭的旧 API v2。有关 v3,请参阅 developers.google.com/maps/documentation/geocoding。免费 api 的限制现在是每天 2500 个。
  • 请注意,搜索输入是一个格式完美的地址。用户实际上多久给你一次?谷歌有大量的错误检测和纠正程序来让它变得更智能,我相信这需要大量的工作
【解决方案2】:

如果您正在寻找具有简单解决方案的地址解析器,请尝试以下操作:

http://usaddress.codeplex.com/

好: 1.不需要数据库 2.无需上网查询 3. 相当准确

不好: 1.无法确认是否为真实地址 2. 仅适用于美国地址 3.在C#中,使用.NET 3.5或更高版本

【讨论】:

  • 快速警告 - 看起来正是我想要的......除了 GPL 部分。我们仍然不会分发我们的代码。
【解决方案3】:

如前所述,这不是一个小问题。除了国际地址之外,最大的问题之一是地址没有标准格式,而且地址无法告诉您它是否格式正确,即它不像信用卡号那样自我验证.

因此,您必须依靠外部事实来源来确保地址是真实的。这就是地址验证服务发挥作用的地方。根据您的业务需求和应用程序要求,您可能正在查看一次性“批量”清理您的地址列表,或者可能是实时/实时地址验证服务。有许多优秀的供应商(成本各不相同)可以轻松解决这个问题。

我应该提到我是 SmartyStreets 的创始人。我们做CASS-certified address verification。我们会将您的未格式化/原始地址转换为经过清理、标准化和验证/确认的地址。根据您列表的大小,成本通常只有几美元,而且周转时间几乎是即时的——通常是几分钟。

【讨论】:

    【解决方案4】:

    你可以试试Experian Address Verification。有问题,但几乎可以像宣传的那样工作。

    【讨论】:

      【解决方案5】:

      由于没有像@duffymo 说的那样简单的解决方案,接下来最好的事情可能是重新考虑设计。如果是用户表单,妥协让用户填写。如果您要追溯解析数据,请使用非常严格的正则表达式根据某些标准(国家/地区为美国)解析地址。然后在剩下的那些上做第二遍,依此类推。我采用了这种方法,它是唯一可靠的方法。

      采用通用正则表达式方法的另一个设计问题是它会为错误地址生成误报。如果您向这些人发送蜗牛邮件,它最终会被退回,您将有更多的工作要做,试图找出哪些邮件回来了,或者继续将邮件发送到错误的地址。

      【讨论】:

        【解决方案6】:

        我最近尝试了 RecogniContact。它是一个解析美国和欧洲地址的 Windows COM 组件。您可以从网站上对其进行测试。

        http://www.loquisoft.com/index.php?page=8

        【讨论】:

          【解决方案7】:

          对于加拿大地址,我使用了一个名为Street Perfect 的地址。我们必须将 c++ 代码包装在一些 .net 中,以使其可用于我们的目的,但这很容易。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-08-16
            • 2014-07-13
            • 2013-06-14
            • 2011-08-30
            • 2012-08-02
            • 1970-01-01
            • 2023-01-26
            相关资源
            最近更新 更多