"""φ_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()