File size: 3,594 Bytes
a72d1cf
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
80
81
82
83
84
"""φ_tr'nin bağımsız doğrulaması: üreteçteki ham sayısal değerler ile ayrıştırılan değerlerin karşılaştırılması.

Referans veritabanı D*, doğru içerik dosyalarındaki Türkçe biçimli metinlerden φ_tr ile kurulur. Bu nedenle φ_tr'deki
bir hata D*'ye de taşınır ve sayı biçimi ablasyonunda görünmez. Bu betik, örnek belge üretecini (aynı tohumla)
bellekte yeniden çalıştırır; tr(), tr_paren() ve pct() biçimlendiricilerine giren HAM değerleri kaydeder ve doğru
içerik dosyalarındaki her sayısal hücre için φ_tr(metin) ile ham değeri karşılaştırır. Belge ve doğru içerik dosyaları
geçici bir klasöre yazılır; proje dosyaları değişmez.

Kullanım: python scripts/phi_dogrulama.py      -> outputs/phi_dogrulama.json
"""
from __future__ import annotations

import importlib.util
import json
import sys
import tempfile
from pathlib import Path

ROOT = Path(__file__).resolve().parent.parent
sys.path.insert(0, str(ROOT))
from t2s.trnum import parse_number  # noqa: E402


def main():
    spec = importlib.util.spec_from_file_location("gen", ROOT / "data" / "generate_samples.py")
    gen = importlib.util.module_from_spec(spec)
    spec.loader.exec_module(gen)  # modül düzeyinde yalnızca yazı tipi kaydı ve rng=Random(2026) çalışır

    raw: dict[str, set[float]] = {}
    o_tr, o_paren, o_pct = gen.tr, gen.tr_paren, gen.pct

    def rec(s, v):
        raw.setdefault(s, set()).add(v)
        return s

    def tr(x, dec=2):
        s = o_tr(x, dec)
        return rec(s, round(float(x), dec)) if x is not None else s

    def tr_paren(x, dec=0):
        return rec(o_paren(x, dec), round(float(x), dec))

    def pct(x, dec=1):
        return rec(o_pct(x, dec), round(float(x), dec))

    gen.tr, gen.tr_paren, gen.pct = tr, tr_paren, pct
    with tempfile.TemporaryDirectory() as tmp:
        gen.DOCS, gen.GT = Path(tmp) / "docs", Path(tmp) / "gt"
        gen.DOCS.mkdir()
        gen.build_pdfs()
        gen.build_htmls()
        gts = [json.loads(p.read_text(encoding="utf-8")) for p in sorted(gen.GT.glob("*.json"))]

    # yeniden üretilen doğru içerik, depodakiyle birebir aynı olmalı (tohum kontrolü)
    repo = {p.stem: json.loads(p.read_text(encoding="utf-8")) for p in (ROOT / "data" / "ground_truth").glob("*.json")}
    same_seed = all(repo.get(g["tablo_id"], {}).get("govde") == g["govde"] for g in gts)

    n = ok = amb = 0
    bad = []
    for g in gts:
        for row in g["govde"]:
            for cell in row:
                if cell not in raw:
                    continue  # sayısal biçimlendiriciden geçmemiş hücre (ad, tarih, yıl başlığı vb.)
                vals = raw[cell]
                if len(vals) > 1:
                    amb += 1
                n += 1
                p = parse_number(cell, "tr")
                if p.ok and p.value is not None and any(abs(p.value - v) <= 1e-9 * max(1, abs(v)) for v in vals):
                    ok += 1
                else:
                    bad.append({"tablo": g["tablo_id"], "hucre": cell, "ham": sorted(vals), "phi_tr": p.value})
    out = {"tohum_ayni": same_seed, "sayisal_hucre": n, "dogru": ok, "hatali": len(bad),
           "belirsiz_esleme": amb, "oran": round(100 * ok / n, 2) if n else None, "hatalar": bad[:20]}
    (ROOT / "outputs" / "phi_dogrulama.json").write_text(json.dumps(out, ensure_ascii=False, indent=1), encoding="utf-8")
    print(json.dumps({k: v for k, v in out.items() if k != "hatalar"}, ensure_ascii=False))
    for b in bad[:10]:
        print("  ✗", b)


if __name__ == "__main__":
    main()