TR Agglutination Pitfalls: Eklerin Tokenize Edilmesi + İ/I/ı/i Casefold Bug
Türkçe agglutinative — ekler kelimeye eklenir. Tokenizer'lar 'evlerimizdekiler' kelimesini parçalarken sık hata yapar. İ/I/ı/i casefold (yaygın bug), apostrof normalize (TR \"\" vs ASCII \"\"), UTF-8 NFC vs NFD encoding tutarsızlığı. Cookbook'un TR mühendis için 'sessiz katil' bug listesi.
Şükrü Yusuf KAYA
24 dakikalık okuma
İleri1. Agglutinative Pitfalls#
"ev" + "ler" + "im" + "iz" + "de" + "ki" + "ler" = "evlerimizdekiler"
7 morfem, tek kelime. Tokenizer bunu nasıl parçalar?
| Tokenizer | Tokenization | Token sayısı |
|---|---|---|
| Llama-3 | "ev", "ler", "imiz", "deki", "ler" | 5 |
| Qwen 2.5 | "evler", "imiz", "deki", "ler" | 4 |
| Custom TR-BPE 50K | "evler", "imiz", "dekiler" | 3 |
| Char-level | "e","v","l","e","r","i","m","i","z","d","e","k","i","l","e","r" | 16 |
Sonuç: TR tokenizer 4x daha verimli, ama model eklerin compositional anlamını öğrenir. Custom TR vocab'i çok agresif parçalamamalı (çok büyük vocab gerek olur).
2. İ/I/ı/i Casefold — Klasik Bug#
Python:
"İSTANBUL".lower() # → "i̇stanbul" (i + combining dot above!) "istanbul".upper() # → "ISTANBUL" (yanlış!) "İSTANBUL".casefold() # → "i̇stanbul"
TR-aware casefold:
def tr_lower(s): return s.replace("İ", "i").replace("I", "ı").lower() def tr_upper(s): return s.replace("i", "İ").replace("ı", "I").upper()
Bu bug sessiz katil: Database'de "İstanbul" araması Python "İSTANBUL".lower() ile karşılaştırılır → eşleşmez → 0 sonuç.
3. Unicode NFC vs NFD#
import unicodedata s_nfc = "İstanbul" # NFC normalize s_nfd = unicodedata.normalize("NFD", "İstanbul") # NFD: I + combining dot len(s_nfc), len(s_nfd) # 8, 9 s_nfc == s_nfd # False — looks same, different bytes
Web'den crawl edilen data farklı normalizasyon'da olabilir → aynı kelime ama farklı bytes → tokenizer farklı parçalar → modelin sözlüğünde "aynı kelime için iki ayrı entry".
Cookbook'un kuralı: Tüm corpus'u NFC normalize ile pipeline'a sok.
text = unicodedata.normalize("NFC", text)
✅ Teslim
- Bir TR text üzerinde İ/I/ı/i casefold bug'unu reproduce et. 2) NFC vs NFD farkını dataset sample'ında ölç. 3) Sonraki ders: 9.10 — TR Benchmarking Suite.
Yorumlar & Soru-Cevap
(0)Yorum yazmak için giriş yap.
Yorumlar yükleniyor...
İlgili İçerikler
Part 0 — Engineering Foundations
Fine-Tuning Cookbook'a Hoş Geldin: Sistematik, Stage Taksonomisi ve Reproducibility Kontratı
Öğrenmeye BaşlaPart 0 — Engineering Foundations
Reproducibility Stack: Seeds, cuDNN Flags ve Deterministic CUDA — 'Sende Niye Çalışıyor Bende Çalışmıyor' Sorununu Bitir
Öğrenmeye BaşlaPart 0 — Engineering Foundations