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 لإعادة تسمية الرموز الخاصة القديمة إلى الرموز الخاصة الجديدة.

Save the new finance tokenizer with save_pretrained() or save and upload it to the Hub with push_to_hub(). This creates a tokenizer.json file that captures the newly trained vocabulary, merge rules, and full pipeline configuration.

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

مفردات مخصصة

يدعم مُجزّئ فارغ مفردات مخصصة عبر الحججين vocab وmerges.

  • vocab هو مجموعة الرموز الكاملة التي يعرفها مُجزِّئ النص، حيث يربط كل عنصر رمزًا بمعرّف مدخلاته.
  • 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 أربعة واجهات خلفية مختلفة. بشكل عام، يجب عليك استخدام TokenizersBackend لتعريف مُقسِّم جديد لأنه أسرع.

يُعدّ PythonBackend مُجزِّئ نصوص مكتوبًا بالكامل بلغة بايثون ولا يعتمد على واجهات خلفية مثل Rust أو SentencePiece أو mistral-common. ينبغي استخدام 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