@mailwoman/neural-weights-fr-fr 9.0.0 → 9.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/model-card.json +29 -16
- package/package.json +14 -6
- package/pair-index-fr.bin +0 -0
package/README.md
CHANGED
|
@@ -35,7 +35,7 @@ model-index:
|
|
|
35
35
|
# mailwoman — neural address-parser weights (fr-fr)
|
|
36
36
|
|
|
37
37
|
The trained-model bundle (`@mailwoman/neural-weights-fr-fr`) for
|
|
38
|
-
[Mailwoman](https://mailwoman.
|
|
38
|
+
[Mailwoman](https://mailwoman.ai), a postal-address parser. This
|
|
39
39
|
package is **data only** — `model.onnx`, `tokenizer.model`, and metadata. It has
|
|
40
40
|
no JavaScript; it is loaded at inference time by `@mailwoman/neural`.
|
|
41
41
|
|
|
@@ -106,7 +106,7 @@ honest caveats on the FR numbers:
|
|
|
106
106
|
Because the older anchor-off / pre-diversified-golden figures in this bundle's
|
|
107
107
|
`model-card.json` `eval` block were measured before the anchor-on grading
|
|
108
108
|
discipline, treat them as historical; the per-tag parity tables under
|
|
109
|
-
[`docs/articles/evals/`](https://mailwoman.
|
|
109
|
+
[`docs/articles/evals/`](https://mailwoman.ai) carry the
|
|
110
110
|
config-stated numbers.
|
|
111
111
|
|
|
112
112
|
## Calibration
|
|
@@ -137,7 +137,7 @@ card carries the full corpus + recipe provenance.
|
|
|
137
137
|
## License & links
|
|
138
138
|
|
|
139
139
|
- **License:** [AGPL-3.0-only](https://www.gnu.org/licenses/agpl-3.0.html).
|
|
140
|
-
- **Docs & concepts:** https://mailwoman.
|
|
140
|
+
- **Docs & concepts:** https://mailwoman.ai
|
|
141
141
|
- **Loader / scorer API:** `@mailwoman/neural` (`createScorer`).
|
|
142
142
|
- The functional contract for this bundle is `model-card.json`; this `README.md`
|
|
143
143
|
is the HuggingFace-facing card.
|
package/model-card.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "neural-weights-fr-fr",
|
|
3
3
|
"version": "6.5.0",
|
|
4
|
-
"model_lineage": "Ships the en-us v310 (v3.1.0-fr-fragment, #1143 T2) model
|
|
5
|
-
"phase": "Stage 3
|
|
4
|
+
"model_lineage": "Ships the en-us v310 (v3.1.0-fr-fragment, #1143 T2) model — init_from v264 plus the synth-fr-fragment BAN shard @ 12.0; tokenizer v0.9.0-multisplice (73,143) UNCHANGED. One model serves both locales; see the en-us card for the full lineage + grade. NOTE for this locale specifically: the shard is BAN-derived (Base Adresse Nationale, Licence Ouverte 2.0) and the gains are measured on French — bare-street 0.215→0.715, street-particle 0.273→0.855, admin-street-homonym 0.087→0.517, with the bare-locality counter-guard holding exactly. This is the largest FR-facing model change since 5.9.0.",
|
|
5
|
+
"phase": "Stage 3 — multi-locale (FR served by the shared en-us v310 model, shipped as 6.4.0)",
|
|
6
6
|
"license": "AGPL-3.0-only OR LicenseRef-Commercial",
|
|
7
7
|
"locale": "fr-fr",
|
|
8
8
|
"training": {
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"note": "Identical artifact to neural-weights-en-us 6.4.0 / v310 fr-fragment (one multi-locale model serves both, copied at publish time). See that card's training/recipe for full provenance."
|
|
14
14
|
},
|
|
15
15
|
"requires": {
|
|
16
|
-
"$comment": "SHIP-CONFIG mirrored from neural-weights-en-us (#718/#721): this package ships en-us's model, so its required channels are identical
|
|
16
|
+
"$comment": "SHIP-CONFIG mirrored from neural-weights-en-us (#718/#721): this package ships en-us's model, so its required channels are identical — including `country` (the #1104 dedicated country soft-feed channel added in v263). createScorer / loadFromWeights read this and feed anchor + gazetteer + country + the conventions mask; running channel-OFF is the #566/#685 OOD crater.",
|
|
17
17
|
"anchor": {
|
|
18
18
|
"required": true
|
|
19
19
|
},
|
|
@@ -30,7 +30,20 @@
|
|
|
30
30
|
"bridge": {
|
|
31
31
|
"required": false
|
|
32
32
|
},
|
|
33
|
-
"suppress_gazetteer_near_postcode": true
|
|
33
|
+
"suppress_gazetteer_near_postcode": true,
|
|
34
|
+
"locality_surface": {
|
|
35
|
+
"required": true,
|
|
36
|
+
"feature_dim": 2,
|
|
37
|
+
"slots": ["locality", "locality_homograph"],
|
|
38
|
+
"lexicon": "locality-surface-lexicon-v7.json",
|
|
39
|
+
"$comment": "Copied VERBATIM from the base card: every overlay shares the base model.onnx byte-for-byte, so the trained ship-config is the base's and this block must be a superset of it. Declaring the `lexicon` name is also what ARMS the #1510 mismatch guard — resolveEvidenceLexicon only compares generations on the declared branch, so an undeclared channel falls back to a legacy filename with no guard at all."
|
|
40
|
+
},
|
|
41
|
+
"street_type": {
|
|
42
|
+
"required": true,
|
|
43
|
+
"feature_dim": 1,
|
|
44
|
+
"slots": ["street_type"],
|
|
45
|
+
"lexicon": "street-type-lexicon-v3.json"
|
|
46
|
+
}
|
|
34
47
|
},
|
|
35
48
|
"components_supported": [
|
|
36
49
|
"country",
|
|
@@ -86,7 +99,7 @@
|
|
|
86
99
|
"I-intersection_b"
|
|
87
100
|
],
|
|
88
101
|
"eval": {
|
|
89
|
-
"$comment": "SUPERSEDED / STALE (#721). The per_component + calibration numbers below are the OLD v0.9.7-step-20000 checkpoint measured ANCHOR-OFF (country 0.21, postcode 0.69
|
|
102
|
+
"$comment": "SUPERSEDED / STALE (#721). The per_component + calibration numbers below are the OLD v0.9.7-step-20000 checkpoint measured ANCHOR-OFF (country 0.21, postcode 0.69 — the #566/#685 OOD crater, NOT this package's real quality). Since the unified release CI ships en-us's v1.5.0 model for fr-fr too, the authoritative FR numbers are en-us v1.5.0-fr-order's, anchor-ON: assembled FR coord p50 1.5km / p90 5.3km, locality-match 76.3%; golden per-tag fr.house_number 99.3, fr.region 41.8 (open gap #330), fr.country 62.7, fr.postcode 99.5. See docs/articles/evals/2026-06-18-v150-vs-v170-head-to-head.md and neural-weights-en-us/model-card.json. Refresh or remove these stale fields per #721.",
|
|
90
103
|
"n_entries": 4535,
|
|
91
104
|
"full_parse_exact_match": 0.08180815876515987,
|
|
92
105
|
"mean_token_confidence": 0.8062812768727202,
|
|
@@ -224,14 +237,14 @@
|
|
|
224
237
|
"tag_correct_after": 76,
|
|
225
238
|
"tag_correct_pct": 95.0,
|
|
226
239
|
"bar_pct": 70.0,
|
|
227
|
-
"note": "mailwoman/eval-harness/fixtures/fr-lieudit-golden.jsonl. Prior-OFF leg on identical bytes stays 0/80. The 4 residual misses are span-boundary (dropped particles), not retrieval
|
|
240
|
+
"note": "mailwoman/eval-harness/fixtures/fr-lieudit-golden.jsonl. Prior-OFF leg on identical bytes stays 0/80. The 4 residual misses are span-boundary (dropped particles), not retrieval — the prior fired on all 80. DISCLOSURE: 80/80 of the board's pairs are in the index (both are BAN-derived), so this measures mechanism efficacy where the gazetteer has data, not generalization."
|
|
228
241
|
},
|
|
229
242
|
"venue_confound_board": {
|
|
230
243
|
"n": 60,
|
|
231
244
|
"false_positives": 0,
|
|
232
245
|
"fp_pct": 0.0,
|
|
233
246
|
"bar_pct": 2.0,
|
|
234
|
-
"note": "40 article-led lieu-dit surfaces (La/Le/Les/Saint
|
|
247
|
+
"note": "40 article-led lieu-dit surfaces (La/Le/Les/Saint…, from 84,582 available) + 20 others, each opening a venue name"
|
|
235
248
|
},
|
|
236
249
|
"gauntlet": "PASS after both decode-path fixes; neural 498/498, mailwoman 521/521"
|
|
237
250
|
}
|
|
@@ -241,7 +254,7 @@
|
|
|
241
254
|
"particle-honorific kryptonite (e.g. FR 'Saint-Just-Saint-Rambert') if not in synth set",
|
|
242
255
|
"non-Latin scripts (CJK, Cyrillic) fall through to byte-fallback tokens; F1 unknown"
|
|
243
256
|
],
|
|
244
|
-
"notes": "v0.4.0
|
|
257
|
+
"notes": "v0.4.0 — issue #116. Same encoder geometry as v0.3.0 (8.87M params, 6L/256H/4-heads, 21 BIO labels, linear-chain CRF). Issue proposed (1) per-token CRF NLL normalization + (3) class-weighted CE biased toward coarse labels + (4) source-weight rebalance. Empirical iteration found that §1 and §3 destabilize sustained training at every LR tested (5e-4, 3e-4, 1.5e-4 — even the v0.3.0-safe LR), and on the golden v0.1.2 eval (4535 entries) they slightly REGRESS country/postcode F1 vs v0.3.0. SHIPPED recipe is the §4-only ablation (v0.3.0 dual-loss + v0.4.0 source-weight rebalance) at lr=1.5e-4, step 2200. Modest fine-label gains (street +0.03, house_number +0.01), modest coarse-F1 regression (country -0.07, postcode -0.07). §1/§3 deferred to v0.4.1 corpus-side investigation per issue's '2K divergence' clause. Full ablation matrix retrospective in LOG.md.",
|
|
245
258
|
"format": {
|
|
246
259
|
"model": "ONNX int8 dynamic",
|
|
247
260
|
"tokenizer": "SentencePiece unigram, byte_fallback=true, vocab_size=16000",
|
|
@@ -260,18 +273,18 @@
|
|
|
260
273
|
"fr_artifacts": {
|
|
261
274
|
"$comment": "Hierarchy campaign R6 (2026-08-01). The FR instance of the placetype-pair prior.",
|
|
262
275
|
"pair_index_fr_bin": {
|
|
263
|
-
"format": "PIX1 placetype-pair index
|
|
264
|
-
"source": "BAN
|
|
276
|
+
"format": "PIX1 placetype-pair index — a retrieval-augmented (lieu-dit, commune) dependent_locality prior, e.g. (\"Pinsonnac\", \"Montpeyroux\")",
|
|
277
|
+
"source": "BAN — Base Adresse Nationale (DINUM/IGN, Licence Ouverte 2.0), raw adresses-<dept>.csv `nom_ld` field read through ban/sdk's cleanLieuDit filter. 101 départements, 1,684,844 rows carrying a clean lieu-dit. NOT WOF: WOF's French neighbourhood records are Paris quartiers, cartographic subdivisions that never appear in a postal address (the arrondissement is encoded in the postcode). The lieu-dit is the line French addresses actually carry — La Poste's line 5.",
|
|
265
278
|
"pairs": 199282,
|
|
266
279
|
"bytes": 6039155,
|
|
267
|
-
"md5": "(staged at release time
|
|
268
|
-
"$comment_pix2": "PIX2 (schema 3, 2026-08-04): every record now carries the PARENT's ComponentTag alongside the child's
|
|
269
|
-
"delta_calibration": "
|
|
280
|
+
"md5": "(staged at release time — see $comment_md5)",
|
|
281
|
+
"$comment_pix2": "PIX2 (schema 3, 2026-08-04): every record now carries the PARENT's ComponentTag alongside the child's — +1 byte per pair, pair COUNT unchanged. For FR the recorded parent tag is always `locality`: BAN's parent surface is `nom_commune`, the commune, which is the French postal locality line. Schema 1 and 2 binaries are refused; the artifact must be rebuilt.",
|
|
282
|
+
"delta_calibration": "δ=10, transitionBeta=5, parentDelta=5 (whole-edge parent bias, #46 — the record's own parentTag gets +5 over the parent window). FR is the leg that CAUGHT that mechanism's one real defect: biasing the parent's whole comma segment put the postcode inside `locality` and took fr-lieudit-golden.jsonl from 96.3% to 0.0% at δ≥6, invisible at δ=4. Fixed by scoping the parent write to the probe key's pieces; FR then held 77/80 at every δ through 20. See docs/records/evals/2026-08-04-pix1-whole-edge-verdict.md. The δ/β pair is inherited from the GB calibration, per R5's finding that the classifier's dependent_locality deficit is uniform across locales rather than GB-specific. The R6 bars were measured at exactly that pair.",
|
|
270
283
|
"country_gate": "hard-gated on the header's country (fr).",
|
|
271
|
-
"not_committed": "derived artifact, .gitignore'd
|
|
284
|
+
"not_committed": "derived artifact, .gitignore'd — rebuilt via `mailwoman gazetteer pair-index --out neural-weights-fr-fr --country fr --delta 10 --transition-beta 5 --ban-dir <corpus/sources/ban>`",
|
|
272
285
|
"required_decode_fixes": "This artifact is INERT without two locale-general probe-chain fixes that shipped alongside it: a LEADING postcode strip on parent-candidate keys (France writes '12210 Montpeyroux'; the probe previously stripped only trailing postcodes, the Anglo/NZ convention) and NEWLINE as a segment boundary (computeGroupSegments scanned for commas only, so multi-line addresses collapsed to one segment and the segment path went structurally inert). With the artifact but without them the golden board stayed at 0/80.",
|
|
273
|
-
"$comment_md5": "REPRODUCIBILITY: a PIX1 header embeds `buildDate`, so a rebuild from identical sources produces different bytes and a different md5. This md5 therefore identifies the artifact STAGED TO HUGGING FACE for this release
|
|
274
|
-
"provenance_gap": "The PIX1 header's sourceMD5s is EMPTY for this artifact: the BAN source is a directory of 101
|
|
286
|
+
"$comment_md5": "REPRODUCIBILITY: a PIX1 header embeds `buildDate`, so a rebuild from identical sources produces different bytes and a different md5. This md5 therefore identifies the artifact STAGED TO HUGGING FACE for this release — it is a provenance record of the shipped bytes, NOT a check a local rebuild can reproduce. A mismatch after rebuilding is expected and is not corruption; verify pair COUNT and header delta/beta instead.",
|
|
287
|
+
"provenance_gap": "The PIX1 header's sourceMD5s is EMPTY for this artifact: the BAN source is a directory of 101 département CSVs, and the build hashes individual files only. Hashing the full dump costs more than the provenance is worth at build time, so a BAN refresh is a deliberate act — rebuild with the artifact deleted rather than trusting a guard to notice."
|
|
275
288
|
}
|
|
276
289
|
}
|
|
277
290
|
}
|
package/package.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mailwoman/neural-weights-fr-fr",
|
|
3
|
-
"version": "9.
|
|
3
|
+
"version": "9.2.0",
|
|
4
4
|
"description": "Mailwoman neural-classifier weights for locale 'fr-fr'. Data-only overlay — shares the base model.onnx + tokenizer.model from @mailwoman/neural-weights-en-us (they are byte-identical); ships only the fr-specific data siblings. Loaded by @mailwoman/neural at runtime.",
|
|
5
5
|
"license": "AGPL-3.0-only OR LicenseRef-Commercial",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
8
8
|
"url": "https://github.com/sister-software/mailwoman.git",
|
|
9
|
-
"directory": "neural-weights-fr-fr"
|
|
9
|
+
"directory": "packages/neural-weights-fr-fr"
|
|
10
10
|
},
|
|
11
11
|
"files": [
|
|
12
12
|
"model-card.json",
|
|
@@ -27,16 +27,24 @@
|
|
|
27
27
|
"!*.test.tsx",
|
|
28
28
|
"!**/*.test.ts",
|
|
29
29
|
"!**/*.test.tsx",
|
|
30
|
-
"!scripts/**"
|
|
30
|
+
"!scripts/**",
|
|
31
|
+
"!test/**"
|
|
31
32
|
],
|
|
33
|
+
"exports": {
|
|
34
|
+
"./*": "./*"
|
|
35
|
+
},
|
|
32
36
|
"publishConfig": {
|
|
33
|
-
"access": "public"
|
|
37
|
+
"access": "public",
|
|
38
|
+
"exports": {
|
|
39
|
+
"./*": "./*"
|
|
40
|
+
}
|
|
34
41
|
},
|
|
35
42
|
"dependencies": {
|
|
36
|
-
"@mailwoman/neural-weights-en-us": "9.
|
|
43
|
+
"@mailwoman/neural-weights-en-us": "9.2.0"
|
|
37
44
|
},
|
|
38
45
|
"devDependencies": {
|
|
39
|
-
"@mailwoman/core": "9.
|
|
46
|
+
"@mailwoman/core": "9.2.0",
|
|
47
|
+
"@mailwoman/resolver-wof-sqlite": "9.2.0"
|
|
40
48
|
},
|
|
41
49
|
"mailwoman": {
|
|
42
50
|
"baseWeights": "@mailwoman/neural-weights-en-us"
|
package/pair-index-fr.bin
CHANGED
|
Binary file
|