Word→Symbol Mapping Coverage Report (PHON-162)¶
Phase 1 (Mulberry only) is kept below as history; phase 2a (OpenMoji as provider #2) follows it.
Phase 1 — Mulberry v3.5.2¶
Date: 2026-07-12. Draft, name-based mapping only — no manual review pass yet.
Build: uv run python packages/data/scripts/build_image_mapping.py
Output: data/mappings/word_to_image.tsv (1,700 rows, 1,406 distinct words).
Lexicon: local data/runtime/words.parquet (125,756 rows; ~47K canonical).
Method¶
Symbol names from symbol-info.csv are normalized for Mulberry's conventions
(_,_to verb suffix, _-_qualifier display qualifier, trailing _2/_1a alternate
drawings) and matched case-insensitively against lexicon words:
| match_type | Rule | Count |
|---|---|---|
exact |
single normalized token equals a word | 1,569 |
joined |
multi-token name equals a word concatenated (bubble_gum → bubblegum) |
66 |
head |
trailing tokens are depiction qualifiers (lady/man/boy/…), leading token is a word (afraid_lady → afraid) |
65 |
One preferred symbol per word (unnumbered drawing, exact > joined > head, lowest
variant). 1,736 of 3,436 symbols remain unmatched — mostly multiword concepts
(apple_juice, algebra_class) that name things the lexicon stores as single words or
doesn't picture-card at all. They are the manual-review pool.
Coverage¶
| Population | Words | With symbol | Coverage |
|---|---|---|---|
| Canonical lexicon (content POS) | 47,370 | 1,232 | 2.6% |
| Early-acquired (AoA ≤ 4, canonical) | 5,575 | 836 | 15.0% |
| Early + imageable (AoA ≤ 4, concreteness ≥ 4) | 3,197 | 687 | 21.5% |
| Top-500 early by corpus frequency | 500 | 130 | 26.0% |
Overall canonical coverage is expectedly tiny (3.4K symbols vs 47K words); the numbers that matter for Therapy Packs are the early-acquired rows.
Key findings¶
- Mulberry alone won't cover early pack vocabulary. It skews toward specific and
adult-AAC concepts (
book_shelf,hand_mixer,childrens_tv) and genuinely lacks plain symbols for basic early nouns — verified absent: book, child, hand, home, people, person, body. A second provider (OpenMoji, CC BY-SA 4.0 — seeimage-sources.md) is the natural gap-filler; the mapping schema is already source-agnostic. headmatches need the manual pass. Most are good (afraid_lady→ afraid), but there are false positives (air_person_1ais an air steward, not "air"). All 65 are labeledmatch_type=headfor review.- High-frequency ≠ picturable. Of the top-60 early words by frequency without a symbol, most are non-imageable (other, also, so, time, very). The concreteness ≥ 4 row is the honest denominator for picture-card coverage.
- Unexploited signal:
symbol-info.csvhas atagscolumn (e.g.grooming,cooking) that could support tag-based candidate generation for the manual pass.
Manual-review priority (top imageable early words without a symbol, by frequency)¶
people, see, year, children, human, women, body, area, child, place, blood, city, home, book, country, land, men, person, site, days, line, words, page, building, word, sea, hand, size, animals, oil, gas, image, web, parts, call, note, matter, contact, office
Next (v6.2 integration thread — not this branch)¶
- Manual review pass over
headmatches + the priority list above. - OpenMoji mapping as provider #2 for basic-noun gaps. (→ done, phase 2a below)
has_imageproperty + provider table emit to D1; asset serving per theimage-sources.mdrecommendation (R2).
Phase 2a — + OpenMoji 17.0.0 (provider #2)¶
Date: 2026-07-12. Build: uv run python packages/data/scripts/build_image_mapping.py
(one script, both providers). Outputs: data/mappings/word_to_image.tsv (3,649 rows,
2,035 distinct words) + data/mappings/image_review_queue.tsv (443 rows). Lexicon and
populations unchanged from phase 1. Provider pinning/license:
docs/commercial/image-sources.md.
Method¶
OpenMoji 17.0.0 ships 4,495 entries; a pool filter keeps 1,343 concrete depictables (skin-tone variants dropped, groups restricted to people-body / animals-nature / food-drink / objects / activities / travel-places + concrete extras- subgroups; flags, symbols/dingbats, smileys, brands, UI elements excluded). Matching is annotation-based — no Mulberry-style positional head-matching*, emoji qualifiers are meaning-bearing too often for that:
| match_type | Rule | Count |
|---|---|---|
exact |
single-token annotation equals a word (child, dog) |
484 |
joined |
multi-token annotation equals a word concatenated (teddy bear → teddybear) |
17 |
token_tag |
word is the first or last annotation token AND appears in the emoji's tags — the tag confirms the token is the depicted concept (waving hand → hand, open book → book) |
1,448 |
Tag-only matches (word in tags but not in the annotation) were rejected outright:
tags carry loose associations (tag body sits on skull/ear/nose, country on house)
and would inflate coverage with wrong cards. 1,949 mapping rows total; 629 words are
covered by OpenMoji alone. Mulberry stays preferred whenever both providers cover a
word (AAC-purpose-built drawings); within OpenMoji, exact > joined > token_tag, then
fewest annotation tokens, then Unicode order.
Coverage — Mulberry-only vs Mulberry+OpenMoji¶
| Population | Words | Mulberry only | + OpenMoji |
|---|---|---|---|
| Canonical lexicon (content POS) | 47,370 | 1,232 (2.6%) | 1,810 (3.8%) |
| Early-acquired (AoA ≤ 4, canonical) | 5,575 | 836 (15.0%) | 1,132 (20.3%) |
| Early + imageable (AoA ≤ 4, concreteness ≥ 4) | 3,197 | 687 (21.5%) | 946 (29.6%) |
| Top-500 early by corpus frequency | 500 | 130 (26.0%) | 168 (33.6%) |
Gap check — phase-1 verified-missing basics¶
| Word | Covered? | Preferred image |
|---|---|---|
| book | ✅ | openmoji 1F4D5 (closed book, token_tag) |
| child | ✅ | openmoji 1F9D2 (child, exact) |
| hand | ✅ | openmoji 1F44B (waving hand, token_tag) |
| home | ❌ | — (🏠 is annotated house; home only appears as a tag → rejected tier) |
| people | ✅ | openmoji 1F93C (people wrestling, token_tag — flagged for review; people hugging 1FAC2 is the better card and is in the TSV as an alternate) |
| person | ✅ | openmoji 1F9D1 (person, exact) |
| body | ❌ | — (no emoji is annotated body; only body parts) |
Gap check — phase-1 manual-review priority list (39 words)¶
| Word | Status | Word | Status |
|---|---|---|---|
| people | ✅ people wrestling (review) | sea | ❌ |
| see | ❌ | hand | ✅ waving hand |
| year | ❌ | size | ❌ |
| children | ❌ | animals | ❌ |
| human | ❌ | oil | ✅ oil drum (review) |
| women | ✅ women wrestling (review) | gas | ❌ |
| body | ❌ | image | ❌ |
| area | ❌ | web | ✅ spider web (review) |
| child | ✅ child (exact) | parts | ❌ |
| place | ❌ | call | ✅ call me hand (review) |
| blood | ✅ drop of blood | note | ✅ musical note (review) |
| city | ❌ | matter | ❌ |
| home | ❌ | contact | ❌ |
| book | ✅ closed book | office | ✅ office worker (review) |
| country | ❌ | word / words | ❌ |
| land | ❌ | page | ✅ page with curl |
| men | ✅ men wrestling (review) | building | ✅ classical building |
| person | ✅ person (exact) | site / days / line | ❌ |
15 of the 39 priority words gained a candidate; the token_tag ones route through the review queue.
Review queue (data/mappings/image_review_queue.tsv, 443 rows)¶
Input for the later human review pass in the UI. Contents: all 65 Mulberry head
matches + the 378 OpenMoji token_tag matches that are currently a word's preferred
image (alternates stay reviewable in word_to_image.tsv). Heuristic verdicts:
| Provider | keep | drop | unsure |
|---|---|---|---|
| mulberry (65) | 41 | 22 | 2 |
| openmoji (378) | 29 | 0 | 349 |
Mulberry heuristic: Feelings/Descriptive/Body-part/Verb categories = the person is
depicting the head concept (afraid_lady → afraid) → keep; People Profession
compounds are meaning-changing (air_person = air steward, milk_person = milkman,
dinner_lady, newspaper_person, post_person, delivery_person) → drop — this
generalizes the one confirmed phase-1 false positive (air_person_1a, forced drop).
OpenMoji heuristic: keep when all non-matching annotation tokens are depiction
qualifiers (colors, open/closed, waving/raised, directions, person/man/woman);
otherwise unsure (people wrestling, office worker).
Still missing — top-30 early+imageable words by frequency¶
see, year, children, human, body, area, place, city, home, country, land, site, days, line, words, word, sea, size, animals, list, gas, image, parts, matter, contact, weight, animal, soil, subject, author
Source #3 recommendation (not pulled yet)¶
Coverage of early+imageable is 29.6% — well under the ~50% bar. But the still-missing
list shows the residue is mostly category/abstract-leaning nouns (year, area,
place, size, matter, subject) and collectives/plurals (people, children, animals,
words, parts) that neither an AAC set nor an emoji set names directly — a third
lookalike set would mostly re-cover ground. Two commercially-usable moves, in order of
expected yield: (1) Tawasol Symbols (CC BY-SA 4.0, AAC-purpose-built, already
vetted in image-sources.md) — worth a coverage probe against the top-100 missing
list before committing; (2) a small in-house commission (~50–100 drawings released
CC BY-SA under the nonprofit) targeted exactly at the missing head nouns (home, body,
family scenes, place/city/country) — the only route that closes the abstract-noun gap,
since plural/inflected forms (children, animals, words) can instead be closed for free
in the pipeline by mapping inflections onto the root's image. Recommendation: do the
inflection→root mapping first (pipeline change, zero licensing), then probe Tawasol;
commission only what remains.