tw-tokenizer-v1
為台灣繁體中文從零訓練的 byte-level BPE tokenizer。
中文壓縮率比 Qwen3.8-27B 高 46%,vocab 只有它的 81%,英文效率幾乎持平。
規格
| vocab | 200,000 + 1,069 特殊 token = 201,069 |
| 演算法 | byte-level BPE |
| normalizer | NFC(非 NFKC——NFKC 會把全形英數轉半形、拆解「㈠」) |
| 純漢字 token 上限 | 6 字 |
| 訓練語料 | 19.27 億字元(繁中 60.6% / 英文 22.8% / 程式碼 10.4% / 數學 6.2%) |
壓縮率(held-out,訓練語料零重疊)
單位為字元/token,越高越省。
| tokenizer | vocab | 中文平均 | 英文 |
|---|---|---|---|
| 本詞表 | 201,069 | 2.026 | 4.657 |
| Qwen3.8-27B | 248,044 | 1.388 | 4.674 |
| DeepSeek-V4 | 128,000 | 1.369 | 4.855 |
| gemma-4-31B | 262,144 | 1.282 | 4.735 |
中文各領域細分:判決書 2.516 / 翻譯繁中 2.267 / 中文網頁 1.983 / 文言 1.796 / 政府文書 1.481。
切分品質
壓縮率高不代表切得對,所以另外量了切分邊界(以 jieba 繁中斷詞為參考)。
| tokenizer | 字/token | 切點命中詞邊界 | 單字 token 佔比 |
|---|---|---|---|
| 本詞表 | 2.169 | 85.6% | 17.6% |
| Qwen3.8-27B | 1.475 | 77.8% | 41.7% |
| DeepSeek-V4 | 1.391 | 74.9% | 49.6% |
專業素養、特質或經公告審查優勝
本詞表:['專業素養', '、', '特質', '或經', '公告', '審查', '優勝']
Qwen :['專業', '素', '養', '、', '特質', '或', ...] ← 「素養」被拆成兩字
下游驗證
用兩個詞表各從零訓練一顆 270M 模型(同架構、同資料來源),以 bits-per-character 比較——BPC 以字元數為分母,是唯一能跨詞表公平比較的指標。
| 條件 | 本詞表 | Qwen 詞表 | |
|---|---|---|---|
| 等算力(各 200M token) | 4.434 | 4.591 | 本詞表低 3.4% |
| 等文字量(各 4 億字元) | 4.595 | 4.379 | Qwen 低 4.7%(但多花 43% 算力) |
等算力下本詞表勝出,且是在參數少 13%(229M vs 259M,因 vocab 較小)的條件下。等文字量下 Qwen 勝出屬預期——它用了 43% 更多的算力跑同樣內容。
實務上算力才是限制,所以等算力那組是主要結論。
詞表污染稽核
逐一檢查全部 201,069 個 token。
| 數量 | 佔比 | |
|---|---|---|
| 含漢字 token | 146,339 | 72.8% |
| 含異體字 | 0 | 0% |
| 含簡體專屬字 | 55 | 0.04% |
那 55 個逐一判讀後,多數為誤報:叁(大寫數字,判決書與契約的法定寫法)、恒(人名)、咨(咨文)、卺(合卺)。真簡體約 8 個單字 token。
對照:Qwen3.8-27B 有 27,364 個簡體專屬的多字 token(佔其詞表 11%)。
特殊 token
具名 45 個 + 保留 1,024 個。ChatML 風格。
| 類別 | 內容 |
|---|---|
| 核心 | <|pad|> <|bos|> <|eos|> <|unk|> |
| 對話 | <|im_start|> <|im_end|> <|system|> <|user|> <|assistant|> <|tool|> |
| 思考 | <|think_start|> <|think_end|> <|no_think|> |
| 工具 | <|tool_call_start|> <|tool_result_start|> <|tool_schema_start|> … |
| 語音 | <|audio_start|> <|task:asr|> <|task:tts|> <|duplex_user|> … |
| 視覺 | <|image_start|> <|video_start|> <|task:ocr|> … |
| 文件 | <|doc_start|> <|page_sep|> <|table_start|> <|cite_start|> … |
| 保留 | <|reserved_0000|> … <|reserved_1023|> |
保留 1,024 個是為了讓未來加新功能時能直接改名,不必擴充 embedding 重訓。
用法
from transformers import AutoTokenizer
tok = AutoTokenizer.from_pretrained("lianghsun/tw-tokenizer-v1")
tok.tokenize("中華民國憲法增修條文第十條")
# ['中華民國憲法', '增修條文', '第十條']
tok.apply_chat_template(
[{"role": "user", "content": "..."},
{"role": "assistant", "reasoning": "...", "content": "..."}],
tokenize=False, enable_thinking=True)
語料前處理
順序不可顛倒:
- 異體字正規化(12.7 萬處)——爲→為、裏→裡、麽→麼、著→着等。不做的話同一個詞會學出兩套 merge
- 陸用語整列丟棄——55 個無歧義詞(質量、身份、通脹、網絡…),命中即丟整列。不改寫、不使用 OpenCC 整段轉換
- NFC
- 近似去重——判決書實測近似重複率 23%
法律語料不套第 2 步:「制作」(刑事訴訟法第 39 條)、「公安」(同法第 10 條)是法定用語。
已知限制
- 台語羅馬字支援不佳。台語漢字表現優於對照組(1.683 vs Qwen 1.391),但台羅拼音(
á、î、iann)會被拆得很碎。訓練語料中台語僅 4.7 萬字元 - 下游驗證規模小。270M 參數、200M token,遠低於實用規模。結果支持但不證明大模型上也成立
- vocab size 未達邊際遞減點。64K→200K 的掃描顯示增益仍在遞減但未轉平,更大的 vocab 可能還有空間
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support