上一篇我們用 Python 打造了能解讀歷史座標的「時光羅盤」。但羅盤只會告訴你地名,無法告訴你歷史。真正的歷史,藏在文言文的汪洋大海中。
因為我本身對台灣史完全沒有概念,為了建立自己的知識體系,我首先向 AI 提問,得到了這份極具啟發性的「台灣方志演化樹」:
【根】 全域性/起源 (Early & Comprehensive)
║
╚══ 1684《福建通志‧臺灣府》(清代最早的官方紀錄)
║
╠══ 1694《臺灣府志》(確立台灣史志的基本架構)
║
╠══ 1920《臺灣通史》(連橫著,民間史學集大成之作)
║
╚══【幹】 區域行政中心 (以北台灣為例)
║
╚══ 1871《淡水廳志》(新竹史料之源,具行政與大租分配紀載)
║
╠══【枝】 縣級史志 (新竹設縣後)
║ ║
║ ╠══ 1892《新竹縣志初稿》(新竹正式設縣後的首部地方志)
║ ║
║ ╠══ 1895《新竹縣制度考》(日治初期清理清代制度之專作)
║ ║
║ ╚══ 1907《新竹廳志》(結合日治調查與清代舊志)
║
╚══【葉】 地方/微觀採訪 (Local & Micro-geographic)
║
╠══ 1894《新竹縣採訪冊》(最細微的點位紀錄,如黃金洞、御史崎)
║
╠══ 1898《樹杞林志》(專注於新竹東部山區與竹東拓墾)
║
╚══ 1980+《新竹縣/市志》(現代修訂版本)
有了這張圖,我就知道該去哪裡尋寶了。於是,我花了一點時間想辦法把這些史書從網路上抓了下來(大部分都順利搞定了)。
這其中,《臺灣通史》被視為重中之重。於是,在初步了解這本書的簡介後,我興致勃勃地開始嘗試針對「王世傑傳」進行分析。但很快我就撞牆了:我發現如果只依賴傳統的文字檢索(grep)或是將整包純文字檔案丟給 AI 處理,因為缺乏結構性,結果雖然堪用(但應該能更好),但執行的方法實在不夠好。這讓我意識到:如果想做到精準的內容調用,或許把這些古書「塞進資料庫 (Database)」會厲害一點?
這次的挑戰目標,便是將被譽為台灣史記的——連橫《臺灣通史》,涵蓋 88 篇、數十萬言的煌煌巨著,進行一次「降維打擊」。如果只把它當成電子書 (TXT/PDF) 放在硬碟裡,我們永遠無法做到「程式調用」。我們必須用現代軟體工程的手段,對它進行一次數位解剖。
一場名為 ETL 的時空手術
步驟一:結構化匯入 (Structural Import)
古籍最大的痛點是沒有現代的排版標籤。為此,我寫了一支程式(build_history_db.py),擔任這場時空手術的主治醫師:
- 解析目錄:將史料的目錄區萃取出來,建立「卷號」與「篇名」的映射表。
- 精準切割:把一整坨純文字,依據卷次與標記完美切分為 88 個獨立的文本區塊。
- 建構引擎:把它們全部塞入 SQLite 資料庫中,並啟動 FTS5 (Full-Text Search) 引擎。現在,面對百萬字史料,我們達成了毫秒級的關鍵字檢索!
步驟二:智能實體萃取 (Entity Extraction)
但只有檢索還不夠,資料庫必須自己知道「什麼是人?什麼是地?」
我啟動了第二階段的掃描腳本 (extract_entities.py),透過精密設計的正則表達式 (Regex),讓程式成為一個不知疲倦的歷史學徒,將整本《臺灣通史》從頭讀到尾。
它的任務是抓出三種核心實體:
- Person (人):王世傑、曹謹、林爽文…
- Infrastructure (水利基建):隆恩圳、曹公圳、八堡圳…
- Location (古地名):竹塹埔、六張犁莊、新港社…
短短幾分鐘的運算,我們從文本中成功提煉了 150 筆編年紀事、639 筆水利建設、675 筆地名實體,以及數百位先賢的資料庫目錄!
現在,那句「地理是凝固的歷史」終於有了數字化載體。我們不僅擁有了電子書,更擁有了一個隨時可用 SQL 指令控制的**「歷史知識大腦」**。
萬事俱備。一邊是擁有座標的「時光羅盤」,另一邊是懂得出處的「歷史大腦」。接下來的終極挑戰,就是將兩者進行「空間縫合」!
(未完待續:下一篇,見證史圖合一的瞬間!)
本文為哈爸與 AI 助理協作產出,紀錄實體探勘與數位工程之歷程。