""" Faz 0 / Adım 3 — Tokenizer sağlık metrikleri (EN vs TR ayrı). Ölçülenler (kılavuz Bölüm 3.3): - fertility = token / kelime (EN ve TR ayrı) → hedef: TR/EN < 1.5 - chars/token, bytes/token - byte_fallback oranı (bilinmeyen bayt kullanımı) Held-out: eğitimde kullanılan ilk dokümanları atlayıp taze örnek çeker. """ import os, re os.environ["HF_HUB_DISABLE_SYMLINKS_WARNING"] = "1" import sentencepiece as spm from datasets import load_dataset MODEL = "kod/data/smartcore_v1_tok.model" N_DOCS = 300 BYTE_RE = re.compile(r"^<0x[0-9A-Fa-f]{2}>$") def measure(sp, name, cfg, skip, tag): ds = load_dataset(name, name=cfg, split="train", streaming=True) it = iter(ds) for _ in range(skip): # eğitim bölgesini atla (held-out) next(it) tok = words = chars = bytefb = n = 0 for rec in it: t = rec.get("text", "").strip() if len(t) < 100: continue ids = sp.encode(t, out_type=int) pieces = sp.encode(t, out_type=str) tok += len(ids) words += len(t.split()) chars += len(t) bytefb += sum(1 for p in pieces if BYTE_RE.match(p)) n += 1 if n >= N_DOCS: break fert = tok / max(1, words) print(f" [{tag}] {n} doc | fertility(tok/kelime)={fert:.3f} | " f"char/token={chars/max(1,tok):.2f} | byte_fallback={100*bytefb/max(1,tok):.2f}% " f"| {words} kelime / {tok} token") return fert def main(): sp = spm.SentencePieceProcessor(model_file=MODEL) print(f"vocab={sp.get_piece_size()} | unk={sp.unk_id()} bos={sp.bos_id()} " f"eos={sp.eos_id()} pad={sp.pad_id()}\n") en = measure(sp, "HuggingFaceFW/fineweb-edu", "sample-10BT", 20000, "EN") tr = measure(sp, "HuggingFaceFW/fineweb-2", "tur_Latn", 16000, "TR") ratio = tr / en print(f"\n TR/EN fertility oranı = {ratio:.3f} " f"(hedef <1.5; çok-dilli tokenizer'lar genelde ~1.4)") print(" YARGI:", "OK — TR dengeli" if ratio < 1.5 else "UYARI — TR fertility yüksek, tokenizer korpusunda TR payını artır") print("\n Örnek tokenizasyon (TR):") s = "Yapay zeka, dilbilgisel açıdan zengin Türkçe metinleri işleyebilmeli." print(" ", sp.encode(s, out_type=str)) if __name__ == "__main__": main()