spectre_pdf 1.0.0

Native Rust PDF extraction engine: text, markdown for RAG, AcroForm widgets, image decoding, and encrypted PDFs. Lazy parser, persistent Document handle, no C dependencies.
Documentation
"""Throwaway: summarize sweep_results.json."""
import json, statistics, sys

raw = open('/tmp/spectre_extra_corpus/sweep_results.json').read()
# MuPDF errors get printed to stdout by pymupdf4llm; skip prelude until '{'.
idx = raw.find('{\n  "rows":')
d = json.loads(raw[idx:])
rows = d['rows']
spec = [r['spec_f1'] for r in rows]
pmu  = [r['pmu_f1']  for r in rows]
gap  = [r['pmu_f1'] - r['spec_f1'] for r in rows]
print(f'N={len(rows)}')
print(f'mean spec F1 = {statistics.mean(spec):.3f}')
print(f'mean pmu  F1 = {statistics.mean(pmu):.3f}')
print(f'mean gap     = {statistics.mean(gap):+.3f}  (positive = pmu wins)')
print(f'median gap   = {statistics.median(gap):+.3f}')
non_zero = [r for r in rows if not (r['spec_f1']==0 and r['pmu_f1']==0)]
spec2 = [r['spec_f1'] for r in non_zero]
pmu2  = [r['pmu_f1']  for r in non_zero]
gap2  = [r['pmu_f1'] - r['spec_f1'] for r in non_zero]
print(f'\n-- excluding zero/zero PDFs --')
print(f'N={len(non_zero)}')
print(f'mean spec F1 = {statistics.mean(spec2):.3f}')
print(f'mean pmu  F1 = {statistics.mean(pmu2):.3f}')
print(f'mean gap     = {statistics.mean(gap2):+.3f}')
spec_wins = sum(1 for r in rows if r['spec_f1'] > r['pmu_f1'])
pmu_wins  = sum(1 for r in rows if r['pmu_f1']  > r['spec_f1'])
ties      = sum(1 for r in rows if r['spec_f1'] == r['pmu_f1'])
print(f'\nspec wins: {spec_wins}, pmu wins: {pmu_wins}, ties: {ties}')
print('\n-- ranked by gap (pmu-favoring first) --')
for r in sorted(rows, key=lambda r: -(r['pmu_f1']-r['spec_f1'])):
    print(f"  {r['label']:18s} gap={r['pmu_f1']-r['spec_f1']:+.2f}  spec={r['spec_f1']:.2f} pmu={r['pmu_f1']:.2f}")