@mailwoman/neural 4.10.0 → 4.12.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 +102 -0
- package/out/anchor-inference.d.ts +1 -1
- package/out/anchor-inference.js +1 -1
- package/out/browser.d.ts +1 -0
- package/out/browser.d.ts.map +1 -1
- package/out/browser.js +5 -0
- package/out/browser.js.map +1 -1
- package/out/case-normalize.d.ts +34 -0
- package/out/case-normalize.d.ts.map +1 -0
- package/out/case-normalize.js +50 -0
- package/out/case-normalize.js.map +1 -0
- package/out/classifier.d.ts +25 -3
- package/out/classifier.d.ts.map +1 -1
- package/out/classifier.js +123 -23
- package/out/classifier.js.map +1 -1
- package/out/index.d.ts +2 -0
- package/out/index.d.ts.map +1 -1
- package/out/index.js +2 -0
- package/out/index.js.map +1 -1
- package/out/labels.d.ts +1 -1
- package/out/labels.js +1 -1
- package/out/onnx-runner.d.ts +7 -0
- package/out/onnx-runner.d.ts.map +1 -1
- package/out/onnx-runner.js +10 -0
- package/out/onnx-runner.js.map +1 -1
- package/out/postcode-repair.d.ts +17 -0
- package/out/postcode-repair.d.ts.map +1 -1
- package/out/postcode-repair.js +48 -0
- package/out/postcode-repair.js.map +1 -1
- package/out/scorer.d.ts +105 -0
- package/out/scorer.d.ts.map +1 -0
- package/out/scorer.js +286 -0
- package/out/scorer.js.map +1 -0
- package/out/soft-features.d.ts +67 -0
- package/out/soft-features.d.ts.map +1 -0
- package/out/soft-features.js +49 -0
- package/out/soft-features.js.map +1 -0
- package/out/span-bridge.d.ts +4 -4
- package/out/span-bridge.js +4 -4
- package/out/span-proposer-lexicon.d.ts +3 -3
- package/out/span-proposer-lexicon.js +3 -3
- package/out/street-morphology-prior.d.ts +4 -4
- package/out/street-morphology-prior.js +3 -3
- package/out/unit-repair.js +1 -1
- package/out/unit-repair.js.map +1 -1
- package/out/weights.d.ts +109 -0
- package/out/weights.d.ts.map +1 -1
- package/out/weights.js +157 -1
- package/out/weights.js.map +1 -1
- package/out/word-consistency.d.ts +60 -0
- package/out/word-consistency.d.ts.map +1 -0
- package/out/word-consistency.js +140 -0
- package/out/word-consistency.js.map +1 -0
- package/package.json +5 -3
package/README.md
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
# @mailwoman/neural
|
|
2
|
+
|
|
3
|
+
**Neural address classifier** — SentencePiece tokenizer, ONNX runtime inference,
|
|
4
|
+
and decoder wiring for the Mailwoman address parser.
|
|
5
|
+
|
|
6
|
+
This is the engine that runs the trained transformer model (shipped separately
|
|
7
|
+
as `@mailwoman/neural-weights-en-us` and `@mailwoman/neural-weights-fr-fr`).
|
|
8
|
+
It handles tokenization, ONNX session management, soft-feature injection (anchor,
|
|
9
|
+
gazetteer), Viterbi decoding, and the `ProposalClassifier` / `ProductionScorer`
|
|
10
|
+
high-level APIs.
|
|
11
|
+
|
|
12
|
+
```ts
|
|
13
|
+
import { createScorer, loadTokenizer, loadModel } from "@mailwoman/neural"
|
|
14
|
+
|
|
15
|
+
// Load a weights bundle (model.onnx + tokenizer.model + model-card.json)
|
|
16
|
+
const scorer = await createScorer({
|
|
17
|
+
weightsPath: "path/to/neural-weights-en-us",
|
|
18
|
+
})
|
|
19
|
+
const result = scorer.score(tokens)
|
|
20
|
+
|
|
21
|
+
// Or at a lower level
|
|
22
|
+
const tokenizer = await loadTokenizer("path/to/tokenizer.model")
|
|
23
|
+
const session = await loadModel("path/to/model.onnx")
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## What's inside
|
|
27
|
+
|
|
28
|
+
| Module | Purpose |
|
|
29
|
+
| --------------------------------- | ------------------------------------------------------------------------------------------------------------------------- |
|
|
30
|
+
| **`tokenizer.ts`** | SentencePiece unigram tokenizer (loads `.model` file) |
|
|
31
|
+
| **`onnx-runner.ts`** | ONNX Runtime Web inference session (WebGPU / WASM backends) |
|
|
32
|
+
| **`classifier.ts`** | `NeuralAddressClassifier` — tokenize → run → decode |
|
|
33
|
+
| **`scorer.ts`** | `createScorer` / `ProductionScorer` — canonical entry point that reads `requires` from `model-card.json` and fails closed |
|
|
34
|
+
| **`anchor-inference.ts`** | Postcode anchor feature injection (soft channel, not override) |
|
|
35
|
+
| **`gazetteer-inference.ts`** | Gazetteer lexicon soft-feature injection |
|
|
36
|
+
| **`viterbi.ts`** | Viterbi decoder (linear-chain CRF) with BIO transition masks |
|
|
37
|
+
| **`labels.ts`** | Label index ↔ `ComponentTag` mapping |
|
|
38
|
+
| **`weights.ts`** | Weight loading from `@mailwoman/neural-weights-*` bundles |
|
|
39
|
+
| **`soft-features.ts`** | Soft-feature vector construction (anchor + gazetteer channels) |
|
|
40
|
+
| **`postcode-anchor.ts`** | Postcode extraction and anchor coordinate resolution |
|
|
41
|
+
| **`postcode-binary-resolver.ts`** | Sorted-binary postcode lookup (browser) |
|
|
42
|
+
| **`query-shape-prior.ts`** | Query-shape-based emission priors |
|
|
43
|
+
| **`span-proposal-prior.ts`** | Phrase-grouper-based span proposal priors |
|
|
44
|
+
| **`span-proposer-lexicon.ts`** | Lexicon-based span proposals |
|
|
45
|
+
| **`proposal-classifier.ts`** | Proposal-level classification wrapper |
|
|
46
|
+
| **`case-normalize.ts`** | All-caps case normalization before the model |
|
|
47
|
+
|
|
48
|
+
## Key exports
|
|
49
|
+
|
|
50
|
+
```ts
|
|
51
|
+
// Canonical entry point — respects model-card.json "requires" contract
|
|
52
|
+
export { createScorer, ProductionScorer, type Scorer } from "./scorer.js"
|
|
53
|
+
|
|
54
|
+
// Tokenizer (SentencePiece unigram, byte_fallback)
|
|
55
|
+
export { loadTokenizer, Tokenizer, tokenizeToIds } from "./tokenizer.js"
|
|
56
|
+
|
|
57
|
+
// ONNX inference
|
|
58
|
+
export { loadModel, createOrtSession, OnnxRunner } from "./onnx-runner.js"
|
|
59
|
+
|
|
60
|
+
// Neural classifier
|
|
61
|
+
export { NeuralAddressClassifier } from "./classifier.js"
|
|
62
|
+
|
|
63
|
+
// Decoder (Viterbi + BIO masks + argmax)
|
|
64
|
+
export { viterbi, softmax, perTokenArgmax, buildBioTransitionMask } from "./viterbi.js"
|
|
65
|
+
|
|
66
|
+
// Label mapping
|
|
67
|
+
export { labelIndexToClassification, classificationToLabelIndices } from "./labels.js"
|
|
68
|
+
|
|
69
|
+
// Weight loading
|
|
70
|
+
export { loadFromWeights, type WeightsBundle } from "./weights.js"
|
|
71
|
+
|
|
72
|
+
// Anchor + gazetteer features (soft channels, never overrides)
|
|
73
|
+
export { AnchorInference, type AnchorResult } from "./anchor-inference.js"
|
|
74
|
+
export { GazetteerInference } from "./gazetteer-inference.js"
|
|
75
|
+
|
|
76
|
+
// Postcode lookup
|
|
77
|
+
export { extractPostcodeAnchors } from "./postcode-anchor.js"
|
|
78
|
+
export { PostcodeBinaryResolver } from "./postcode-binary-resolver.js"
|
|
79
|
+
|
|
80
|
+
// Case normalization
|
|
81
|
+
export { normalizeCase, type CaseNormalizeResult } from "./case-normalize.js"
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## Ship-config contract
|
|
85
|
+
|
|
86
|
+
The `ProductionScorer` reads `model-card.json`'s `requires` block and
|
|
87
|
+
**fails closed** if a declared channel isn't fed. Do not hand-wire ONNX
|
|
88
|
+
sessions with zero-filled anchor inputs — anchor-off is out-of-distribution
|
|
89
|
+
for the shipped model.
|
|
90
|
+
|
|
91
|
+
## Related
|
|
92
|
+
|
|
93
|
+
- [`@mailwoman/neural-weights-en-us`](../neural-weights-en-us) — trained model bundle (en-US)
|
|
94
|
+
- [`@mailwoman/neural-weights-fr-fr`](../neural-weights-fr-fr) — trained model bundle (fr-FR)
|
|
95
|
+
- [`@mailwoman/core`](../core) — pipeline coordinator, types, decoder
|
|
96
|
+
- [Neural Classification concepts](https://mailwoman.sister.software/articles/concepts/neural-classification/)
|
|
97
|
+
- [ONNX Runtime concepts](https://mailwoman.sister.software/articles/concepts/onnx-runtime/)
|
|
98
|
+
- [What Mailwoman Is](https://mailwoman.sister.software/articles/concepts/what-mailwoman-is/)
|
|
99
|
+
|
|
100
|
+
## License
|
|
101
|
+
|
|
102
|
+
[AGPL-3.0-only](https://www.gnu.org/licenses/agpl-3.0.html)
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* lookup the model trained against (`scripts/build-pilot-anchor-lookup.py`), so the feature
|
|
11
11
|
* layout matches byte-for-byte.
|
|
12
12
|
*
|
|
13
|
-
* The layout is
|
|
13
|
+
* The layout is ESSENTIAL and cross-language: a wrong locale order or centroid scale feeds the
|
|
14
14
|
* model garbage. `anchor-inference.test.ts` pins both `LOCALE_ORDER` and the vector to values
|
|
15
15
|
* emitted by the Python `anchor_feature_vector` — any drift fails the test.
|
|
16
16
|
*/
|
package/out/anchor-inference.js
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* lookup the model trained against (`scripts/build-pilot-anchor-lookup.py`), so the feature
|
|
11
11
|
* layout matches byte-for-byte.
|
|
12
12
|
*
|
|
13
|
-
* The layout is
|
|
13
|
+
* The layout is ESSENTIAL and cross-language: a wrong locale order or centroid scale feeds the
|
|
14
14
|
* model garbage. `anchor-inference.test.ts` pins both `LOCALE_ORDER` and the vector to values
|
|
15
15
|
* emitted by the Python `anchor_feature_vector` — any drift fails the test.
|
|
16
16
|
*/
|
package/out/browser.d.ts
CHANGED
|
@@ -15,5 +15,6 @@ export * from "./tokenizer.js";
|
|
|
15
15
|
export * from "./anchor-inference.js";
|
|
16
16
|
export * from "./postcode-binary-resolver.js";
|
|
17
17
|
export * from "./gazetteer-inference.js";
|
|
18
|
+
export * from "./soft-features.js";
|
|
18
19
|
export type { InferResult } from "./onnx-runner.js";
|
|
19
20
|
//# sourceMappingURL=browser.d.ts.map
|
package/out/browser.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../browser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,cAAc,iBAAiB,CAAA;AAC/B,cAAc,aAAa,CAAA;AAC3B,cAAc,gBAAgB,CAAA;AAG9B,cAAc,uBAAuB,CAAA;AACrC,cAAc,+BAA+B,CAAA;AAK7C,cAAc,0BAA0B,CAAA;
|
|
1
|
+
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../browser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,cAAc,iBAAiB,CAAA;AAC/B,cAAc,aAAa,CAAA;AAC3B,cAAc,gBAAgB,CAAA;AAG9B,cAAc,uBAAuB,CAAA;AACrC,cAAc,+BAA+B,CAAA;AAK7C,cAAc,0BAA0B,CAAA;AAKxC,cAAc,oBAAoB,CAAA;AAGlC,YAAY,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA"}
|
package/out/browser.js
CHANGED
|
@@ -21,4 +21,9 @@ export * from "./postcode-binary-resolver.js";
|
|
|
21
21
|
// model and feeds the clue at inference (gazetteer-trained models REQUIRE it; zero-filled clues are
|
|
22
22
|
// the measured train/inference mismatch — see CONTRIBUTING_MODEL_WORK.mdx "zero-fill trap").
|
|
23
23
|
export * from "./gazetteer-inference.js";
|
|
24
|
+
// Browser-safe soft-feature choreography (#718): the pure `buildSoftFeatures` that composes the
|
|
25
|
+
// anchor + gazetteer channels (+ near-postcode suppression). No `fs`. The Node-only `./scorer` (which
|
|
26
|
+
// constructs the OnnxRunner + reads the card/lookup/lexicon from disk) is deliberately NOT re-exported
|
|
27
|
+
// here.
|
|
28
|
+
export * from "./soft-features.js";
|
|
24
29
|
//# sourceMappingURL=browser.js.map
|
package/out/browser.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../browser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,cAAc,iBAAiB,CAAA;AAC/B,cAAc,aAAa,CAAA;AAC3B,cAAc,gBAAgB,CAAA;AAC9B,sGAAsG;AACtG,sEAAsE;AACtE,cAAc,uBAAuB,CAAA;AACrC,cAAc,+BAA+B,CAAA;AAC7C,oGAAoG;AACpG,oGAAoG;AACpG,oGAAoG;AACpG,6FAA6F;AAC7F,cAAc,0BAA0B,CAAA"}
|
|
1
|
+
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../browser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,cAAc,iBAAiB,CAAA;AAC/B,cAAc,aAAa,CAAA;AAC3B,cAAc,gBAAgB,CAAA;AAC9B,sGAAsG;AACtG,sEAAsE;AACtE,cAAc,uBAAuB,CAAA;AACrC,cAAc,+BAA+B,CAAA;AAC7C,oGAAoG;AACpG,oGAAoG;AACpG,oGAAoG;AACpG,6FAA6F;AAC7F,cAAc,0BAA0B,CAAA;AACxC,gGAAgG;AAChG,sGAAsG;AACtG,uGAAuG;AACvG,QAAQ;AACR,cAAc,oBAAoB,CAAA"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @copyright Sister Software
|
|
3
|
+
* @license AGPL-3.0
|
|
4
|
+
* @author Teffen Ellis, et al.
|
|
5
|
+
*
|
|
6
|
+
* #690: input case-normalization for the neural parser. ALL-CAPS registry/compliance data (`214
|
|
7
|
+
* JONES RD, ELKHART, TX 75839`) is partly out-of-domain for a model trained on mixed-case text —
|
|
8
|
+
* it drops/mis-bounds tokens (`PALESTINE` → locality `ALESTINE`). Title-casing an all-caps input
|
|
9
|
+
* before the model recovers it (measured: TX HHSC locality 90.1% → 99.7%,
|
|
10
|
+
* `docs/articles/evals/2026-06-17-geocoder-vs-provided-coords.md`).
|
|
11
|
+
*
|
|
12
|
+
* Detection is deliberately STRICT — only a fully-shouting input qualifies — so mixed-case input is
|
|
13
|
+
* never touched (the caller's byte-stable path). Distinct from the identifier-casing all-caps
|
|
14
|
+
* idiom in `core/identifiers.ts` (`smartSnakeCase`/`smartCamelCase`): those skip _case
|
|
15
|
+
* conversion_ when a name is already uppercase; this _applies_ a title-case to address TEXT for
|
|
16
|
+
* the model.
|
|
17
|
+
*/
|
|
18
|
+
/**
|
|
19
|
+
* True when `text` is PURE-ASCII ALL-CAPS: it has cased ASCII letters and ZERO lowercase, and NO
|
|
20
|
+
* non-ASCII characters. The pure-ASCII requirement is deliberate — title-casing accented/non-Latin
|
|
21
|
+
* text is locale-sensitive and can change length (`ß`→`SS`, Turkish dotted/dotless I), which would
|
|
22
|
+
* break the token-offset invariant the caller relies on. So this fix targets ASCII registry data
|
|
23
|
+
* only; accented or non-Latin input falls back to the model's current behavior. The 3-letter floor
|
|
24
|
+
* avoids treating a digit/punctuation-only or tiny-token input as a whole shouting address.
|
|
25
|
+
*/
|
|
26
|
+
export declare function isAllCapsInput(text: string): boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Title-case each ASCII alphabetic run (`PALESTINE` → `Palestine`). Length-preserving — token
|
|
29
|
+
* offsets unchanged.
|
|
30
|
+
*/
|
|
31
|
+
export declare function titleCaseInput(text: string): string;
|
|
32
|
+
/** Title-case the input iff it is all-caps; otherwise return it unchanged. The parser's #690 hook. */
|
|
33
|
+
export declare function normalizeInputCase(text: string): string;
|
|
34
|
+
//# sourceMappingURL=case-normalize.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"case-normalize.d.ts","sourceRoot":"","sources":["../case-normalize.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CASpD;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,sGAAsG;AACtG,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEvD"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @copyright Sister Software
|
|
3
|
+
* @license AGPL-3.0
|
|
4
|
+
* @author Teffen Ellis, et al.
|
|
5
|
+
*
|
|
6
|
+
* #690: input case-normalization for the neural parser. ALL-CAPS registry/compliance data (`214
|
|
7
|
+
* JONES RD, ELKHART, TX 75839`) is partly out-of-domain for a model trained on mixed-case text —
|
|
8
|
+
* it drops/mis-bounds tokens (`PALESTINE` → locality `ALESTINE`). Title-casing an all-caps input
|
|
9
|
+
* before the model recovers it (measured: TX HHSC locality 90.1% → 99.7%,
|
|
10
|
+
* `docs/articles/evals/2026-06-17-geocoder-vs-provided-coords.md`).
|
|
11
|
+
*
|
|
12
|
+
* Detection is deliberately STRICT — only a fully-shouting input qualifies — so mixed-case input is
|
|
13
|
+
* never touched (the caller's byte-stable path). Distinct from the identifier-casing all-caps
|
|
14
|
+
* idiom in `core/identifiers.ts` (`smartSnakeCase`/`smartCamelCase`): those skip _case
|
|
15
|
+
* conversion_ when a name is already uppercase; this _applies_ a title-case to address TEXT for
|
|
16
|
+
* the model.
|
|
17
|
+
*/
|
|
18
|
+
/**
|
|
19
|
+
* True when `text` is PURE-ASCII ALL-CAPS: it has cased ASCII letters and ZERO lowercase, and NO
|
|
20
|
+
* non-ASCII characters. The pure-ASCII requirement is deliberate — title-casing accented/non-Latin
|
|
21
|
+
* text is locale-sensitive and can change length (`ß`→`SS`, Turkish dotted/dotless I), which would
|
|
22
|
+
* break the token-offset invariant the caller relies on. So this fix targets ASCII registry data
|
|
23
|
+
* only; accented or non-Latin input falls back to the model's current behavior. The 3-letter floor
|
|
24
|
+
* avoids treating a digit/punctuation-only or tiny-token input as a whole shouting address.
|
|
25
|
+
*/
|
|
26
|
+
export function isAllCapsInput(text) {
|
|
27
|
+
let upper = 0;
|
|
28
|
+
for (let i = 0; i < text.length; i++) {
|
|
29
|
+
const c = text.charCodeAt(i);
|
|
30
|
+
if (c > 127)
|
|
31
|
+
return false; // any non-ASCII (accented/non-Latin) → leave it alone
|
|
32
|
+
if (c >= 97 && c <= 122)
|
|
33
|
+
return false; // any [a-z] → mixed case, leave it alone
|
|
34
|
+
if (c >= 65 && c <= 90)
|
|
35
|
+
upper++;
|
|
36
|
+
}
|
|
37
|
+
return upper >= 3;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Title-case each ASCII alphabetic run (`PALESTINE` → `Palestine`). Length-preserving — token
|
|
41
|
+
* offsets unchanged.
|
|
42
|
+
*/
|
|
43
|
+
export function titleCaseInput(text) {
|
|
44
|
+
return text.replace(/[A-Za-z]+/g, (w) => w[0].toUpperCase() + w.slice(1).toLowerCase());
|
|
45
|
+
}
|
|
46
|
+
/** Title-case the input iff it is all-caps; otherwise return it unchanged. The parser's #690 hook. */
|
|
47
|
+
export function normalizeInputCase(text) {
|
|
48
|
+
return isAllCapsInput(text) ? titleCaseInput(text) : text;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=case-normalize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"case-normalize.js","sourceRoot":"","sources":["../case-normalize.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY;IAC1C,IAAI,KAAK,GAAG,CAAC,CAAA;IACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAA;QAC5B,IAAI,CAAC,GAAG,GAAG;YAAE,OAAO,KAAK,CAAA,CAAC,sDAAsD;QAChF,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,GAAG;YAAE,OAAO,KAAK,CAAA,CAAC,yCAAyC;QAC/E,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;YAAE,KAAK,EAAE,CAAA;IAChC,CAAC;IACD,OAAO,KAAK,IAAI,CAAC,CAAA;AAClB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY;IAC1C,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAA;AACzF,CAAC;AAED,sGAAsG;AACtG,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC9C,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;AAC1D,CAAC"}
|
package/out/classifier.d.ts
CHANGED
|
@@ -12,9 +12,9 @@
|
|
|
12
12
|
import { type SystemCode } from "@mailwoman/codex";
|
|
13
13
|
import { decodeAsXml, type AddressTree, type Calibrator, type ComponentTag } from "@mailwoman/core/decoder";
|
|
14
14
|
import { type SpanProposerLexicon } from "@mailwoman/core/pipeline";
|
|
15
|
-
import {
|
|
15
|
+
import type { AnchorLookup } from "./anchor-inference.js";
|
|
16
16
|
import { type FstMatcherLike } from "./fst-prior.js";
|
|
17
|
-
import {
|
|
17
|
+
import type { GazetteerLexicon } from "./gazetteer-inference.js";
|
|
18
18
|
import type { InferResult } from "./onnx-runner.js";
|
|
19
19
|
import { type QueryShapeLike } from "./query-shape-prior.js";
|
|
20
20
|
import { type SpanProposalPriorOpts } from "./span-proposal-prior.js";
|
|
@@ -83,7 +83,7 @@ export interface NeuralAddressClassifierConfig {
|
|
|
83
83
|
* adjacent to a postcode-anchor hit (needs both `gazetteerLexicon` and `postcodeAnchorLookup`).
|
|
84
84
|
* Targets the region-clue→postcode CRF interference (~3pp US postcode).
|
|
85
85
|
*
|
|
86
|
-
* PAIRING IS
|
|
86
|
+
* PAIRING IS ESSENTIAL: set this IFF the model was TRAINED with the matching train-time
|
|
87
87
|
* choreography (`data.gazetteer_choreography`). The 2026-06-10 diagnostic showed the harm is
|
|
88
88
|
* WEIGHT-BAKED — applying this at inference on a model trained _without_ train-choreography does
|
|
89
89
|
* NOT recover postcode and adds train/inference skew. Only enable for a consolidation-era model
|
|
@@ -119,6 +119,13 @@ export interface NeuralAddressClassifierConfig {
|
|
|
119
119
|
* (the pre-2026-06-12 byte-stable default).
|
|
120
120
|
*/
|
|
121
121
|
spanProposer?: SpanProposerConfig | false;
|
|
122
|
+
/**
|
|
123
|
+
* Per-word BIO consistency repair (#727 + the admin-token fragmentation class). Default off →
|
|
124
|
+
* byte-identical. When true, every `▁`-delimited word's pieces are forced to ONE tag by a
|
|
125
|
+
* confidence-weighted vote over the post-prior emissions (see word-consistency.ts). Per-parse
|
|
126
|
+
* `ParseOptions.enforceWordConsistency` overrides this default.
|
|
127
|
+
*/
|
|
128
|
+
enforceWordConsistency?: boolean;
|
|
122
129
|
}
|
|
123
130
|
/**
|
|
124
131
|
* Config for the Stage 2.7 span-proposer integration (see
|
|
@@ -236,6 +243,11 @@ export interface ParseOpts {
|
|
|
236
243
|
* v0.7 gate confirms it. See `./postcode-repair.ts`.
|
|
237
244
|
*/
|
|
238
245
|
postcodeRepair?: boolean;
|
|
246
|
+
/**
|
|
247
|
+
* Per-word BIO consistency repair (#727 + the admin-token fragmentation class). Overrides the
|
|
248
|
+
* classifier's `enforceWordConsistency` config default for this parse. See word-consistency.ts.
|
|
249
|
+
*/
|
|
250
|
+
enforceWordConsistency?: boolean;
|
|
239
251
|
/**
|
|
240
252
|
* When true, run the deterministic secondary-unit regex repair pass on the decoded label sequence
|
|
241
253
|
* before tree-building. Detects designator-shaped substrings ("Apt 4B", "Ste 12", "Unit 9400",
|
|
@@ -244,6 +256,16 @@ export interface ParseOpts {
|
|
|
244
256
|
* v0.7.2 arena re-run quantifies its delta. See `./unit-repair.ts`.
|
|
245
257
|
*/
|
|
246
258
|
unitRepair?: boolean;
|
|
259
|
+
/**
|
|
260
|
+
* When true AND the input is detected ALL-CAPS (registry/compliance data like `214 JONES RD,
|
|
261
|
+
* ELKHART, TX 75839`), title-case the input before the model sees it. The model trains on
|
|
262
|
+
* mixed-case text, so all-caps is partly OOD — it drops/mis-bounds tokens (#690: `PALESTINE` →
|
|
263
|
+
* locality `ALESTINE`; all-caps locality 3/5 vs title-case 5/5). Detection-gated, so MIXED-case
|
|
264
|
+
* input is untouched (byte-stable). Off by default. On all-caps input the output values are
|
|
265
|
+
* title-cased (the SHOUTING is normalized away — better, and the resolver name-matches
|
|
266
|
+
* case-insensitively regardless).
|
|
267
|
+
*/
|
|
268
|
+
normalizeCase?: boolean;
|
|
247
269
|
/**
|
|
248
270
|
* Optional span-confidence calibrator (task #59). When provided, each decoded span's `conf=` is
|
|
249
271
|
* mapped through it (isotonic lookup table → calibrated probability of correctness). OPT-IN —
|
package/out/classifier.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"classifier.d.ts","sourceRoot":"","sources":["../classifier.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAwB,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAA;AACxE,OAAO,EAIN,WAAW,EACX,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,YAAY,EAEjB,MAAM,yBAAyB,CAAA;AAChC,OAAO,EAAmC,KAAK,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAGpG,OAAO,
|
|
1
|
+
{"version":3,"file":"classifier.d.ts","sourceRoot":"","sources":["../classifier.ts"],"names":[],"mappings":"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"}
|
package/out/classifier.js
CHANGED
|
@@ -13,12 +13,12 @@ import { conventionsForSystem } from "@mailwoman/codex";
|
|
|
13
13
|
import { buildAddressTree, decodeAsJson, decodeAsTuples, decodeAsXml, } from "@mailwoman/core/decoder";
|
|
14
14
|
import { proposeSpans } from "@mailwoman/core/pipeline";
|
|
15
15
|
import { detectAddressSystem } from "./address-system.js";
|
|
16
|
-
import {
|
|
16
|
+
import { normalizeInputCase } from "./case-normalize.js";
|
|
17
17
|
import { buildFstEmissionPriors } from "./fst-prior.js";
|
|
18
|
-
import { buildGazetteerFeatures, suppressGazetteerNearPostcode } from "./gazetteer-inference.js";
|
|
19
18
|
import { STAGE2_BIO_LABELS } from "./labels.js";
|
|
20
|
-
import { repairPostcodeLabels } from "./postcode-repair.js";
|
|
19
|
+
import { repairLeadingHouseNumber, repairPostcodeLabels } from "./postcode-repair.js";
|
|
21
20
|
import { addEmissionMatrix, buildEmissionPriors } from "./query-shape-prior.js";
|
|
21
|
+
import { buildSoftFeatures } from "./soft-features.js";
|
|
22
22
|
import { bridgePunctuationGaps } from "./span-bridge.js";
|
|
23
23
|
import { buildSpanProposalPriors } from "./span-proposal-prior.js";
|
|
24
24
|
import { buildCodexSpanLexicon } from "./span-proposer-lexicon.js";
|
|
@@ -26,6 +26,7 @@ import { buildStreetMorphologyEmissionPriors } from "./street-morphology-prior.j
|
|
|
26
26
|
import { MailwomanTokenizer } from "./tokenizer.js";
|
|
27
27
|
import { repairUnitLabels } from "./unit-repair.js";
|
|
28
28
|
import { buildBioEndMask, buildBioStartMask, buildBioTransitionMask, softmax, viterbi } from "./viterbi.js";
|
|
29
|
+
import { enforceWordConsistency } from "./word-consistency.js";
|
|
29
30
|
export class NeuralAddressClassifier {
|
|
30
31
|
cfg;
|
|
31
32
|
labels;
|
|
@@ -75,9 +76,13 @@ export class NeuralAddressClassifier {
|
|
|
75
76
|
// + node:fs) and throws cleanly in a browser if called. Without the directive, webpack
|
|
76
77
|
// pulls onnx-runner / weights into the browser chunk graph + then chokes on the Node-only
|
|
77
78
|
// builtins they reference.
|
|
78
|
-
const [{ OnnxRunner }, { resolveWeights, readLabelsFromModelCard, readCrfTransitions }] = await Promise.all([
|
|
79
|
+
const [{ OnnxRunner }, { resolveWeights, readLabelsFromModelCard, readCrfTransitions, readRequiredChannels }, { parseAnchorLookup }, { parseGazetteerLexicon }, { PostcodeBinaryResolver }, fs,] = await Promise.all([
|
|
79
80
|
import(/* webpackIgnore: true */ "./onnx-runner.js"),
|
|
80
81
|
import(/* webpackIgnore: true */ "./weights.js"),
|
|
82
|
+
import(/* webpackIgnore: true */ "./anchor-inference.js"),
|
|
83
|
+
import(/* webpackIgnore: true */ "./gazetteer-inference.js"),
|
|
84
|
+
import(/* webpackIgnore: true */ "./postcode-binary-resolver.js"),
|
|
85
|
+
import(/* webpackIgnore: true */ "node:fs"),
|
|
81
86
|
]);
|
|
82
87
|
const resolved = resolveWeights(opts);
|
|
83
88
|
const labels = readLabelsFromModelCard(resolved.modelCardPath);
|
|
@@ -86,6 +91,53 @@ export class NeuralAddressClassifier {
|
|
|
86
91
|
MailwomanTokenizer.loadFromFile(resolved.tokenizerPath),
|
|
87
92
|
OnnxRunner.create(resolved.modelPath),
|
|
88
93
|
]);
|
|
94
|
+
// --- Soft-feed (#718 D1): feed the channels the SHIPPED model was trained against ----------
|
|
95
|
+
// The anchor-trained en-us model goes OOD when scored anchor-OFF (the #566/#685 crater: country
|
|
96
|
+
// ~0, region 71, locality 57 vs the server-tier 68/90/77). The browser loader already feeds the
|
|
97
|
+
// channels from URLs; this is the Node-side mirror so EVERY consumer (ResolveRouter,
|
|
98
|
+
// GeocodeRouter, geocode.tsx, the CLI) transparently gains them with no callsite change.
|
|
99
|
+
//
|
|
100
|
+
// SOFT: each channel is best-effort. A caller-passed `postcodeAnchorLookup` always wins. When
|
|
101
|
+
// the model-card declares a channel REQUIRED but the package didn't ship its data, we warn ONCE
|
|
102
|
+
// (mirroring neural-web's `warnOnUnfedTrainedChannels`) and run that channel OFF — never crash.
|
|
103
|
+
const declared = readRequiredChannels(resolved.modelCardPath);
|
|
104
|
+
let postcodeAnchorLookup = opts.postcodeAnchorLookup;
|
|
105
|
+
if (!postcodeAnchorLookup && resolved.anchorLookupPath) {
|
|
106
|
+
try {
|
|
107
|
+
postcodeAnchorLookup = resolved.anchorLookupPath.binary
|
|
108
|
+
? new PostcodeBinaryResolver(new Uint8Array(fs.readFileSync(resolved.anchorLookupPath.path))).toAnchorLookup()
|
|
109
|
+
: parseAnchorLookup(JSON.parse(fs.readFileSync(resolved.anchorLookupPath.path, "utf8")));
|
|
110
|
+
}
|
|
111
|
+
catch (err) {
|
|
112
|
+
warnUnfedChannel("anchor", `failed to parse ${resolved.anchorLookupPath.path}: ${err.message}`);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
if (declared?.anchor?.required && !(postcodeAnchorLookup && postcodeAnchorLookup.size > 0)) {
|
|
116
|
+
warnUnfedChannel("anchor", resolved.anchorLookupPath
|
|
117
|
+
? `parsed lookup at ${resolved.anchorLookupPath.path} is empty`
|
|
118
|
+
: `no postcode-<cc>.bin / anchor-lookup.json found in the weights package`);
|
|
119
|
+
}
|
|
120
|
+
let gazetteerLexicon;
|
|
121
|
+
if (resolved.gazetteerLexiconPath) {
|
|
122
|
+
try {
|
|
123
|
+
gazetteerLexicon = parseGazetteerLexicon(JSON.parse(fs.readFileSync(resolved.gazetteerLexiconPath, "utf8")));
|
|
124
|
+
}
|
|
125
|
+
catch (err) {
|
|
126
|
+
warnUnfedChannel("gazetteer", `failed to parse ${resolved.gazetteerLexiconPath}: ${err.message}`);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
// Pocket tier is anchor-only: `resolveWeights` already withholds the gazetteer path, so a
|
|
130
|
+
// declared-required gazetteer is EXPECTED to be unfed there — don't warn. Otherwise warn.
|
|
131
|
+
if (declared?.gazetteer?.required && !gazetteerLexicon && opts.tier !== "pocket") {
|
|
132
|
+
warnUnfedChannel("gazetteer", resolved.gazetteerLexiconPath
|
|
133
|
+
? `lexicon at ${resolved.gazetteerLexiconPath} could not be parsed`
|
|
134
|
+
: `no anchor-lexicon-v1.json found in the weights package`);
|
|
135
|
+
}
|
|
136
|
+
// Near-postcode gazetteer choreography + conventions mode: drive them off the card's declared
|
|
137
|
+
// SHIP-CONFIG (mirrors createScorer / the browser loader defaults), inert when the source
|
|
138
|
+
// channel is absent. Byte-stable for a non-anchor card (no `requires` → all undefined/false).
|
|
139
|
+
const suppressGazetteerNearPostcode = declared?.suppress_gazetteer_near_postcode ?? false;
|
|
140
|
+
const addressSystemConventions = declared?.conventions?.required ? (declared.conventions.mode ?? "auto") : undefined;
|
|
89
141
|
return new NeuralAddressClassifier({
|
|
90
142
|
tokenizer,
|
|
91
143
|
runner,
|
|
@@ -93,15 +145,23 @@ export class NeuralAddressClassifier {
|
|
|
93
145
|
transitions: crf?.transitions,
|
|
94
146
|
startTransitions: crf?.startTransitions,
|
|
95
147
|
endTransitions: crf?.endTransitions,
|
|
96
|
-
...(
|
|
148
|
+
...(postcodeAnchorLookup ? { postcodeAnchorLookup } : {}),
|
|
149
|
+
...(gazetteerLexicon ? { gazetteerLexicon } : {}),
|
|
150
|
+
...(suppressGazetteerNearPostcode ? { suppressGazetteerNearPostcode } : {}),
|
|
151
|
+
...(addressSystemConventions ? { addressSystemConventions: addressSystemConventions } : {}),
|
|
97
152
|
});
|
|
98
153
|
}
|
|
99
154
|
/** Tokenize → infer → Viterbi (or argmax) → decoder tree. */
|
|
100
155
|
async parse(text, opts) {
|
|
101
156
|
if (text.length === 0)
|
|
102
157
|
return { raw: text, roots: [] };
|
|
103
|
-
|
|
104
|
-
|
|
158
|
+
// #690: title-case all-caps ASCII input so the mixed-case-trained model doesn't go OOD.
|
|
159
|
+
// Detection-gated (mixed-case + non-ASCII untouched), opt-in. ASCII title-case is char-for-char
|
|
160
|
+
// length-preserving, so token offsets are unaffected; the tree is built from the normalized text
|
|
161
|
+
// (values come out title-cased — the SHOUTING is gone, the resolver name-matches case-insensitively).
|
|
162
|
+
const modelText = opts?.normalizeCase ? normalizeInputCase(text) : text;
|
|
163
|
+
const { tokens } = await this.#decode(modelText, opts);
|
|
164
|
+
return buildAddressTree(modelText, tokens, opts?.calibrate ? { calibrate: opts.calibrate } : undefined);
|
|
105
165
|
}
|
|
106
166
|
/**
|
|
107
167
|
* Like `parse`, but also returns the raw per-token logits and piece offsets needed for per-span
|
|
@@ -129,26 +189,31 @@ export class NeuralAddressClassifier {
|
|
|
129
189
|
*/
|
|
130
190
|
async #decode(text, opts) {
|
|
131
191
|
const { pieces, ids } = this.cfg.tokenizer.encode(text);
|
|
132
|
-
//
|
|
133
|
-
// model
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
const
|
|
138
|
-
|
|
139
|
-
:
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
const { logits, localeLogits } = await this.cfg.runner.infer(ids, anchor, gazFed);
|
|
192
|
+
// Soft-feature channels (#718): the postcode-anchor (#239/#240) + gazetteer-anchor (#464) clues
|
|
193
|
+
// the model conditions on alongside the ids, plus the near-postcode gazetteer choreography. The
|
|
194
|
+
// build + choreography is the single PURE `buildSoftFeatures` (soft-features.ts) — both this
|
|
195
|
+
// decode path and the ProductionScorer feed channels identically, so there is exactly one
|
|
196
|
+
// choreography. Each channel is undefined when its source is unconfigured (no-op).
|
|
197
|
+
const soft = buildSoftFeatures(text, pieces, {
|
|
198
|
+
postcodeAnchorLookup: this.cfg.postcodeAnchorLookup,
|
|
199
|
+
gazetteerLexicon: this.cfg.gazetteerLexicon,
|
|
200
|
+
suppressGazetteerNearPostcode: this.cfg.suppressGazetteerNearPostcode,
|
|
201
|
+
});
|
|
202
|
+
const { logits, localeLogits } = await this.cfg.runner.infer(ids, soft.anchor, soft.gazetteer);
|
|
144
203
|
this.assertEmissionWidth(logits);
|
|
145
204
|
// Address-system conventions (#511 Tier A): resolve which system's rules apply — caller-pinned
|
|
146
205
|
// system, or the model's own locale-head detection under a high confidence bar. Null = no
|
|
147
206
|
// constraints; the parse below is byte-identical to the pre-conventions path.
|
|
148
207
|
const conventionsOpt = opts?.addressSystemConventions ?? this.cfg.addressSystemConventions;
|
|
149
|
-
|
|
208
|
+
// The resolved system code, captured so the US-only leading-house-number repair below can gate on
|
|
209
|
+
// it (see repairLeadingHouseNumber). null when conventions are off → no system, no repair
|
|
210
|
+
// (byte-stable). "auto" reads the model's locale head; a pinned SystemCode wins.
|
|
211
|
+
const detectedSystem = conventionsOpt === undefined
|
|
150
212
|
? null
|
|
151
|
-
:
|
|
213
|
+
: conventionsOpt === "auto"
|
|
214
|
+
? (detectAddressSystem(localeLogits)?.system ?? null)
|
|
215
|
+
: conventionsOpt;
|
|
216
|
+
const conventions = conventionsForSystem(detectedSystem);
|
|
152
217
|
let emissions = opts?.queryShape
|
|
153
218
|
? addEmissionMatrix(logits, buildEmissionPriors(opts.queryShape, pieces, this.labels, {
|
|
154
219
|
biasScale: opts.queryShapeBiasScale ?? 1.0,
|
|
@@ -191,7 +256,7 @@ export class NeuralAddressClassifier {
|
|
|
191
256
|
emissions = emissions.map((row) => row.map((v, idx) => (forbidden.has(idx) ? -1e9 : v)));
|
|
192
257
|
}
|
|
193
258
|
}
|
|
194
|
-
|
|
259
|
+
let labelIndices = this.decodeMode === "viterbi"
|
|
195
260
|
? viterbi({
|
|
196
261
|
emissions,
|
|
197
262
|
transitions: this.transitions,
|
|
@@ -199,6 +264,16 @@ export class NeuralAddressClassifier {
|
|
|
199
264
|
endTransitions: this.endTransitions,
|
|
200
265
|
}).path
|
|
201
266
|
: emissions.map((row) => argmaxSoftmax(row).idx);
|
|
267
|
+
// Per-word BIO consistency repair (#727 + the admin-token fragmentation class). Opt-in — default
|
|
268
|
+
// OFF → byte-identical. Heals words whose pieces disagree (e.g. `VERMONT`→VER[loc]+MONT[region],
|
|
269
|
+
// `Lozère`→Loz[loc]+ère[region]) via a confidence-weighted vote over the post-prior emissions; a
|
|
270
|
+
// word whose pieces already agree is untouched. See word-consistency.ts.
|
|
271
|
+
let healedConfidence = null;
|
|
272
|
+
if (opts?.enforceWordConsistency ?? this.cfg.enforceWordConsistency ?? false) {
|
|
273
|
+
const wc = enforceWordConsistency(pieces, emissions, this.labels, labelIndices);
|
|
274
|
+
labelIndices = wc.labelIndices;
|
|
275
|
+
healedConfidence = wc.healedConfidence;
|
|
276
|
+
}
|
|
202
277
|
let tokens = pieces.map((p, i) => {
|
|
203
278
|
const idx = labelIndices[i];
|
|
204
279
|
const probs = softmax(logits[i]);
|
|
@@ -207,7 +282,9 @@ export class NeuralAddressClassifier {
|
|
|
207
282
|
start: p.start,
|
|
208
283
|
end: p.end,
|
|
209
284
|
label: (this.labels[idx] ?? "O"),
|
|
210
|
-
|
|
285
|
+
// Healed words carry the vote's mean p(type) (length-invariant); unchanged pieces keep
|
|
286
|
+
// the model's per-piece softmax confidence.
|
|
287
|
+
confidence: healedConfidence?.get(i) ?? probs[idx],
|
|
211
288
|
};
|
|
212
289
|
});
|
|
213
290
|
// Postcode repair runs when the caller asks for it OR the detected system declares a postcode
|
|
@@ -216,6 +293,12 @@ export class NeuralAddressClassifier {
|
|
|
216
293
|
if (opts?.postcodeRepair || conventions?.postcodePattern) {
|
|
217
294
|
tokens = repairPostcodeLabels(text, tokens).tokens;
|
|
218
295
|
}
|
|
296
|
+
// US leading-house-number repair (#723): the model labels a big rural house number as a ZIP
|
|
297
|
+
// ("24588 Outback Trl" → [postcode], no house_number). US-GATED — a leading 5-digit before a
|
|
298
|
+
// street is a POSTCODE in reversed-order FR (the #560 shard), so only when the detected system is US.
|
|
299
|
+
if (detectedSystem === "us") {
|
|
300
|
+
tokens = repairLeadingHouseNumber(text, tokens).tokens;
|
|
301
|
+
}
|
|
219
302
|
if (opts?.unitRepair) {
|
|
220
303
|
tokens = repairUnitLabels(text, tokens).tokens;
|
|
221
304
|
}
|
|
@@ -260,6 +343,23 @@ export class NeuralAddressClassifier {
|
|
|
260
343
|
}
|
|
261
344
|
}
|
|
262
345
|
}
|
|
346
|
+
/**
|
|
347
|
+
* Loud-degrade warning for the `loadFromWeights` soft-feed (#718 D1) — the Node mirror of
|
|
348
|
+
* neural-web's `warnOnUnfedTrainedChannels`. Fired ONCE per channel per process: a model-card that
|
|
349
|
+
* declares a channel REQUIRED, paired with a package that didn't ship (or could not parse) its
|
|
350
|
+
* data, runs that channel OFF. Structural fallback (the parse still works), loud console (a
|
|
351
|
+
* silently anchor-OFF anchor-trained model is the #566/#685 OOD crater this fix exists to
|
|
352
|
+
* surface).
|
|
353
|
+
*/
|
|
354
|
+
const warnedUnfedChannels = new Set();
|
|
355
|
+
function warnUnfedChannel(channel, detail) {
|
|
356
|
+
if (warnedUnfedChannels.has(channel))
|
|
357
|
+
return;
|
|
358
|
+
warnedUnfedChannels.add(channel);
|
|
359
|
+
console.error(`[mailwoman/neural] loadFromWeights: model-card declares the ${channel} channel REQUIRED but ${detail} — ` +
|
|
360
|
+
`running ${channel}-OFF, parses degraded (train/inference mismatch). Ship the ${channel} artifact in the ` +
|
|
361
|
+
`weights package (postcode-<cc>.bin / anchor-lexicon-v1.json), or pass an explicit lookup.`);
|
|
362
|
+
}
|
|
263
363
|
function argmaxSoftmax(row) {
|
|
264
364
|
let maxIdx = 0;
|
|
265
365
|
let maxVal = row[0];
|
package/out/classifier.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"classifier.js","sourceRoot":"","sources":["../classifier.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"classifier.js","sourceRoot":"","sources":["../classifier.ts"],"names":[],"mappings":"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"}
|