← 返回 Session 9

Lab Session 9 · Tokenization

中文 Tokenization 公平性研究平台

同一句話寫成不同字形與不同地區用詞,送進同一個 BPE tokenizer,會得到不同長度的 token 序列。 這個差異常被含糊地稱為「方言稅」。本頁把它拆開來問:那到底是字形的代價,還是詞彙的代價?

怎麼讀這一頁
  1. 先看上面那兩排橫條:紫色是字形造成的差距,金色是詞彙造成的差距。橫條上的細線是 95% 信賴區間,穿過 0 就代表證據不足。
  2. 第 1 節可以換句子,看六個版本各要花幾個 token。
  3. 第 2 節把 token 攤開來看,紅色方塊是被拆成位元組碎片的漢字——差距主要就是它造成的。
  4. 第 4 節是詞表本身的內容。那一節不需要統計就看得懂,但可能是整頁最值得討論的部分。

想看舊版的三欄比較(以及它為什麼會誤導),見 v1 探索器。

01

研究設計:把混淆的兩個因子拆開

舊版比較「台灣繁體/中國簡體/香港繁體」三欄。問題在於這三欄同時變動了兩件事: 字形(繁/簡)與 詞彙(軟體/软件/軟件)。 兩者的成因與解法完全不同,混在一起量,得到的數字無法解釋。 這裡改成完全交叉的 2×3 設計:詞彙欄由人工撰寫,字形欄用 OpenCC 逐字轉換機械生成。 斜線底紋的四格在社會語言學上並不自然(沒有人用簡體字寫台灣用語),它們是控制條件, 功能與心理語言學實驗中的假詞相同:用來分離 tokenizer 反應的是什麼,而不是讀者會寫什麼。

右欄與底列為邊際平均(該列/該行的平均 token 數)。 紅色數字是 byte-fallback token 數:字元在詞表裡沒有自己的位置,只能被拆成 UTF-8 原始位元組。

02

切分機制:差異從哪裡來

把同一句話的六個版本並排看 token 串,差異的來源會直接顯示在表面上。 繁體版本裡大量出現的紅色方塊,是被拆成位元組碎片的漢字——它在詞表中沒有對應項目, 於是每出現一次就付 2 到 3 個 token。這不是統計上的頻率問題,而是覆蓋率問題。

多字 token(詞表中的整塊) 單字 token byte fallback(字元碎片)

03

效果分解

每個項目都出現在全部六格,因此分析單位是項目內對比。 點估計為各項目差值的平均,區間為 10,000 次配對 bootstrap 的 95% CI, 檢定為 Wilcoxon 符號秩檢定,效果量為 rank-biserial 相關。

04

詞表考古:這份詞表是誰的詞典?

tokenizer 的詞表可以當成一份詞典來讀。它是某個語料庫裡「夠常見」的形式單位清單, 在某個時間點凍結,然後隨模型出貨給所有使用者。用讀詞典的方式問兩個問題: 裡面收了誰的字?那些多字條目又是什麼性質的單位?

詞表中最長的純漢字 token

依 token 字串長度排序。這份清單是訓練語料的化石紀錄。

05

構式完整性:BPE 能學到什麼樣的單位

從構式語法的角度看,BPE 的詞表是一份構式庫(constructicon),但只能容納其中一類: 實體的、連續的、高頻的形式。凡是帶開放槽位(越 X 越 Y)、或可被插入成分打斷(洗澡 → 洗了個澡)的構式, 原則上無法成為一個 token。下表逐一檢查。

判讀方式:若「典型形式」需要多個 token,表示該構式在詞表中根本不存在為單位; 若典型形式是單一 token 而「變體形式」被拆開,則顯示該單位的辨識依賴表層連續性, 而非構式身分。兩種結果都對「tokenizer 隱含的詞彙理論」有話可說。

06

代價換算

token 數本身不是使用者的經驗。使用者經驗到的是兩件事:同樣的錢買到多少內容, 以及同樣的 context window 裝得下多少字。下表把 tokens/字換算成這兩個量。

價格與 context 長度是佔位值,寫在 metrics.py 的 PRICE_USD_PER_MTOK 與 CONTEXT_TOKENS。引用前請自行更新並註明查詢日期。

07

自己試

輸入任意文字,即時切分並計算同一組指標。字形欄由 OpenCC 產生的部分在此不可用, 請自行輸入要比較的兩段文字。

載入 tokenizer…

08

方法、限制與重現

語料說明(datasheet)

    已知限制

    • 詞彙欄為作者自撰而非語料抽樣,因此不能推論到「一般文本」。要做那個推論, 需要以維基百科的 zh-tw/zh-cn/zh-hk 自動轉換版本,或 FLORES-200 的 zho_Hant/zho_Hans 平行句對作為抽樣框,見 run_study.py 的說明。
    • 香港欄的效度最弱。標記為 hk_confidence="low" 的項目混入了書面粵語, 那是語法差異而非詞彙差異,會污染詞彙效果的估計。這些項目應由香港母語者校訂後才可引用。
    • 只測了兩個 OpenAI tokenizer。Llama、Qwen、Gemma、DeepSeek、XLM-R 的詞表由不同語料訓練, 方向未必相同;「誰訓練詞表」本身就是可測的變項。
    • token 數差異與下游表現差異是兩件事。本頁只量前者。

    重現

    cd lab/session-9/tokfair
    python run_study.py --ranks ranks --out data/study.json
    python build_web.py --study data/study.json --out ../zh-tokenizer.html