1

我的任务是将非原子(澳大利亚)街道地址转换为原子街道地址,这意味着当前街道数据将作为街道编号和街道名称一起存储。样品是:

24 George street        -----------> 24         |   George street    
55 park rd              -----------> 55         |   pard rd  
102a gordon road        -----------> 102a       |   gordon road
unit 5/46 addison ave   -----------> unit 5/46  |   addison ave 
flat 2-9/87 north avenue-----------> flat 2-9/87|   north avenue
suit 5 lvl2/55 prince hwy-------> suit 5 lvl2/55|   prince hwy
shop 5 Big Shopping Centre  ------> Rejected
Suit 2 Level 100          -------> Rejected

添加数据(程序应该工作的方式):

Darling street ------------------> Rejected
City road -----------------------> rejected

建议的代码处理结果:

Darling street ------------>   Darling     |    Street
City road   --------------->   City        |     road

实际上在这种情况下,代码不应该处理地址并抛出异常。

拆分地址的最佳方法是什么?

4

2 回答 2

3

我假设您已经按照相同的思路看到了这个问题的答案。

@kaᵠ 已经指出程序对数据一无所知,因此它没有上下文。情况将永远如此。因此,考虑到这一点,您需要确定的第一件事是您需要什么级别的准确度?如果您需要 70% 的准确率,那么您可以使用简单的 REGEX 来做到这一点。(正则表达式真的很简单吗)?

如果您需要确定从输入中提取的地址实际上是真实有效的,则需要一个列表或表格进行比较。该数据将来自澳大利亚邮政(或美国的 USPS)等来源。

因此,使用您的正则表达式来提取“猜测”,然后根据主列表验证这些,并且匹配的那些是好的。如果没有主列表,您就无法确定自己做对了还是做错了。

实际上,我一直在 SmartyStreets 研究这个完全相同的问题(除了我只处理美国地址)并提出了许多不同的解决方案 - 确定地址字符串的开头和结尾的不同方法,以及如何处理误报或看起来像邮政编码的主要数字。您可以使用纯正则表达式,也可以使用包含邮政编码、州和街道名称的表格。这使您能够非常接近能够以高精度提取原子数据。

于 2013-05-13T17:48:36.973 回答
2
select
   addr,
   regexp_substr(addr, '^(.*?)\s\D+$', 1, 1, '', 1) street_number,
   regexp_substr(addr, '^.*?\s+(\D*?)\s*$', 1, 1, '', 1) street_name
from t1   
where -- don't show rejected
   regexp_like(addr, '\d.*\s(street|road|rd|ave|avenue|hwy)\s*$', 'i')  

小提琴

于 2013-05-12T14:32:05.567 回答