| """
|
| 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):
|
| 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()
|
|
|