Extracting Standards References From a Curriculum Document
9 min read · updated August 11, 2026
Pulling every standards code out of a curriculum document is easy and produces something almost useless: a list of identifiers with no indication of what each one was attached to. The useful extraction is the pairing, and the pairing is what the document’s formatting makes hard.
A code on its own is not the data
Consider a line in a lesson plan: students compare two fractions with unlike denominators and justify their reasoning, followed by a code in parentheses. The code is an annotation on that activity. Extract the code alone and you have recorded that the document mentions a standard; extract the pair and you have recorded which activity claims to address it, which is the question everyone downstream is actually asking — coverage reporting, gap analysis, aligning an assessment item to what was taught.
So the extraction target is an edge, not a node: a code, the span it annotates, and the kind of thing that span is. The kinds matter and are worth constraining to a small set, because they carry different strength of claim.
- A unit or lesson objective. The strongest claim: the lesson is designed to teach the standard.
- An activity or task. A specific piece of work addressing it, usually partially.
- An assessment item. The standard is being measured, not taught, and this pairing is the one an assessment-alignment workflow needs isolated.
- A back-matter alignment table. A wholesale claim of coverage, made by the publisher, listing codes against chapters. This is a different kind of evidence from an inline mention and should not be merged with it: the table says the book claims coverage, the inline mention says where.
Store the span verbatim with a page and offset, for the same reason every other page in this cluster does: a coverage claim that cannot be traced back to its sentence cannot be checked by the person who disputes it.
The grammar of a standards identifier
Most frameworks use a dotted or hyphenated positional grammar, and the positions are meaningful. In the Common Core State Standards, published by the Common Core State Standards Initiative at corestandards.org, a mathematics identifier reads as an initiative prefix, a subject, a content marker, then a grade, a domain abbreviation, a cluster letter, a standard number and sometimes a lettered sub-standard. English language arts identifiers use a different subject segment and a strand abbreviation in place of the domain. The Next Generation Science Standards, published at nextgenscience.org, use a hyphenated form instead: a grade band, a disciplinary abbreviation and a number. State frameworks differ again, and several states cite their standards as sections of an administrative code with parenthesised subdivisions.
Two rules follow. First, parse positionally rather than as an opaque string, because the grade and the domain are the fields that make the data queryable and they are recoverable for free. Second, never write the grammar from memory: take the identifier list from the publishing body and validate against membership in it. That is the checkable part of this document — a code either exists in the published set for a framework or it does not, and a code that does not exist is either a typo in the source document or a misread in your pipeline, both of which you want to know.
Ranges, elision and inherited prefixes
In running text, authors abbreviate. This is the mechanical core of the extraction problem and it defeats a stateless matcher.
- Ranges. A citation of sub-standards a through b written with a dash denotes two or more codes, not one. Expanding it requires knowing which sub-standards exist, which is another use for the published identifier list. Where the endpoints are numeric the expansion is arithmetic; where they are letters it is alphabetic, and where the framework skips a letter the naive expansion invents a code.
- Elision within a list. A sentence citing one full identifier followed by bare numbers separated by commas means the remaining codes share the preceding prefix. The bare numbers are meaningless alone, so a matcher that emits them as codes has produced garbage, and one that ignores them has lost most of the citations on the page.
- Inherited prefixes across a document. A chapter heading establishes a grade and a domain, and every code in the chapter is written in short form beneath it. Resolution requires carrying the last complete identifier as state while walking the document in reading order — which is another reason reading order has to be right before any of this starts. The general problem is PDF parsing’s, and a two-column teacher edition is the case where it bites — see two-column PDF reading order.
- Case and separator drift. The same standard appears uppercase with dots in one document and lowercase with the sub-letter attached to the number in another. Normalise to a canonical form for the key and keep the printed form for display, exactly as with the parcel number in permit application field extraction.
Why a regex over-fires and under-fires at once
A pattern loose enough to catch the elided forms will also match things that are not standards. Curriculum documents are dense with numbers that look identical to short-form codes: section numbers, page references, figure numbers, textbook exercise ranges, and reading levels. A short numeric token with a dot in it, taken out of context, is not decidable.
The fix is not a better pattern; it is a two-stage design. Use the pattern as a candidate generator with recall as the priority, then decide each candidate with evidence that a pattern cannot see: does the token resolve to a member of a loaded identifier set, is it inside or adjacent to a span introduced by a standards heading, does it inherit a prefix that makes it valid, and is it typographically marked — in parentheses, in a margin column, in a labelled row of a table. A language model is well suited to the second stage precisely because the decision is contextual, and a validation lookup is well suited to settling it afterwards.
Keep the rejected candidates with their reason, in the same place the extraction field audit trail lives. A curriculum reviewer reading a coverage report needs to know the difference between a standard the document does not mention and one your pipeline discarded.
Frameworks are versioned and renamed
The last thing that makes this document type distinctive is that the vocabulary itself is contested and moves. Several states adopted the Common Core, then renamed their standards while keeping most of the content and altering some codes; others wrote their own frameworks from the start. A document can cite two frameworks at once — a national set and a state set — and a crosswalk between them is an editorial artifact with its own version, not a fact.
Practically: store framework, version, code and verbatim citation as four fields, never fold a crosswalk into the extraction, and treat an unresolvable code as unresolved rather than mapping it to the nearest match. A coverage report built on a silent crosswalk is a report whose errors are invisible to the person relying on it, and mapping standards across frameworks is a judgement made by curriculum specialists rather than something to infer from string similarity.