---
title: WikiData 與 戶役政資訊系統資料代碼整合 # 簡報的名稱
tags: presentation # 簡報的標籤
slideOptions: # 簡報相關的設定
theme: night # 顏色主題
transition: 'fade' # 換頁動畫
# parallaxBackgroundImage: 'https://s3.amazonaws.com/hakim-static/reveal-js/reveal-parallax-1.jpg'
---
COSCUP 2022
OpenStreetMap x Wikidata 開放內容議程軌
## 【WikiData 與 戶役政資訊系統資料代碼整合】
[[User:Planetoid]]
---
簡報

https://bit.ly/3OFMf5T
---
## 簡介
延續去在 COSCUP 的 Wikidata 資料品質的討論,今年嘗試將 Wikidata、OpenStreetMap 開放街圖資料、與政府公開資料「戶役政資訊系統資料代碼 」進行整合。分享真實世界的資料 QA 清理整合經驗。
---
## 大綱
* 現有資料
* 社群需求
* 規劃介面功能
* 資料問題
* 功能開發
* 多資料源整合
* 網頁成果
---
## 現有資料
內部政「連結介面戶役政資料代碼內容」

---
1. 全部村里代碼約7千多筆、
2. 村里代碼變動
* 新增村里代碼
* 刪除村里代碼
https://www.ris.gov.tw/documents/html/5/1/167.html
---
## 社群需求
* 需求1:政府公開資料與 WikiData 條目資料整合
* 需求2:村里代碼變動與新增
* 被整併消失的時間沒加上去,以及
* 新產生的村里對應關係
* 可以對應到「連結介面戶役政資料代碼內容」網頁的「刪除村里代碼」與「新增村里代碼」
* 「台南那邊,2018年那次整理量變動太大了」網頁提供可篩選縣市與變動的時間
* 需求3:與 OSM 條目資料整合、經緯度連結
---
### 許願池的概念

