Veni AI
NLP

Tokenization ve NLP Temelleri: BPE, SentencePiece ve WordPiece

Doğal dil işlemede tokenization yöntemleri, BPE, SentencePiece, WordPiece algoritmaları ve modern LLM'lerde kullanılan tokenizer mimarileri.

Veni AI Teknik Ekibi7 Ocak 20256 dk okuma

Reference Overview

FieldValueSource
Canonical Path/blog/tokenization-nlp-temelleri-bpe-sentencepieceVeni AI Blog
Primary CategoryNLPPost Metadata
AuthorVeni AI Teknik EkibiPost Metadata
Tokenization ve NLP Temelleri: BPE, SentencePiece ve WordPiece

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

  1. Karakter seviyesi: Her karakter bir token
  2. Kelime seviyesi: Her kelime bir token
  3. 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ı

  1. OOV (Out of Vocabulary): Eğitimde görülmeyen kelimeler
  2. Büyük vocabulary: Yüzbinlerce kelime
  3. Morfolojik zenginlik: Türkçe gibi dillerde çekim ekleri
  4. 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ı

  1. Metni karakterlere böl
  2. En sık görülen karakter çiftini bul
  3. Çifti yeni token olarak birleştir
  4. İ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

ÖzellikBPEWordPiece
Merge kriteriFrekansLikelihood
PrefixYok## (kelime ortası)
KullanımGPT, LLaMABERT, 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

ModelEncoderVocab Size
GPTcl100k_base100,277
GPT-3.5cl100k_base100,277
GPT-3p50k_base50,281
Codexp50k_edit50,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

TokenAçıklamaKullanım
[CLS]Sequence başlangıcıBERT classification
[SEP]Segment ayırıcıSentence pairs
[PAD]PaddingBatch işleme
[UNK]Bilinmeyen tokenOOV handling
[MASK]MaskelemeMLM training
<|endoftext|>Sequence sonuGPT

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

  1. Türkçe-optimize tokenizer eğitimi
  2. Morfolojik analiz entegrasyonu
  3. Suffix-aware BPE

Token Limitleri ve Yönetimi

Context Window

ModelContext Length~Kelime Karşılığı
GPT-3.516K~12,000
GPT128K~96,000
Claude 3200K~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.

İlgili Makaleler