zxell.ai トークナイザ比較レポート(再生成版)
作成日: 2026-09-27((省略: 原版が失われた経緯)本書は 2026-09-05 に新サーバで再学習したモデルから再生成。数値は 8/13 時点のレポートと小数第 3 位まで一致している)
対象: zxell_prep/train_compare_tokenizers.py による SentencePiece BPE 48k / 64k の学習と比較。モデル本体: sp_bpe_48k.model(採用)/ sp_bpe_64k.model(比較用)。語彙のテキスト一覧: sp_bpe_48k.vocab(48,000 行、「ピース␉スコア」)。
1. 結論
語彙 48k を採用。 コーパス全体の推定トークン数は 6.14B(実測 6.152B、9/5 の全量トークン化で確定)。
64k は総トークン数を 3%(0.18B)減らすだけで、埋め込み層が 33% 太る(S モデルでは 48k×384 = 18.4M パラメータが 64k×384 = 24.6M になり、総 30M の大半を埋め込みが占める)。 2GB VRAM の GTX 1050 で S を回す前提では 48k が妥当。RTX 3060 が合流した現在も、埋め込みの肥大が S/M の「本体の学習能力」を圧迫する構図は同じなので判断は変えない。
2. 学習データ(サンプル)
extract_sample.py でスナップショットから抽出(全言語 id%20==0 の 5% + ja は id%4==0 に増量)。 9/5 実測(旧 8/13 の稼働 DB 版と 0.2% 以内で一致):
| 言語 | 学習用記事 | 学習用文字数 | 評価用記事(学習に未使用) | 評価用文字数 |
|---|---|---|---|---|
| en | 193,917 | 829.9M | 3,000 | 13.28M |
| de | 98,657 | 291.2M | 2,028 | 5.71M |
| fr | 53,944 | 129.3M | 1,094 | 2.57M |
| ja | 207,976 | 111.8M | 3,000 | 1.72M |
抽出 567,982 行 / link 重複 2,164 / 空 2,202 / 所要 315 秒(新サーバ)。
トークナイザ学習用ファイル sp_train.txt は言語別の文字数上限で配分(en 120M / de 85M / fr 70M / ja 65M 字。合計 340,379,150 字、192,625 文)。自然比率のままだと ja は 1.5% しか入らず日本語の語彙が育たないため、 トークナイザ学習に限り ja を約 19% まで厚くしている(学習データ本体の配分とは別)。
3. 学習条件
model_type=bpe, character_coverage=0.9995, byte_fallback=True(UNK を出さずバイト列へ)
split_digits=True(数字は 1 桁ずつ)、normalization_rule_name=nmt_nfkc
max_sentence_length=16384, input_sentence_size=2,000,000, shuffle=True
学習時間(Ryzen 3 4300U、AVX2 あり): 48k 約 84 秒 / 64k 約 86 秒(旧 Celeron N3350 では各約 4 分)。 Alphabet size 2,177 / 文字カバレッジ 99.95%。
4. 圧縮効率(評価セット、学習に未使用)
| 言語 | 48k 字/トークン | 64k 字/トークン | 48k 推定コーパストークン | 64k 推定 |
|---|---|---|---|---|
| en | 4.185 | 4.289 | 3.87B | 3.77B |
| de | 4.181 | 4.349 | 1.36B | 1.31B |
| fr | 3.800 | 3.922 | 0.67B | 0.65B |
| ja | 1.945 | 2.033 | 0.24B | 0.23B |
| 合計 | 6.14B | 5.96B |
推定はフェーズ0 実測の言語別総文字数 × 重複除去後の残存率 0.947 ÷ 字/トークン。 9/5 の全量トークン化の実測は 6.152B(推定との差 0.2%)、言語構成は en 64.6% / de 21.7% / fr 10.0% / ja 3.7%(トークンベース)。
5. 語彙(48k)の中身
ピース 48,000 個の文字種構成(機械分類):
| 種別 | 個数 | 備考 |
|---|---|---|
| ラテン文字(en/de/fr) | 29,463 | 61% |
| 漢字のみ | 7,003 | |
| 漢字+かな混在 | 6,447 | 「首相は」「対策を」のような文節単位 |
| かなのみ | 4,479 | |
| バイトフォールバック | 256 | <0x00>〜<0xFF> |
| 数字 | 10 | 0〜9(split_digits のため 1 桁ずつ) |
| 記号・その他 | 342 |
日本語のピースが合計約 18,000(37%)を占める。ja 増量サンプリングの効果。
6. 分割の実例(48k モデル)
en: The central bank raised interest rates for the third time this year.
␣The | ␣central | ␣bank | ␣raised | ␣interest | ␣rates | ␣for | ␣the | ␣third | ␣time | ␣this | ␣year | .
68 字 → 13 トークン(5.23 字/トークン)
de: Die Bundesregierung hat ein neues Konjunkturpaket beschlossen.
␣Die | ␣Bundesregierung | ␣hat | ␣ein | ␣neues | ␣Konjunktur | p | aket | ␣beschlossen | .
62 字 → 10 トークン(6.20)。複合語 Konjunkturpaket は 3 分割
fr: Le gouvernement a annoncé de nouvelles mesures économiques mercredi.
␣Le | ␣gouvernement | ␣a | ␣annoncé | ␣de | ␣nouvelles | ␣mesures | ␣économiques | ␣mercredi | .
68 字 → 10 トークン(6.80)
ja: 政府は水曜日に新しい経済対策を発表した。
␣政府は | 水曜 | 日に | 新しい | 経済 | 対策を | 発表した | 。
20 字 → 8 トークン(2.50)。「政府は」「対策を」「発表した」と意味単位で切れている
短い整った文では評価セット平均(4.2 / 4.2 / 3.8 / 1.9)より効率が良く出る。評価セット側には URL・数字・固有名詞・HTML 残骸が含まれるため、そちらが実効値。
7. 既知の注意点
- ja の字/トークン 1.95 は他言語の半分以下。ja の 0.4G 字は 0.24B トークンにしかならず、学習データ中の ja 比率はトークンベースで 3.7%。日本語能力の評価では「データが薄い」ことを前提に見る必要がある
- ja 記事の重複連結(review19/20): title+description+content の素朴な連結で同じ文が 2〜3 回繰り返される記事が多かった。2026-09-27 に
textprep.compose_jaで「後続部分の冒頭に既に含まれている部分は連結しない」改良を実装(効果の実測値は review20)。再エンコード後は ja のトークン数が数%〜十数%減る見込み - HTML 残骸: 一部フィードの本文に
<p><img src=…>等のタグが生で残っている。規模調査と対処は review20 の確認事項 - 評価セットの de/fr は 2,028 / 1,094 記事とやや少ない(5% サンプル × 50 記事に 1 件の上限)。字/トークンの推定精度としては十分だが、モデル評価(パープレキシティ)にはシャード側の val/test を使う
zxell.ai