Transformers documentation

トークナイザーのカスタマイズ

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v5.22.1).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

トークナイザーのカスタマイズ

Tokenizersは、学習された語彙から分離されています。これにより、学習用の空のトークナイザーを初期化したり、独自の語彙を直接指定して作成したりできます。基盤となるトークナイズ処理パイプライン(正規化器、プレトークナイザー、トークナイズアルゴリズム)は同じなので、ゼロから作り直す必要はありません。

このガイドでは、カスタムトークナイザーの学習と作成方法を示します。

トークナイザーの学習

空の学習可能トークナイザーは、語彙を新しいターゲット語彙に置き換えます。これは、金融のような新しいドメイン、低リソース言語、またはコードへの適応に役立ちます。

空のトークナイザーを作成し、データセットを読み込みます。

from datasets import load_dataset
from transformers import GemmaTokenizer

tokenizer = GemmaTokenizer()
dataset = load_dataset("Josephgflowers/Finance-Instruct-500k", split="train")

TokenizersBackend.train_new_from_iterator() メソッドを使用して、トークナイザーを学習します。このメソッドは、データセット全体を一度にメモリに読み込まずに、ジェネレーター関数を通じてテキストのチャンクを返すことを受け入れます。vocab_size 引数は、トークナイザーの語彙サイズを設定します。

def batch_iterator(batch_size=1000):
    for i in range(0, len(dataset), batch_size):
        yield dataset[i : i + batch_size]["assistant"]

trained_tokenizer = tokenizer.train_new_from_iterator(
    batch_iterator(),
    vocab_size=32000,
)
encoded = trained_tokenizer("The stock market rallied today.")
print(encoded["input_ids"])
[5866, 11503, 98, 5885, 8617, 13381, 30]

new_special_tokens 引数で新しい特殊トークンを追加するか、special_tokens_map を使用して古い特殊トークンを新しい特殊トークンにリネームしてください。

新しい finance トークナイザーを save_pretrained() で保存するか、push_to_hub() で保存して Hub にアップロードします。これにより、新しく学習された語彙、マージルール、および完全なパイプライン設定を記録した tokenizer.json ファイルが作成されます。

trained_tokenizer.save_pretrained("./finance-gemma-tokenizer")
trained_tokenizer.push_to_hub("finance-gemma-tokenizer")

カスタム語彙

空のtokenizerは、vocabとmerges引数によってカスタム語彙をサポートします。

  • vocab は、トークナイザーが認識するトークンの完全な集合であり、各エントリはトークンとその入力 ID を対応付けます。
  • merges は、BPE アルゴリズムが隣接するトークンをどのように結合すべきかを定義します。
from transformers import GemmaTokenizer

vocab={
    "<pad>": 0,
    "</s>": 1,
    "<s>": 2,
    "<unk>": 3,
    "<mask>": 4,
    "▁the": 5,
    "▁stock": 6,
    "▁market": 7,
    "▁": 8,
    "r": 9,
    "a": 10,
    "l": 11,
    "i": 12,
    "e": 13,
    "d": 14,
    "ra": 15,
    "li": 16,
    "lie": 17,
    "lied": 18,
    "ral": 19,
    "ralli": 20,
    "rallie": 21,
    "rallied": 22,
}
merges=[
    ("r", "a"),       # r + a → ra
    ("l", "i"),       # l + i → li
    ("li", "e"),      # li + e → lie
    ("lie", "d"),     # lie + d → lied
    ("ra", "l"),      # ra + l → ral
    ("ral", "li"),    # ral + li → ralli
    ("ralli", "e"),   # ralli + e → rallie
    ("rallie", "d"),  # rallie + d → rallied
]

tokenizer = GemmaTokenizer(vocab=vocab, merges=merges)
encoded = tokenizer("the stock market rallied")
print(encoded["input_ids"])

TokenizersBackend のサブクラス化

Tokenizers は 4 つの異なる バックエンド をサポートしています。一般的には、TokenizersBackend を使用して新しいトークナイザーを定義することをお勧めします。より高速だからです。

PythonBackendは、Rust、SentencePiece、mistral-commonなどのバックエンドに依存しない、純粋なPython製のトークナイザーです。PythonBackendは、Rustバックエンドでは表現できない非常に特殊なトークナイザーを構築する場合にのみ使用してください。

  1. クラス属性としてパディング側や使用するトークナイズアルゴリズムなどを指定して、TokenizersBackendをサブクラス化します。
  2. __init__内でトークナイズパイプラインを定義します。これには、使用するトークナイズアルゴリズム、アルゴリズム適用前に生テキストをどのように分割するか、そしてトークンをどのようにテキストにデコードするかを含みます。
from tokenizers import Tokenizer, decoders, pre_tokenizers
from tokenizers.models import BPE
from transformers import TokenizersBackend

class NewTokenizer(TokenizersBackend):
    padding_side = "left"
    model = BPE

    def __init__(
        self,
        vocab=None,
        merges=None,
        unk_token="<unk>",
        bos_token="<s>",
        eos_token="</s>",
        pad_token="<pad>",
    ):
        self._vocab = vocab or {
            str(unk_token): 0,
            str(bos_token): 1,
            str(eos_token): 2,
            str(pad_token): 3,
        }
        self._merges = merges or []

        self._tokenizer = Tokenizer(
            BPE(vocab=self._vocab, merges=self._merges, fuse_unk=True)
        )
        self._tokenizer.pre_tokenizer = pre_tokenizers.ByteLevel(add_prefix_space=False)
        self._tokenizer.decoder = decoders.ByteLevel()

        super().__init__(
            unk_token=unk_token,
            bos_token=bos_token,
            eos_token=eos_token,
            pad_token=pad_token,
        )

新しい空のトークナイザーを学習するか、保存します。

tokenizer = NewTokenizer()

# train on new corpus
corpus = ["The stock market rallied today.", "Bond yields fell sharply."]
trained_tokenizer = tokenizer.train_new_from_iterator(corpus, vocab_size=32000)
# save tokenizer
trained_tokenizer.save_pretrained("./new-tokenizer")
Update on GitHub