jtok-eucalyptus-v3

日本語向けの BPE トークナイザ(語彙 49,152、v3 系列)。HF tokenizers 形式で、前処理なしで任意の文字列を decode(encode(text)) == text で復元できます。

v1 / v2 との非互換について

v1 系列(j-llm/j72-tokenizer)・v2 系列(j-llm/j48-tokenizer-v2 ほか)は SentencePiece Unigram で、本モデルとは方式・コーパス・語彙がすべて異なります。トークン ID 列と分割結果に互換性はありません。

ファイル

ファイル 内容
tokenizer.json HF tokenizers のトークナイザ本体
tokenizer_config.json / special_tokens_map.json transformers の AutoTokenizer 用設定
tokenizer.sha256 tokenizer.json の SHA-256

tokenizer.json の SHA-256:

8bee9b74eed12955041e29670e046edde9b7ee68ed8ca3be8227501a691d7f52

仕様

項目 値
方式 BPE(byte fallback あり)
語彙数 49,152(学習で得たトークン 48,863、merge 39,176)
最大トークン長 15 文字
正規化 なし
pre-tokenizer 空白文字(\n \t 半角空白 U+3000)の連続を 1 区切りとして分離し、数字は 1 桁ずつ分割
空白の扱い 空白は他の文字と結合しません。空白同士の連続(\n\n など)だけが 1 トークンになり得ます
decoder ByteFallback + Fuse(▁ への置換なし)
post-processor なし(encode は BOS/EOS を付与しません)

予約 ID

ID トークン 種別
0–3 <unk> <s> </s> <pad> 特殊トークン
4–7 <|system|> <|user|> <|assistant|> <|turn_end|> 特殊トークン(チャット用)
8–11 <|cast|> <|outline|> <|scene|> <|story|> 追加トークン(小説の登場人物・あらすじ・場面・本文の見出し用)
12–27 <character0> 〜 <character15> 追加トークン(登場人物の枠)
28–32 \n\n \n \t 半角空白 U+3000 空白
33–288 <0x00> 〜 <0xFF> byte fallback

ID 8–27 は special=False の追加トークンです。本文中に同じ文字列(例: <|cast|>)がそのまま現れた場合も、その ID に変換されます。ID 0–7 は、下記「注意」の設定で使う限り、本文中の同じ文字列からは生成されません。

学習データ

約 30 億字(3,000,051,617 字)。重複除去と評価用データとの漏洩除外を行ったうえで、文字数基準で次の比率に配合しました。

分野 比率 主な出典
小説 46.5% web 小説
小説(R18) 10.1% web 小説
一般 13.5% FineWeb-2 Edu(日本語)ほか
ノンフィクション 8.4% Wikipedia 日本語版
難解文 7.5% 文語体・学術書・古文・漢文訓読など
技術文書 6.9% WARP PDF(llm-jp-corpus v4)ほか
古典 4.4% 国立国会図書館のパブリックドメイン資料、Pleias の日本語パブリックドメイン資料
会話 2.7% 国会会議録

供給の少ない分野(小説 R18 と難解文)では、同じ文書を最大 2 回まで採用しています(合計 5,003 万字)。

品質検査

評価用 11,196 文書(各分野の評価データ、英語、ソースコード)とストレステキスト 32 件で、次の項目をすべて満たすことを確認しています。

  • decode(encode(text)) == text(skip_special_tokens の有無の両方)
  • 空白・数字が pre-token の境界を越えて結合しないこと
  • 本文中の制御文字列(<s> </s> <|system|> など)から ID 0–7 が生成されないこと
  • transformers の PreTrainedTokenizerFast と ID 列が一致すること
  • llama.cpp で GGUF に変換した場合と ID 列が一致すること

評価データでの圧縮率は平均 1.96 字/トークンです。

使い方

from transformers import AutoTokenizer

tok = AutoTokenizer.from_pretrained("j-llm/jtok-eucalyptus-v3")
text = "吾輩は猫である。\n名前はまだ無い。"
ids = tok.encode(text)
assert tok.decode(ids) == text

tokenizers だけで使う場合:

from huggingface_hub import hf_hub_download
from tokenizers import Tokenizer

tok = Tokenizer.from_file(hf_hub_download("j-llm/jtok-eucalyptus-v3", "tokenizer.json"))
tok.encode_special_tokens = True   # 本文中の "</s>" などを特殊トークンとして解釈しない
ids = tok.encode("吾輩は猫である。", add_special_tokens=False).ids

注意

  • 本文中の <s> </s> <|user|> などの文字列は、特殊トークン(ID 0–7)ではなく通常の文字列として分割する前提です。AutoTokenizer では同梱の設定(split_special_tokens: true)でこの動作になります。tokenizers を直接使う場合は encode_special_tokens = True を設定してください。特殊トークンは ID を直接挿入してください。
  • tokenizers の一部の版(0.23.3 で確認)は encode_special_tokens を無視します。tok.encode("</s>").ids が [2] になる場合は、tokenizer.json の added_tokens から ID 0–7 を除いて読み込んでください(ID と decode 結果は変わりません)。動作確認は tokenizers 0.22.2 / transformers 4.57.6 で行っています。
  • encode は BOS/EOS を付与しません。必要な場合は呼び出し側で ID 1 / 2 を追加してください。
  • 空白を前の語に溶かし込まないため、空白の多い英語やソースコードでは、Metaspace 方式のトークナイザよりトークン数が増えます。

ライセンス

Apache License 2.0

Downloads last month

-

Downloads are not tracked for this model. How to track
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support