Veni AI
معالجة اللغة الطبيعية

أساسيات التجزئة ومعالجة اللغة الطبيعية: BPE وSentencePiece وWordPiece

أساليب التجزئة في معالجة اللغة الطبيعية، خوارزميات BPE وSentencePiece وWordPiece، وهياكل المرمّزات الحديثة في نماذج اللغة الكبيرة.

Veni AI Technical Team7 Ocak 20256 dk okuma
أساسيات التجزئة ومعالجة اللغة الطبيعية: BPE وSentencePiece وWordPiece

أساسيات التقسيم (Tokenization) ومعالجة اللغة الطبيعية: BPE، SentencePiece، وWordPiece

التقسيم هو عملية تجزئة النص إلى وحدات فرعية (Tokens) يمكن للنموذج معالجتها. تشكل هذه العملية الأساس الذي تعتمد عليه نماذج LLM الحديثة وتؤثر بشكل مباشر على أداء النموذج.

ما هو التقسيم؟

التقسيم هو الخطوة الأولى لتحويل النص الخام إلى تمثيلات رقمية:

"Hello world!" → ["Hello", "world", "!"] → [1234, 5678, 99]

مستويات التقسيم

  1. مستوى الحرف: كل حرف يُعد Token.
  2. مستوى الكلمة: كل كلمة تُعد Token.
  3. مستوى تحت-الكلمة: تقسيم الكلمات إلى وحدات أصغر (الأسلوب الحديث).

التقسيم على مستوى الكلمة

منهجية بسيطة

1def word_tokenize(text): 2 return text.split() 3 4# Example 5text = "Artificial intelligence is shaping the future" 6tokens = word_tokenize(text) 7# ['Artificial', 'intelligence', 'is', 'shaping', 'the', 'future']

المشكلات

  1. كلمات خارج القاموس (OOV): ظهور كلمات لم تُشاهد أثناء التدريب.
  2. حجم قاموس كبير: إدارة مئات الآلاف من الكلمات غير فعّالة.
  3. الثراء الصرفي: في لغات مثل التركية، عدد صيغ الكلمات الناتجة عن اللواحق ضخم جدًا.
  4. الكلمات المركّبة: مثل تحديد ما إذا كان "Artificial intelligence" مفهومًا واحدًا أم مفهومين.

التقسيم على مستوى الحرف

1def char_tokenize(text): 2 return list(text) 3 4# Example 5text = "Hello" 6tokens = char_tokenize(text) 7# ['H', 'e', 'l', 'l', 'o']

المزايا

  • لا يوجد مشكلة كلمات خارج القاموس.
  • حجم قاموس صغير (حوالي 100 حرف).

العيوب

  • تسلسل Tokens الناتج يكون طويلًا جدًا.
  • فقدان دلالة السياق على مستوى الـ Token.
  • تكلفة حسابية أعلى للنموذج.

التقسيم على مستوى تحت-الكلمة

خيار النماذج الحديثة: توازن بين مستوى الكلمة ومستوى الحرف.

"tokenization" → ["token", "ization"] "unhappiness" → ["un", "happiness"] or ["un", "happy", "ness"]

BPE (Byte Pair Encoding)

الخوارزمية الأكثر استخدامًا للتقسيم إلى وحدات تحت-الكلمة.

خوارزمية BPE

  1. تقسيم النص إلى أحرف منفردة.
  2. إيجاد أكثر زوج متجاور من الأحرف تكرارًا.
  3. دمج هذا الزوج في Token واحد جديد.
  4. تكرار العملية حتى الوصول إلى حجم القاموس المطلوب.

مثال BPE

1Starting vocabulary: ['l', 'o', 'w', 'e', 'r', 'n', 's', 't', 'i', 'd'] 2Corpus: "low lower newest lowest widest" 3 4Step 1: Most frequent pair 'e' + 's' → 'es' 5Step 2: Most frequent pair 'es' + 't' → 'est' 6Step 3: Most frequent pair 'l' + 'o' → 'lo' 7Step 4: Most frequent pair 'lo' + 'w' → 'low' 8... 9 10Final Result: ['low', 'est', 'er', 'new', 'wid', ...]

تنفيذ BPE

1def get_stats(vocab): 2 pairs = {} 3 for word, freq in vocab.items(): 4 symbols = word.split() 5 for i in range(len(symbols) - 1): 6 pair = (symbols[i], symbols[i + 1]) 7 pairs[pair] = pairs.get(pair, 0) + freq 8 return pairs 9 10def merge_vocab(pair, vocab): 11 new_vocab = {} 12 bigram = ' '.join(pair) 13 replacement = ''.join(pair) 14 for word in vocab: 15 new_word = word.replace(bigram, replacement) 16 new_vocab[new_word] = vocab[word] 17 return new_vocab 18 19def train_bpe(corpus, num_merges): 20 vocab = get_initial_vocab(corpus) 21 22 for i in range(num_merges): 23 pairs = get_stats(vocab) 24 if not pairs: 25 break 26 best_pair = max(pairs, key=pairs.get) 27 vocab = merge_vocab(best_pair, vocab) 28 29 return vocab

WordPiece

خوارزمية طورتها Google وتستخدم في نماذج مثل BERT.

مقارنة BPE وWordPiece

الميزةBPEWordPiece
معيار الدمجFrequencyLikelihood
بادئةNone## (للوحدات داخل الكلمة)
مستخدم فيGPT, LLaMABERT, DistilBERT

مثال WordPiece

