大家好,
我想提出 libchewing 的第四代詞庫與語言模型架構,以下是簡要的演進背景與這次的改變。
## 小歷史
* 第 1 代:原始 2002 年技術報告的結構(fonetree.dat, ph_index.dat, dict.dat),
採 trie + word index + word text 分離設計,但 binary 不跨平台、檔案長度
寫死在 C 程式碼中。
* 第 1.5 代:為第 1 代檔案加上長度資訊,支援跨平台 mmap 讀取。
* 第 2 代:引入 SQLite 儲存使用者詞庫,以及預設未啟用的 trie index。
* 第 3 代:統一以 binary trie 格式儲存靜態詞庫與使用者詞庫。
## 為什麼需要更新
目前的架構源自 2002 年的技術報告,第 3 代雖然改善了效能,但仍有結構性限制:
* 詞頻與使用者偏好混淆,導致靜態詞庫難以重現、難以合併
* 語言模型與注音輸入緊密耦合,無法簡單支援拼音、倉頡等其他輸入方式
* 語言模型僅支援 unigram,缺乏上下文能力
## 第 4 代的主要改變
1. 分離字典與語言模型:static_dict.bin(注音/字形查詢)與
static_lm.bin(bigram/unigram 語言模型)分離,讓同一個語言模型可
服務多種輸入法。
2. 使用者詞彙改為 append-only log:user_vocab.bin 以 log entry 追加
寫入,取代整檔重寫的 Trie 格式,提供穩定 ID 供外部索引。
3. 使用者習慣改為衰減計數表:user_history.bin 以固定大小的衰減計數表記錄
使用頻率。
4. 新增 user_freq.csv 手動偏好微調:以人類可讀的 CSV 支援雙向調整
(正值 boost / 負值 deboost)。
5. 靜態詞條來源改為 static_words.txt:以純文字檔作為詞庫與語言模型的共同
生成基準,方便稽核與重建。
## 完整文件
詳細的架構說明、檔案格式、ID 空間分配、解碼器評分公式、遷移流程請見:
https://hackmd.io/@kanru/rkuK9SvXzx
歡迎直接回覆郵件或在 hackmd 上註解討論。謝謝!
Kan-Ru