Tokenization ve NLP Temelleri: BPE, SentencePiece ve WordPiece
Tokenization, metni model tarafından işlenebilir alt birimlere (token) bölme işlemidir. Modern LLM'lerin temelini oluşturan bu süreç, model performansını doğrudan etkiler.
Tokenization Nedir?
Tokenization, ham metni sayısal temsillere dönüştürmenin ilk adımıdır:
"Merhaba dünya!" → ["Merhaba", "dünya", "!"] → [1234, 5678, 99]
Tokenization Seviyeleri
- Karakter seviyesi: Her karakter bir token
- Kelime seviyesi: Her kelime bir token
- Subword seviyesi: Kelimeler alt parçalara bölünür (modern yaklaşım)
Kelime Seviyesi Tokenization
Basit Yaklaşım
1def word_tokenize(text): 2 return text.split() 3 4# Örnek 5text = "Yapay zeka geleceği şekillendiriyor" 6tokens = word_tokenize(text) 7# ['Yapay', 'zeka', 'geleceği', 'şekillendiriyor']
Sorunları
- OOV (Out of Vocabulary): Eğitimde görülmeyen kelimeler
- Büyük vocabulary: Yüzbinlerce kelime
- Morfolojik zenginlik: Türkçe gibi dillerde çekim ekleri
- Compound words: "Yapay zeka" → tek kavram mı?
Karakter Seviyesi Tokenization
1def char_tokenize(text): 2 return list(text) 3 4# Örnek 5text = "Merhaba" 6tokens = char_tokenize(text) 7# ['M', 'e', 'r', 'h', 'a', 'b', 'a']
Avantajlar
- OOV sorunu yok
- Küçük vocabulary (~100 karakter)
Dezavantajlar
- Çok uzun diziler
- Anlam kaybı
- Hesaplama maliyeti yüksek
Subword Tokenization
Modern LLM'lerin tercihi: Kelime ve karakter arasında denge.
"tokenization" → ["token", "ization"] "unhappiness" → ["un", "happiness"] veya ["un", "happy", "ness"]
BPE (Byte Pair Encoding)
En yaygın subword tokenization algoritması.
BPE Algoritması
- Metni karakterlere böl
- En sık görülen karakter çiftini bul
- Çifti yeni token olarak birleştir
- İstenen vocabulary boyutuna ulaşana kadar tekrarla
BPE Örneği
1Başlangıç vocabulary: ['l', 'o', 'w', 'e', 'r', 'n', 's', 't', 'i', 'd'] 2Corpus: "low lower newest lowest widest" 3 4Adım 1: En sık çift 'e' + 's' → 'es' 5Adım 2: En sık çift 'es' + 't' → 'est' 6Adım 3: En sık çift 'l' + 'o' → 'lo' 7Adım 4: En sık çift 'lo' + 'w' → 'low' 8... 9 10Final: ['low', 'est', 'er', 'new', 'wid', ...]
BPE Implementasyonu
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 tarafından geliştirilen, BERT'te kullanılan algoritma.
BPE vs WordPiece
| Özellik | BPE | WordPiece |
|---|---|---|
| Merge kriteri | Frekans | Likelihood |
| Prefix | Yok | ## (kelime ortası) |
| Kullanım | GPT, LLaMA | BERT, DistilBERT |
WordPiece Örneği
"tokenization" → ["token", "##ization"] "playing" → ["play", "##ing"]
SentencePiece
Google'ın geliştirdiği dil-agnostik tokenizer.
Özellikler
- Dil bağımsız: Whitespace varsayımı yok
- Byte-level: Raw text üzerinde çalışır
- BPE + Unigram: İki algoritma desteği
- Reversible: Detokenization mümkün
SentencePiece Kullanımı
1import sentencepiece as spm 2 3# Model eğitimi 4spm.SentencePieceTrainer.train( 5 input='corpus.txt', 6 model_prefix='tokenizer', 7 vocab_size=32000, 8 model_type='bpe' # veya 'unigram' 9) 10 11# Model yükleme ve kullanım 12sp = spm.SentencePieceProcessor() 13sp.load('tokenizer.model') 14 15# Encode 16tokens = sp.encode('Merhaba dünya', out_type=str) 17# ['▁Mer', 'haba', '▁dünya'] 18 19ids = sp.encode('Merhaba dünya', out_type=int) 20# [1234, 5678, 9012] 21 22# Decode 23text = sp.decode(ids) 24# 'Merhaba dünya'
▁ (Underscore) Sembolü
SentencePiece, kelime başlangıçlarını ▁ ile işaretler:
"Hello world" → ["▁Hello", "▁world"] "New York" → ["▁New", "▁York"]
Tiktoken (OpenAI)
OpenAI'ın kullandığı BPE implementasyonu.
1import tiktoken 2 3# Encoder yükleme 4enc = tiktoken.encoding_for_model("gpt-4") 5 6# Encode 7tokens = enc.encode("Merhaba dünya!") 8# [12345, 67890, 999] 9 10# Decode 11text = enc.decode(tokens) 12# "Merhaba dünya!" 13 14# Token sayısı 15print(len(tokens)) # 3
Model-Encoder Eşleşmeleri
| Model | Encoder | Vocab Size |
|---|---|---|
| GPT | cl100k_base | 100,277 |
| GPT-3.5 | cl100k_base | 100,277 |
| GPT-3 | p50k_base | 50,281 |
| Codex | p50k_edit | 50,281 |
Hugging Face Tokenizers
1from transformers import AutoTokenizer 2 3# Tokenizer yükleme 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 listesi 18tokens = tokenizer.tokenize("Hello, world!") 19# ['hello', ',', 'world', '!']
Fast Tokenizers
1from tokenizers import Tokenizer, models, trainers, pre_tokenizers 2 3# Yeni tokenizer oluşturma 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")
Özel Tokenler
Yaygın Özel Tokenler
| Token | Açıklama | Kullanım |
|---|---|---|
| [CLS] | Sequence başlangıcı | BERT classification |
| [SEP] | Segment ayırıcı | Sentence pairs |
| [PAD] | Padding | Batch işleme |
| [UNK] | Bilinmeyen token | OOV handling |
| [MASK] | Maskeleme | MLM training |
| <|endoftext|> | Sequence sonu | GPT |
Chat Tokenları
1<|system|>Sen yardımcı bir asistansın<|end|> 2<|user|>Merhaba!<|end|> 3<|assistant|>Merhaba! Size nasıl yardımcı olabilirim?<|end|>
Türkçe Tokenization Zorlukları
Morfolojik Zenginlik
1"gelebileceklermiş" → tek kelime ama karmaşık yapı 2gel + ebil + ecek + ler + miş 3 4Tokenization: 5- Kötü: ["gelebileceklermiş"] (tek token, nadir) 6- İyi: ["gel", "ebil", "ecek", "ler", "miş"]
Çözümler
- Türkçe-optimize tokenizer eğitimi
- Morfolojik analiz entegrasyonu
- Suffix-aware BPE
Token Limitleri ve Yönetimi
Context Window
| Model | Context Length | ~Kelime Karşılığı |
|---|---|---|
| GPT-3.5 | 16K | ~12,000 |
| GPT | 128K | ~96,000 |
| Claude 3 | 200K | ~150,000 |
Token Sayısı Tahmini
1def estimate_tokens(text): 2 # Kaba tahmin: 1 token ≈ 4 karakter (İngilizce) 3 # Türkçe için: 1 token ≈ 3 karakter 4 return len(text) // 3 5 6# Daha doğru 7def count_tokens(text, model="gpt-4"): 8 enc = tiktoken.encoding_for_model(model) 9 return len(enc.encode(text))
Sonuç
Tokenization, NLP ve LLM'lerin temel yapı taşıdır. BPE, WordPiece ve SentencePiece gibi subword yöntemleri, modern dil modellerinin başarısında kritik rol oynar. Doğru tokenizer seçimi ve konfigürasyonu, model performansını doğrudan etkiler.
Veni AI olarak, Türkçe NLP çözümlerinde uzmanlaşmış tokenization stratejileri sunuyoruz.
