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()
|