Repository navigation
Releases: Nanako0129/shanjie
Release list
善解 0.5.0
聊天設定更會選口語的用字,書面設定的語意校正也調過;輸入法改在 App 沙盒裡執行,更新交給另一個小程式;安裝程式可以裝給這台 Mac 的每個帳號。
- 聊天更懂口語:聊天設定的語意校正多參考兩樣東西(只在聊天設定):
- 口語詞頻表「常談」(SJ-CL-1-68K,詞彙 68,055)。它只有詞與詞對的次數、不含句子;來源與授權列在
LICENSES/data.md與 Releasesj-cl-1-68k的署名清單。 - 單字的讀音:打的讀音不是那個字最常見的讀法時,比較不會選它。
- 例如「桌腳的螺絲鬆掉了」「是不是很雷啊」「變快」,用同樣的條件重播,上一版的設定選成「羅斯松」「很累」「便會」,這一版都選對。
- 已知:「長歪了」會選成「掌歪了」,詞庫裡「長」讀ㄓㄤˇ的分數有誤,之後修。
- 口語詞頻表「常談」(SJ-CL-1-68K,詞彙 68,055)。它只有詞與詞對的次數、不含句子;來源與授權列在
- 書面設定的語意校正換參數:會意換成 SJ-SR-6-14M,權重和上一版相同,只重選書面設定的融合參數(α 0.7、τ 2、δ 1)。聊天設定的參數不變。
- 安裝程式多了「這台 Mac」:歡迎頁有兩個並列的選項,沒有預設。
- 這台 Mac:裝到
/Library/Input Methods,檔案由系統保護,這台 Mac 的每個帳號都能用。有程式開著安全輸入時(密碼管理器、終端機的「加密的鍵盤輸入」),善解不再反灰,照常能用(學習暫停、不讀前文)。代價是安裝與每次更新各要輸入一次管理員密碼。 - 只有我的帳號:和之前一樣,不需要密碼;有程式開著安全輸入時,系統仍會暫時停用善解。
- 自動更新上來的人仍在自己的帳號裡;要搬到「這台 Mac」,重新打開這一版的安裝程式選它。學習資料與設定不受影響。
- 換了位置之後要登出再登入一次,安裝程式最後一頁會提醒;第一次裝給這台 Mac 時,登入後還要到「系統設定 → 鍵盤」把善解加入,最後一頁會寫步驟。系統設定跳出來蓋住安裝程式時,安裝程式會自己回到前面。
- Homebrew 只裝在你的帳號。
- 這台 Mac:裝到
- App 沙盒與「善解更新」:輸入法本體在 App 沙盒裡執行(活動監視器的「沙盒」欄位是「是」),只開三個權限:沙盒本身、對外連線(只為了檢查更新)、註冊輸入法的連線。
- 第一次啟動這一版時,學習資料與偏好設定會搬進沙盒的資料夾;學過的選字、新詞、倚天排列與各項設定都還在。
- 按「更新到 X」之後,由 App 裡另一個不在沙盒裡的小程式「善解更新」下載、驗證並安裝,它只會更新已安裝的那一份善解。裝在「這台 Mac」時,系統會跳出密碼框,文字是「善解更新 wants permission to update 善解輸入法.」。Sparkle 升到 2.10.0。
- 沙盒擋不住輸入法把輸入內容送出去;它限制的是程式被攻破時碰得到的檔案與程式。
- 數字列直接打數字:標準排列、中英混打開著時,不切輸入法就能在注音裡打半形數字(含
./-),例如「2026年1月15日」「3.14」;還沒決定是數字還是注音時,畫面先顯示語境下比較可能的那一種,另一種在 ↓ 的清單裡。數字打完,預測列會依前文列出可能接的詞(「下午3」→「點」)。- 中英混打(實驗)改成預設開:從沒動過這個開關的人,更新後會是開著;自己關過的照舊是關。不要的話在設定的「選字」關掉。
- 改選後其他字不動:在候選窗改選一段之後,那一段以外已經顯示的字都固定,不會改一個、翻一個(學蘋果注音)。
- 預測列與 ↓ 一致:預測列顯示時按 ↓(沒有打到一半的音節時,空白鍵也一樣),候選窗前面幾項就是預測列那幾個詞、同樣順序;還沒進入的預測列第一格前面有 Tab(⇥)提示。
- 逐字改選也會學成新詞:用候選窗一個字一個字改選拼出來的 2–4 字詞,會學成新詞,之後打得出來。
- 善解只在你用候選窗改字、或從預測列選詞時學習,學習檔只存在這台 Mac。檔案裡有:你選的詞和它前面最多 2 個漢字;你逐字改選拼出來的 2–4 字新詞,包括一起送出、但你沒改選的相鄰字(可能包含人名);讀音、權重和日期。之後再打到這個新詞,會更新它的權重和日期。
- 在候選窗按 ⌘⌫ 可以忘記一個詞(新詞的單字改選紀錄要另外忘記),選單的「清除選字記憶…」會全部刪掉。學習檔不受 macOS 的隱私權限保護,靠 FileVault 加密;預設會進 Time Machine,可以在選單排除;清除不會刪掉已經備份的副本。
- 中英文之間自動加空格(設定 → 選字,預設關):在漢字和半形英文、數字之間自動加一個空格(俗稱「盤古之白」),例如「我用claude寫」送出成「我用 claude 寫」。只改善解送出的文字,標點旁邊不加。
- 關於頁列出內附的模型:設定的「關於」頁多一節「模型」,列出這一版內附的六個模型(中文名與對外名稱)。
- 跨版本比較(v0.4.7 → v0.5.0,出貨設定,
docs/benchmark.md):兩種設定都沒有集合顯著變差。- 聊天:Discord 聊天評測集(4,958 句)86.81% → 87.90%(改對 88/改壞 34,p 1.1e-6)、cvtune(3,791 句)90.95% → 91.93%(53/16,p 9.1e-6)、lytune(4,811 句)83.91% → 87.32%(191/27)、錯字回報(80 句)28 → 33 句(7/2,p 0.18,不顯著)。wikitune(2,827 句)77.57% → 77.26%(37/46,p 0.38,不顯著)。
- 書面:wikitune 78.95% → 80.16%(39/5,p 1.4e-7)、Discord 聊天評測集 85.07% → 86.06%(69/20)、cvtune 90.74% → 91.80%(42/2)、lytune 84.81% → 85.68%(74/32)、錯字回報 24 → 29 句(6/1,p 0.13,不顯著)。
- 打字測驗(76 句):兩種設定都是改對 0/改壞 0。
- 保留集(shard-1,300 句):聊天 234 → 237 句(7/4,p 0.55)、書面 233 → 241 句(8/0,p 0.0078)。口語那一半用聊天設定 116 → 115(3/4),新聞那一半用書面設定 116 → 120(4/0)。
- 速度與記憶體(兩版在同一台機器、同一場輪流跑;load avg 約 4,不是閒置窗,只能看同場兩版的差距,所以
docs/kpi.md的速度欄不填):每鍵 p95 2.00 → 2.05 ms,引擎載入 752 → 905 ms,記憶體(RSS)430 → 441 MB。
- 更新後如果某個 App 打不出字:請把那個 App 完全結束(⌘Q)再打開。
- 其餘是研究紀錄、契約、評測工具與 CI 的更新。
完整變更:v0.4.7...v0.5.0
常談 SJ-CL-1-68K
善解的常談模型 SJ-CL-1-68K(口語詞頻表,檔案 colloquial.sjlm,SJLM0001 格式;模型命名見 docs/releases/README.md):聊天設定的語意校正多參考一項「這個說法在口語裡常不常見」。只有聊天設定、標準強度、搭配語意校正模型 sj-sr-6-14m(tinylm.sjtl)時核心才會用它(docs/contracts/colloquial-term.md);其他設定不載入也沒差,核心自己判斷。CI 與發布版從這裡下載。這不是輸入法的發行版。
-
檔案:
colloquial.sjlm,4,680,680 bytes -
SHA-256:
2984eeb525a06b12c244b3c04b84641c9a67492486132ebf404198372b684c33 -
內容:一般的二元詞頻表(SJLM0001,不用詞類、不用 KN),詞彙 68,055;折扣 0.75、剪枝 2。它不綁
bigram.sjlm的雜湊(核心當成獨立的一張表讀)。 -
附件:
colloquial-attribution.tsv(2,000,233 bytes,SHA-256eb6fb69abf8d062b80479e20d2b1608381af2a6d51ba96435d62d3ca47015f22):口語池每個來源單位一列(YODAS 影片 id 與網址、Tatoeba 句子 id 與作者、WildChat 與 MASSIVE 的資料集出處與授權),附句數;各來源句數加總 WildChat 3,491、YODAS 90,080、Tatoeba 36,839、MASSIVE 13,485(合計 143,895)。不含任何句子文字。App 一起打包(Resources/LICENSES/)。sj-cl-1-68k.NOTICE.txt(本 repo 的docs/releases/sj-cl-1-68k.NOTICE.txt):四個來源的名稱、授權與連結。
-
產生(P4 的表 T2,
experiments/p4-colloquial/README.md):model-v6 建置時的口語計數counts-colloquial3.pkl(SHA-2561e7a15ef…)加上 Phase 2 的公開口語池的計數,權重各 ×1:# 口語池的計數(和 model-v6 的口語計數同一套斷詞;acg-count.tsv、names-count.tsv 是 model-v6 建置時的兩份計數詞表,SHA-256 前綴 e8757303、5c14a359) python3 experiments/s2/build_counts_text.py --expected --extra-lexicon acg-count.tsv --extra-lexicon names-count.tsv counts-pool.pkl pool.tsv # 口語表(計數檔放在 $S2_WORK 底下;--corpora 一定要給 --out,不會蓋掉 data/lm/bigram.sjlm) python3 tools/build_lm.py --corpora counts-colloquial3.pkl:1 counts-pool.pkl:1 --out data/lm/colloquial.sjlm
口語池
pool.tsv(143,895 句,約 300 萬個漢字)完整 SHA-256:19fdc47430a63e24addf0ad925da090eca0ad0002656c454f757485aa00045da;它由 Phase 2 的資料準備程式建(docs/research-log.md2026-10-18「Phase 2 公開句子池」),已對公開評測集去重、對保留集比對過;池與計數檔不進 repo。這個 Release 的檔案是 P4 當時建的那一份,這一片沒有重建(只用上面的雜湊核對)。 -
量測:P4d(
experiments/p4d-colloquial/README.md)在 chatjudge-2 確認:改對 108、改壞 39,淨值 +69,p 1.1×10⁻⁸,改壞÷改對 0.36。 -
授權:CC BY-SA 4.0(https://creativecommons.org/licenses/by-sa/4.0/ )。口語池的四個來源各自的授權都只要求署名(WildChat-1M:ODC-BY 1.0;YODAS:CC BY 3.0;Tatoeba:CC BY 2.0 FR;MASSIVE:CC BY 4.0),可以併進 BY-SA;model-v6 的口語計數本來就以 CC BY-SA 4.0 隨 model-v6 出貨。YODAS 資料集只給影片 id(查不到頻道名稱),所以照資料集提供的內容署名:資料集名稱、授權、每支影片的 id、網址與句數(
colloquial-attribution.tsv)。完整的署名在sj-cl-1-68k.NOTICE.txt與 App 的Resources/LICENSES/CC-BY-SA-4.0-attribution.txt。 -
不含任何私人對話資料;表裡是詞與詞對的次數,沒有句子文字。
下載:
gh release download sj-cl-1-68k -R Nanako0129/shanjie -p colloquial.sjlm -p colloquial-attribution.tsv -D data/lm
shasum -a 256 -c data/colloquial.sjlm.sha256 data/colloquial-attribution.tsv.sha256建立這個 Release(維護者同意之後;附件三個,雜湊檔核對的是 data/lm/ 的那兩個):
shasum -a 256 -c data/colloquial.sjlm.sha256 data/colloquial-attribution.tsv.sha256 # 上傳前
gh release create sj-cl-1-68k data/lm/colloquial.sjlm data/lm/colloquial-attribution.tsv docs/releases/sj-cl-1-68k.NOTICE.txt \
-R Nanako0129/shanjie --title "常談 SJ-CL-1-68K" --notes-file docs/releases/sj-cl-1-68k.md --latest=false
rm -rf /tmp/check-sj-cl-1-68k && gh release download sj-cl-1-68k -R Nanako0129/shanjie -p colloquial.sjlm -p colloquial-attribution.tsv -D /tmp/check-sj-cl-1-68k/data/lm \
&& (cd /tmp/check-sj-cl-1-68k && shasum -a 256 -c "$OLDPWD/data/colloquial.sjlm.sha256" "$OLDPWD/data/colloquial-attribution.tsv.sha256") # 上傳後會意 SJ-SR-6-14M(語意校正模型)
善解「語意校正」用的小型字元語言模型。這一版是會意(SJ-SR)第 6 版:權重和 tinylm-v5(SJ-SR-5-14M)完全相同,只換了書面設定的融合參數,在現在的書面解碼器(model-v6+kn-v1,書面另用三元表 sj-cx-1-7.7m)上重選。聊天設定的參數不變。這不是輸入法的發行版。
- 檔案:
tinylm.sjtl,14,638,352 bytes - SHA-256:
e7c179d85405ec42a40bb22adb58a7485c58f77aed89dfc2ca76a0d89568ed5e - 格式:SJTL0004(和
tinylm-v5相同,現在的核心都讀得懂)。 - 內容:1,440 萬參數的字元語言模型(6 層、d 384、字表 9,717 個 id;二維權重每列對稱 int8 加 float32 縮放)。只在 n-gram 解碼出的前 8 名候選之間重排,不會產生新的文字。和
tinylm-v5比,只有檔頭的書面融合參數不同(逐欄比對:書面 α、τ、δ 與書面積極檔三個數;字表與 76 個張量逐位元組相同,檔頭 244 bytes 之後沒有任何位元組不同)。 - 融合參數(α、τ、δ;δ 是融合分數要比 n-gram 第一名高出多少才換):
| 設定 | 保守 | 標準 | 積極 |
|---|---|---|---|
| 聊天 | 1、2、3 | 0.3、2、0.25 | 0.3、2、0.25(同標準) |
| 書面 | 1、1、4 | 0.7、2、1(原本 1、1、3) | 0.7、2、1(同標準) |
- 值怎麼選(
docs/contracts/rerank-formal.md§3、§8–§10,研究紀錄 2026-10-17):書面候選與分數用現在出貨的設定重新產生;選值只用 cvtune+wikitune,改對與改壞 1:1 計分;預設檔的改壞率上限 0.5%。原本選出的 0.5、2、0.25 在其他來源的改壞率 1.72%,沒有出貨。維護者要「改對更多、但守住 0.5%」,所以在 0.1%–0.5% 之間的幾個選值上限各選一格,用已看過的資料篩選。0.7、2、1 在已看過的資料上改壞率 0.53%,沒過事先寫的 0.5% 篩選;維護者看過篩選結果後同意把它也送進確認(篩選放寬到 0.6%,確認的門檻不變)。在沒有任何人看過的維基判讀集(第 315,000–319,999 篇)上:0.7、2、1 對原本的書面值改對 39、改壞 11(p 0.0001),改壞率 0.35%;保守檔 0.7、1、1.5 也過,取改對較多的 0.7、2、1。 - 量測,書面設定,對同一個 n-gram 的第一名(改對/改壞;公開集合;錯字回報 133 列):
- 書面標準(=積極):dev302 14/2、打字測驗 1/0、錯字回報 8/1、cvtune 76/4、wikitune 66/6、維基判讀集 84/6 與 67/10、lytune 96/35、維基錯字表 0/0
- 書面保守:dev302 2/0、打字測驗 0/0、錯字回報 0/0、維基判讀集 15/0 與 16/1、lytune 7/1、維基錯字表 0/0
- 保留集(fresh verifier,2026-10-17,建 Release 之前;300 列):書面標準與積極對 n-gram 12/0、對
tinylm-v58/0;書面保守對 n-gram 3/0、對tinylm-v50/0。 - 綁定:檔案記了 model-v6
bigram.sjlm與 kn-v1kn.sjkn的 SHA-256,和tinylm-v5相同;不符就拒絕載入、只用 n-gram。 - 產生:
tinylm-M.npz(SHA-25632308122782d3c5aba8a838521f031a466671d47d48ec0f54dcfb9256451815e,沒有另外發布),用experiments/s7a-tinylm/export_sjtl.py以--type int8 --ngram-model <model-v6> --kn-side <kn-v1> --chat 0.3 2 0.25 --formal 0.7 2 1 --levels 1 2 3 0.3 2 0.25 1 1 4 0.7 2 1匯出。 - 授權:CC BY-SA 4.0(https://creativecommons.org/licenses/by-sa/4.0/ )。訓練文字和
tinylm-v1~v5相同:- 中文維基百科 2026-10-01 dump 的前 20 萬篇條目(CC BY-SA 4.0,署名:Wikipedia contributors)
- Mozilla Common Voice 繁體中文(台灣)的句子(CC0)
- Tatoeba 的中文句子(CC BY 2.0 FR,署名:Tatoeba contributors)
- 台灣口語合成句(gpt-oss-120b 的模型輸出;模型權重本身為 Apache-2.0)
善解 0.4.7
書面設定的選字改看前兩個詞(連文模型),設定裡多了「關於」頁與自動更新,輸入法也有了自己的圖示。
- 這一版要手動更新一次:v0.4.6 以前沒有自動更新。用 Homebrew 裝的請執行
brew upgrade --cask nanako0129/tap/shanjie,其他人下載這一頁的安裝程式。從 v0.4.7 起,之後的版本可以在輸入法裡直接更新。 - 書面設定看前兩個詞:書面設定在解碼時加上三元表「連文」(SJ-CX-1-7.7M,7,700,964 條,跟著通語 SJ-LM-6-9.1M),這時不用 KN 平滑;聊天設定與預測列不變。
- 三元表用唯讀映射載入:活動監視器看到的記憶體(peak footprint)只多約 2 MB;安裝檔多約 48 MB(輸入法的 zip 從 53.3 MB 變成 101.4 MB)。
- 「關於」頁與自動更新(設定→關於):
- 顯示版本,有「自動檢查更新」開關(預設開)與「立即檢查」。
- 自動檢查每天最多一次,只查有沒有新版、不跳視窗;有新版時關於頁與輸入選單出現「更新到 X」,按下才下載安裝(Sparkle 2.9.3)。
- 連線內容:讀 GitHub 上的
appcast.xml,GitHub 看得到你的 IP 與請求標頭;不送任何輸入內容、選字記憶或系統資訊。更新檔安裝前驗證 EdDSA 簽章。關掉開關就不做背景檢查。
- App 圖示:朱紅印章「解」,框與字是兩層玻璃;Finder 與安裝程式都看得到,之後的更新視窗也會用這個圖示。字形取自 Noto Serif CJK TC(SIL Open Font License 1.1)。
- 跨版本比較(v0.4.6 → v0.4.7,出貨設定,
docs/benchmark.md):- 聊天設定:每個評測集合的結果都和 v0.4.6 相同。
- 書面設定:四個集合顯著變好,沒有集合顯著變差。
- wikitune(2,827 句):77.22% → 78.95%(改對 101/改壞 52,p 9.2e-5)
- lytune(4,811 句):84.06% → 84.81%(117/81,p 0.013)
- Discord 聊天評測集(4,958 句):84.27% → 85.07%(138/98,p 0.011)
- cvtune(3,791 句):90.11% → 90.74%(75/51,p 0.04)
- 錯字回報(80 句):26 → 24 句(5/7,p 0.77),不顯著。
- 保留集(換新後的 shard-1,300 句):聊天 234 → 234 句(0/0)、書面 230 → 233 句(7/4,p 0.55)。
- 速度:每鍵延遲和 v0.4.6 相同。兩版在同一台閒置的機器上交錯各跑 5 輪,每鍵 p95 的中位數:聊天 2.94 → 2.85 ms、書面 2.83 → 2.86 ms。
docs/benchmark.md這次的速度欄是另一個重負載同時在跑時量的,兩版都偏慢,不能拿來比(研究紀錄 2026-10-17)。
- 更新後如果某個 App 打不出字:請把那個 App 完全結束(⌘Q)再打開。
- 其餘是研究紀錄、契約與評測工具的更新。
完整變更:v0.4.6...v0.4.7
善解 0.4.6
選字的詞類表換成 classes-v5:只降低詞類項的權重,補回 v0.4.4 起立法院發言語料的退步(書面全數補回,聊天補回約六成)。
- 詞類表 classes-v5:詞類項的權重 μ 從 0.8 降到 0.2,詞類本身沒有改。v0.4.4 起,立法院發言語料(lytune)在兩種設定都顯著變差。歸因結果是書面設定的退步主要來自詞類項和 KN 平滑同時開時互相干擾;聊天設定的退步大多落在語意校正的重排階段,降低 μ 只補回一部分。μ 是在 {0, 0.2, 0.4, 0.6, 0.8} 裡依事先寫好的規則選出的(
docs/contracts/lytune-attrib.md)。 - 跨版本比較(v0.4.5 → v0.4.6,出貨設定,
docs/benchmark.md):- lytune(4,811 句):書面 82.71% → 84.06%(改對 130/改壞 65,p 3.8e-6)、聊天 83.35% → 83.91%(100/73,p 0.048)。
- 其他評測集合在兩種設定都沒有顯著變化。錯字回報聊天 24 → 28 句(5/1)、書面 28 → 26 句(3/5),都不顯著;Discord 聊天評測集兩種設定都只差 1 句。
- 保留集:聊天 191 → 191 句(改對 3/改壞 3)、書面 186 → 187 句(6/5),兩者 p 1。
- 速度(dev302 重播,兩版同一場):每鍵 p95 2.16 → 2.27 ms;語意校正每次重排的 p50/p95 6.41/8.23 → 6.86/9.10 ms;記憶體相同(293 MB)。
- 已知問題:手動加的詞在書面設定可能輸給同音的寫法:手動詞的測試 15 句裡有 1 句(「米雅歌唱得很好」的第一名變成「米亞」),聊天設定 15 句都對。之後另開一片處理(例如提高手動詞的加分)。
- 更新後如果某個 App 打不出字:請把那個 App 完全結束(⌘Q)再打開。
- 其餘是研究紀錄、契約與評測工具的更新。
完整變更:v0.4.5...v0.4.6
連文 SJ-CX-1-7.7M(書面設定的 trigram 表)
善解的連文模型 SJ-CX-1-7.7M(trigram 表,檔案 trigram.sjt3,SJT30001 格式;模型命名見 docs/releases/README.md),要和 model-v6 的 bigram.sjlm 一起用,放在同一個資料夾,核心會自動載入;只有書面設定用它(同時關掉 KN),聊天設定與預測列不用。CI 與發布版從這裡下載。這不是輸入法的發行版,也不含語言模型本身。
- 檔案:
trigram.sjt3,143,643,936 bytes - SHA-256:
fdd3b05d8c18cf85da434443d4fabbbfebf31e8c97a04e00e4a339bbe19eec84 - 綁定的模型:model-v6(
bigram.sjlm,SHA-256fc2bddd1…8b2cde42)。檔頭記了模型的 SHA-256 與詞彙數,配到別的模型會載入失敗。 - 內容:4,101,808 個兩詞前文、7,700,964 個「前兩個詞之後接哪個詞」的次數,以及每個前文剪枝前的總次數(插值絕對折扣,D = 0.75)。
- 產生:derisk-1015 的 E1a 用 model-v6 的配方重算計數(維基 20 萬篇與口語語料,多算一張 trigram 表),E1e 用相對熵剪枝留下分數最高的 7,700,964 條(H3),再用
experiments/derisk-1015/e1/remap_tri.py(commit6c52e7f)把詞 id 換成 model-v6 的並綁定雜湊,輸出就是這個檔。tools/build_trigram.py是之後移進tools/的同一個演算法(只換了讀寫檔的函式),沒有拿它重跑這個檔。量測與判讀見docs/contracts/derisk-1015.md(E1e、E1g、E1h)、docs/contracts/trigram-core.md與研究紀錄 2026-10-16。 - 授權:CC BY-SA 4.0(https://creativecommons.org/licenses/by-sa/4.0/ ),和 model-v6 相同:由同一批語料的詞頻計數而來(見 model-v6 的說明)。
- 不含任何私人對話資料。
下載:
gh release download model-v6 -R Nanako0129/shanjie -p bigram.sjlm -D data/lm
gh release download classes-v5 -R Nanako0129/shanjie -p classes.sjc -D data/lm
gh release download kn-v1 -R Nanako0129/shanjie -p kn.sjkn -D data/lm
gh release download sj-cx-1-7.7m -R Nanako0129/shanjie -p trigram.sjt3 -D data/lm善解 0.4.5
中英混打可以不按空白直接打英文,選了的英文會留在組字區,和中文一起送出。
- 英文的顯示(設定的「選字」,中英混打開關下面):預設「打字時就顯示」。打英文單字時,打到 3 個字母以上、而且看得出是單字表裡某個字的開頭(有按鍵把注音的同一欄取代掉),組字區就直接顯示字母,不用按空白;短的字、或按鍵剛好拼成正常注音的字,打的當下仍是注音,按空白照 v0.4.4 開英文窗。改成「按空白才顯示」時,打字當下一律顯示注音、按空白才開英文窗,和 v0.4.4 相同;下面「英文留在組字區」的第一點、Shift 英文段與逐字母刪除,兩種設定都有。
- 英文留在組字區:
- 從英文窗選了英文,英文留在組字區,可以接著打中文,Enter 一次送出(例如「我在用rust編譯」);以前選了英文會立刻送出。兩種顯示設定都一樣。
- 「打字時就顯示」時,字母顯示著、打完一個完整的單字之後直接接著打注音,英文會自動留下,不必按空白。
- Shift+字母打一段英文:中英混打開著時,按住 Shift 打的第一個字母開始一段英文(例如
Windows、iPhone),粗底線標出這段,旁邊有一行提示。按一下空白結束這段英文,再按一下才是空白。 - 英文可以改寫法:游標緊接在英文後面時按 ↓,可以換成小寫、首字大寫、全大寫;打完英文直接接中文而自動留下的英文,清單最後還有同一串按鍵打出的中文字(詞庫裡有那個音才有),想打的其實是中文時可以換回來。
- 英文逐字母刪除:Backspace 一次刪一個字母,剩下的字母可以接著打。「打字時就顯示」時,如果英文剛好是個完整的字、打錯的下一個字母讓它自動留下並開始一個注音(例如
rusr:rus是字,最後的r變成 ㄐ),按 Backspace 刪掉那個注音,英文會回到可以接著打的樣子;從英文窗選的英文、Shift 打的英文段不會這樣,刪掉後面的注音之後照舊打注音。 - 中英混打仍是實驗功能,預設關;只支援標準鍵盤排列。
- 跨版本比較(v0.4.4 → v0.4.5,出貨設定,
docs/benchmark.md):- 選字結果沒有變:十個評測集合在聊天與書面兩種設定都是改對 0、改壞 0,保留集聊天 191/227、書面 186/227 也和 v0.4.4 相同。評測時中英混打是關的(和預設一樣),所以這些數字不涵蓋中英混打開著時的情況。
- 速度(dev302 重播,兩版同一場、中英混打關):每鍵 p95 2.42 → 2.34 ms;語意校正每次重排的 p50/p95 6.80/8.71 → 8.08/12.16 ms,變慢的原因沒有查。中英混打開著時每鍵多做的字首查詢沒有量過。
- 更新後如果某個 App 打不出字:請把那個 App 完全結束(⌘Q)再打開。
完整變更:v0.4.4...v0.4.5
善解 0.4.4
設定視窗改版、新模型 model-v6,加上實驗性的中英混打與語意校正強度。
- 設定視窗:改成像「系統設定」那樣左邊一列分類(一般、選字、外觀、選字記憶),右邊是那一類的設定。視窗最高只到螢幕可用的高度,放不下的部分可以捲動;之前在筆電上設定視窗會從選單列一路長到 Dock 底下(Discord 回饋)。設定項目都沒有改。
- 選字模型 model-v6:計數時常見專有名詞也當成斷詞的詞,口語合成句多補 50 萬字,拿掉粵語用字的疊加層詞,並開啟 Kneser–Ney 平滑(
kn-v1)。動漫與遊戲詞包拿掉 106 個會把詞庫裡的詞擠下第一名的詞(例如「家母」不再被「加姆」蓋過)。語意校正換成在新候選上重新調過參數的tinylm-v5。各評測集的數字見 model-v6 的說明。 - 常見專有名詞:品牌、學校等常見專有名詞有自己的一層詞表(名單),打這些名字時比較容易一次選對。另外加入少數手動加的詞,手動詞的加分從 0.5 提高到 0.75。
- 選字記憶:開 KN 時,學到的詞不經過 KN 的分數替換,所以改選過的詞照樣排在前面。
- 語意校正強度:設定的「選字」可以選「保守/標準/積極」,預設「標準」。這一版「積極」和「標準」的值相同(積極沒有通過出貨門檻,暫時寫成標準);書面設定的「標準」值改成在新候選上選出的值(見
tinylm-v5的說明),所以書面的語意校正和 v0.4.3 不完全一樣。 - 中英混打(實驗,預設關):打開後,直接照英文鍵位打一個英文單字、按空白鍵時,候選窗會出現那個英文字可以選,不必切換輸入法;不會自動送出。在設定的「選字」裡開關,只支援標準鍵盤排列。
- 跨版本比較(v0.4.3 → v0.4.4,出貨設定,
docs/benchmark.md):- 錯字回報(書面)28/80,比 v0.4.3 多對 6 句、沒有改壞(p 0.031);wikitune 兩種設定多對 8/14 句(不顯著);dev302、打字測驗、cvtune、wikitypo 大致持平。
- 立法院發言語料(lytune,4,811 句)變差:聊天少對 45 句(改對 40/改壞 85)、書面少對 42 句(54/96),兩者都顯著。原因還沒確認:推測和新的詞類表有關(另一個還沒合併的實驗量到:出貨的 model-v6 關掉詞類表,在以 lytune 為主的評測集多對 42/51 句,但聊天語料反而變差),聊天設定也有一部分在語意校正那一步。下一片做歸因,結果決定下一版要不要換詞類表。
- 使用者端的評測都沒有顯著變差:錯字回報聊天 25 → 24 句、聊天評測集兩種設定少 11/14 句、保留集聊天持平(改對 3、改壞 3)、書面少 3 句(2/5),都不顯著。
- 每鍵延遲(dev302 重播)p95 2.2 → 2.8 ms、最大 9.8 → 7.6 ms;記憶體 289 → 294 MB。
- 更新後如果某個 App 打不出字:請把那個 App 完全結束(⌘Q)再打開。更新時舊的輸入法程序會被換掉,少數已經開著的 App 不會自己重新連上新的程序(2026-10-15 在 Orca 等 App 上遇到過,原因還在查)。
- 其餘是評測工具、研究紀錄與文件的更新。
完整變更:v0.4.3...v0.4.4
classes-v5:詞類表(μ 0.2,配 model-v6)
善解的詞類表(classes.sjc),要和 model-v6 的 bigram.sjlm 一起用,放在同一個資料夾。CI 與發布版從這裡下載。這不是輸入法的發行版,也不含語言模型本身。
- 檔案:
classes.sjc,5,656,826 bytes - SHA-256:
9e36fa1be4518adb34bcddc2c79761006b0b06c539aa64a4564ba00397cf0262 - 綁定的模型:model-v6(
bigram.sjlm,SHA-256fc2bddd1…8b2cde42)。檔案裡記了模型的 SHA-256,配到別的模型會載入失敗。 - 和 classes-v4 的差別:只改了詞類項的權重 μ,0.8 → 0.2(檔頭位移 44 的 8 個位元組),詞類、發射機率與類別接續機率都相同。μ 是在出貨設定(model-v6+kn-v1+tinylm-v5)上掃描 {0, 0.2, 0.4, 0.6, 0.8} 選出的:v0.4.4 起 lytune 顯著變差,歸因到詞類項和 KN 同時開的交互作用,降低 μ 把它拿回來,其他評測集合沒有顯著變差(
docs/contracts/lytune-attrib.md、docs/research-log.md2026-10-16)。 - 產生:
python3 experiments/lytune-attrib/set_mu.py classes-v4/classes.sjc classes.sjc 0.2(印出 SHA-256 與讀回的 μ),規格見docs/contracts/classes-v5.md。 - 授權:CC BY-SA 4.0(https://creativecommons.org/licenses/by-sa/4.0/ ),和 model-v6 相同:由同一批語料的詞頻計數而來(見 model-v6 的說明)。
- 不含任何私人對話資料。
下載:
gh release download model-v6 -R Nanako0129/shanjie -p bigram.sjlm -D data/lm
gh release download classes-v5 -R Nanako0129/shanjie -p classes.sjc -D data/lm
gh release download kn-v1 -R Nanako0129/shanjie -p kn.sjkn -D data/lm善解 0.4.3
選字的修正:解碼時不再太早丟掉「最後一個詞不同」的斷法。
- 選字:
- 下一個詞接得順不順,要看前面最後一個「詞」是什麼。v0.4.2 以前,解碼器在每個位置,同樣的字只留分數最高的一種斷法,可能把後面接得比較順的那一種提早丟掉。例如書面設定(非聊天 App)打
ㄒㄧㄚˋ ㄌㄞˊ ㄈㄣ ㄒㄧ:單看前兩個字,「下來」比「下|來」好,留下了「下來」;但接「分析」時是「來→分析」比較順,結果整句出現「夏來分析」。 - 這一版起,同樣的字、最後一個詞不同的斷法會分開保留,這句變成「下來分析」。
- 評測(v0.4.2 → v0.4.3):公開評測集與保留集,聊天、書面兩種設定,每個集合改對的列數都不少於改壞的列數;立法院發言語料(lytune)四種組合都顯著變好。數字在
docs/research-log.md(2026-10-14 解碼器合併一節)與docs/benchmark.md。 - 名單裡同樣的句子只列一次之後,n-best 變短,有幾個集合「正解在前 64 名」的列數少了 1–4 列(例如 typing76 聊天 76 → 75);第一名與語意校正用的前 8 名不受影響。
- 每鍵延遲(dev302 重播的 p95)v0.4.2 3.3 ms、v0.4.3 4.0 ms;記憶體兩版都約 290 MB(
docs/benchmark.md)。
- 下一個詞接得順不順,要看前面最後一個「詞」是什麼。v0.4.2 以前,解碼器在每個位置,同樣的字只留分數最高的一種斷法,可能把後面接得比較順的那一種提早丟掉。例如書面設定(非聊天 App)打
- 其餘是評測工具、研究紀錄與文件的更新。
完整變更:v0.4.2...v0.4.3