Skip to content

Human review of the 859 auto-drafted construction decisions.csv rows #104

Description

@rybesh

Summary

sources/construction/decisions.csv was last hand-curated on 2026-07-08, against the candidate pool as it existed then. The 2026-07-23 rebase (#86, commit 47740f7) re-mined candidates.csv/occurrences.csv from the full per-record zip MARC — which now includes the non-held Z39.50 harvest — and that surfaced 859 heading clusters that had no decision.

Because a book only gets an ab:constructedUsing edge when one of its headings falls in an include=y cluster, this stale gap meant only 390 of the 3,567 books with candidate headings were linked. The join was correct; the curation was simply behind the data.

Commit 7c1a21b (on feat/construction-vocab, PR #103) fills the gap: it extends decisions.csv from 435 → 1,294 rows so every current candidate cluster now has a decision. The 859 new rows are an auto-generated best-guess DRAFT and need human review — that's what this issue tracks.

Verified rebuild impact of the draft as committed:

  • construction-methods.ttl: 100 → 176 concepts (valid Turtle)
  • ab:constructedUsing: 390 → 606 books, 980 edges

What the draft did

Each new row carries a note column explaining its auto-call. The bias is deliberate: ambiguous → include=n, because a wrong y silently adds a junk concept to the published SKOS scheme, whereas a wrong n just leaves a book unlinked (the status quo we're improving on).

Tier note contains Rows Call
Reconcile to existing concept reconciled to existing concept 113 y, reuses an existing conceptId
New construction concept NEW … concept (best-guess) 87 y, new conceptId + guessed category
Genre/subject noise genre/subject heading 227 n
Unclassified unclassified 432 n

The columns you're reviewing

cluster,labels,include,conceptId,category,prefLabel,note

  • cluster — the reconciliation key (a $0 authority URI, or <scheme>|<normalized-label>). Do not edit. It's the join key to occurrences.csv.
  • labels — read-only: the distinct raw MARC heading strings in this cluster. This is what you're judging.
  • includey or n. The gate.
  • conceptId — for y rows only: the SKOS concept this heading maps to. Reuse an existing id to merge variants across vocabularies; invent a new slug for a genuinely new concept.
  • category — for y rows only. Must be exactly one of: material, technique, binding-format, production-printing.
  • prefLabel — for y rows only: the human-facing label for a new concept. Ignored when conceptId reuses an existing concept (the existing prefLabel wins).
  • note — the auto-rationale. Delete it once you've reviewed the row so remaining notes = remaining work.

How to review

Work tier by tier (grep the note column). Only the existing 435 rows are trusted; every row with an auto: note is a draft.

  1. reconciled to existing concept (113, y) — quickest. Confirm the heading in labels really is the concept named by conceptId. Most are safe (screen prints.screen-printing), but the plural/qualifier matcher can overreach — check the VERIFY ones. If wrong, either repoint conceptId or flip to n.

  2. NEW … concept (best-guess) (87, y) — needs the most attention. For each, decide:

    • Is it actually a construction method/material/binding/printing technique? If not → n, clear the other columns.
    • Is category right (one of the four)?
    • Is conceptId/prefLabel clean, and does it duplicate an existing concept that should be merged instead? Known cases to fix: MARC typos Accordian/Acordion fold should fold into accordion-fold; long AAT parentheticals like Perfect binding (process need a clean label; borderline art-media headings (drawings, gouaches) were split — decide whether they belong.
  3. genre/subject heading (227, n). Skim to confirm none is actually a construction method. These are things like artists' books, poetry, limited editions, exhibition catalogs — correctly excluded.

  4. unclassified (432, n) — the long tail. Mostly genuine noise (foreign-language genre terms, short stories, containers), but this is where a real construction heading could hide, so it's worth a scan. Anything real → set include=y + conceptId + category (+ prefLabel if new).

To exclude a row: set include=n and blank out conceptId, category, prefLabel (matches the existing convention; the build only reads y rows).

Rebuild & sanity-check after editing

# regenerate the SKOS scheme + the per-book edges
make -C sources construction-methods.ttl
make -B graph/artists-books.ttl

# how many books are now linked?
tools/jena/bin/arq --data=graph/artists-books.ttl -q <<'SPARQL'
PREFIX ab: <https://dkglab.github.io/ns/artists-books/>
SELECT (COUNT(DISTINCT ?b) AS ?books) (COUNT(*) AS ?edges) WHERE { ?b ab:constructedUsing ?c }
SPARQL

# validate the scheme
tools/jena/bin/riot --validate sources/construction-methods.ttl

Integrity rules the build assumes (worth a final check): every y row has a non-empty conceptId, a prefLabel, and a category in the four-value set; every n row leaves those three blank.

Definition of done

Every auto: note has been reviewed and removed, and decisions.csv reflects deliberate human calls for all 1,294 clusters.

Follow-up to #103 (commit 7c1a21b).

Metadata

Metadata

Assignees

Labels

help wantedExtra attention is neededsource:library-catField sourced from the library catalog (MARC)

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions