# تخصيص مُجزِّئات الرموز

تُفصل مُجزِّئات الرموز (Tokenizers) عن قواميسها المُتعلَّمة. وهذا يتيح لك تهيئة مُجزِّئ فارغ للتدريب، أو إنشاء مُجزِّئ مباشرةً بقاموسك الخاص. وتبقى سلسلة معالجة التجزئة الأساسية كما هي (المُطَبِّع، مُجزِّئ ما قبل التجزئة، خوارزمية التجزئة)، لذا لا حاجة إلى إعادة إنشائها من الصفر.

يُبيّن هذا الدليل كيفية تدريب وإنشاء مُرمِّز مخصص.

## تدريب مُجزِّئ

يستبدل مُرمِّز قابل للتدريب فارغ المفردات قاموس الكلمات بقاموس هدف جديد. وهذا مفيد للتكيف مع مجال جديد مثل التمويل، أو لغة منخفضة الموارد، أو الأكواد البرمجية.

أنشئ مُجزِّئًا فارغًا ثم حمّل مجموعة بيانات.

```py
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()](/docs/transformers/main/ar/main_classes/tokenizer#transformers.TokenizersBackend.train_new_from_iterator) لتدريب مُجزّئ الرموز. تقبل هذه الطريقة دالة مولّدة لإرجاع مقاطع نصية من مجموعة البيانات بدلاً من تحميل كل شيء في الذاكرة دفعة واحدة. يحدد الحجة `vocab_size` حجم مفردات مُجزّئ الرموز.

```py
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()](/docs/transformers/main/ar/internal/tokenization_utils#transformers.PreTrainedTokenizerBase.save_pretrained) or save and upload it to the Hub with [push_to_hub()](/docs/transformers/main/ar/main_classes/model#transformers.utils.PushToHubMixin.push_to_hub). This creates a `tokenizer.json` file that captures the newly trained vocabulary, merge rules, and full pipeline configuration.

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

## مفردات مخصصة

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

- `vocab` هو مجموعة الرموز الكاملة التي يعرفها مُجزِّئ النص، حيث يربط كل عنصر رمزًا بمعرّف مدخلاته.
- `merges` يحدد كيفية دمج الرموز المتجاورة في خوارزمية BPE.

```py
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 أربعة [واجهات خلفية](./fast_tokenizers#backends) مختلفة. بشكل عام، ينبغي استخدام [TokenizersBackend](/docs/transformers/main/ar/main_classes/tokenizer#transformers.TokenizersBackend) لتعريف مُجزِّئ جديد لأنه أسرع.

> [!TIP]
> يُعدّ [PythonBackend](/docs/transformers/main/ar/main_classes/tokenizer#transformers.PythonBackend) مُجزِّئًا (tokenizer) مكتوبًا بالكامل بلغة بايثون، ولا يعتمد على واجهات خلفية (backends) مثل Rust أو SentencePiece أو mistral-common. ينبغي استخدام [PythonBackend](/docs/transformers/main/ar/main_classes/tokenizer#transformers.PythonBackend) فقط عند بناء مُجزِّئ متخصص للغاية لا يمكن التعبير عنه عبر الواجهة الخلفية Rust.

1. أنشئ فئة فرعية من [TokenizersBackend](/docs/transformers/main/ar/main_classes/tokenizer#transformers.TokenizersBackend) مع سمات فئة مثل جانب الحشو وخوارزمية الترميز المستخدمة.
2. حدد خط أنابيب الترميز في `__init__`. ويشمل ذلك خوارزمية الترميز المستخدمة، وكيفية تقسيم النص الخام قبل الخوارزمية، وكيفية فك ترميز الرموز مرة أخرى إلى نص.

```py
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,
        )
```

درّب أو احفظ المُجزِّئ الجديد الفارغ.

```py
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")
```