1"tokenization" → ["token", "##ization"] 2"playing" → ["play", "##ing"] 3## SentencePiece 4 5مُجزِّئ لغوي غير مرتبط بلغة معينة، تم تطويره أيضًا من قبل Google. 6 7### Features 8 9- **مستقل عن اللغة:** لا يفترض أن المسافة البيضاء هي فاصل بين الكلمات. 10- **على مستوى البايت:** يعمل مباشرة على النص الخام. 11- **BPE + Unigram:** يدعم خوارزميات متعددة. 12- **عكسي:** يمكن إجراء فك ترميز مثالي. 13 14### SentencePiece Usage 15 16```python 17import sentencepiece as spm 18 19# Training the model 20spm.SentencePieceTrainer.train( 21 input='corpus.txt', 22 model_prefix='tokenizer', 23 vocab_size=32000, 24 model_type='bpe' # or 'unigram' 25) 26 27# Loading and using the model 28sp = spm.SentencePieceProcessor() 29sp.load('tokenizer.model') 30 31# Encode 32tokens = sp.encode('Hello world', out_type=str) 33# ['▁Hello', '▁world'] 34 35ids = sp.encode('Hello world', out_type=int) 36# [1234, 5678, 9012] 37 38# Decode 39text = sp.decode(ids) 40# 'Hello world'

▁ (Underscore) Symbol

يُشير SentencePiece إلى بداية الكلمات باستخدام :

"Hello world" → ["▁Hello", "▁world"] "New York" → ["▁New", "▁York"]

Tiktoken (OpenAI)

تنفيذ BPE متخصص تُنتجه OpenAI.

1import tiktoken 2 3# Loading the encoder 4enc = tiktoken.encoding_for_model("gpt-4") 5 6# Encode 7tokens = enc.encode("Hello world!") 8# [12345, 67890, 999] 9 10# Decode 11text = enc.decode(tokens) 12# "Hello world!" 13 14# Check token count 15print(len(tokens)) # 3

Model-Encoder Mappings

ModelEncoderVocab Size
GPT-4cl100k_base100,277
GPT-3.5cl100k_base100,277
GPT-3p50k_base50,281
Codexp50k_edit50,281

Hugging Face Tokenizers

1from transformers import AutoTokenizer 2 3# Loading the tokenizer 4tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased") 5 6# Encode 7encoded = tokenizer("Hello, world!", return_tensors="pt") 8# { 9# 'input_ids': tensor([[101, 7592, 1010, 2088, 999, 102]]), 10# 'attention_mask': tensor([[1, 1, 1, 1, 1, 1]]) 11# } 12 13# Decode 14text = tokenizer.decode(encoded['input_ids'][0]) 15# "[CLS] hello, world! [SEP]" 16 17# Token List 18tokens = tokenizer.tokenize("Hello, world!") 19# ['hello', ',', 'world', '!']

Fast Tokenizers

1from tokenizers import Tokenizer, models, trainers, pre_tokenizers 2 3# Creating a new tokenizer 4tokenizer = Tokenizer(models.BPE()) 5tokenizer.pre_tokenizer = pre_tokenizers.Whitespace() 6 7trainer = trainers.BpeTrainer( 8 vocab_size=30000, 9 special_tokens=["[PAD]", "[UNK]", "[CLS]", "[SEP]", "[MASK]"] 10) 11 12tokenizer.train(files=["corpus.txt"], trainer=trainer) 13tokenizer.save("my_tokenizer.json")

Special Tokens

Common Special Tokens

TokenDescriptionUse Case
[CLS]بداية التسلسلمهام التصنيف في BERT
[SEP]فاصل المقاطعفصل أزواج الجمل
[PAD]حشومحاذاة المعالجة الدُفعية
[UNK]رمز غير معروفالتعامل مع الكلمات خارج المفردات
[MASK]قناعنمذجة اللغة المقنّعة (MLM)
<|endoftext|>نهاية التسلسلمهام التوليد في GPT

Chat Tokens

1<|system|>You are a helpful assistant<|end|> 2<|user|>Hello!<|end|> 3<|assistant|>Hello! How can I help you today?<|end|>

Tokenization Challenges in Turkish

Morphological Richness

1"gelebileceklermiş" (they were said to be able to come) → كلمة واحدة لكنها ذات بنية معقدة 2gel (come) + ebil (can) + ecek (will) + ler (they) + miş (reportedly) 3 4Tokenization: 5- Poor: ["gelebileceklermiş"] (Single token, very rare) 6- Good: ["gel", "ebil", "ecek", "ler", "miş"]

Solutions

  1. تدريب مُجزِّئ محسّن للّغة التركية.
  2. دمج التحليل الصرفي.
  3. تطبيق BPE واعٍ باللواحق.

حدود وإدارة التوكنات

نافذة السياق

النموذجطول السياق (توكنات)ما يعادلها بالكلمات تقريبًا
GPT-3.516K~12,000
GPT-4128K~96,000
Claude 3200K~150,000

تقدير عدد التوكنات

1def estimate_tokens(text): 2 # Rough estimate: 1 token ≈ 4 characters (English) 3 # For Turkish: 1 token ≈ 3 characters 4 return len(text) // 3 5 6# More accurate calculation 7def count_tokens(text, model="gpt-4"): 8 enc = tiktoken.encoding_for_model(model) 9 return len(enc.encode(text))

الخلاصة

تُعد عملية تحويل النص إلى توكنات الركيزة الأساسية لمعالجة اللغات الطبيعية ونماذج اللغة الكبيرة. تلعب أساليب التقسيم الجزئي للكلمات مثل BPE وWordPiece وSentencePiece دورًا محوريًا في نجاح النماذج اللغوية الحديثة. إن اختيار وتهيئة المُقسّم المناسب يؤثر بشكل مباشر على الأداء النهائي للنموذج.

في Veni AI، نقدّم استراتيجيات متقدمة لتحويل النصوص إلى توكنات مخصّصة لحلول معالجة اللغة التركية.

İlgili Makaleler