File size: 2,947 Bytes
9aed7c4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
"""
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()