| """ |
| 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 |
| MIN_LINE = 24 |
|
|
|
|
| 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() |
|
|