النص لأرقام: Tokenization
الموديل مبيشوفش حروف ولا كلمات. بيشوف tokens.
المشكلة
زي ما الصورة اتحولت لأرقام (بكسلات)، النص لازم يتحول لأرقام. الطريقة دي اسمها Tokenization: بنقطّع النص لحتت اسمها tokens، وكل token ليه رقم في قاموس الموديل.
ليه مش كلمات كاملة؟
لو كل كلمة ليها رقم، القاموس هيبقى ملايين الكلمات، وأي كلمة جديدة أو غلطة إملائية الموديل مش هيعرفها. ولو كل حرف لوحده، النص هيبقى طويل جداً. الحل الوسط: subwords، الكلمات الشائعة بتبقى token واحد، والنادرة بتتقطع لحتت.
from transformers import AutoTokenizer tok = AutoTokenizer.from_pretrained("gpt2") for text in ["Hello world", "unbelievable", "Tokenization is fun"]: tokens = tok.tokenize(text) ids = tok.encode(text) print(f"{text!r:24} -> {tokens} -> {ids}")
الحرف Ġ معناه إن فيه مسافة قبل الكلمة. و «unbelievable» اتقطعت لحتت مألوفة. الموديل بيتعلم معنى الحتت دي، فيقدر يفهم كلمات عمره ما شافها كاملة.
العربي بيتكلف أكتر
الـ tokenizers اتدربت أغلبها على إنجليزي، فالعربي بيتقطع لحتت أصغر. ده مهم لأن الـ APIs بتحاسب بالـ token، وكمان الموديل ليه حد أقصى للـ tokens اللي يقدر يقراها مرة واحدة.
from transformers import AutoTokenizer english = "I want to book a table for two people tonight" arabic = "عايز أحجز ترابيزة لشخصين النهارده بالليل" for name in ["gpt2", "xlm-roberta-base"]: # English-first vs multilingual tok = AutoTokenizer.from_pretrained(name) print(f"{name:17} EN: {len(tok.encode(english)):3} tokens | " f"AR: {len(tok.encode(arabic)):3} tokens")
نفس الجملة بالعربي خدت ٤.٥ ضعف الـ tokens في GPT-2 اللي اتدرب على إنجليزي تقريباً بس. في موديل متعدد اللغات زي XLM-RoBERTa الفرق أقل بكتير. الموديلات الحديثة الكبيرة تحسنت جداً في ده، بس العربي لسه غالباً بياخد tokens أكتر من الإنجليزي.
token حتة نص ليها رقم في القاموس، ممكن تبقى كلمة أو جزء من كلمة.vocabulary قاموس الموديل: كل الـ tokens اللي يعرفها، غالباً عشرات الآلاف.context window أقصى عدد tokens الموديل يقدر يقراه مرة واحدة: الـ prompt والرد مع بعض.