圖片來源:https://star.ettoday.net/news/387755
---
## 規劃介面功能
篩選/排序條件
* 顯示新增的村里代碼
* 顯示刪除的村里代碼
* 顯示近期未確認、已確認的村里代碼
* 顯示省縣名稱/省縣代碼/村里名稱/村里代碼
* 可篩選年份
---
🎂
### Before:一塊蛋糕
---
<!-- .slide: data-background="https://i.imgur.com/wt0tV6w.jpg" -->
⚔️
### After:一出新手村,就遇到大魔王
圖片來源:(CC0) https://bit.ly/3OB3O7a
---
## 資料問題
1. 檔案格式不一致
2. 文字檔案編碼不一致
3. 欄位分隔符號不一致
4. 空白字元不一致
5. 識別碼資料問題
6. 異體字、豆腐字
8. 資料更新頻率不固定
---
### 資料問題 1:檔案格式不一致
村里代碼檔案格式
* 純文字檔案 (txt)
* WORD 97-2004 檔案 (doc)
* WORD 檔案 (docx)
---
🧹
* txt 維持不變
* doc 檔案數量少,則用 LibreOffice 批次轉成 docx
* docx 轉換成 html 再取出純文字
---
### 資料問題 2:文字檔案編碼不一致
* Big5
* UTF-8
---
* 大五碼(英語:Big5,又稱為五大碼)是使用繁體中文(正體中文)社群中最常用的電腦漢字字元集標準,共收錄 13,060 個漢字。
* 缺字問題:游錫堃、張栢芝、陶喆等名字,寫成為「游錫方方土」、「張木百芝」和「陶吉吉」等
資料來源:[維基百科](https://zh.wikipedia.org/zh-tw/%E5%A4%A7%E4%BA%94%E7%A2%BC)
---
🧹
* 使用函數 `mb_detect_encoding` 偵測文字編碼 Big5, UTF-8
* 轉換成 UTF-8
---
### 資料問題 3:文字檔案欄位分隔符號不一致
村里代碼與村里名稱間的分隔符號,可能是
* 逗號
* 空白
* 甚至沒有任何間隔符號
---
檔案 1:新增村里代碼-11106.txt

檔案 2:新增村里代碼-09109.txt

---
🧹
* 觀察資料
* 共通規則是前面是數字、後面是中文
* 就可以忽略中間是逗號、空白、或者沒有空白
---
代碼對照表

---
不同行政層級的最後一個字
* 縣市名稱: 縣/市
* 鄉鎮市區名稱: 鄉/鎮/市/區
* 村里名稱: 村/里
---
不同代碼間關連:
村里代碼 (villageId) 共 11 碼 e.g. `66000010001=繼光里`
* 取前 8 碼是`鄉鎮市區代碼` `66000010=臺中市中區`
* 取前 8 碼,後 3 碼改成 0 e.g. `66000000=臺中市` 即縣市,但是跟 `縣市代碼` 不相同 `10019=臺灣省臺中市`
---
### 問題 4:空白字元不一致
* 半形空白
* 全形空白 `\u3000`
---
🧹
取代全形空白為半形空白
---
### 資料問題 5:識別碼資料問題
* 村里代碼不存在於總表 `全部村里代碼`
檔案:2002/02 新增的村里代碼 `10019050045 中正里` 需要匯整到大表
* 村里代碼對應的名稱不一致 2017/6
```刪除村里
屏東縣東港鄉
10013030023,大鵬里
```
* `10013030023` 是 `屏東縣東港鎮 福德里`
* `10013010072` 是 `屏東縣東港鄉 大鵬里`正確村里代碼
---

我以為「予以唯一和完整標識的資料列或屬性的鍵」
(資料來源:[維基百科](https://zh.wikipedia.org/zh-tw/%E5%85%B3%E7%B3%BB%E9%94%AE))
---
### 資料問題 6:異體字、豆腐字
* `裡里`
* `嵵裡里`
(村里代碼 `10016010031`)
---
🧹
* 原始資料 [連結介面戶役政資料代碼內容](https://www.ris.gov.tw/documents/html/5/1/167.html) 已經是豆腐字,
* 改用 [行政院主計總處與內政部戶政司村里代碼對照表](https://view.officeapps.live.com/op/view.aspx?src=https%3A%2F%2Fwww.stat.gov.tw%2Fpublic%2FAttachment%2F712693030RPKUP4RX.xlsx&wdOrigin=BROWSELINK) 修正
---
### 問題 7:資料更新頻率不固定
* 短:隔月
* 長:數年

---
🤖
CronJob 半天一次
* 抓取 [連結介面戶役政資料代碼內容](https://www.ris.gov.tw/documents/html/5/1/167.html)
* 抓取 WikiData 資料
---
## 功能開發
* 處理資料問題
* 網頁爬取 多資料源整合
* 抓取連結介面戶役政資料代碼內容網頁
* WikiData 資料整合
* OSM 資料整合
---
## 多資料源整合
嘗試方法1:鄉鎮名稱作為關鍵字
* 鄉鎮名稱作為關鍵字,但 Wikidata 結果只有一筆,推測是對應的。
* 但是如果多筆結果,就無法直接確認,需要人工確認的步驟
---
關鍵字搜尋策略:
1. 台、臺異體字
2. 市+區+里
3. 模糊、精準搜尋
---
以康寧里為例
1. `台北市內湖區康寧里`
2. `"台北市內湖區康寧里"` (加上雙引號精準搜尋)
3. `"臺北市內湖區康寧里"` (加上雙引號精準搜尋)
4. `臺北市內湖區康寧里`
5. `康寧里`
---
❗
解決方案衍生新的問題:
* 7,000 筆村里 (逐漸增加)
x 5 種關鍵字搜尋策略組合
* API 查詢數量太高 (3.5 萬次+)
---
嘗試方法2:以 WikiData 資料為主
* 標示沒有 WikiData ID 的村里代碼
* 使用 WikiData Query Service 直接查詢村里
* API 查詢次數:1 次
---

https://w.wiki/4KQi
---
## 網頁成果

---
快速找到沒有 WikiData ID 的村里

---
欄位:維基數據標籤、新增刪除月份、經緯度、開放街圖ID ... 欄位可以排序

---
搜尋欄位值

---
<!-- .slide: data-background="https://i.imgur.com/dqPDo8i.jpg" -->
<style>
h2.raw {
color: #999;
}
</style>
## 真實世界的資料
圖片來源 CC-BY [Flickr](https://www.flickr.com/photos/30478819@N08/50742478477)
---
## 後續計畫
* 村里改名:關廟南雄里改回舊地名「龜洞」 地方連署案通過明年元旦實施 - 生活 - 自由時報電子報 https://news.ltn.com.tw/news/life/breakingnews/3706988

圖片來源:https://youtu.be/7uBqNgxAuBA?t=43
---
## 相關連結

* 簡報:https://bit.ly/3OFMf5T
* 網站:https://bit.ly/3oLfHwK
* 程式碼:https://bit.ly/3cQDGI5 (MIT Lincese)