# BuildWithThis check script for "Turn web pages into clean text" (test script v1, frozen 2026-10-16).
# Run from a folder containing a clone of github.com/scrapinghub/article-extraction-benchmark as aeb/ and your runs/<name>.json + runs/<name>.time.
import json, sys, statistics, re
sys.path.insert(0, 'aeb'); import evaluate as ev
gt = json.load(open('aeb/ground-truth.json'))
res = {}
for name in sys.argv[1:]:
    d = json.load(open(f'runs/{name}.json'))
    out = d['output']; keys = list(gt)
    tpf = [ev.string_shingle_matching(true=gt[k]['articleBody'], pred=out[k]['articleBody']) for k in keys]
    m = ev.metrics_from_tp_fp_fns(tpf)
    f1s = []
    for tp, fp, fn in tpf:
        p, r = ev.precision_score(tp, fp, fn), ev.recall_score(tp, fp, fn)
        f1s.append(0 if p + r == 0 else 2*p*r/(p+r))
    nonempty = sum(1 for k in keys if out[k]['articleBody'].strip()) / len(keys)
    good = sum(1 for f in f1s if f >= 0.8) / len(keys)
    med = statistics.median(d['times'].values()) * 1000
    tm = open(f'runs/{name}.time').read()
    mem = int(re.search(r'Maximum resident set size \(kbytes\): (\d+)', tm).group(1)) / 1024
    unsafe = [k for k in keys if re.search(r'<script|javascript:', (d['html'].get(k) or out[k]['articleBody']), re.I)]
    W = {'W1': nonempty >= .95, 'W2': m['f1'] >= .90, 'W3': m['precision'] >= .90, 'W4': m['recall'] >= .90,
         'W5': good >= .90, 'W6': med <= 50, 'W7': mem <= 1024}
    res[name] = dict(version=d['version'], nonempty=nonempty, f1=m['f1'], precision=m['precision'], recall=m['recall'],
                     mean_page_f1=statistics.mean(f1s), share_f1_08=good, median_ms=med, peak_mb=mem,
                     unsafe_pages=len(unsafe), empty_pages=[k for k in keys if not out[k]['articleBody'].strip()],
                     checks=W, passed=sum(W.values()))
    print(name, {k: (round(v, 3) if isinstance(v, float) else v) for k, v in res[name].items() if k != 'empty_pages'}, 'empty', len(res[name]['empty_pages']))
json.dump(res, open('runs/scores-r1.json', 'w'), indent=1)
