用Google Refine + Google Map API 正規化台灣地址

這一年因為工作需求,常常得處理大量Raw Data,從資料庫來的,或是Excel,超過50000筆資料所在多有,因此呢,一個常常得拿出來的好用的工具就一定要分享了。

上頭的影片可以看見Google Refine強大處,不過我這兒想介紹的是另一個應用,也就是將一整串的地址分欄方式。也請注意,本文Geek Only,生人勿入...

首先,下載回來解壓Google Refine,就可以直接執行。執行後會跳出瀏覽器,原因是Google Refine其實是一個包好的Web端應用程序,因此執行後,可發現在瀏覽器的網址為「127.0.0.1:3333」,這就是預設的Google Refine應用程式首頁。

匯入Project / Excel 等照畫面操作,就不多提,以下直接跳到簡單介紹我如何正規化台灣地址,簡而言之,本文的目標就是批次把所有地址如「100台北市中正區天龍路3段253巷1號5樓」,轉變成以下格式:

100 | 台北市 | 中正區 | 天龍路3段253巷1號5樓

 

1. 將地址欄位去掉空白,郵遞區號去掉

因為呢,Google Map會自動判斷郵遞區號,所以得先把不必要的郵遞區號去掉,我們用Edit Cell裡頭,Transform 搭配正規表達式達成。

Edit Cell -> Transform ->
value.trim().replace(/\s/,'').replace(/^\d+/,'')

2. 將縣市名稱換成正確五都名稱,分三次作業

一樣,因為過往的data都有五都問題,得一次清掉解決

Edit Cell -> Transform ->
value.replace("臺","台").replace(/^北縣/,"台北縣").replace(/^北市/,"台北市")
value.replace(/((台北縣|台中縣|台南縣|高雄縣).+)(市|鄉|鎮)/,'$1區')
value.replace("台北縣","新北市").replace("台中縣","台中市").replace("台南縣","台南市").replac e("高雄縣","高雄市")


3. 使用Google Map解析地址成為JSON:

這個方法會開始一個一個地址丟去web爬結果回來,所有JSON都會存成一欄供後續處理

Edit Column -> Add column by fetching urls ->
"http://maps.google.com/maps/api/geocode/json?sensor=false&language=zh-tw&region=tw&address=" + escape(value, "url")

參考:FetchingURLsFromWebServices
參考:Google Map API JSON 解析結果

 

4. 分別切出郵遞區號、縣市、鄉鎮市區、街道

利用Google Refine內建function parseJson() 來進行這件事情。

參考: 如何使用Google Refine parseJson

Edit Column -> Add column based on this column
郵遞區號: value.parseJson().results[0].address_components[6].long_name
縣市: value.parseJson().results[0].address_components[4].long_name
鄉鎮市區: value.parseJson().results[0].address_components[3].long_name

 

5. 抽取正確的街道地址

因為Google回傳的街道地址,會自動把「樓」去掉,所以我們得把原始的地址給保留,但去掉縣市、鄉鎮市區。 

Edit Column -> Add column based on this column
value.replace(cells["縣市"].value,"").replace(cells["鄉鎮市區"].value,"")

 

以上,是不是輕鬆寫意呢?還有些資訊可供參考、研讀!

Google Refine

Google Refine GREL Function

一點補充:

如果只是想要把 中正區天龍路3段253巷1號5樓 變成 中正區 | 天龍路3段253巷1號5樓,下面是一個小技巧:

Edit Column -> Add column based on this column
value.replace(value.replace(/^.+(鄉|鎮|市|區)/, ""),"")