""" Faz 0 / Adım 1 — Tokenizer korpusu hazırla (EN + TR, TR ağırlıklı). EN: HuggingFaceFW/fineweb-edu (sample-10BT) — streaming TR: HuggingFaceFW/fineweb-2 (tur_Latn) — streaming TR ağırlığı yüksek (~%45) tutulur ki tokenizer TR fertility'sini düşürsün (kılavuz Bölüm 3.2). Çıktı: satır-başı-bir-parça düz metin (SentencePiece girdisi). Uzun dokümanlar paragraf/parçalara bölünür (SP max_sentence_length limiti için). Kullanım: python kod/faz0_01_corpus.py --total_mb 150 --tr_frac 0.45 """ import os, argparse, time os.environ["HF_HUB_DISABLE_SYMLINKS_WARNING"] = "1" from datasets import load_dataset CHUNK_MAX = 2000 # bir satırın max karakteri (SP max_sentence_length güvenli) MIN_LINE = 24 # çok kısa parçaları atla def doc_to_lines(text): for para in text.split("\n"): para = para.strip() if len(para) < MIN_LINE: continue if len(para) <= CHUNK_MAX: yield para else: for i in range(0, len(para), CHUNK_MAX): seg = para[i:i + CHUNK_MAX].strip() if len(seg) >= MIN_LINE: yield seg def pull(name, cfg, target_bytes, fout, tag): ds = load_dataset(name, name=cfg, split="train", streaming=True) written, ndocs, t0 = 0, 0, time.perf_counter() for rec in ds: ndocs += 1 for line in doc_to_lines(rec.get("text", "")): b = (line + "\n").encode("utf-8") fout.write(line + "\n") written += len(b) if written >= target_bytes: break if ndocs % 2000 == 0: print(f" [{tag}] {written/1e6:6.1f} MB | {ndocs} doc | " f"{written/1e6/max(1e-9,(time.perf_counter()-t0)):.1f} MB/s", flush=True) print(f" [{tag}] BİTTİ: {written/1e6:.1f} MB, {ndocs} doc " f"({time.perf_counter()-t0:.0f}s)", flush=True) return written def main(): ap = argparse.ArgumentParser() ap.add_argument("--total_mb", type=float, default=150) ap.add_argument("--tr_frac", type=float, default=0.45) ap.add_argument("--out", default="kod/data/tokenizer_corpus.txt") args = ap.parse_args() os.makedirs(os.path.dirname(args.out), exist_ok=True) tr_bytes = int(args.total_mb * 1e6 * args.tr_frac) en_bytes = int(args.total_mb * 1e6 * (1 - args.tr_frac)) print(f"Hedef: {args.total_mb} MB toplam | TR {tr_bytes/1e6:.0f} MB ({args.tr_frac:.0%}) " f"+ EN {en_bytes/1e6:.0f} MB") with open(args.out, "w", encoding="utf-8", newline="\n") as f: en = pull("HuggingFaceFW/fineweb-edu", "sample-10BT", en_bytes, f, "EN") tr = pull("HuggingFaceFW/fineweb-2", "tur_Latn", tr_bytes, f, "TR") total = (en + tr) / 1e6 print(f"\nKORPUS HAZIR: {args.out} | {total:.1f} MB " f"(EN {en/1e6:.1f} + TR {tr/1e6:.1f}, TR payı {tr/(en+tr):.0%})") if __name__ == "__main__": main()