# الترجمة

تقوم الترجمة بتحويل تسلسل من النص من لغة إلى أخرى. وهي إحدى المهام التي يمكن صياغتها كمسألة من تسلسل إلى تسلسل، وهي إطار قوي لإرجاع بعض المخرجات من مدخلات، مثل الترجمة أو التلخيص. تُستخدم أنظمة الترجمة بشكل شائع للترجمة بين نصوص بلغات مختلفة، لكنها يمكن أن تُستخدم أيضاً للصوت أو بعض التوليفات بينهما مثل تحويل النص إلى كلام أو تحويل الكلام إلى نص.

ستُظهر لك هذه الدليل كيفية:

1. قم بضبط [T5](https://huggingface.co/google-t5/t5-small) على مجموعة البيانات الفرعية الإنجليزية-الفرنسية من مجموعة [OPUS Books](https://huggingface.co/datasets/Helsinki-NLP/opus_books) لترجمة النصوص الإنجليزية إلى الفرنسية.
2. استخدم النموذج المُحسَّن لديك للاستدلال.

للاطلاع على جميع البنى المعمارية ونقاط التفتيش المتوافقة مع هذه المهمة، ننصح بالاطلاع على [صفحة المهمة](https://huggingface.co/tasks/translation).

قبل أن تبدأ، تأكد من تثبيت جميع المكتبات اللازمة:

```bash
pip install transformers datasets evaluate sacrebleu
```

ننصحك بتسجيل الدخول إلى حسابك على Hugging Face حتى تتمكن من رفع نموذجك ومشاركته مع المجتمع. عند الطلب، أدخل رمزك (token) لتسجيل الدخول:

```py
>>> from huggingface_hub import notebook_login

>>> notebook_login()
```

## تحميل مجموعة بيانات OPUS Books

ابدأ بتحميل مجموعة البيانات الفرعية الإنجليزية-الفرنسية من مجموعة بيانات [OPUS Books](https://huggingface.co/datasets/Helsinki-NLP/opus_books) باستخدام مكتبة 🤗 Datasets:

```py
>>> from datasets import load_dataset

>>> books = load_dataset("Helsinki-NLP/opus_books", "en-fr")
```

قسّم مجموعة البيانات إلى مجموعة تدريب ومجموعة اختبار باستخدام طريقة [train_test_split](https://huggingface.co/docs/datasets/main/en/package_reference/main_classes#datasets.Dataset.train_test_split):

```py
>>> books = books["train"].train_test_split(test_size=0.2)
```

ثم اطّلع على مثال:

```py
>>> books["train"][0]
{'id': '90560',
 'translation': {'en': 'But this lofty plateau measured only a few fathoms, and soon we reentered Our Element.',
  'fr': 'Mais ce plateau élevé ne mesurait que quelques toises, et bientôt nous fûmes rentrés dans notre élément.'}}
```

`translation`: ترجمة النص إلى الإنجليزية والفرنسية.

## المعالجة المسبقة

الخطوة التالية هي تحميل مُرمِّز T5 لمعالجة أزواج اللغتين الإنجليزية والفرنسية:

```py
>>> from transformers import AutoTokenizer

>>> checkpoint = "google-t5/t5-small"
>>> tokenizer = AutoTokenizer.from_pretrained(checkpoint)
```

تحتاج دالة المعالجة المسبقة التي تريد إنشاؤها إلى:

1. أضِف بادئة إلى المدخلات حتى يعرف T5 أن هذه مهمة ترجمة. بعض النماذج القادرة على أداء مهام معالجة اللغة الطبيعية المتعددة تتطلب بادئة محددة لكل مهمة.
2. اضبط اللغة المستهدفة (الفرنسية) في معامل `text_target` لضمان معالجة المُجزِّئ للنص المستهدف بشكل صحيح. إذا لم تضبط `text_target`، فسيُعالج المُجزِّئ النص المستهدف على أنه نص بالإنجليزية.
3. اقطع التسلسلات بحيث لا تتجاوز الطول الأقصى المحدد بواسطة معامل `max_length`.

```py
>>> source_lang = "en"
>>> target_lang = "fr"
>>> prefix = "translate English to French: "

>>> def preprocess_function(examples):
...     inputs = [prefix + example[source_lang] for example in examples["translation"]]
...     targets = [example[target_lang] for example in examples["translation"]]
...     model_inputs = tokenizer(inputs, text_target=targets, max_length=128, truncation=True)
...     return model_inputs
```

لتطبيق دالة المعالجة المسبقة على مجموعة البيانات بأكملها، استخدم طريقة [map](https://huggingface.co/docs/datasets/main/en/package_reference/main_classes#datasets.Dataset.map) في 🤗 Datasets. يمكنك تسريع دالة `map` عن طريق تعيين `batched=True` لمعالجة عدة عناصر من مجموعة البيانات في وقت واحد:

```py
>>> tokenized_books = books.map(preprocess_function, batched=True)
```

الآن أنشئ دفعة من الأمثلة باستخدام [DataCollatorForSeq2Seq](/docs/transformers/main/ar/main_classes/data_collator#transformers.DataCollatorForSeq2Seq). من الكفاءة أن *نملأ الجمل ديناميكيًا* حتى أطول طول في الدفعة أثناء التجميع، بدلاً من ملء مجموعة البيانات بأكملها حتى الطول الأقصى.

```py
>>> from transformers import DataCollatorForSeq2Seq

>>> data_collator = DataCollatorForSeq2Seq(tokenizer=tokenizer, model=checkpoint)
```

## تقييم

غالباً ما يكون تضمين مقياس أثناء التدريب مفيداً لتقييم أداء نموذجك. يمكنك تحميل طريقة تقييم بسرعة باستخدام مكتبة 🤗 [Evaluate](https://huggingface.co/docs/evaluate/index). لهذه المهمة، حمّل مقياس [SacreBLEU](https://huggingface.co/spaces/evaluate-metric/sacrebleu) (راجع [الجولة السريعة](https://huggingface.co/docs/evaluate/a_quick_tour) في 🤗 Evaluate لمعرفة المزيد حول كيفية تحميل مقياس وحسابه):

```py
>>> import evaluate

>>> metric = evaluate.load("sacrebleu")
```

ثم أنشئ دالةً تمرّر تنبؤاتك والتسميات إلى [compute](https://huggingface.co/docs/evaluate/main/en/package_reference/main_classes#evaluate.EvaluationModule.compute) لحساب درجة SacreBLEU:

```py
>>> import numpy as np

>>> def postprocess_text(preds, labels):
...     preds = [pred.strip() for pred in preds]
...     labels = [[label.strip()] for label in labels]

...     return preds, labels

>>> def compute_metrics(eval_preds):
...     preds, labels = eval_preds
...     if isinstance(preds, tuple):
...         preds = preds[0]
...     decoded_preds = tokenizer.batch_decode(preds, skip_special_tokens=True)

...     labels = np.where(labels != -100, labels, tokenizer.pad_token_id)
...     decoded_labels = tokenizer.batch_decode(labels, skip_special_tokens=True)

...     decoded_preds, decoded_labels = postprocess_text(decoded_preds, decoded_labels)

...     result = metric.compute(predictions=decoded_preds, references=decoded_labels)
...     result = {"bleu": result["score"]}

...     prediction_lens = [np.count_nonzero(pred != tokenizer.pad_token_id) for pred in preds]
...     result["gen_len"] = np.mean(prediction_lens)
...     result = {k: round(v, 4) for k, v in result.items()}
...     return result
```

دالة `compute_metrics` الخاصة بك جاهزة الآن، وستعود إليها عند إعداد التدريب.

## تدريب

إذا لم تكن على دراية بضبط نموذج باستخدام [Trainer](/docs/transformers/main/ar/main_classes/trainer#transformers.Trainer)، فاطّلع على الدرس الأساسي [هنا](../training)!

أنت مستعد الآن لبدء تدريب نموذجك! حمّل T5 باستخدام [AutoModelForSeq2SeqLM](/docs/transformers/main/ar/model_doc/auto#transformers.AutoModelForSeq2SeqLM):

```py
>>> from transformers import AutoModelForSeq2SeqLM, Seq2SeqTrainingArguments, Seq2SeqTrainer

>>> model = AutoModelForSeq2SeqLM.from_pretrained(checkpoint)
```

في هذه المرحلة، تبقى ثلاث خطوات فقط:

1. حدّد معاملات التدريب الفائقة في [Seq2SeqTrainingArguments](/docs/transformers/main/ar/main_classes/trainer#transformers.Seq2SeqTrainingArguments). المعامل الوحيد الإلزامي هو `output_dir` الذي يحدد مكان حفظ النموذج. ستقوم بدفع هذا النموذج إلى Hub من خلال تعيين `push_to_hub=True` (يتعين عليك تسجيل الدخول إلى Hugging Face لرفع النموذج). في نهاية كل حقبة، سيقوم [Trainer](/docs/transformers/main/ar/main_classes/trainer#transformers.Trainer) بتقييم مقياس SacreBLEU وحفظ نقطة الفحص للتدريب.
2. مرّر حُجج التدريب إلى [Seq2SeqTrainer](/docs/transformers/main/ar/main_classes/trainer#transformers.Seq2SeqTrainer) مع النموذج، ومجموعة البيانات، ومُرمِّز الرموز، ومُجمِّع البيانات، ودالة `compute_metrics`.
3. استدعِ [train()](/docs/transformers/main/ar/main_classes/trainer#transformers.Trainer.train) لضبط نموذجك.

```py
>>> training_args = Seq2SeqTrainingArguments(
...     output_dir="my_awesome_opus_books_model",
...     eval_strategy="epoch",
...     learning_rate=2e-5,
...     per_device_train_batch_size=16,
...     per_device_eval_batch_size=16,
...     weight_decay=0.01,
...     save_total_limit=3,
...     num_train_epochs=2,
...     predict_with_generate=True,
...     fp16=True, #change to bf16=True for XPU
...     push_to_hub=True,
... )

>>> trainer = Seq2SeqTrainer(
...     model=model,
...     args=training_args,
...     train_dataset=tokenized_books["train"],
...     eval_dataset=tokenized_books["test"],
...     processing_class=tokenizer,
...     data_collator=data_collator,
...     compute_metrics=compute_metrics,
... )

>>> trainer.train()
```

بمجرد اكتمال التدريب، شارك نموذجك على Hub باستخدام طريقة [push_to_hub()](/docs/transformers/main/ar/main_classes/trainer#transformers.Trainer.push_to_hub) ليتمكن الجميع من استخدام نموذجك:

```py
>>> trainer.push_to_hub()
```

لمثال أكثر تفصيلاً حول كيفية ضبط نموذج للترجمة، راجع [دفتر PyTorch](https://colab.research.google.com/github/huggingface/notebooks/blob/main/examples/translation.ipynb) المقابل.

## الاستدلال

ممتاز، والآن بعد أن قمت بضبط نموذج، يمكنك استخدامه للاستدلال!

فكّر في بعض النصوص التي ترغب في ترجمتها إلى لغة أخرى. بالنسبة إلى T5، تحتاج إلى إضافة بادئة إلى مدخلاتك اعتماداً على المهمة التي تعمل عليها. فبالنسبة إلى الترجمة من الإنجليزية إلى الفرنسية، يجب أن تضيف البادئة إلى مدخلاتك كما هو موضح أدناه:

```py
>>> text = "translate English to French: Legumes share resources with nitrogen-fixing bacteria."
```

قم بتجزئة النص وإرجاع `input_ids` كمُتجهات PyTorch:

```py
>>> from transformers import AutoTokenizer

>>> tokenizer = AutoTokenizer.from_pretrained("username/my_awesome_opus_books_model")
>>> inputs = tokenizer(text, return_tensors="pt").input_ids
```

استخدم طريقة [generate()](/docs/transformers/main/ar/main_classes/text_generation#transformers.GenerationMixin.generate) لإنشاء الترجمة. لمزيد من التفاصيل حول استراتيجيات توليد النص المختلفة ومعلمات التحكم في التوليد، راجع واجهة برمجة تطبيقات [Text Generation](../main_classes/text_generation).

```py
>>> from transformers import AutoModelForSeq2SeqLM

>>> model = AutoModelForSeq2SeqLM.from_pretrained("username/my_awesome_opus_books_model")
>>> outputs = model.generate(inputs, max_new_tokens=40, do_sample=True, top_k=30, top_p=0.95)
```

فكّ ترميز معرّفات الرموز المولّدة إلى نص:

```py
>>> tokenizer.decode(outputs[0], skip_special_tokens=True)
'Les lignées partagent des ressources avec des bactéries enfixant l'azote.'
```

