# Rime bands of English, under a stated anchor rule

155,854 rows over 126,052 headwords:
every reading of every word in the dictionary, with the rime it belongs to.

**The unit is a reading, not a word.** One row is one (headword, pronunciation, anchor)
triple. A word with two pronunciations and two legitimate anchors each contributes four
rows. It is not a list of words, and `rows` is not a word count.

## The one thing this has that a rhyming dictionary does not

Every rhyming dictionary anchors the rime on the last **primary**-stressed vowel. This one
anchors on the last vowel carrying stress **of any grade**, and keeps both readings where
both exist. That is why `paradise` is in the same rime as `dice` here and in no other
dictionary, and it is why 20,744 of these rows exist at
all: they are the secondary-stress readings, flagged `secondary: true`.

Two rows with the same `rime` string are a perfect rhyme under this rule. That field is
the join key, and 50,566 distinct rimes cover the whole
dictionary.

## Three corrections, each flagged rather than applied silently

1. **The anchor.** As above. `anchor_stress` says which grade the reading used.
2. **Maximal onset.** `onset` against `raw_onset`: where they differ, the correction
   fired, and it is what stops `quicksilver` reading as a perfect rhyme for `silver`.
3. **Pre-rhotic neutralisation.** `fragment` against `raw_fragment`, summarised by
   `normalised`, true on 140 rows. The source
   writes `hear` as HH IY1 R and `clear` as K L IH1 R: it contradicts itself before
   /r/. We neutralise the distinction and say so on the row rather than repairing the
   dictionary quietly.

## Files

- `rhymes-a.jsonl` through `rhymes-z.jsonl`, plus `rhymes-0.jsonl` for headwords
  that do not begin with a letter: one JSON object per line, UTF-8, LF, sharded on the
  headword's first character. Every shard is independently valid JSONL, so you can take
  one letter or concatenate them all.
- `schema.json`, `sources.json`, `manifest.json`, `validate.mjs`: the shape, the
  provenance, the digests, and a dependency-free checker for all three.
- `CMUDICT-LICENSE.txt`, `SCOWL-COPYRIGHT.txt`: the two upstream notices, verbatim,
  because both licences require them to travel with a redistribution.

## What is missing, and it is not small

- `band` is null on 67,705 of
  126,052 headwords. SCOWL's ordinary-word lists do not
  contain proper names, abbreviations, contractions or possessives, and the intersection
  rule that decides membership is ours, not SCOWL's.
- **Neither source carries a retrieval date in this repository.** CMUdict upstream is a
  rolling working copy with no version, so the sha256 in `sources.json` is the only
  identifier either of them has. That is a real gap and it is recorded rather than
  papered over.
- Seven headwords have no vowel in any pronunciation (hm, and its kind) and produce no row at all.

## Citation

> Artificial Wasteland (2026). *Rime bands of English, under a stated anchor rule.*
> https://artwaste.land/data/rhyme-anchors/ · pronunciations from CMUdict (CMU, BSD
> 2-Clause), commonness bands from SCOWL (Kevin Atkinson); anchor rule and rime banding
> by the Artificial Wasteland, CC0 1.0.
