Is per-piece tagging worth its incoherence? — the B0 verdict
2026-07-16. Asked directly: does our intra-word emission incoherence vindicate or villainize the architecture?
Verdict: MIXED, and the mix is informative. The capability is real and provably beyond a word-unitunitA subdivision of a building — apartment, suite, floor — that refines a street address. Mailwoman's unit component; a designator plus identifier forms a subpremise. tagger's ceiling. We exercise it only when a partner word licenses it — which is the same defect, for the third time, in a third component. The architecture is not the problem. The licence is.
The question, made decidable
A word-pooled tagger (subwords → one vector per word → one tag per word) cannot produce an
intra-word disagreement. We can, and do: on Tindvegen nedre 44B our modelneural classifierThe machine learning model at the core of Mailwoman's parser — a transformer encoder (~30M parameters) trained from scratch to do BIO token classification over addresses. It learns the 'grammar' of address formats; the gazetteer supplies the 'atlas.' emits B-house_number
at 0.604 on the first digit piece and I-postcode at 0.587/0.765 on its continuations. ViterbiViterbi decodingA dynamic programming algorithm that finds the most likely sequence of hidden states (labels) given a sequence of observations (token emissions). Mailwoman uses Viterbi over a linear-chain CRF to produce globally coherent BIO label sequences from per-token model scores. then
legally resolves to postcodepostcodeThe country-specific postal code (US ZIP, French code postal, etc.). Mailwoman handles postcode parsing entirely by rule classifier — a regex problem, not an ML one., discarding the piece that was right.
That is a real liability. But the flexibility that lets us be wrong is the same flexibility that lets us be right, so the question is not "is incoherence bad" — it is whether the per-piece unitunitA subdivision of a building — apartment, suite, floor — that refines a street address. Mailwoman's unit component; a designator plus identifier forms a subpremise. buys more than it costs. Two arms, one axis:
- BENEFIT — rows where the correct answer requires splitting inside a whitespace word. Not in a word-unitunitA subdivision of a building — apartment, suite, floor — that refines a street address. Mailwoman's unit component; a designator plus identifier forms a subpremise. tagger's output space at any confidence.
- COST — rows where our per-piece emissions disagree with themselves.
The benefit arm: proven on one row, and one row is enough
Unit 12/345 Main St
mailwoman -> unit "Unit 12", house_number "345", street "Main St" CORRECT
deepparse -> Unit "unit 12/345", StreetNumber "main", StreetName "st" cannot represent it
12/345 is one whitespace word carrying two components — unitunitA subdivision of a building — apartment, suite, floor — that refines a street address. Mailwoman's unit component; a designator plus identifier forms a subpremise. 12 at number 345, the standard AU/NZ
form. Our parity gold has demanded this since the v1 rules era (v1-address.aus-2).
This is not deepparse scoring lower. The correct answer is not in its output space. One word gets one tag; there is no assignment of tags-to-words that yields unitunitA subdivision of a building — apartment, suite, floor — that refines a street address. Mailwoman's unit component; a designator plus identifier forms a subpremise.=12 and house_number=345. No amount of trainingtrainingThe process of adjusting a model's parameters so its predictions match labeled examples, by repeatedly measuring error and nudging the weights to reduce it. Distinct from inference, when the trained model is run on new input. or data fixes that — it is the unitunitA subdivision of a building — apartment, suite, floor — that refines a street address. Mailwoman's unit component; a designator plus identifier forms a subpremise. of decision.
An existence proof needs one instance and it has one. The per-piece unitunitA subdivision of a building — apartment, suite, floor — that refines a street address. Mailwoman's unit component; a designator plus identifier forms a subpremise. buys a class of answers a word unitunitA subdivision of a building — apartment, suite, floor — that refines a street address. Mailwoman's unit component; a designator plus identifier forms a subpremise. cannot express.
The cost arm: 5 losses, of which only 3 are this defect
| input | mailwoman | deepparse |
|---|---|---|
Øvste Skogen 121 | streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels. ✓, postcodepostcodeThe country-specific postal code (US ZIP, French code postal, etc.). Mailwoman handles postcode parsing entirely by rule classifier — a regex problem, not an ML one. 121 ✗ | StreetNumber 121 ✓ |
aleja Wojska Polskiego 178 | streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels. ✓, postcodepostcodeThe country-specific postal code (US ZIP, French code postal, etc.). Mailwoman handles postcode parsing entirely by rule classifier — a regex problem, not an ML one. 178 ✗ | StreetNumber 178 ✓ |
14 Glen Neaves | postcodepostcodeThe country-specific postal code (US ZIP, French code postal, etc.). Mailwoman handles postcode parsing entirely by rule classifier — a regex problem, not an ML one. 14 ✗, streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels. ✓ | StreetNumber 14 ✓ |
Epleskogen 39A | localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy. "Epleskogen", postcodepostcodeThe country-specific postal code (US ZIP, French code postal, etc.). Mailwoman handles postcode parsing entirely by rule classifier — a regex problem, not an ML one. 39A | StreetNumber 39a ✓ |
Tindvegen nedre 44B | localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy. "Tindvegen", streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels. "nedre", postcodepostcodeThe country-specific postal code (US ZIP, French code postal, etc.). Mailwoman handles postcode parsing entirely by rule classifier — a regex problem, not an ML one. 44B | StreetNumber 44b ✓ |
Tindvegen 44B (control) | streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels. ✓, house_number ✓ | ✓ |
Main St 44B (control) | streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels. ✓, house_number ✓ | ✓ |
The last two rows do the work. Tindvegen 44B — an unfamiliar Norwegian streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels. — parsesaddress parsingThe process of decomposing a free-text postal address string into structured components — house number, street name, locality, region, postcode, and country — so a geocoder can resolve them to coordinates.
correctly. Add one word and Tindvegen nedre 44B breaks. So the cost arm is not "unfamiliar streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels.
breaks the digit."
And the bottom two failures are not digit ownership at all: the modelneural classifierThe machine learning model at the core of Mailwoman's parser — a transformer encoder (~30M parameters) trained from scratch to do BIO token classification over addresses. It learns the 'grammar' of address formats; the gazetteer supplies the 'atlas.' called the streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels. a localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy.. That is Track A's bare-streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels. polarity defect — the one v310 just fixed for French — leaking in. With no streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels. recognized, the digit has no streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels. to attach to, so it cannot be a house number. Only 3 of 5 cost rows are genuine digit ownership.
The third instance of the licence
The benefit arm exposed something the cost arm hid. We split intra-word — but only when told to:
Unit 12/345 Main St -> unit "Unit 12", house_number "345" SPLIT
12/345 Main St -> house_number "12/345" no split
Apt 12/345 Main St -> unit "Apt 12", house_number "345" SPLIT
3/17 Bondi Rd -> house_number "3/17" no split
Unit 12/345 -> unit "Unit 12", house_number "345" SPLIT
12/345 -> postcode "12/345" no split, and postcode
The designatordesignatorThe closed-vocabulary leading word of a secondary-address phrase — 'Apt', 'Suite', 'Floor', 'PO Box', 'Level' — paired with an identifier to form a complete subpremise. word licenses the split. Remove it and the identical characters collapse to one spanspanA contiguous range of characters or tokens in the input string, tagged with an address component type (street, locality, postcode, etc.). Parsed addresses are represented as collections of spans, possibly nested in a tree.. Deepparse, for the record, splits neither — it cannot.
That is the same shape as the two defects already on the board:
| # | licence | consequence | status |
|---|---|---|---|
| 1 | a digit licenses the streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels. reading | Rue Montmartre → localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy. | fixed by v310's shardshardA partial output file of the corpus build, written in Parquet format. The training pipeline streams shards row by row. (+50pp) |
| 2 | a known streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels. licenses the house_number reading | Øvste Skogen 121 → postcodepostcodeThe country-specific postal code (US ZIP, French code postal, etc.). Mailwoman handles postcode parsing entirely by rule classifier — a regex problem, not an ML one. | open (Track B) |
| 3 | a designatordesignatorThe closed-vocabulary leading word of a secondary-address phrase — 'Apt', 'Suite', 'Floor', 'PO Box', 'Level' — paired with an identifier to form a complete subpremise. word licenses the intra-word split | 12/345 → one spanspanA contiguous range of characters or tokens in the input string, tagged with an address component type (street, locality, postcode, etc.). Parsed addresses are represented as collections of spans, possibly nested in a tree. | open (this page) |
One defect, three components: the modelneural classifierThe machine learning model at the core of Mailwoman's parser — a transformer encoder (~30M parameters) trained from scratch to do BIO token classification over addresses. It learns the 'grammar' of address formats; the gazetteer supplies the 'atlas.' will not read a component without its co-occurring partner. It has learned the joint distribution and not the marginals. That is a trainingtrainingThe process of adjusting a model's parameters so its predictions match labeled examples, by repeatedly measuring error and nudging the weights to reduce it. Distinct from inference, when the trained model is run on new input.-data property, not an architecture property — and instance 1 was fixed with a phenomenon shardshardA partial output file of the corpus build, written in Parquet format. The training pipeline streams shards row by row. plus a counter-distribution, without touching the architecture at all.
What this means for the architecture
Vindicating:
- The per-piece unitunitA subdivision of a building — apartment, suite, floor — that refines a street address. Mailwoman's unit component; a designator plus identifier forms a subpremise. buys answers a word unitunitA subdivision of a building — apartment, suite, floor — that refines a street address. Mailwoman's unit component; a designator plus identifier forms a subpremise. cannot represent, demonstrated (
Unit 12/345 Main St). - Our ≥4-digit boundary is learned, not structural: on the 351/376 parity rows we get right, the per-piece posterior tracks the length-conditioned corpuscorpusThe BIO-labeled training data used to train Mailwoman's neural classifier. Assembled from real sources (OpenAddresses, National Address Database) and synthetic shards (boundary stress, order variants, negative space). Managed by @mailwoman/corpus. (2d continuation → postcodepostcodeThe country-specific postal code (US ZIP, French code postal, etc.). Mailwoman handles postcode parsing entirely by rule classifier — a regex problem, not an ML one. 0.0270 vs the corpuscorpusThe BIO-labeled training data used to train Mailwoman's neural classifier. Assembled from real sources (OpenAddresses, National Address Database) and synthetic shards (boundary stress, order variants, negative space). Managed by @mailwoman/corpus.'s 0.0427) and crosses over at 4 digits — the same boundary a word-unitunitA subdivision of a building — apartment, suite, floor — that refines a street address. Mailwoman's unit component; a designator plus identifier forms a subpremise. tagger gets from its unitunitA subdivision of a building — apartment, suite, floor — that refines a street address. Mailwoman's unit component; a designator plus identifier forms a subpremise.. We have it, from data. See the H3 verdict.
- The incoherence is a tail (25/376), not the general behaviour of digit runs. "Every multi-piece digit run gets dragged to postcodepostcodeThe country-specific postal code (US ZIP, French code postal, etc.). Mailwoman handles postcode parsing entirely by rule classifier — a regex problem, not an ML one. by its continuations" is refuted at 0.0270.
Villainizing, and worth saying plainly:
- Their failure mode is bounded; ours is not. A word-unitunitA subdivision of a building — apartment, suite, floor — that refines a street address. Mailwoman's unit component; a designator plus identifier forms a subpremise. tagger's worst case is a wrong tag. Ours is
a self-contradictory one, and ViterbiViterbi decodingA dynamic programming algorithm that finds the most likely sequence of hidden states (labels) given a sequence of observations (token emissions). Mailwoman uses Viterbi over a linear-chain CRF to produce globally coherent BIO label sequences from per-token model scores. resolves it by discarding a first piece that was correct
(0.604
B-house_number, outvoted 3-to-1 by its own continuations). We destroy information we already had. - The
enforceWordConsistencyheal cannot reach this class, and the arithmetic says why: the vote sums softmaxsoftmaxThe function that converts a vector of logits into a probability distribution summing to 1, applied after priors and biases are added to the emission logits. mass, and the continuations have more of it (postcodepostcodeThe country-specific postal code (US ZIP, French code postal, etc.). Mailwoman handles postcode parsing entirely by rule classifier — a regex problem, not an ML one. 1.53 vs house_number 0.65 on▁3|9|A). It works exactly as designed and still lands on postcodepostcodeThe country-specific postal code (US ZIP, French code postal, etc.). Mailwoman handles postcode parsing entirely by rule classifier — a regex problem, not an ML one.. Do not tune it for this. - We collect the benefit only under licence. An unexercised capability is not a capability.
Not settled here: the arc's own research says a lower-fertilityfertilityHow many tokenizer pieces it takes to spell a word: fertility 1 means whole words survive tokenization, fertility 3 means they arrive in fragments. High fertility hurts sequence labeling directly — the model has to reassemble a word before it can label it, and fragment boundaries are where labels break. Mailwoman measured this on French street names: accented words splitting at the accent ('René' → '▁Ren' + 'é') caused real geocoding misses, and lowering French fertility was worth a tokenizer revision plus a retrain. vocabvocabularyThe fixed set of tokens a tokenizer can produce. Mailwoman's SentencePiece vocabulary is tens of thousands of subword pieces, with byte fallback for anything outside it. is upstream of any spanspanA contiguous range of characters or tokens in the input string, tagged with an address component type (street, locality, postcode, etc.). Parsed addresses are represented as collections of spans, possibly nested in a tree. headattention headOne of several parallel attention computations in a layer, each free to focus on a different kind of relationship between tokens. Their outputs are concatenated — 'multi-head attention'. Mailwoman uses 4 heads., and the spanspanA contiguous range of characters or tokens in the input string, tagged with an address component type (street, locality, postcode, etc.). Parsed addresses are represented as collections of spans, possibly nested in a tree. headattention headOne of several parallel attention computations in a layer, each free to focus on a different kind of relationship between tokens. Their outputs are concatenated — 'multi-head attention'. Mailwoman uses 4 heads. was built and closed first — a conditional verdict flagged on its parked PR. Nothing on this page re-opens it. But note the direction: if the licence defect is a data property and the shardshardA partial output file of the corpus build, written in Parquet format. The training pipeline streams shards row by row. fixes it, the vocabvocabularyThe fixed set of tokens a tokenizer can produce. Mailwoman's SentencePiece vocabulary is tens of thousands of subword pieces, with byte fallback for anything outside it. work is an optimization, not a prerequisite.
Caveats
- The control set is 16 hand-built rows plus 6 minimal pairs. It is an existence proof and a mechanism probe, not a score. No CI is quoted and none should be.
- Three rows are marked
contested(Apt4B,1-2-3 Chome,Eberswalder Straße 100 104) — each turns on a schema call we have not made — and are excluded from every count above. - deepparse is good research and this is not a scoreboard. It ties us where the schemas overlap and beats us on one tag; the representational asymmetry runs both ways and this page is about ours.
Reproduce
node scratchpad/intraword-mailwoman.run.ts
node scratchpad/mp-designator.mjs
cd /home/lab/Projects/deepparse && source .venv/bin/activate && \
python /home/lab/Projects/mailwoman/scratchpad/intraword-deepparse.py