# 40.5 — ACM 50th Anniversary Booklet extraction Structured extraction of the *Alliance for Community Media 50th Anniversary Booklet* (1976–2026) into per-contributor records: the speaker or author, their role or the piece's title, and the complete text of that person's section. **105 records from 47 text-bearing pages of a 60-page PDF.** 45 origin stories, 23 conversation turns (12 people), 11 In Remembrance entries, 6 feature articles, and 19 records flagged for human review. ## Read first `docs/ACM50_EXTRACTION_ANALYSIS_AND_PLAN.md` (`.docx`/`.pdf` alongside) — what the source is, why `pdftotext -layout` was rejected on evidence, why PyMuPDF was chosen over four alternatives, and §6.3: the eight defects found while building, **every one of which produced fluent, non-erroring, wrong output**. ## Run ``` /home/access/.venvs/acm50/bin/python tools/diagnose_layout.py # run FIRST on a new edition /home/access/.venvs/acm50/bin/python tools/extract_acm50.py # dry-run /home/access/.venvs/acm50/bin/python tools/extract_acm50.py --yes # apply /home/access/.venvs/acm50/bin/python tools/make_review_sheet.py # worksheet ``` Requires `pymupdf` (venv at `~/.venvs/acm50`). Source PDF is read from `~/Downloads/`; it is not copied into the bundle (159 MB). ## Layout | Path | What | |---|---| | `docs/` | analysis and plan (`.md`/`.docx`/`.pdf`) | | `tools/diagnose_layout.py` | re-derives the layout facts every rule depends on — **run first on any new edition** | | `tools/extract_acm50.py` | the pipeline — streaming, checkpointed, resumable | | `tools/make_review_sheet.py` | worksheet generator for flagged records | | `out/acm50_sections.jsonl` | the records | | `out/run_manifest.json` | source SHA-256, page inventory, rule version | | `out/checkpoint.json` | completed pages; drives resume | | `out/REVIEW_flagged.txt` | 19 rows awaiting a human decision | | `out/layout_diagnostics.txt` | stylesheet, text-layer inventory, gutters, rotated text | ## Status Extraction complete and verified. **The 19 flagged records have not been reviewed** — the worksheet is generated, not worked. Nothing downstream (the proper-noun gazetteer, any NER pass) has been run; see §9 of the analysis for the recommended sequence and why NER should *not* be used for the author field.