1. 地址結構化拆解與語意解析 (Parser & Segmenter)
- 自動分詞與標籤化:利用語意解析與規則引擎,將輸入的無結構字串(如
臺北市中正區廣州街2號)自動拆解為County(縣市)、District(鄉鎮市區)、Road(路名)、HouseNumber(門牌)、Floor(樓層)等標準欄位。 - 格式標準化:自動統一阿拉伯數字與中文數字(例如:
三樓$\rightarrow$3F、五段$\rightarrow$5段)、補全簡寫(台北市$\rightarrow$臺北市)。
2. 極速前綴匹配與快取 (Fast Prefix Lookup Engine)
- $O(K)$ 最長前綴比對:採用 MARISA-Trie 記憶體壓縮結構,能在數微秒內秒級鎖定標準縣市與行政區。
- 高併發快取:極大化過濾常見且格式正確的地址,減輕後續圖譜與模糊比對的運算負擔。
3. 空間約束與錯字修復 (Spatial-Aware RapidFuzz Engine)
- 同音字與錯字修正:基於 C++ Levenshtein Distance 算法,自動修正打錯的路名(如
松篙路$\rightarrow$松高路、羅斯福路五段的同音漏字)。 - 空間剪枝(Spatial Pruning):限定比對範圍於已鎖定的「縣市/行政區」方圓內,避免「桃園中正路」錯補成「板橋中正路」的誤判。
4. 圖譜拓樸與跨區門牌斷言 (Kùzu Graph Topology Guard)
- 長道路與跨區門牌精準判定:透過
RoadSegment節點的門牌區間與單雙號屬性,自動判定橫跨多個行政區的道路歸屬(如:廣州街 2 號$\rightarrow$中正區;廣州街 200 號$\rightarrow$萬華區)。 - 圖譜拓樸約束:以 Cypher 查詢驗證
(Zipcode)-[:BELONGS_TO]->(County)-[:HAS_DISTRICT]->(District)-[:HAS_SEGMENT]->(RoadSegment)階層關係,嚴格防止邏輯矛盾的地址存在。
5. 門牌與樓層邏輯驗證 (House Number & Floor Guard)
- 門牌區間與單雙號檢驗:驗證該號碼是否落在該道路的合法號碼範圍內,以及單雙號(Parity)是否符合事實。
- 附號與特殊樓層處理:支援「之幾號」(如
80之1號)、地下室(B1、B2)、頂樓加蓋等台灣特有門牌邏輯校驗。
6. 自我學習與異步高效能服務 (Self-Improving & Serving Layer)
- 未命中自動收集 (Unmatched Feedback Pool):自動將解析失敗或高疑義的地址寫入 SQLite 記錄池,便於定期人工覆核與增量補充圖資。
- 異步高併發處理 (Async Batch Pipeline):基於 Python
asyncio與ProcessPoolExecutor,支援每秒數千筆地址的批次正規化。 - Standardized REST API:提供 FastAPI 介面,支援 OpenAPI (Swagger) 文件,方便微服務架構整合與 Docker 容器化部署。
建置這套台灣地址正規化與圖譜校驗系統,核心關鍵在於「權威圖資的取得與清洗」。為了支援從縣市、行政區、跨區長道路門牌分段、到郵遞區號的完整校驗,你需要蒐集以下 4 大類開放資料(Open Data):
1. 全國行政區劃與郵遞區號對照表(基礎層)
- 用途:建立
County、District與Zipcode節點及拓樸關係。 - 資料來源:
- 中華郵政 3+3 碼郵遞區號文字檔(包含路街段與郵遞區號對照表)。
- 內政部戶政司 全國行政區劃代碼表。
- 欄位需求:縣市名稱、鄉鎮市區名稱、郵遞區號 (3碼/3+2碼/3+3碼)。
2. 全國門牌公所與道路門牌號碼區間(核心圖譜層)
- 用途:建立
RoadSegment與NumberRange,解決「廣州街 2 號(中正區)vs 廣州街 200 號(萬華區)」這類跨行政區道路門牌判定問題。 - 資料來源:
- 內政部戶政司 全國門牌資料庫(TGOS / 門牌反查開放資料)。
- 政府資料開放平台 (data.gov.tw) – 各縣市門牌資料集。
- 欄位需求:
- 縣市名稱、鄉鎮市區名稱、路街名稱、段號(如:一段)。
- 起始門牌號碼 (
min_num)、結束門牌號碼 (max_num)。 - 單雙號規則 (
parity):單號 (ODD)、雙號 (EVEN) 或連續號 (ALL)。
3. 全國標準道路名稱與同義詞對照庫(錯字與修復層)
- 用途:供 MARISA-Trie 與 RapidFuzz 模糊比對使用,做同義詞替換與錯字校正(如
台北市$\rightarrow$臺北市、松篙路$\rightarrow$松高路)。 - 資料來源:
- 交通部 GIS 道路網圖資(Road Network) 或 NLSC 國土測繪圖資。
- 常見異體字與俗體字映射表(自行建立字典,例如:
台$\leftrightarrow$臺、哨船頭$\leftrightarrow$哨船街)。
- 欄位需求:標準道路全名、道路別名/舊稱、拼音對照。
4. 特殊門牌與邏輯規則庫(規則 Guard 層)
- 用途:提供
HouseNumberGuard與FloorGuard作邏輯檢驗。 - 資料來源:
- 台灣門牌編釘規則文件(各縣市門牌編釘及道路命名自治條例)。
- 邏輯規則集(語法/常數):
- 附號識別:
之(如:80之1號)。 - 樓層識別:
樓、F、FL、B(地下室,如B1)。 - 特殊地名/衖/弄/巷階層序列。
- 附號識別:
📥 資料蒐集清單總覽表
| 資料類別 | 建議資料源 | 主要檔案格式 | 用途模組 |
| 行政區與郵遞區號 | 中華郵政 Open Data | CSV / JSON | trie_search.py, Zipcode 節點 |
| 道路門牌區間與跨區分段 | 內政部 TGOS / 戶政司門牌庫 | CSV / SHP | graph_topology_guard.py (RoadSegment) |
| 標準道路網與異體字字典 | 交通部 TDX / 自建字典 | JSON / TXT | spatial_guard.py (RapidFuzz 比對) |
| 門牌樓層邏輯規則 | 各縣市戶政門牌法規 | Regex 規則表 | house_number_guard.py |