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 でそれを行うことができます。(正規表現は本当に単純ですか)?

入力から抽出したアドレスが実際に本物で有効であることを確認する必要がある場合は、比較するリストまたはテーブルが必要です。そのデータは、Australia Post (または米国の USPS) などのソースから取得されます。

したがって、正規表現を使用して「推測」を抽出し、それらをマスター リストと照合して、一致するものが適切であることを確認します。マスターリストがなければ、それが正しいか間違っているかを確信することはできません.

私は実際に SmartyStreets でこれとまったく同じ問題に取り組んでおり (ただし、私は米国の住所のみを扱っていることを除いて)、さまざまな解決策を考え出しました。偽陽性、または郵便番号のように見える一次番号に対処します。純粋な REGEX を使用することも、郵便番号、州、および通りの名前を含むテーブルを使用することもできます。これにより、原子データを高精度で抽出できるようになります。

于 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 に答える