从字符串中解析出可用的街道地址、城市、州和邮政编码

133

问题:我有一个来自Access数据库的地址字段,已转换为SQL Server 2005。这个字段将所有内容都放在一个字段中。我需要将地址的各个部分解析成其规范化表中相应的字段。我需要对大约4,000条记录执行此操作,并且需要可重复。

假设:

  1. 暂时假设地址位于美国

  2. 假设输入字符串有时会包含被寄信人(收件人)和/或第二个街道地址(即B套房)

  3. 州名可能会缩写

  4. 邮政编码可能是标准的5位数字或zip+4

  5. 有些情况下可能存在拼写错误

更新:回答的问题后,标准并不是普遍适用的;我需要存储单独的值,而不仅仅是地理编码和errors表示拼写错误(已更正)

示例数据:

  • A. P. Croll & Son 2299 Lewes-Georgetown Hwy, Georgetown, DE 19947

  • 11522 Shawnee Road, Greenwood DE 19950

  • 144 Kings Highway, S.W. Dover, DE 19901

  • Intergrated Const. Services 2 Penns Way Suite 405 New Castle, DE 19720

  • Humes Realty 33 Bridle Ridge Court, Lewes, DE 19958

  • Nichols Excavation 2742 Pulaski Hwy Newark, DE 19711

  • 2284 Bryn Zion Road, Smyrna, DE 19904

  • VEI Dover Crossroads, LLC 1500 Serpentine Road, Suite 100 Baltimore MD 21

  • 580 North Dupont Highway Dover, DE 19901

  • P.O. Box 778 Dover, DE 19903


几个问题:
  1. 有任何分隔符吗?
  2. 字符串中的字段顺序是什么?
  3. 在数据错误的情况下,您希望出现什么行为(例如将地址推入SQL表中的单个字段,其他字段留空)?
- Jay Mooney
好问题,非常有趣的答案。从邮编倒推似乎是一个常见的主题,但如果你从客户那里获取原始数据,邮编可能不准确。我猜大多数网站例如90210都有不成比例的地址数量。 - Kevin Williams
4
@Kevin:是的,因为你们美国人喜欢用“邮政编码”来锁住我们加拿大人,不接受我们的邮政编码,从而迫使我们输入一些无意义的内容来绕过系统...不幸的是,我唯一知道的邮编是90210 :-) 编辑:算了吧...你显然和我在不远处的卑诗省住得很近。那么你可能也会做同样的事情 :-P - mpen
2
请参考这个 Stack Overflow 问题以获取更详细的概述。 - Matt
24个回答

2
对于 Ruby 或 Rails 开发人员,有一个不错的 gem 可用,叫做 street_address。我在我的一个项目中使用了它,它能够满足我所需。
唯一的问题是,每当地址以这种格式出现时 P. O. Box 1410 Durham, NC 27702,它会返回 nil,因此我不得不将 "P. O. Box" 替换为 '',然后才能解析它。

以上模块的链接已经失效,请使用以下链接:http://search.cpan.org/~kimryan/Lingua-EN-AddressParse/。 - Kim Ryan

1

我不知道这个做法有多可行,但我没有看到过这个提到,所以我想建议一下:

如果你只在美国境内运营...获取一个包含所有邮政编码、州、城市和街道的大型数据库。现在在你的地址中查找这些信息。你可以通过测试你发现的城市是否存在于你发现的州中,或者通过检查你发现的街道是否存在于你发现的城市中来验证你发现的内容。如果没有,那么John可能不是指John的街道,而是收件人的名字...基本上,尽可能获取最多的信息,并将你的地址与之进行核对。一个极端的例子是获取美国所有地址的列表,然后找出哪一个与你的每个地址最相关...


1

1

有一些数据服务,输入邮政编码将返回该邮政编码内的街道名称列表。

使用正则表达式提取邮编或城市州名 - 找到正确的一个或者如果出现错误则获取两个。 从数据源中获取街道列表。更正城市和州名,然后是街道地址。一旦您获得了有效的地址行1、城市、州和邮编,就可以对地址行2..3进行假设。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接