@mailwoman/corpus 9.3.0 → 10.0.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 +16 -0
- package/lib/adapters/geonames/adapter.ts +3 -3
- package/lib/adapters/geonames/postal/adapter.ts +122 -0
- package/lib/adapters/index.ts +39 -32
- package/lib/adapters/openaddresses/adapter.ts +4 -7
- package/lib/adapters/osm/adapter.ts +278 -0
- package/lib/adapters/overture/adapter.ts +22 -7
- package/lib/adapters/utils/index.ts +1 -1
- package/lib/adapters/wof/admin/json/adapter.ts +239 -0
- package/lib/adapters/wof/json-rows.ts +181 -0
- package/lib/adapters/wof/postalcode-json/adapter.ts +196 -0
- package/lib/au/adapters/gnaf/adapter.ts +152 -0
- package/lib/au/adapters/gnaf/assemble.ts +225 -0
- package/lib/cz/recipes/pcfirst-preposition.ts +112 -0
- package/lib/de/recipes/locale.ts +360 -0
- package/lib/fr/adapters/ban/adapter.ts +159 -0
- package/lib/fr/recipes/admin-split.ts +243 -0
- package/lib/fr/recipes/bare-street.ts +171 -0
- package/lib/fr/recipes/fragment.ts +334 -0
- package/lib/fr/recipes/lieudit.ts +274 -0
- package/lib/fr/recipes/order.ts +246 -0
- package/lib/fr/tools/fetch/ban.ts +289 -0
- package/lib/index.ts +1 -1
- package/lib/international/recipes/locale.ts +598 -0
- package/lib/jp/tools/fetch/houjin.ts +141 -0
- package/lib/kr/adapters/juso/label-rows.ts +259 -0
- package/lib/kr/adapters/localdata/align.ts +299 -0
- package/lib/kr/adapters/localdata/key-index.ts +185 -0
- package/lib/kr/adapters/localdata/permit-rows.ts +186 -0
- package/lib/kr/tools/fetch/juso.ts +172 -0
- package/lib/kr/tools/fetch/localdata.ts +206 -0
- package/lib/nl/recipes/postcode.ts +117 -0
- package/lib/no/recipes/fragment.ts +213 -0
- package/lib/no/recipes/street/index.ts +91 -0
- package/lib/no/recipes/street/led.ts +135 -0
- package/lib/recipes/anchor-absorption.ts +2 -2
- package/lib/recipes/bare/country.ts +95 -0
- package/lib/recipes/bare/postcode/eval.ts +99 -0
- package/lib/recipes/bare/postcode/index.ts +327 -0
- package/lib/recipes/boundary-stress.ts +3 -1
- package/lib/recipes/country-balanced.ts +3 -2
- package/lib/recipes/house-venue.ts +2 -1
- package/lib/recipes/index.ts +28 -21
- package/lib/recipes/intersection.ts +3 -2
- package/lib/recipes/po/box/cedex/au-nz.ts +82 -0
- package/lib/recipes/po/box/cedex/ca.ts +58 -0
- package/lib/recipes/po/box/cedex/fr.ts +76 -0
- package/lib/recipes/po/box/cedex/phrases.ts +108 -0
- package/lib/recipes/po/box/cedex/recipe.ts +203 -0
- package/lib/recipes/po/box/cedex/sources.ts +189 -0
- package/lib/recipes/po/box/cedex/types.ts +35 -0
- package/lib/recipes/po/box/cedex/us.ts +69 -0
- package/lib/recipes/po/box/cedex/vocabulary.ts +106 -0
- package/lib/recipes/po/box/cedex.ts +9 -0
- package/lib/recipes/po/box/index.ts +128 -0
- package/lib/recipes/scaffold.ts +18 -42
- package/lib/recipes/street/affix.ts +807 -0
- package/lib/recipes/street/bare.ts +102 -0
- package/lib/recipes/street.ts +3 -1
- package/lib/recipes/sub/venue/context.ts +149 -0
- package/lib/recipes/sub/venue/index.ts +997 -0
- package/lib/recipes/sub/venue/sources.ts +739 -0
- package/lib/recipes/trailing-region.ts +9 -9
- package/lib/recipes/unit.ts +3 -3
- package/lib/sg/recipes/register.ts +270 -0
- package/lib/sg/tools/fetch/acra.ts +179 -0
- package/lib/si/recipes/bare-village.ts +99 -0
- package/lib/south-asia/recipes/register.ts +214 -0
- package/lib/synthesizers/anchor-absorption.ts +1 -1
- package/lib/synthesizers/locale.ts +261 -0
- package/lib/synthesizers/street.ts +1 -1
- package/lib/synthesizers/utils.ts +2 -2
- package/lib/tools/audit.ts +3 -2
- package/lib/tools/corpus-stats.ts +3 -3
- package/lib/tools/fetch/download/index.ts +10 -0
- package/lib/tools/fetch/download/manifest.ts +102 -0
- package/lib/tools/fetch/download/network.ts +226 -0
- package/lib/tools/fetch/download/retry.ts +173 -0
- package/lib/tools/fetch/geonames/dump.ts +257 -0
- package/lib/tools/fetch/geonames/postal.ts +180 -0
- package/lib/tools/fetch/index.ts +47 -20
- package/lib/tools/fetch/openaddresses.ts +2 -2
- package/lib/tools/fetch/ourairports.ts +2 -2
- package/lib/tools/fetch/ppd.ts +1 -3
- package/lib/tools/fetch/wikidata-subvenue.ts +2 -2
- package/lib/tools/golden/promote.ts +340 -0
- package/lib/tools/golden/relabel-street/directory.ts +340 -0
- package/lib/tools/golden/relabel-street/index.ts +9 -0
- package/lib/tools/golden/relabel-street/row.ts +361 -0
- package/lib/tools/index.ts +10 -10
- package/lib/tools/ingest-csv.ts +5 -7
- package/lib/tools/lint/slice/vocab.ts +376 -0
- package/lib/tools/overlay-manifest.ts +92 -25
- package/lib/tools/overture-subvenue.ts +1 -1
- package/lib/tools/postcode-triples.ts +138 -14
- package/lib/tools/sub/venue/harvest.ts +234 -0
- package/lib/tools/sub/venue/head-nouns.ts +245 -0
- package/lib/tools/sub/venue/lexicon.ts +429 -0
- package/lib/tools/sub/venue/surfaces.ts +95 -0
- package/lib/tools/sub/venue/table.ts +281 -0
- package/lib/tools/sub/venue/wikidata.ts +85 -0
- package/lib/tw/tools/fetch/gcis.ts +180 -0
- package/lib/types.ts +1 -1
- package/lib/us/adapters/fcc-bdc/adapter.ts +173 -0
- package/lib/us/adapters/state/hi-schools/adapter.ts +160 -0
- package/lib/us/adapters/state/ia-contractors/adapter.ts +136 -0
- package/lib/us/adapters/state/ny-notaries/adapter.ts +133 -0
- package/lib/us/adapters/state/tx-notaries/adapter.ts +149 -0
- package/lib/us/adapters/tiger/adapter.ts +250 -0
- package/lib/us/adapters/usgov/hrsa-fqhc/adapter.ts +156 -0
- package/lib/us/adapters/usgov/imls-pls/adapter.ts +134 -0
- package/lib/us/adapters/usgov/irs-bmf/adapter.ts +145 -0
- package/lib/us/adapters/usgov/nad/adapter.ts +324 -0
- package/lib/us/adapters/usgov/nppes/adapter.ts +143 -0
- package/lib/us/adapters/usgov/samhsa-treatment-locator/adapter.ts +182 -0
- package/lib/us/tools/fetch/hrsa.ts +59 -0
- package/lib/us/tools/fetch/imls-pls.ts +149 -0
- package/lib/us/tools/fetch/nad.ts +341 -0
- package/lib/us/tools/fetch/nppes.ts +165 -0
- package/lib/us/tools/fetch/state/hi-schools.ts +161 -0
- package/lib/us/tools/fetch/state/sources.ts +146 -0
- package/lib/us/tools/fetch/tiger-full.ts +308 -0
- package/lib/utils/align.ts +1 -1
- package/lib/utils/golden.ts +12 -8
- package/lib/utils/wof-json.ts +7 -13
- package/out/adapters/geonames/adapter.d.ts +1 -1
- package/out/adapters/geonames/adapter.js +3 -3
- package/out/adapters/geonames/adapter.js.map +1 -1
- package/out/adapters/geonames/postal/adapter.d.ts.map +1 -0
- package/out/adapters/geonames/postal/adapter.js +107 -0
- package/out/adapters/geonames/postal/adapter.js.map +1 -0
- package/out/adapters/index.d.ts +16 -16
- package/out/adapters/index.d.ts.map +1 -1
- package/out/adapters/index.js +34 -32
- package/out/adapters/index.js.map +1 -1
- package/out/adapters/openaddresses/adapter.d.ts.map +1 -1
- package/out/adapters/openaddresses/adapter.js +4 -6
- package/out/adapters/openaddresses/adapter.js.map +1 -1
- package/out/adapters/osm/adapter.d.ts +95 -0
- package/out/adapters/osm/adapter.d.ts.map +1 -0
- package/out/adapters/osm/adapter.js +211 -0
- package/out/adapters/osm/adapter.js.map +1 -0
- package/out/adapters/overture/adapter.d.ts +10 -0
- package/out/adapters/overture/adapter.d.ts.map +1 -1
- package/out/adapters/overture/adapter.js +20 -7
- package/out/adapters/overture/adapter.js.map +1 -1
- package/out/adapters/synth-po-box/adapter.js.map +1 -1
- package/out/adapters/utils/index.d.ts +1 -1
- package/out/adapters/utils/index.d.ts.map +1 -1
- package/out/adapters/utils/index.js.map +1 -1
- package/out/adapters/wof/admin/json/adapter.d.ts +79 -0
- package/out/adapters/wof/admin/json/adapter.d.ts.map +1 -0
- package/out/adapters/wof/admin/json/adapter.js +204 -0
- package/out/adapters/wof/admin/json/adapter.js.map +1 -0
- package/out/adapters/wof/json-rows.d.ts +73 -0
- package/out/adapters/wof/json-rows.d.ts.map +1 -0
- package/out/adapters/wof/json-rows.js +115 -0
- package/out/adapters/wof/json-rows.js.map +1 -0
- package/out/adapters/wof/postalcode-json/adapter.d.ts +65 -0
- package/out/adapters/wof/postalcode-json/adapter.d.ts.map +1 -0
- package/out/adapters/wof/postalcode-json/adapter.js +167 -0
- package/out/adapters/wof/postalcode-json/adapter.js.map +1 -0
- package/out/au/adapters/gnaf/adapter.d.ts.map +1 -0
- package/out/au/adapters/gnaf/adapter.js +127 -0
- package/out/au/adapters/gnaf/adapter.js.map +1 -0
- package/out/au/adapters/gnaf/assemble.d.ts +65 -0
- package/out/au/adapters/gnaf/assemble.d.ts.map +1 -0
- package/out/au/adapters/gnaf/assemble.js +154 -0
- package/out/au/adapters/gnaf/assemble.js.map +1 -0
- package/out/cn/recipes/organizational-units.d.ts +36 -0
- package/out/cn/recipes/organizational-units.d.ts.map +1 -0
- package/out/cn/recipes/organizational-units.js +159 -0
- package/out/cn/recipes/organizational-units.js.map +1 -0
- package/out/cz/recipes/pcfirst-preposition.d.ts +22 -0
- package/out/cz/recipes/pcfirst-preposition.d.ts.map +1 -0
- package/out/cz/recipes/pcfirst-preposition.js +101 -0
- package/out/cz/recipes/pcfirst-preposition.js.map +1 -0
- package/out/de/recipes/locale.d.ts +44 -0
- package/out/de/recipes/locale.d.ts.map +1 -0
- package/out/de/recipes/locale.js +289 -0
- package/out/de/recipes/locale.js.map +1 -0
- package/out/env.d.ts +1 -1
- package/out/fr/adapters/ban/adapter.d.ts.map +1 -0
- package/out/fr/adapters/ban/adapter.js +123 -0
- package/out/fr/adapters/ban/adapter.js.map +1 -0
- package/out/fr/adapters/ban/street-decompose.d.ts.map +1 -0
- package/out/fr/adapters/ban/street-decompose.js.map +1 -0
- package/out/fr/recipes/admin-split.d.ts +38 -0
- package/out/fr/recipes/admin-split.d.ts.map +1 -0
- package/out/fr/recipes/admin-split.js +192 -0
- package/out/fr/recipes/admin-split.js.map +1 -0
- package/out/fr/recipes/bare-street.d.ts +28 -0
- package/out/fr/recipes/bare-street.d.ts.map +1 -0
- package/out/fr/recipes/bare-street.js +144 -0
- package/out/fr/recipes/bare-street.js.map +1 -0
- package/out/fr/recipes/fragment.d.ts +77 -0
- package/out/fr/recipes/fragment.d.ts.map +1 -0
- package/out/fr/recipes/fragment.js +277 -0
- package/out/fr/recipes/fragment.js.map +1 -0
- package/out/fr/recipes/lieudit.d.ts +32 -0
- package/out/fr/recipes/lieudit.d.ts.map +1 -0
- package/out/fr/recipes/lieudit.js +211 -0
- package/out/fr/recipes/lieudit.js.map +1 -0
- package/out/fr/recipes/order.d.ts +38 -0
- package/out/fr/recipes/order.d.ts.map +1 -0
- package/out/fr/recipes/order.js +198 -0
- package/out/fr/recipes/order.js.map +1 -0
- package/out/fr/tools/fetch/ban.d.ts +31 -0
- package/out/fr/tools/fetch/ban.d.ts.map +1 -0
- package/out/fr/tools/fetch/ban.js +239 -0
- package/out/fr/tools/fetch/ban.js.map +1 -0
- package/out/index.d.ts +1 -1
- package/out/index.d.ts.map +1 -1
- package/out/index.js +1 -1
- package/out/index.js.map +1 -1
- package/out/international/recipes/locale.d.ts +136 -0
- package/out/international/recipes/locale.d.ts.map +1 -0
- package/out/international/recipes/locale.js +458 -0
- package/out/international/recipes/locale.js.map +1 -0
- package/out/jp/adapters/wof-admin/adapter.d.ts.map +1 -0
- package/out/jp/adapters/wof-admin/adapter.js.map +1 -0
- package/out/jp/tools/fetch/houjin.d.ts +24 -0
- package/out/jp/tools/fetch/houjin.d.ts.map +1 -0
- package/out/jp/tools/fetch/houjin.js +102 -0
- package/out/jp/tools/fetch/houjin.js.map +1 -0
- package/out/kr/adapters/juso/label-rows.d.ts +76 -0
- package/out/kr/adapters/juso/label-rows.d.ts.map +1 -0
- package/out/kr/adapters/juso/label-rows.js +194 -0
- package/out/kr/adapters/juso/label-rows.js.map +1 -0
- package/out/kr/adapters/localdata/align.d.ts +43 -0
- package/out/kr/adapters/localdata/align.d.ts.map +1 -0
- package/out/kr/adapters/localdata/align.js +223 -0
- package/out/kr/adapters/localdata/align.js.map +1 -0
- package/out/kr/adapters/localdata/key-index.d.ts +71 -0
- package/out/kr/adapters/localdata/key-index.d.ts.map +1 -0
- package/out/kr/adapters/localdata/key-index.js +133 -0
- package/out/kr/adapters/localdata/key-index.js.map +1 -0
- package/out/kr/adapters/localdata/permit-rows.d.ts +66 -0
- package/out/kr/adapters/localdata/permit-rows.d.ts.map +1 -0
- package/out/kr/adapters/localdata/permit-rows.js +131 -0
- package/out/kr/adapters/localdata/permit-rows.js.map +1 -0
- package/out/kr/tools/fetch/juso.d.ts +30 -0
- package/out/kr/tools/fetch/juso.d.ts.map +1 -0
- package/out/kr/tools/fetch/juso.js +120 -0
- package/out/kr/tools/fetch/juso.js.map +1 -0
- package/out/kr/tools/fetch/localdata.d.ts +30 -0
- package/out/kr/tools/fetch/localdata.d.ts.map +1 -0
- package/out/kr/tools/fetch/localdata.js +139 -0
- package/out/kr/tools/fetch/localdata.js.map +1 -0
- package/out/nl/recipes/postcode.d.ts +26 -0
- package/out/nl/recipes/postcode.d.ts.map +1 -0
- package/out/nl/recipes/postcode.js +103 -0
- package/out/nl/recipes/postcode.js.map +1 -0
- package/out/no/recipes/fragment.d.ts +43 -0
- package/out/no/recipes/fragment.d.ts.map +1 -0
- package/out/no/recipes/fragment.js +183 -0
- package/out/no/recipes/fragment.js.map +1 -0
- package/out/no/recipes/street/index.d.ts +18 -0
- package/out/no/recipes/street/index.d.ts.map +1 -0
- package/out/no/recipes/street/index.js +72 -0
- package/out/no/recipes/street/index.js.map +1 -0
- package/out/no/recipes/street/led.d.ts +24 -0
- package/out/no/recipes/street/led.d.ts.map +1 -0
- package/out/no/recipes/street/led.js +114 -0
- package/out/no/recipes/street/led.js.map +1 -0
- package/out/recipes/anchor-absorption.d.ts.map +1 -1
- package/out/recipes/anchor-absorption.js +2 -1
- package/out/recipes/anchor-absorption.js.map +1 -1
- package/out/recipes/bare/country.d.ts +25 -0
- package/out/recipes/bare/country.d.ts.map +1 -0
- package/out/recipes/bare/country.js +88 -0
- package/out/recipes/bare/country.js.map +1 -0
- package/out/recipes/bare/postcode/eval.d.ts +29 -0
- package/out/recipes/bare/postcode/eval.d.ts.map +1 -0
- package/out/recipes/bare/postcode/eval.js +85 -0
- package/out/recipes/bare/postcode/eval.js.map +1 -0
- package/out/recipes/bare/postcode/index.d.ts +62 -0
- package/out/recipes/bare/postcode/index.d.ts.map +1 -0
- package/out/recipes/bare/postcode/index.js +267 -0
- package/out/recipes/bare/postcode/index.js.map +1 -0
- package/out/recipes/boundary-stress.d.ts.map +1 -1
- package/out/recipes/boundary-stress.js +2 -1
- package/out/recipes/boundary-stress.js.map +1 -1
- package/out/recipes/country-balanced.d.ts.map +1 -1
- package/out/recipes/country-balanced.js +2 -1
- package/out/recipes/country-balanced.js.map +1 -1
- package/out/recipes/house-venue.d.ts.map +1 -1
- package/out/recipes/house-venue.js +2 -1
- package/out/recipes/house-venue.js.map +1 -1
- package/out/recipes/index.d.ts.map +1 -1
- package/out/recipes/index.js +28 -21
- package/out/recipes/index.js.map +1 -1
- package/out/recipes/intersection.d.ts.map +1 -1
- package/out/recipes/intersection.js +2 -1
- package/out/recipes/intersection.js.map +1 -1
- package/out/recipes/po/box/cedex/au-nz.d.ts +7 -0
- package/out/recipes/po/box/cedex/au-nz.d.ts.map +1 -0
- package/out/recipes/po/box/cedex/au-nz.js +56 -0
- package/out/recipes/po/box/cedex/au-nz.js.map +1 -0
- package/out/recipes/po/box/cedex/ca.d.ts +7 -0
- package/out/recipes/po/box/cedex/ca.d.ts.map +1 -0
- package/out/recipes/po/box/cedex/ca.js +38 -0
- package/out/recipes/po/box/cedex/ca.js.map +1 -0
- package/out/recipes/po/box/cedex/fr.d.ts +7 -0
- package/out/recipes/po/box/cedex/fr.d.ts.map +1 -0
- package/out/recipes/po/box/cedex/fr.js +57 -0
- package/out/recipes/po/box/cedex/fr.js.map +1 -0
- package/out/recipes/po/box/cedex/phrases.d.ts +8 -0
- package/out/recipes/po/box/cedex/phrases.d.ts.map +1 -0
- package/out/recipes/po/box/cedex/phrases.js +76 -0
- package/out/recipes/po/box/cedex/phrases.js.map +1 -0
- package/out/recipes/po/box/cedex/recipe.d.ts +9 -0
- package/out/recipes/po/box/cedex/recipe.d.ts.map +1 -0
- package/out/recipes/po/box/cedex/recipe.js +153 -0
- package/out/recipes/po/box/cedex/recipe.js.map +1 -0
- package/out/recipes/po/box/cedex/sources.d.ts +86 -0
- package/out/recipes/po/box/cedex/sources.d.ts.map +1 -0
- package/out/recipes/po/box/cedex/sources.js +143 -0
- package/out/recipes/po/box/cedex/sources.js.map +1 -0
- package/out/recipes/po/box/cedex/types.d.ts +31 -0
- package/out/recipes/po/box/cedex/types.d.ts.map +1 -0
- package/out/recipes/po/box/cedex/types.js +5 -0
- package/out/recipes/po/box/cedex/types.js.map +1 -0
- package/out/recipes/po/box/cedex/us.d.ts +7 -0
- package/out/recipes/po/box/cedex/us.d.ts.map +1 -0
- package/out/recipes/po/box/cedex/us.js +51 -0
- package/out/recipes/po/box/cedex/us.js.map +1 -0
- package/out/recipes/po/box/cedex/vocabulary.d.ts +68 -0
- package/out/recipes/po/box/cedex/vocabulary.d.ts.map +1 -0
- package/out/recipes/po/box/cedex/vocabulary.js +90 -0
- package/out/recipes/po/box/cedex/vocabulary.js.map +1 -0
- package/out/recipes/po/box/cedex.d.ts +9 -0
- package/out/recipes/po/box/cedex.d.ts.map +1 -0
- package/out/recipes/po/box/cedex.js +9 -0
- package/out/recipes/po/box/cedex.js.map +1 -0
- package/out/recipes/po/box/index.d.ts +17 -0
- package/out/recipes/po/box/index.d.ts.map +1 -0
- package/out/recipes/po/box/index.js +105 -0
- package/out/recipes/po/box/index.js.map +1 -0
- package/out/recipes/scaffold.d.ts +20 -1
- package/out/recipes/scaffold.d.ts.map +1 -1
- package/out/recipes/scaffold.js +18 -49
- package/out/recipes/scaffold.js.map +1 -1
- package/out/recipes/street/affix.d.ts +89 -0
- package/out/recipes/street/affix.d.ts.map +1 -0
- package/out/recipes/street/affix.js +565 -0
- package/out/recipes/street/affix.js.map +1 -0
- package/out/recipes/street/bare.d.ts +25 -0
- package/out/recipes/street/bare.d.ts.map +1 -0
- package/out/recipes/street/bare.js +87 -0
- package/out/recipes/street/bare.js.map +1 -0
- package/out/recipes/street.d.ts.map +1 -1
- package/out/recipes/street.js +2 -1
- package/out/recipes/street.js.map +1 -1
- package/out/recipes/sub/venue/context.d.ts +29 -0
- package/out/recipes/sub/venue/context.d.ts.map +1 -0
- package/out/recipes/sub/venue/context.js +106 -0
- package/out/recipes/sub/venue/context.js.map +1 -0
- package/out/recipes/sub/venue/index.d.ts +270 -0
- package/out/recipes/sub/venue/index.d.ts.map +1 -0
- package/out/recipes/sub/venue/index.js +728 -0
- package/out/recipes/sub/venue/index.js.map +1 -0
- package/out/recipes/sub/venue/sources.d.ts +209 -0
- package/out/recipes/sub/venue/sources.d.ts.map +1 -0
- package/out/recipes/sub/venue/sources.js +555 -0
- package/out/recipes/sub/venue/sources.js.map +1 -0
- package/out/recipes/trailing-region.d.ts.map +1 -1
- package/out/recipes/trailing-region.js +8 -2
- package/out/recipes/trailing-region.js.map +1 -1
- package/out/recipes/unit.d.ts.map +1 -1
- package/out/recipes/unit.js +2 -1
- package/out/recipes/unit.js.map +1 -1
- package/out/sg/recipes/register.d.ts +69 -0
- package/out/sg/recipes/register.d.ts.map +1 -0
- package/out/sg/recipes/register.js +211 -0
- package/out/sg/recipes/register.js.map +1 -0
- package/out/sg/tools/fetch/acra.d.ts +23 -0
- package/out/sg/tools/fetch/acra.d.ts.map +1 -0
- package/out/sg/tools/fetch/acra.js +126 -0
- package/out/sg/tools/fetch/acra.js.map +1 -0
- package/out/si/recipes/bare-village.d.ts +32 -0
- package/out/si/recipes/bare-village.d.ts.map +1 -0
- package/out/si/recipes/bare-village.js +89 -0
- package/out/si/recipes/bare-village.js.map +1 -0
- package/out/south-asia/recipes/register.d.ts +51 -0
- package/out/south-asia/recipes/register.d.ts.map +1 -0
- package/out/south-asia/recipes/register.js +154 -0
- package/out/south-asia/recipes/register.js.map +1 -0
- package/out/synthesizers/anchor-absorption.d.ts +1 -1
- package/out/synthesizers/anchor-absorption.d.ts.map +1 -1
- package/out/synthesizers/anchor-absorption.js.map +1 -1
- package/out/synthesizers/boundary-stress.js.map +1 -1
- package/out/synthesizers/house-venue.js.map +1 -1
- package/out/synthesizers/intersection.js.map +1 -1
- package/out/synthesizers/locale.d.ts +116 -0
- package/out/synthesizers/locale.d.ts.map +1 -0
- package/out/synthesizers/locale.js +150 -0
- package/out/synthesizers/locale.js.map +1 -0
- package/out/synthesizers/no-street.d.ts.map +1 -1
- package/out/synthesizers/no-street.js.map +1 -1
- package/out/synthesizers/po-box.js.map +1 -1
- package/out/synthesizers/street.d.ts.map +1 -1
- package/out/synthesizers/street.js +1 -1
- package/out/synthesizers/street.js.map +1 -1
- package/out/synthesizers/utils.js +1 -1
- package/out/synthesizers/utils.js.map +1 -1
- package/out/test-kit/corpus-recipe.d.ts.map +1 -1
- package/out/test-kit/corpus-recipe.js.map +1 -1
- package/out/tools/audit.d.ts.map +1 -1
- package/out/tools/audit.js +3 -2
- package/out/tools/audit.js.map +1 -1
- package/out/tools/corpus-stats.js +3 -3
- package/out/tools/corpus-stats.js.map +1 -1
- package/out/tools/fetch/download/index.d.ts +10 -0
- package/out/tools/fetch/download/index.d.ts.map +1 -0
- package/out/tools/fetch/download/index.js +10 -0
- package/out/tools/fetch/download/index.js.map +1 -0
- package/out/tools/fetch/download/manifest.d.ts +47 -0
- package/out/tools/fetch/download/manifest.d.ts.map +1 -0
- package/out/tools/fetch/download/manifest.js +74 -0
- package/out/tools/fetch/download/manifest.js.map +1 -0
- package/out/tools/fetch/download/network.d.ts +105 -0
- package/out/tools/fetch/download/network.d.ts.map +1 -0
- package/out/tools/fetch/download/network.js +130 -0
- package/out/tools/fetch/download/network.js.map +1 -0
- package/out/tools/fetch/download/retry.d.ts +45 -0
- package/out/tools/fetch/download/retry.d.ts.map +1 -0
- package/out/tools/fetch/download/retry.js +136 -0
- package/out/tools/fetch/download/retry.js.map +1 -0
- package/out/tools/fetch/geonames/dump.d.ts +91 -0
- package/out/tools/fetch/geonames/dump.d.ts.map +1 -0
- package/out/tools/fetch/geonames/dump.js +171 -0
- package/out/tools/fetch/geonames/dump.js.map +1 -0
- package/out/tools/fetch/geonames/postal.d.ts +76 -0
- package/out/tools/fetch/geonames/postal.d.ts.map +1 -0
- package/out/tools/fetch/geonames/postal.js +126 -0
- package/out/tools/fetch/geonames/postal.js.map +1 -0
- package/out/tools/fetch/index.d.ts +47 -20
- package/out/tools/fetch/index.d.ts.map +1 -1
- package/out/tools/fetch/index.js +47 -20
- package/out/tools/fetch/index.js.map +1 -1
- package/out/tools/fetch/openaddresses.d.ts +1 -1
- package/out/tools/fetch/openaddresses.d.ts.map +1 -1
- package/out/tools/fetch/openaddresses.js +1 -1
- package/out/tools/fetch/openaddresses.js.map +1 -1
- package/out/tools/fetch/ourairports.d.ts +1 -1
- package/out/tools/fetch/ourairports.d.ts.map +1 -1
- package/out/tools/fetch/ourairports.js +1 -1
- package/out/tools/fetch/ourairports.js.map +1 -1
- package/out/tools/fetch/ppd.js +1 -3
- package/out/tools/fetch/ppd.js.map +1 -1
- package/out/tools/fetch/wikidata-subvenue.d.ts +1 -1
- package/out/tools/fetch/wikidata-subvenue.d.ts.map +1 -1
- package/out/tools/fetch/wikidata-subvenue.js +1 -1
- package/out/tools/fetch/wikidata-subvenue.js.map +1 -1
- package/out/tools/golden/expand.d.ts +90 -0
- package/out/tools/golden/expand.d.ts.map +1 -0
- package/out/tools/golden/expand.js +406 -0
- package/out/tools/golden/expand.js.map +1 -0
- package/out/tools/golden/promote.d.ts +72 -0
- package/out/tools/golden/promote.d.ts.map +1 -0
- package/out/tools/golden/promote.js +243 -0
- package/out/tools/golden/promote.js.map +1 -0
- package/out/tools/golden/relabel-street/directory.d.ts +83 -0
- package/out/tools/golden/relabel-street/directory.d.ts.map +1 -0
- package/out/tools/golden/relabel-street/directory.js +216 -0
- package/out/tools/golden/relabel-street/directory.js.map +1 -0
- package/out/tools/golden/relabel-street/index.d.ts +9 -0
- package/out/tools/golden/relabel-street/index.d.ts.map +1 -0
- package/out/tools/golden/relabel-street/index.js +9 -0
- package/out/tools/golden/relabel-street/index.js.map +1 -0
- package/out/tools/golden/relabel-street/row.d.ts +121 -0
- package/out/tools/golden/relabel-street/row.d.ts.map +1 -0
- package/out/tools/golden/relabel-street/row.js +232 -0
- package/out/tools/golden/relabel-street/row.js.map +1 -0
- package/out/tools/index.d.ts +10 -10
- package/out/tools/index.d.ts.map +1 -1
- package/out/tools/index.js +10 -10
- package/out/tools/index.js.map +1 -1
- package/out/tools/ingest-csv.d.ts.map +1 -1
- package/out/tools/ingest-csv.js +5 -7
- package/out/tools/ingest-csv.js.map +1 -1
- package/out/tools/lint/slice/index.d.ts +93 -0
- package/out/tools/lint/slice/index.d.ts.map +1 -0
- package/out/tools/lint/slice/index.js +322 -0
- package/out/tools/lint/slice/index.js.map +1 -0
- package/out/tools/lint/slice/vocab.d.ts +90 -0
- package/out/tools/lint/slice/vocab.d.ts.map +1 -0
- package/out/tools/lint/slice/vocab.js +254 -0
- package/out/tools/lint/slice/vocab.js.map +1 -0
- package/out/tools/overlay-manifest.d.ts +56 -6
- package/out/tools/overlay-manifest.d.ts.map +1 -1
- package/out/tools/overlay-manifest.js +56 -15
- package/out/tools/overlay-manifest.js.map +1 -1
- package/out/tools/overture-subvenue.d.ts +1 -1
- package/out/tools/postcode-triples.d.ts +36 -0
- package/out/tools/postcode-triples.d.ts.map +1 -1
- package/out/tools/postcode-triples.js +91 -12
- package/out/tools/postcode-triples.js.map +1 -1
- package/out/tools/slice/kryptonite.d.ts +32 -0
- package/out/tools/slice/kryptonite.d.ts.map +1 -0
- package/out/tools/slice/kryptonite.js +99 -0
- package/out/tools/slice/kryptonite.js.map +1 -0
- package/out/tools/slice/translit.d.ts +51 -0
- package/out/tools/slice/translit.d.ts.map +1 -0
- package/out/tools/slice/translit.js +166 -0
- package/out/tools/slice/translit.js.map +1 -0
- package/out/tools/sub/venue/harvest.d.ts +100 -0
- package/out/tools/sub/venue/harvest.d.ts.map +1 -0
- package/out/tools/sub/venue/harvest.js +168 -0
- package/out/tools/sub/venue/harvest.js.map +1 -0
- package/out/tools/sub/venue/head-nouns.d.ts +50 -0
- package/out/tools/sub/venue/head-nouns.d.ts.map +1 -0
- package/out/tools/sub/venue/head-nouns.js.map +1 -0
- package/out/tools/sub/venue/lexicon.d.ts +156 -0
- package/out/tools/sub/venue/lexicon.d.ts.map +1 -0
- package/out/tools/sub/venue/lexicon.js +283 -0
- package/out/tools/sub/venue/lexicon.js.map +1 -0
- package/out/tools/sub/venue/promotions.d.ts +94 -0
- package/out/tools/sub/venue/promotions.d.ts.map +1 -0
- package/out/tools/sub/venue/promotions.js +266 -0
- package/out/tools/sub/venue/promotions.js.map +1 -0
- package/out/tools/sub/venue/surfaces.d.ts +45 -0
- package/out/tools/sub/venue/surfaces.d.ts.map +1 -0
- package/out/tools/sub/venue/surfaces.js.map +1 -0
- package/out/tools/sub/venue/table.d.ts +229 -0
- package/out/tools/sub/venue/table.d.ts.map +1 -0
- package/out/tools/sub/venue/table.js.map +1 -0
- package/out/tools/sub/venue/wikidata.d.ts +26 -0
- package/out/tools/sub/venue/wikidata.d.ts.map +1 -0
- package/out/tools/sub/venue/wikidata.js +62 -0
- package/out/tools/sub/venue/wikidata.js.map +1 -0
- package/out/tw/tools/fetch/gcis.d.ts +23 -0
- package/out/tw/tools/fetch/gcis.d.ts.map +1 -0
- package/out/tw/tools/fetch/gcis.js +135 -0
- package/out/tw/tools/fetch/gcis.js.map +1 -0
- package/out/types.d.ts +1 -1
- package/out/types.d.ts.map +1 -1
- package/out/us/adapters/fcc-bdc/adapter.d.ts.map +1 -0
- package/out/us/adapters/fcc-bdc/adapter.js +142 -0
- package/out/us/adapters/fcc-bdc/adapter.js.map +1 -0
- package/out/us/adapters/state/hi-schools/adapter.d.ts.map +1 -0
- package/out/us/adapters/state/hi-schools/adapter.js +136 -0
- package/out/us/adapters/state/hi-schools/adapter.js.map +1 -0
- package/out/us/adapters/state/hi-schools/workbook.d.ts.map +1 -0
- package/out/us/adapters/state/hi-schools/workbook.js.map +1 -0
- package/out/us/adapters/state/ia-contractors/adapter.d.ts.map +1 -0
- package/out/us/adapters/state/ia-contractors/adapter.js +104 -0
- package/out/us/adapters/state/ia-contractors/adapter.js.map +1 -0
- package/out/us/adapters/state/ny-notaries/adapter.d.ts.map +1 -0
- package/out/us/adapters/state/ny-notaries/adapter.js +112 -0
- package/out/us/adapters/state/ny-notaries/adapter.js.map +1 -0
- package/out/us/adapters/state/tx-notaries/adapter.d.ts.map +1 -0
- package/out/us/adapters/state/tx-notaries/adapter.js +118 -0
- package/out/us/adapters/state/tx-notaries/adapter.js.map +1 -0
- package/out/us/adapters/tiger/adapter.d.ts +55 -0
- package/out/us/adapters/tiger/adapter.d.ts.map +1 -0
- package/out/us/adapters/tiger/adapter.js +197 -0
- package/out/us/adapters/tiger/adapter.js.map +1 -0
- package/out/us/adapters/tiger/street-decompose.d.ts.map +1 -0
- package/out/us/adapters/tiger/street-decompose.js.map +1 -0
- package/out/us/adapters/usgov/hrsa-fqhc/adapter.d.ts.map +1 -0
- package/out/us/adapters/usgov/hrsa-fqhc/adapter.js +121 -0
- package/out/us/adapters/usgov/hrsa-fqhc/adapter.js.map +1 -0
- package/out/us/adapters/usgov/imls-pls/adapter.d.ts.map +1 -0
- package/out/us/adapters/usgov/imls-pls/adapter.js +106 -0
- package/out/us/adapters/usgov/imls-pls/adapter.js.map +1 -0
- package/out/us/adapters/usgov/irs-bmf/adapter.d.ts.map +1 -0
- package/out/us/adapters/usgov/irs-bmf/adapter.js +116 -0
- package/out/us/adapters/usgov/irs-bmf/adapter.js.map +1 -0
- package/out/us/adapters/usgov/nad/adapter.d.ts.map +1 -0
- package/out/us/adapters/usgov/nad/adapter.js +239 -0
- package/out/us/adapters/usgov/nad/adapter.js.map +1 -0
- package/out/us/adapters/usgov/nppes/adapter.d.ts.map +1 -0
- package/out/us/adapters/usgov/nppes/adapter.js +110 -0
- package/out/us/adapters/usgov/nppes/adapter.js.map +1 -0
- package/out/us/adapters/usgov/samhsa-treatment-locator/adapter.d.ts.map +1 -0
- package/out/us/adapters/usgov/samhsa-treatment-locator/adapter.js +143 -0
- package/out/us/adapters/usgov/samhsa-treatment-locator/adapter.js.map +1 -0
- package/out/us/fips-state.d.ts +41 -0
- package/out/us/fips-state.d.ts.map +1 -0
- package/out/us/fips-state.js +100 -0
- package/out/us/fips-state.js.map +1 -0
- package/out/us/tools/fetch/hrsa.d.ts +18 -0
- package/out/us/tools/fetch/hrsa.d.ts.map +1 -0
- package/out/us/tools/fetch/hrsa.js +46 -0
- package/out/us/tools/fetch/hrsa.js.map +1 -0
- package/out/us/tools/fetch/imls-pls.d.ts +25 -0
- package/out/us/tools/fetch/imls-pls.d.ts.map +1 -0
- package/out/us/tools/fetch/imls-pls.js +108 -0
- package/out/us/tools/fetch/imls-pls.js.map +1 -0
- package/out/us/tools/fetch/nad.d.ts +70 -0
- package/out/us/tools/fetch/nad.d.ts.map +1 -0
- package/out/us/tools/fetch/nad.js +234 -0
- package/out/us/tools/fetch/nad.js.map +1 -0
- package/out/us/tools/fetch/nppes.d.ts +26 -0
- package/out/us/tools/fetch/nppes.d.ts.map +1 -0
- package/out/us/tools/fetch/nppes.js +126 -0
- package/out/us/tools/fetch/nppes.js.map +1 -0
- package/out/us/tools/fetch/state/hi-schools.d.ts +26 -0
- package/out/us/tools/fetch/state/hi-schools.d.ts.map +1 -0
- package/out/us/tools/fetch/state/hi-schools.js +112 -0
- package/out/us/tools/fetch/state/hi-schools.js.map +1 -0
- package/out/us/tools/fetch/state/sources.d.ts +26 -0
- package/out/us/tools/fetch/state/sources.d.ts.map +1 -0
- package/out/us/tools/fetch/state/sources.js +111 -0
- package/out/us/tools/fetch/state/sources.js.map +1 -0
- package/out/us/tools/fetch/tiger-full.d.ts +22 -0
- package/out/us/tools/fetch/tiger-full.d.ts.map +1 -0
- package/out/us/tools/fetch/tiger-full.js +217 -0
- package/out/us/tools/fetch/tiger-full.js.map +1 -0
- package/out/utils/align.d.ts +1 -1
- package/out/utils/align.d.ts.map +1 -1
- package/out/utils/align.js.map +1 -1
- package/out/utils/golden.d.ts +7 -3
- package/out/utils/golden.d.ts.map +1 -1
- package/out/utils/golden.js +12 -8
- package/out/utils/golden.js.map +1 -1
- package/out/utils/parquet.d.ts.map +1 -1
- package/out/utils/split.js.map +1 -1
- package/out/utils/wof-json.d.ts.map +1 -1
- package/out/utils/wof-json.js +7 -12
- package/out/utils/wof-json.js.map +1 -1
- package/out/ve/recipes/reviewed-postcode-tail.d.ts.map +1 -0
- package/out/ve/recipes/reviewed-postcode-tail.js.map +1 -0
- package/package.json +196 -46
- package/lib/adapters/ban/adapter.ts +0 -190
- package/lib/adapters/fcc-bdc/adapter.ts +0 -174
- package/lib/adapters/geonames-postal/adapter.ts +0 -122
- package/lib/adapters/gnaf/adapter.ts +0 -149
- package/lib/adapters/gnaf/assemble.ts +0 -225
- package/lib/adapters/state-hi-schools/adapter.ts +0 -170
- package/lib/adapters/state-ia-contractors/adapter.ts +0 -144
- package/lib/adapters/state-ny-notaries/adapter.ts +0 -141
- package/lib/adapters/state-tx-notaries/adapter.ts +0 -157
- package/lib/adapters/tiger/adapter.ts +0 -252
- package/lib/adapters/usgov-hrsa-fqhc/adapter.ts +0 -167
- package/lib/adapters/usgov-imls-pls/adapter.ts +0 -143
- package/lib/adapters/usgov-irs-bmf/adapter.ts +0 -151
- package/lib/adapters/usgov-nad/adapter.ts +0 -334
- package/lib/adapters/usgov-nppes/adapter.ts +0 -151
- package/lib/adapters/usgov-samhsa-treatment-locator/adapter.ts +0 -193
- package/lib/adapters/wof-admin-json/adapter.ts +0 -231
- package/lib/adapters/wof-json-rows.ts +0 -129
- package/lib/adapters/wof-postalcode-json/adapter.ts +0 -176
- package/lib/name-prone-us-suffixes.ts +0 -12
- package/lib/recipes/bare-country.ts +0 -95
- package/lib/recipes/cz-pcfirst-preposition.ts +0 -111
- package/lib/recipes/fr-admin-split.ts +0 -242
- package/lib/recipes/fr-bare-street.ts +0 -170
- package/lib/recipes/fr-fragment.ts +0 -333
- package/lib/recipes/fr-lieudit.ts +0 -301
- package/lib/recipes/fr-order.ts +0 -245
- package/lib/recipes/german.ts +0 -359
- package/lib/recipes/locale.ts +0 -599
- package/lib/recipes/nl-postcode.ts +0 -115
- package/lib/recipes/no-fragment.ts +0 -219
- package/lib/recipes/no-street-led.ts +0 -141
- package/lib/recipes/no-street.ts +0 -90
- package/lib/recipes/po-box-cedex.ts +0 -976
- package/lib/recipes/po-box.ts +0 -123
- package/lib/recipes/si-bare-village.ts +0 -97
- package/lib/recipes/street-affix.ts +0 -804
- package/lib/recipes/street-bare.ts +0 -100
- package/lib/recipes/sub-venue-sources.ts +0 -877
- package/lib/recipes/sub-venue.ts +0 -997
- package/lib/synthesizers/german.ts +0 -260
- package/lib/tools/fetch/ban.ts +0 -289
- package/lib/tools/fetch/download.ts +0 -262
- package/lib/tools/fetch/geonames-dump.ts +0 -257
- package/lib/tools/fetch/geonames-postal.ts +0 -180
- package/lib/tools/fetch/hrsa.ts +0 -59
- package/lib/tools/fetch/imls-pls.ts +0 -149
- package/lib/tools/fetch/nad.ts +0 -341
- package/lib/tools/fetch/nppes.ts +0 -165
- package/lib/tools/fetch/state-hi-schools.ts +0 -161
- package/lib/tools/fetch/state-sources.ts +0 -146
- package/lib/tools/fetch/tiger-full.ts +0 -308
- package/lib/tools/golden-promote.ts +0 -337
- package/lib/tools/golden-relabel-street.ts +0 -683
- package/lib/tools/lint-slice-vocab.ts +0 -388
- package/lib/tools/sub-venue/harvest.ts +0 -234
- package/lib/tools/sub-venue/head-nouns.ts +0 -245
- package/lib/tools/sub-venue/surfaces.ts +0 -95
- package/lib/tools/sub-venue/table.ts +0 -281
- package/lib/tools/sub-venue/wikidata.ts +0 -85
- package/lib/tools/sub-venue-lexicon.ts +0 -429
- package/out/adapters/ban/adapter.d.ts.map +0 -1
- package/out/adapters/ban/adapter.js +0 -149
- package/out/adapters/ban/adapter.js.map +0 -1
- package/out/adapters/ban/street-decompose.d.ts.map +0 -1
- package/out/adapters/ban/street-decompose.js.map +0 -1
- package/out/adapters/fcc-bdc/adapter.d.ts.map +0 -1
- package/out/adapters/fcc-bdc/adapter.js +0 -144
- package/out/adapters/fcc-bdc/adapter.js.map +0 -1
- package/out/adapters/geonames-postal/adapter.d.ts.map +0 -1
- package/out/adapters/geonames-postal/adapter.js +0 -107
- package/out/adapters/geonames-postal/adapter.js.map +0 -1
- package/out/adapters/gnaf/adapter.d.ts.map +0 -1
- package/out/adapters/gnaf/adapter.js +0 -124
- package/out/adapters/gnaf/adapter.js.map +0 -1
- package/out/adapters/gnaf/assemble.d.ts +0 -65
- package/out/adapters/gnaf/assemble.d.ts.map +0 -1
- package/out/adapters/gnaf/assemble.js +0 -154
- package/out/adapters/gnaf/assemble.js.map +0 -1
- package/out/adapters/state-hi-schools/adapter.d.ts.map +0 -1
- package/out/adapters/state-hi-schools/adapter.js +0 -145
- package/out/adapters/state-hi-schools/adapter.js.map +0 -1
- package/out/adapters/state-hi-schools/workbook.d.ts.map +0 -1
- package/out/adapters/state-hi-schools/workbook.js.map +0 -1
- package/out/adapters/state-ia-contractors/adapter.d.ts.map +0 -1
- package/out/adapters/state-ia-contractors/adapter.js +0 -111
- package/out/adapters/state-ia-contractors/adapter.js.map +0 -1
- package/out/adapters/state-ny-notaries/adapter.d.ts.map +0 -1
- package/out/adapters/state-ny-notaries/adapter.js +0 -119
- package/out/adapters/state-ny-notaries/adapter.js.map +0 -1
- package/out/adapters/state-tx-notaries/adapter.d.ts.map +0 -1
- package/out/adapters/state-tx-notaries/adapter.js +0 -125
- package/out/adapters/state-tx-notaries/adapter.js.map +0 -1
- package/out/adapters/tiger/adapter.d.ts +0 -55
- package/out/adapters/tiger/adapter.d.ts.map +0 -1
- package/out/adapters/tiger/adapter.js +0 -201
- package/out/adapters/tiger/adapter.js.map +0 -1
- package/out/adapters/tiger/street-decompose.d.ts.map +0 -1
- package/out/adapters/tiger/street-decompose.js.map +0 -1
- package/out/adapters/usgov-hrsa-fqhc/adapter.d.ts.map +0 -1
- package/out/adapters/usgov-hrsa-fqhc/adapter.js +0 -132
- package/out/adapters/usgov-hrsa-fqhc/adapter.js.map +0 -1
- package/out/adapters/usgov-imls-pls/adapter.d.ts.map +0 -1
- package/out/adapters/usgov-imls-pls/adapter.js +0 -114
- package/out/adapters/usgov-imls-pls/adapter.js.map +0 -1
- package/out/adapters/usgov-irs-bmf/adapter.d.ts.map +0 -1
- package/out/adapters/usgov-irs-bmf/adapter.js +0 -120
- package/out/adapters/usgov-irs-bmf/adapter.js.map +0 -1
- package/out/adapters/usgov-nad/adapter.d.ts.map +0 -1
- package/out/adapters/usgov-nad/adapter.js +0 -249
- package/out/adapters/usgov-nad/adapter.js.map +0 -1
- package/out/adapters/usgov-nppes/adapter.d.ts.map +0 -1
- package/out/adapters/usgov-nppes/adapter.js +0 -118
- package/out/adapters/usgov-nppes/adapter.js.map +0 -1
- package/out/adapters/usgov-samhsa-treatment-locator/adapter.d.ts.map +0 -1
- package/out/adapters/usgov-samhsa-treatment-locator/adapter.js +0 -154
- package/out/adapters/usgov-samhsa-treatment-locator/adapter.js.map +0 -1
- package/out/adapters/wof-admin-jp/adapter.d.ts.map +0 -1
- package/out/adapters/wof-admin-jp/adapter.js.map +0 -1
- package/out/adapters/wof-admin-json/adapter.d.ts +0 -79
- package/out/adapters/wof-admin-json/adapter.d.ts.map +0 -1
- package/out/adapters/wof-admin-json/adapter.js +0 -197
- package/out/adapters/wof-admin-json/adapter.js.map +0 -1
- package/out/adapters/wof-json-rows.d.ts +0 -62
- package/out/adapters/wof-json-rows.d.ts.map +0 -1
- package/out/adapters/wof-json-rows.js +0 -83
- package/out/adapters/wof-json-rows.js.map +0 -1
- package/out/adapters/wof-postalcode-json/adapter.d.ts +0 -65
- package/out/adapters/wof-postalcode-json/adapter.d.ts.map +0 -1
- package/out/adapters/wof-postalcode-json/adapter.js +0 -151
- package/out/adapters/wof-postalcode-json/adapter.js.map +0 -1
- package/out/codex/us-fips-state.d.ts +0 -41
- package/out/codex/us-fips-state.d.ts.map +0 -1
- package/out/codex/us-fips-state.js +0 -100
- package/out/codex/us-fips-state.js.map +0 -1
- package/out/name-prone-us-suffixes.d.ts +0 -12
- package/out/name-prone-us-suffixes.d.ts.map +0 -1
- package/out/name-prone-us-suffixes.js +0 -12
- package/out/name-prone-us-suffixes.js.map +0 -1
- package/out/recipes/bare-country.d.ts +0 -25
- package/out/recipes/bare-country.d.ts.map +0 -1
- package/out/recipes/bare-country.js +0 -87
- package/out/recipes/bare-country.js.map +0 -1
- package/out/recipes/cn-organizational-units.d.ts +0 -36
- package/out/recipes/cn-organizational-units.d.ts.map +0 -1
- package/out/recipes/cn-organizational-units.js +0 -159
- package/out/recipes/cn-organizational-units.js.map +0 -1
- package/out/recipes/cz-pcfirst-preposition.d.ts +0 -22
- package/out/recipes/cz-pcfirst-preposition.d.ts.map +0 -1
- package/out/recipes/cz-pcfirst-preposition.js +0 -100
- package/out/recipes/cz-pcfirst-preposition.js.map +0 -1
- package/out/recipes/fr-admin-split.d.ts +0 -38
- package/out/recipes/fr-admin-split.d.ts.map +0 -1
- package/out/recipes/fr-admin-split.js +0 -192
- package/out/recipes/fr-admin-split.js.map +0 -1
- package/out/recipes/fr-bare-street.d.ts +0 -28
- package/out/recipes/fr-bare-street.d.ts.map +0 -1
- package/out/recipes/fr-bare-street.js +0 -143
- package/out/recipes/fr-bare-street.js.map +0 -1
- package/out/recipes/fr-fragment.d.ts +0 -77
- package/out/recipes/fr-fragment.d.ts.map +0 -1
- package/out/recipes/fr-fragment.js +0 -276
- package/out/recipes/fr-fragment.js.map +0 -1
- package/out/recipes/fr-lieudit.d.ts +0 -32
- package/out/recipes/fr-lieudit.d.ts.map +0 -1
- package/out/recipes/fr-lieudit.js +0 -227
- package/out/recipes/fr-lieudit.js.map +0 -1
- package/out/recipes/fr-order.d.ts +0 -38
- package/out/recipes/fr-order.d.ts.map +0 -1
- package/out/recipes/fr-order.js +0 -197
- package/out/recipes/fr-order.js.map +0 -1
- package/out/recipes/german.d.ts +0 -44
- package/out/recipes/german.d.ts.map +0 -1
- package/out/recipes/german.js +0 -288
- package/out/recipes/german.js.map +0 -1
- package/out/recipes/locale.d.ts +0 -136
- package/out/recipes/locale.d.ts.map +0 -1
- package/out/recipes/locale.js +0 -460
- package/out/recipes/locale.js.map +0 -1
- package/out/recipes/nl-postcode.d.ts +0 -26
- package/out/recipes/nl-postcode.d.ts.map +0 -1
- package/out/recipes/nl-postcode.js +0 -102
- package/out/recipes/nl-postcode.js.map +0 -1
- package/out/recipes/no-fragment.d.ts +0 -43
- package/out/recipes/no-fragment.d.ts.map +0 -1
- package/out/recipes/no-fragment.js +0 -182
- package/out/recipes/no-fragment.js.map +0 -1
- package/out/recipes/no-street-led.d.ts +0 -24
- package/out/recipes/no-street-led.d.ts.map +0 -1
- package/out/recipes/no-street-led.js +0 -113
- package/out/recipes/no-street-led.js.map +0 -1
- package/out/recipes/no-street.d.ts +0 -18
- package/out/recipes/no-street.d.ts.map +0 -1
- package/out/recipes/no-street.js +0 -71
- package/out/recipes/no-street.js.map +0 -1
- package/out/recipes/po-box-cedex.d.ts +0 -38
- package/out/recipes/po-box-cedex.d.ts.map +0 -1
- package/out/recipes/po-box-cedex.js +0 -767
- package/out/recipes/po-box-cedex.js.map +0 -1
- package/out/recipes/po-box.d.ts +0 -17
- package/out/recipes/po-box.d.ts.map +0 -1
- package/out/recipes/po-box.js +0 -100
- package/out/recipes/po-box.js.map +0 -1
- package/out/recipes/reviewed-postcode-tail.d.ts.map +0 -1
- package/out/recipes/reviewed-postcode-tail.js.map +0 -1
- package/out/recipes/si-bare-village.d.ts +0 -32
- package/out/recipes/si-bare-village.d.ts.map +0 -1
- package/out/recipes/si-bare-village.js +0 -88
- package/out/recipes/si-bare-village.js.map +0 -1
- package/out/recipes/street-affix.d.ts +0 -89
- package/out/recipes/street-affix.d.ts.map +0 -1
- package/out/recipes/street-affix.js +0 -563
- package/out/recipes/street-affix.js.map +0 -1
- package/out/recipes/street-bare.d.ts +0 -25
- package/out/recipes/street-bare.d.ts.map +0 -1
- package/out/recipes/street-bare.js +0 -86
- package/out/recipes/street-bare.js.map +0 -1
- package/out/recipes/sub-venue-sources.d.ts +0 -229
- package/out/recipes/sub-venue-sources.d.ts.map +0 -1
- package/out/recipes/sub-venue-sources.js +0 -653
- package/out/recipes/sub-venue-sources.js.map +0 -1
- package/out/recipes/sub-venue.d.ts +0 -269
- package/out/recipes/sub-venue.d.ts.map +0 -1
- package/out/recipes/sub-venue.js +0 -725
- package/out/recipes/sub-venue.js.map +0 -1
- package/out/synthesizers/german.d.ts +0 -115
- package/out/synthesizers/german.d.ts.map +0 -1
- package/out/synthesizers/german.js +0 -149
- package/out/synthesizers/german.js.map +0 -1
- package/out/tools/fetch/ban.d.ts +0 -31
- package/out/tools/fetch/ban.d.ts.map +0 -1
- package/out/tools/fetch/ban.js +0 -239
- package/out/tools/fetch/ban.js.map +0 -1
- package/out/tools/fetch/download.d.ts +0 -117
- package/out/tools/fetch/download.d.ts.map +0 -1
- package/out/tools/fetch/download.js +0 -160
- package/out/tools/fetch/download.js.map +0 -1
- package/out/tools/fetch/geonames-dump.d.ts +0 -91
- package/out/tools/fetch/geonames-dump.d.ts.map +0 -1
- package/out/tools/fetch/geonames-dump.js +0 -171
- package/out/tools/fetch/geonames-dump.js.map +0 -1
- package/out/tools/fetch/geonames-postal.d.ts +0 -76
- package/out/tools/fetch/geonames-postal.d.ts.map +0 -1
- package/out/tools/fetch/geonames-postal.js +0 -126
- package/out/tools/fetch/geonames-postal.js.map +0 -1
- package/out/tools/fetch/hrsa.d.ts +0 -18
- package/out/tools/fetch/hrsa.d.ts.map +0 -1
- package/out/tools/fetch/hrsa.js +0 -46
- package/out/tools/fetch/hrsa.js.map +0 -1
- package/out/tools/fetch/imls-pls.d.ts +0 -25
- package/out/tools/fetch/imls-pls.d.ts.map +0 -1
- package/out/tools/fetch/imls-pls.js +0 -108
- package/out/tools/fetch/imls-pls.js.map +0 -1
- package/out/tools/fetch/nad.d.ts +0 -70
- package/out/tools/fetch/nad.d.ts.map +0 -1
- package/out/tools/fetch/nad.js +0 -234
- package/out/tools/fetch/nad.js.map +0 -1
- package/out/tools/fetch/nppes.d.ts +0 -26
- package/out/tools/fetch/nppes.d.ts.map +0 -1
- package/out/tools/fetch/nppes.js +0 -126
- package/out/tools/fetch/nppes.js.map +0 -1
- package/out/tools/fetch/state-hi-schools.d.ts +0 -26
- package/out/tools/fetch/state-hi-schools.d.ts.map +0 -1
- package/out/tools/fetch/state-hi-schools.js +0 -112
- package/out/tools/fetch/state-hi-schools.js.map +0 -1
- package/out/tools/fetch/state-sources.d.ts +0 -26
- package/out/tools/fetch/state-sources.d.ts.map +0 -1
- package/out/tools/fetch/state-sources.js +0 -111
- package/out/tools/fetch/state-sources.js.map +0 -1
- package/out/tools/fetch/tiger-full.d.ts +0 -22
- package/out/tools/fetch/tiger-full.d.ts.map +0 -1
- package/out/tools/fetch/tiger-full.js +0 -217
- package/out/tools/fetch/tiger-full.js.map +0 -1
- package/out/tools/golden-expand.d.ts +0 -90
- package/out/tools/golden-expand.d.ts.map +0 -1
- package/out/tools/golden-expand.js +0 -406
- package/out/tools/golden-expand.js.map +0 -1
- package/out/tools/golden-promote.d.ts +0 -72
- package/out/tools/golden-promote.d.ts.map +0 -1
- package/out/tools/golden-promote.js +0 -240
- package/out/tools/golden-promote.js.map +0 -1
- package/out/tools/golden-relabel-street.d.ts +0 -196
- package/out/tools/golden-relabel-street.d.ts.map +0 -1
- package/out/tools/golden-relabel-street.js +0 -440
- package/out/tools/golden-relabel-street.js.map +0 -1
- package/out/tools/lint-slice-vocab.d.ts +0 -90
- package/out/tools/lint-slice-vocab.d.ts.map +0 -1
- package/out/tools/lint-slice-vocab.js +0 -267
- package/out/tools/lint-slice-vocab.js.map +0 -1
- package/out/tools/lint-slice.d.ts +0 -93
- package/out/tools/lint-slice.d.ts.map +0 -1
- package/out/tools/lint-slice.js +0 -322
- package/out/tools/lint-slice.js.map +0 -1
- package/out/tools/slice-kryptonite.d.ts +0 -32
- package/out/tools/slice-kryptonite.d.ts.map +0 -1
- package/out/tools/slice-kryptonite.js +0 -99
- package/out/tools/slice-kryptonite.js.map +0 -1
- package/out/tools/slice-translit.d.ts +0 -51
- package/out/tools/slice-translit.d.ts.map +0 -1
- package/out/tools/slice-translit.js +0 -166
- package/out/tools/slice-translit.js.map +0 -1
- package/out/tools/sub-venue/harvest.d.ts +0 -100
- package/out/tools/sub-venue/harvest.d.ts.map +0 -1
- package/out/tools/sub-venue/harvest.js +0 -168
- package/out/tools/sub-venue/harvest.js.map +0 -1
- package/out/tools/sub-venue/head-nouns.d.ts +0 -50
- package/out/tools/sub-venue/head-nouns.d.ts.map +0 -1
- package/out/tools/sub-venue/head-nouns.js.map +0 -1
- package/out/tools/sub-venue/surfaces.d.ts +0 -45
- package/out/tools/sub-venue/surfaces.d.ts.map +0 -1
- package/out/tools/sub-venue/surfaces.js.map +0 -1
- package/out/tools/sub-venue/table.d.ts +0 -229
- package/out/tools/sub-venue/table.d.ts.map +0 -1
- package/out/tools/sub-venue/table.js.map +0 -1
- package/out/tools/sub-venue/wikidata.d.ts +0 -26
- package/out/tools/sub-venue/wikidata.d.ts.map +0 -1
- package/out/tools/sub-venue/wikidata.js +0 -62
- package/out/tools/sub-venue/wikidata.js.map +0 -1
- package/out/tools/sub-venue-lexicon.d.ts +0 -156
- package/out/tools/sub-venue-lexicon.d.ts.map +0 -1
- package/out/tools/sub-venue-lexicon.js +0 -283
- package/out/tools/sub-venue-lexicon.js.map +0 -1
- package/out/tools/sub-venue-promotions.d.ts +0 -94
- package/out/tools/sub-venue-promotions.d.ts.map +0 -1
- package/out/tools/sub-venue-promotions.js +0 -266
- package/out/tools/sub-venue-promotions.js.map +0 -1
- /package/lib/{recipes/cn-organizational-units.ts → cn/recipes/organizational-units.ts} +0 -0
- /package/lib/{adapters → fr/adapters}/ban/street-decompose.ts +0 -0
- /package/lib/{adapters/wof-admin-jp → jp/adapters/wof-admin}/adapter.ts +0 -0
- /package/lib/tools/{golden-expand.ts → golden/expand.ts} +0 -0
- /package/lib/tools/{lint-slice.ts → lint/slice/index.ts} +0 -0
- /package/lib/tools/{slice-kryptonite.ts → slice/kryptonite.ts} +0 -0
- /package/lib/tools/{slice-translit.ts → slice/translit.ts} +0 -0
- /package/lib/tools/{sub-venue-promotions.ts → sub/venue/promotions.ts} +0 -0
- /package/lib/{adapters/state-hi-schools → us/adapters/state/hi-schools}/workbook.ts +0 -0
- /package/lib/{adapters → us/adapters}/tiger/street-decompose.ts +0 -0
- /package/lib/{codex/us-fips-state.ts → us/fips-state.ts} +0 -0
- /package/lib/{recipes → ve/recipes}/reviewed-postcode-tail.ts +0 -0
- /package/out/adapters/{geonames-postal → geonames/postal}/adapter.d.ts +0 -0
- /package/out/{adapters → au/adapters}/gnaf/adapter.d.ts +0 -0
- /package/out/{adapters → fr/adapters}/ban/adapter.d.ts +0 -0
- /package/out/{adapters → fr/adapters}/ban/street-decompose.d.ts +0 -0
- /package/out/{adapters → fr/adapters}/ban/street-decompose.js +0 -0
- /package/out/{adapters/wof-admin-jp → jp/adapters/wof-admin}/adapter.d.ts +0 -0
- /package/out/{adapters/wof-admin-jp → jp/adapters/wof-admin}/adapter.js +0 -0
- /package/out/tools/{sub-venue → sub/venue}/head-nouns.js +0 -0
- /package/out/tools/{sub-venue → sub/venue}/surfaces.js +0 -0
- /package/out/tools/{sub-venue → sub/venue}/table.js +0 -0
- /package/out/{adapters → us/adapters}/fcc-bdc/adapter.d.ts +0 -0
- /package/out/{adapters/state-hi-schools → us/adapters/state/hi-schools}/adapter.d.ts +0 -0
- /package/out/{adapters/state-hi-schools → us/adapters/state/hi-schools}/workbook.d.ts +0 -0
- /package/out/{adapters/state-hi-schools → us/adapters/state/hi-schools}/workbook.js +0 -0
- /package/out/{adapters/state-ia-contractors → us/adapters/state/ia-contractors}/adapter.d.ts +0 -0
- /package/out/{adapters/state-ny-notaries → us/adapters/state/ny-notaries}/adapter.d.ts +0 -0
- /package/out/{adapters/state-tx-notaries → us/adapters/state/tx-notaries}/adapter.d.ts +0 -0
- /package/out/{adapters → us/adapters}/tiger/street-decompose.d.ts +0 -0
- /package/out/{adapters → us/adapters}/tiger/street-decompose.js +0 -0
- /package/out/{adapters/usgov-hrsa-fqhc → us/adapters/usgov/hrsa-fqhc}/adapter.d.ts +0 -0
- /package/out/{adapters/usgov-imls-pls → us/adapters/usgov/imls-pls}/adapter.d.ts +0 -0
- /package/out/{adapters/usgov-irs-bmf → us/adapters/usgov/irs-bmf}/adapter.d.ts +0 -0
- /package/out/{adapters/usgov-nad → us/adapters/usgov/nad}/adapter.d.ts +0 -0
- /package/out/{adapters/usgov-nppes → us/adapters/usgov/nppes}/adapter.d.ts +0 -0
- /package/out/{adapters/usgov-samhsa-treatment-locator → us/adapters/usgov/samhsa-treatment-locator}/adapter.d.ts +0 -0
- /package/out/{recipes → ve/recipes}/reviewed-postcode-tail.d.ts +0 -0
- /package/out/{recipes → ve/recipes}/reviewed-postcode-tail.js +0 -0
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @copyright Sister Software
|
|
3
|
+
* @license AGPL-3.0
|
|
4
|
+
* @author Teffen Ellis, et al.
|
|
5
|
+
*
|
|
6
|
+
* `no-street-led` — the Norwegian street-led slice, third orthography of the #901
|
|
7
|
+
* leading-name-boundary family. The post-#920 NO row-read measured the residual as
|
|
8
|
+
* ORDER-SENSITIVE decode: street-led forms ("Tangavegen 40, 5620 Tørvikbygd") carry a 30%
|
|
9
|
+
* residual vs pc-first's 7% — the diacritic street head (…vegen/…veien with ø/å/æ) is the same
|
|
10
|
+
* leading-name-before-comma boundary the FR bare-street and SI village forms exercise, in a
|
|
11
|
+
* third orthography. All three real orders cycle per tuple (balanced polarity — the v1.9.9
|
|
12
|
+
* lesson: a one-order gradient loses at convergence):
|
|
13
|
+
*
|
|
14
|
+
* 1. canonical "«st» «n», «pc» «city»" (the 30% residual class — the lesson)
|
|
15
|
+
* 2. city-first "«city», «pc», «st» «n»"
|
|
16
|
+
* 3. pc-first "«pc» «city», «st» «n»" (the 7% floor — the anchor the others converge to)
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
import { mulberry32 as makeMulberry32 } from "@mailwoman/core/utils"
|
|
20
|
+
import { TextSpliterator } from "spliterator"
|
|
21
|
+
|
|
22
|
+
import { alignAndWrite, foldNOSurface, readTuples, type CorpusRecipe, sliceSourceID } from "#recipes/scaffold"
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Slice recipe registered with the corpus builder — see the file header for the parse behaviour it exists to exercise,
|
|
26
|
+
* and `description` below for the surface form it generates.
|
|
27
|
+
*/
|
|
28
|
+
export const noStreetLedRecipe: CorpusRecipe = {
|
|
29
|
+
name: "no-street-led",
|
|
30
|
+
description: "NO street-led boundary form (#901 family): '«st» «n», «pc» «city»' — diacritic street heads",
|
|
31
|
+
mode: "tuples",
|
|
32
|
+
options: [
|
|
33
|
+
{
|
|
34
|
+
flag: "--exclude-surfaces <path>",
|
|
35
|
+
description:
|
|
36
|
+
"REQUIRED. The NO digit board's reserved surface list " +
|
|
37
|
+
"(mailwoman/eval-harness/fixtures/no-digits.surfaces.txt); every listed street is skipped.",
|
|
38
|
+
},
|
|
39
|
+
],
|
|
40
|
+
async run(opts, write) {
|
|
41
|
+
makeMulberry32(opts.seed)
|
|
42
|
+
|
|
43
|
+
// THE SPLIT (ported from fr-fragment, #727 T2). Without it this slice trains on all 10,697
|
|
44
|
+
// NO surfaces, 1,952 of which the digit board reserves — so a Norway retrain would grade
|
|
45
|
+
// memorization of `Hallingrudveien` while claiming to measure the boundary form. There is no
|
|
46
|
+
// safe default: source-disjoint by street SURFACE is the discipline, so the flag throws.
|
|
47
|
+
const excludePath = opts.excludeSurfaces
|
|
48
|
+
|
|
49
|
+
if (!excludePath) {
|
|
50
|
+
throw new Error(
|
|
51
|
+
"no-street-led: --exclude-surfaces is REQUIRED. Pass the NO digit board's reserved list " +
|
|
52
|
+
"(mailwoman/eval-harness/fixtures/no-digits.surfaces.txt) or this slice trains on its own eval set. " +
|
|
53
|
+
"Source-disjoint by street SURFACE is the split discipline; there is no safe default."
|
|
54
|
+
)
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const excluded = new Set<string>()
|
|
58
|
+
|
|
59
|
+
for await (const line of TextSpliterator.fromAsync(excludePath)) {
|
|
60
|
+
const trimmed = line.trim()
|
|
61
|
+
|
|
62
|
+
if (trimmed && !trimmed.startsWith("#")) {
|
|
63
|
+
excluded.add(trimmed)
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
if (!excluded.size) throw new Error(`no-street-led: --exclude-surfaces "${excludePath}" listed no surfaces`)
|
|
68
|
+
|
|
69
|
+
let read = 0
|
|
70
|
+
let emitted = 0
|
|
71
|
+
let skipped = 0
|
|
72
|
+
let contaminated = 0
|
|
73
|
+
|
|
74
|
+
for await (const t of readTuples(opts.input!)) {
|
|
75
|
+
read++
|
|
76
|
+
const street = String(t.street ?? "").trim()
|
|
77
|
+
const city = String(t.locality ?? "").trim()
|
|
78
|
+
const number = String(t.number ?? "").trim()
|
|
79
|
+
const postcode = String(t.postcode ?? "").trim()
|
|
80
|
+
|
|
81
|
+
if (!street || !city || !number || !postcode) {
|
|
82
|
+
skipped++
|
|
83
|
+
|
|
84
|
+
continue
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// A surface on the digit board never enters training.
|
|
88
|
+
if (excluded.has(foldNOSurface(street))) {
|
|
89
|
+
contaminated++
|
|
90
|
+
|
|
91
|
+
continue
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
const order = read % 3
|
|
95
|
+
let raw: string
|
|
96
|
+
|
|
97
|
+
const components: Record<string, string> = {
|
|
98
|
+
street,
|
|
99
|
+
house_number: number,
|
|
100
|
+
postcode,
|
|
101
|
+
locality: city,
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
if (order === 0) {
|
|
105
|
+
raw = `${street} ${number}, ${postcode} ${city}`
|
|
106
|
+
} else if (order === 1) {
|
|
107
|
+
raw = `${city}, ${postcode}, ${street} ${number}`
|
|
108
|
+
} else {
|
|
109
|
+
raw = `${postcode} ${city}, ${street} ${number}`
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
const source_id = sliceSourceID("synth-no-street-led", { ...components, o: String(order), v: String(read) })
|
|
113
|
+
|
|
114
|
+
const canonical = {
|
|
115
|
+
raw,
|
|
116
|
+
components,
|
|
117
|
+
country: "NO",
|
|
118
|
+
locale: "nb-NO",
|
|
119
|
+
source: "synth-no-street-led",
|
|
120
|
+
source_id,
|
|
121
|
+
corpus_version: "0.10.0",
|
|
122
|
+
license:
|
|
123
|
+
"Synthetic — no-street-led; (street, number, postcode, city) from OpenAddresses NO (per-source attribution in the model card)",
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
if (alignAndWrite(write, canonical, "no-street-led")) {
|
|
127
|
+
emitted++
|
|
128
|
+
} else {
|
|
129
|
+
skipped++
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
return { read, emitted, skipped, contaminated }
|
|
134
|
+
},
|
|
135
|
+
}
|
|
@@ -14,12 +14,12 @@
|
|
|
14
14
|
|
|
15
15
|
import { dataRootPath } from "@mailwoman/core/data-root"
|
|
16
16
|
import { readLocalJSONFile } from "@mailwoman/core/fs/readers"
|
|
17
|
+
import { makeLcg } from "@mailwoman/core/utils"
|
|
17
18
|
import type { PathBuilderLike } from "path-ts"
|
|
18
19
|
|
|
19
|
-
import {
|
|
20
|
+
import { sliceSourceID, type CorpusRecipe } from "#recipes/scaffold"
|
|
20
21
|
import { synthesizeAnchorAbsorptionRow } from "#synthesizers/anchor-absorption"
|
|
21
22
|
import { alignRow } from "#utils"
|
|
22
|
-
|
|
23
23
|
/**
|
|
24
24
|
* The leading-5-digit source: the real US ZIPs in the postcode anchor's pilot lookup. Resolved through the data-root
|
|
25
25
|
* helper (the lab default is `$MAILWOMAN_DATA_ROOT`), never re-hardcoded.
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @copyright Sister Software
|
|
3
|
+
* @license AGPL-3.0
|
|
4
|
+
* @author Teffen Ellis, et al.
|
|
5
|
+
*
|
|
6
|
+
* `bare-country` — the country name as the WHOLE query. Addresses almost never consist of one bare
|
|
7
|
+
* country name, so the class is out of the model's training distribution and the tag is a coin
|
|
8
|
+
* flip: measured on the 2026-08-13 panel, France/Germany/United States/New Zealand parsed
|
|
9
|
+
* `country` while Japan/China/Nigeria/Australia/Deutschland parsed `locality`. The retrieval-side
|
|
10
|
+
* bare-country race (#1651) covers the answer either way; this slice closes the PARSE half so the
|
|
11
|
+
* tag itself is right.
|
|
12
|
+
*
|
|
13
|
+
* Source is the codex country table — every ISO canonical English name plus the curated surface
|
|
14
|
+
* forms (endonyms and long-form names). The 2–3 letter CODES are deliberately excluded: a bare
|
|
15
|
+
* `JP` or `GER` is an abbreviation register with its own ambiguity surface (`IN`, `DE`, `TO` are
|
|
16
|
+
* English words), and teaching it here would be an unmeasured claim. Case augmentation is the
|
|
17
|
+
* loader's job, as everywhere.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import { COUNTRY_SURFACE_FORMS, CountryNames, matchCountry } from "@mailwoman/codex/country"
|
|
21
|
+
import { mulberry32 as makeMulberry32 } from "@mailwoman/core/utils"
|
|
22
|
+
|
|
23
|
+
import { alignAndWrite, type CorpusRecipe, sliceSourceID } from "#recipes/scaffold"
|
|
24
|
+
/**
|
|
25
|
+
* Surfaces shorter than this are the code register (`JP`, `GER`), not a name — excluded (see the module doc).
|
|
26
|
+
*/
|
|
27
|
+
const MIN_NAME_LENGTH = 4
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Every (surface, iso2) pair the slice emits: the ISO canonical names plus each country's curated surface forms,
|
|
31
|
+
* deduplicated on the surface string (a form shared across countries — none known — would keep its first bearer).
|
|
32
|
+
*/
|
|
33
|
+
function* bareCountrySurfaces(): Generator<{ surface: string; iso2: string }> {
|
|
34
|
+
const seen = new Set<string>()
|
|
35
|
+
|
|
36
|
+
for (const [iso2, forms] of Object.entries(COUNTRY_SURFACE_FORMS)) {
|
|
37
|
+
for (const surface of forms) {
|
|
38
|
+
if (surface.length < MIN_NAME_LENGTH || seen.has(surface)) continue
|
|
39
|
+
seen.add(surface)
|
|
40
|
+
yield { surface, iso2 }
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
for (const name of CountryNames) {
|
|
45
|
+
if (name.length < MIN_NAME_LENGTH || seen.has(name)) continue
|
|
46
|
+
const matched = matchCountry(name)
|
|
47
|
+
|
|
48
|
+
if (!matched) continue
|
|
49
|
+
seen.add(name)
|
|
50
|
+
yield { surface: name, iso2: matched.iso2 }
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Slice recipe registered with the corpus builder — see the file header for the parse behaviour it exists to exercise,
|
|
56
|
+
* and `description` below for the surface form it generates.
|
|
57
|
+
*/
|
|
58
|
+
export const bareCountryRecipe: CorpusRecipe = {
|
|
59
|
+
name: "bare-country",
|
|
60
|
+
description: "The country name as the whole query (#1651 parse half): ISO names + curated endonyms, no codes",
|
|
61
|
+
mode: "generate",
|
|
62
|
+
async run(opts, write) {
|
|
63
|
+
// Seeded for parity with the other recipes; the surfaces themselves drive the content.
|
|
64
|
+
makeMulberry32(opts.seed)
|
|
65
|
+
let read = 0
|
|
66
|
+
let emitted = 0
|
|
67
|
+
let skipped = 0
|
|
68
|
+
|
|
69
|
+
for (const { surface, iso2 } of bareCountrySurfaces()) {
|
|
70
|
+
read++
|
|
71
|
+
|
|
72
|
+
const components: Record<string, string> = { country: surface }
|
|
73
|
+
const source_id = sliceSourceID("synth-bare-country", { country: surface, cc: iso2, v: String(read) })
|
|
74
|
+
|
|
75
|
+
const canonical = {
|
|
76
|
+
raw: surface,
|
|
77
|
+
components,
|
|
78
|
+
country: iso2,
|
|
79
|
+
locale: "und",
|
|
80
|
+
source: "synth-bare-country",
|
|
81
|
+
source_id,
|
|
82
|
+
corpus_version: "0.11.0",
|
|
83
|
+
license: "Synthetic — bare-country; surfaces from the codex country table (ISO 3166 + curated forms)",
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
if (alignAndWrite(write, canonical, "bare-country")) {
|
|
87
|
+
emitted++
|
|
88
|
+
} else {
|
|
89
|
+
skipped++
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
return { read, emitted, skipped }
|
|
94
|
+
},
|
|
95
|
+
}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @copyright Sister Software
|
|
3
|
+
* @license AGPL-3.0
|
|
4
|
+
* @author Teffen Ellis, et al.
|
|
5
|
+
*
|
|
6
|
+
* Reserved bare-postcode capability cases. These strings are excluded from every country in the
|
|
7
|
+
* training recipe and are read only by evaluation. Reservation is by normalized input string,
|
|
8
|
+
* because `NNN NN` is shared by CZ, SK, SE and GR; excluding a Czech row alone could still train
|
|
9
|
+
* the model on the identical Swedish input.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
export type BarePostcodeEvalFamily = "nnn_nn" | "nnnn_ll"
|
|
13
|
+
|
|
14
|
+
export interface BarePostcodeEvalCase {
|
|
15
|
+
input: string
|
|
16
|
+
country: "CZ" | "NL" | "SK"
|
|
17
|
+
family: BarePostcodeEvalFamily
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const SPACED_FIVE_CZ = [
|
|
21
|
+
"120 00",
|
|
22
|
+
"130 00",
|
|
23
|
+
"140 00",
|
|
24
|
+
"150 00",
|
|
25
|
+
"160 00",
|
|
26
|
+
"170 00",
|
|
27
|
+
"180 00",
|
|
28
|
+
"190 00",
|
|
29
|
+
"602 00",
|
|
30
|
+
"603 00",
|
|
31
|
+
"612 00",
|
|
32
|
+
"616 00",
|
|
33
|
+
"621 00",
|
|
34
|
+
"628 00",
|
|
35
|
+
"635 00",
|
|
36
|
+
"639 00",
|
|
37
|
+
"702 00",
|
|
38
|
+
"708 00",
|
|
39
|
+
"710 00",
|
|
40
|
+
"721 00",
|
|
41
|
+
"779 00",
|
|
42
|
+
"746 01",
|
|
43
|
+
"747 05",
|
|
44
|
+
"750 02",
|
|
45
|
+
] as const
|
|
46
|
+
|
|
47
|
+
const SPACED_FIVE_SK = ["811 02", "821 01", "831 02", "841 01", "851 01", "949 01", "974 01", "010 01"] as const
|
|
48
|
+
|
|
49
|
+
const DUTCH = [
|
|
50
|
+
"1011 AB",
|
|
51
|
+
"1013 BG",
|
|
52
|
+
"1015 CJ",
|
|
53
|
+
"1017 DK",
|
|
54
|
+
"1018 EL",
|
|
55
|
+
"1052 GM",
|
|
56
|
+
"1053 HN",
|
|
57
|
+
"1054 JP",
|
|
58
|
+
"2011 KR",
|
|
59
|
+
"2012 LS",
|
|
60
|
+
"2511 MT",
|
|
61
|
+
"2513 NV",
|
|
62
|
+
"3011 PW",
|
|
63
|
+
"3012 RX",
|
|
64
|
+
"3511 SA",
|
|
65
|
+
"3512 TB",
|
|
66
|
+
"4811 VC",
|
|
67
|
+
"5611 WD",
|
|
68
|
+
"6211 XE",
|
|
69
|
+
"6511 ZF",
|
|
70
|
+
"7511 AG",
|
|
71
|
+
"8011 BH",
|
|
72
|
+
"9711 CJ",
|
|
73
|
+
"9712 DK",
|
|
74
|
+
] as const
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* The 56 postcode strings measured across v5.0.0 through v5.5.0 and reserved from later training.
|
|
78
|
+
*/
|
|
79
|
+
export const BARE_POSTCODE_EVAL_CASES: readonly BarePostcodeEvalCase[] = [
|
|
80
|
+
...SPACED_FIVE_CZ.map((input) => ({ input, country: "CZ" as const, family: "nnn_nn" as const })),
|
|
81
|
+
...SPACED_FIVE_SK.map((input) => ({ input, country: "SK" as const, family: "nnn_nn" as const })),
|
|
82
|
+
...DUTCH.map((input) => ({ input, country: "NL" as const, family: "nnnn_ll" as const })),
|
|
83
|
+
]
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Normalize the model-visible postcode value for reservation checks.
|
|
87
|
+
*/
|
|
88
|
+
export function normalizeBarePostcodeSurface(surface: string): string {
|
|
89
|
+
return surface.trim().toUpperCase().replaceAll(/\s+/gu, "")
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
const RESERVED_SURFACES = new Set(BARE_POSTCODE_EVAL_CASES.map(({ input }) => normalizeBarePostcodeSurface(input)))
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Whether a postcode string is reserved exclusively for the capability evaluation.
|
|
96
|
+
*/
|
|
97
|
+
export function isReservedBarePostcode(surface: string): boolean {
|
|
98
|
+
return RESERVED_SURFACES.has(normalizeBarePostcodeSurface(surface))
|
|
99
|
+
}
|
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @copyright Sister Software
|
|
3
|
+
* @license AGPL-3.0
|
|
4
|
+
* @author Teffen Ellis, et al.
|
|
5
|
+
*
|
|
6
|
+
* `bare-postcode` — a postcode standing ALONE, in the form its country writes.
|
|
7
|
+
*
|
|
8
|
+
* The shape is absent from the corpus. A census of the 685,187,151 rows the v0.29.0 mixture reads
|
|
9
|
+
* found ZERO two-token rows of `NNN NN` and one of `NNNN LL`, so `100 00` and `1012 LG` are out of
|
|
10
|
+
* distribution and every model's answer for them is generalization off longer lines. That
|
|
11
|
+
* generalization is what moved: held-out CZ/SK codes read 31/32 as a postcode under v5.0.0, v5.2.0
|
|
12
|
+
* AND v5.3.0 — a seed pair agreeing, so not training noise — and 0/32 under v5.4.0, whose added
|
|
13
|
+
* OpenStreetMap PK/BD/VN rows raise the leading-digit-is-a-house-number evidence at that opening
|
|
14
|
+
* from 393 to 444 samples per epoch.
|
|
15
|
+
*
|
|
16
|
+
* Neither existing repair reaches it. `nl-postcode` and `cz-pcfirst-preposition` teach the same
|
|
17
|
+
* postcodes IN CONTEXT — every row they emit carries a street, a number and a city — and the
|
|
18
|
+
* 12,759 in-context `NNN NN` rows do not transfer to the bare input. The deterministic half,
|
|
19
|
+
* `buildEmissionPriors`, caps near 0.95 at the default `biasScale` against a measured 1.67-to-3.78
|
|
20
|
+
* nat deficit.
|
|
21
|
+
*
|
|
22
|
+
* So this recipe emits the postcode and NOTHING else, which is the one thing no sibling does.
|
|
23
|
+
*
|
|
24
|
+
* VERIFIED AGAINST THE PRIOR, NOT MERELY MATCHED TO IT. Every surface is run through
|
|
25
|
+
* `detectKnownFormats` and refused unless the detector calls it a postcode. The recipe's rendering
|
|
26
|
+
* table and `known-formats.ts`'s patterns have to agree, and matched constants would not prove
|
|
27
|
+
* they do — the trained surface and the prior that boosts it come from one check.
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
import { dataRootPath } from "@mailwoman/core/data-root"
|
|
31
|
+
import { pathExists } from "@mailwoman/core/fs/readers"
|
|
32
|
+
import { SeededRandom } from "@mailwoman/core/utils"
|
|
33
|
+
import { computeQueryShape } from "@mailwoman/query-shape"
|
|
34
|
+
import { isPostcodeFormat } from "@mailwoman/query-shape/known-formats"
|
|
35
|
+
import { join, type PathBuilderLike } from "path-ts"
|
|
36
|
+
|
|
37
|
+
import { isReservedBarePostcode } from "#recipes/bare/postcode/eval"
|
|
38
|
+
import { alignAndWrite, type CorpusRecipe, readCSVRecords, sliceSourceID } from "#recipes/scaffold"
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* One country's postcodes: the CSV under the extracted OpenAddresses tree, and the country it covers.
|
|
42
|
+
*
|
|
43
|
+
* `openaddresses/extracted/` rather than a cached zip, because the extracted tree is what survives on this lab and its
|
|
44
|
+
* paths mirror the archive's member paths exactly (`cz/countrywide.csv`). Sweden publishes per municipality, so SE is
|
|
45
|
+
* sixteen files; CZ, SK and NL are one countrywide file each.
|
|
46
|
+
*/
|
|
47
|
+
interface PostcodeSource {
|
|
48
|
+
csv: PathBuilderLike
|
|
49
|
+
country: string
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const EXTRACTED = dataRootPath("openaddresses", "extracted")
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Read from the archive rather than guessed: `readZippedCSVRecords` throws on a member that is not there, and
|
|
56
|
+
* OpenAddresses keeps the Swedish spelling on two of these (`savsjö`, `Österåker`) while folding the rest to ASCII.
|
|
57
|
+
*/
|
|
58
|
+
const SWEDISH_MUNICIPALITIES = [
|
|
59
|
+
"alingsas",
|
|
60
|
+
"gislaved",
|
|
61
|
+
"goteborg",
|
|
62
|
+
"helsingborg",
|
|
63
|
+
"hoganas",
|
|
64
|
+
"kalmar",
|
|
65
|
+
"kristinehamn",
|
|
66
|
+
"malmo",
|
|
67
|
+
"nacka",
|
|
68
|
+
"savsjö",
|
|
69
|
+
"stockholm",
|
|
70
|
+
"uppsala",
|
|
71
|
+
"vasteras",
|
|
72
|
+
"vaxholm",
|
|
73
|
+
"vaxjo",
|
|
74
|
+
"Österåker",
|
|
75
|
+
]
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* GREECE IS ABSENT ON PURPOSE. `gr/b/municipality_of_kalamaria.csv` is the archive's only Greek member and it declares
|
|
79
|
+
* a `postcode` column carrying nothing: 0 values in 10,877 rows. `gr_postcode` shares `NNN NN` with the three below, so
|
|
80
|
+
* a Greek reader is served by what they teach until a Greek source with postcodes exists — but no row here claims to be
|
|
81
|
+
* Greek.
|
|
82
|
+
*/
|
|
83
|
+
const SOURCES: PostcodeSource[] = [
|
|
84
|
+
{ csv: join(EXTRACTED, "cz", "countrywide.csv"), country: "CZ" },
|
|
85
|
+
{ csv: join(EXTRACTED, "sk", "countrywide.csv"), country: "SK" },
|
|
86
|
+
{ csv: join(EXTRACTED, "nl", "countrywide.csv"), country: "NL" },
|
|
87
|
+
...SWEDISH_MUNICIPALITIES.map((name) => ({
|
|
88
|
+
csv: join(EXTRACTED, "se", `municipality_of_${name}.csv`),
|
|
89
|
+
country: "SE",
|
|
90
|
+
})),
|
|
91
|
+
]
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* How a country writes its postcode when a person types it alone, and the locale to stamp.
|
|
95
|
+
*
|
|
96
|
+
* `render` receives the source's own spelling with whitespace stripped, and answers every surface that country writes —
|
|
97
|
+
* the spaced form first where one exists, because that is the failing one. A country whose written form is the source's
|
|
98
|
+
* form answers a single entry.
|
|
99
|
+
*
|
|
100
|
+
* Only countries whose bare postcode COLLIDES with a house number are here: an all-digit or digits-then-letters opening
|
|
101
|
+
* is what the model reads as `house_number`. `SW1A 1AA` opens with letters and was never in doubt, so GB is
|
|
102
|
+
* deliberately absent.
|
|
103
|
+
*/
|
|
104
|
+
const WRITTEN_FORMS: ReadonlyMap<string, { locale: string; render: (compact: string) => string[] }> = new Map([
|
|
105
|
+
// `NNN NN`, written with the space. The four countries share the shape, which is why
|
|
106
|
+
// `detectKnownFormats` answers all four for one string and why the label is the same for each.
|
|
107
|
+
["CZ", { locale: "cs-CZ", render: spacedThree }],
|
|
108
|
+
["SK", { locale: "sk-SK", render: spacedThree }],
|
|
109
|
+
["SE", { locale: "sv-SE", render: spacedThree }],
|
|
110
|
+
["GR", { locale: "el-GR", render: spacedThree }],
|
|
111
|
+
// `NNNN LL`. Both spellings are attested and the spaced one is what fails.
|
|
112
|
+
[
|
|
113
|
+
"NL",
|
|
114
|
+
{
|
|
115
|
+
locale: "nl-NL",
|
|
116
|
+
render: (compact) =>
|
|
117
|
+
/^\d{4}[A-Z]{2}$/.test(compact) ? [`${compact.slice(0, 4)} ${compact.slice(4)}`, compact] : [],
|
|
118
|
+
},
|
|
119
|
+
],
|
|
120
|
+
])
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* `10000` → `["100 00", "10000"]`. Sweden and Greece write five digits with the space after the third, exactly as
|
|
124
|
+
* Czechia and Slovakia do; the compact form rides along because sources store it that way and a reader types it both
|
|
125
|
+
* ways.
|
|
126
|
+
*/
|
|
127
|
+
function spacedThree(compact: string): string[] {
|
|
128
|
+
if (!/^\d{5}$/.test(compact)) return []
|
|
129
|
+
|
|
130
|
+
return [`${compact.slice(0, 3)} ${compact.slice(3)}`, compact]
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Choose distinct postcodes without inheriting the publisher's row order.
|
|
135
|
+
*
|
|
136
|
+
* Sorting first makes the result independent of input-file order; the seeded sample then gives a reproducible spread
|
|
137
|
+
* across the complete set instead of taking the first municipality or numeric prefix that happens to fill the cap.
|
|
138
|
+
*/
|
|
139
|
+
export function selectPostcodes(codes: Iterable<string>, limit: number, seed: number): string[] {
|
|
140
|
+
const pool = [...new Set(codes)].toSorted()
|
|
141
|
+
|
|
142
|
+
if (limit >= pool.length) return pool
|
|
143
|
+
|
|
144
|
+
return new SeededRandom(seed).sample(pool, Math.max(0, limit))
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Return every required input path that is absent, preserving declaration order for diagnostics.
|
|
149
|
+
*/
|
|
150
|
+
export async function findMissingPostcodeSources(
|
|
151
|
+
paths: readonly string[],
|
|
152
|
+
exists: (path: string) => Promise<boolean> = pathExists
|
|
153
|
+
): Promise<string[]> {
|
|
154
|
+
const results = await Promise.all(paths.map(async (path) => ({ path, exists: await exists(path) })))
|
|
155
|
+
|
|
156
|
+
return results.filter((result) => !result.exists).map(({ path }) => path)
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* Every surface a country writes for one postcode, spaced form first, or `[]` when this recipe carries no form for that
|
|
161
|
+
* country or the code does not fit the one it carries.
|
|
162
|
+
*
|
|
163
|
+
* Exported because it is the half of the recipe a test can reach: `run` reads a 500 MB archive from the data root, and
|
|
164
|
+
* the contract worth pinning — that every surface this renders is one {@linkcode detectedAsPostcode} accepts — needs
|
|
165
|
+
* neither.
|
|
166
|
+
*/
|
|
167
|
+
export function renderBarePostcode(country: string, postcode: string): string[] {
|
|
168
|
+
const form = WRITTEN_FORMS.get(country.trim().toUpperCase())
|
|
169
|
+
|
|
170
|
+
if (!form) return []
|
|
171
|
+
|
|
172
|
+
return form.render(postcode.trim().toUpperCase().replaceAll(/\s+/gu, ""))
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* Whether `known-formats.ts` reads this surface as a postcode across its whole span.
|
|
177
|
+
*
|
|
178
|
+
* A surface the detector does not recognize would train the model on a string the query-shape prior cannot then
|
|
179
|
+
* support, which is the divergence this recipe exists to close rather than widen.
|
|
180
|
+
*/
|
|
181
|
+
export function detectedAsPostcode(surface: string): boolean {
|
|
182
|
+
return computeQueryShape(surface).knownFormats.some(
|
|
183
|
+
(hit) => isPostcodeFormat(hit.format) && hit.span.start === 0 && hit.span.end === surface.length
|
|
184
|
+
)
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* Slice recipe registered with the corpus builder — see the file header for the parse behaviour it exists to exercise,
|
|
189
|
+
* and `description` below for the surface form it generates.
|
|
190
|
+
*/
|
|
191
|
+
export const barePostcodeRecipe: CorpusRecipe = {
|
|
192
|
+
name: "bare-postcode",
|
|
193
|
+
description: "A postcode alone, in its country's written form — the shape no slice carries (CZ/SK/SE/NL)",
|
|
194
|
+
mode: "generate",
|
|
195
|
+
options: [
|
|
196
|
+
{
|
|
197
|
+
flag: "--count",
|
|
198
|
+
description: "Cap on emitted rows; each country contributes an equal share until its codes run out",
|
|
199
|
+
},
|
|
200
|
+
],
|
|
201
|
+
async run(opts, write) {
|
|
202
|
+
let read = 0
|
|
203
|
+
let emitted = 0
|
|
204
|
+
let skipped = 0
|
|
205
|
+
let unrecognized = 0
|
|
206
|
+
|
|
207
|
+
// Check the complete input set before writing the first row. A missing municipality otherwise
|
|
208
|
+
// produces a plausible non-empty artifact with less Swedish coverage than the recipe declares.
|
|
209
|
+
const missing = await findMissingPostcodeSources(SOURCES.map(({ csv }) => String(csv)))
|
|
210
|
+
|
|
211
|
+
if (missing.length) {
|
|
212
|
+
throw new Error(
|
|
213
|
+
`bare-postcode is missing ${missing.length} of ${SOURCES.length} required OpenAddresses files, ` +
|
|
214
|
+
`starting with ${missing[0]}. Fetch the per-source runs into \`openaddresses/extracted/\` ` +
|
|
215
|
+
"(anonymous, see packages/corpus/CLAUDE.md)."
|
|
216
|
+
)
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
// A PER-COUNTRY budget, because supply is wildly uneven and the shortage is where the capability
|
|
220
|
+
// broke: the Netherlands publishes ~460,000 distinct `NNNN LL` codes against Czechia's 2,669 and
|
|
221
|
+
// Slovakia's 1,059, so an uncapped pass emits 98.9% Dutch rows and teaches the `NNN NN` countries —
|
|
222
|
+
// the ones reading 0/32 — almost nothing. Equal shares, each country keeping whatever it can fill.
|
|
223
|
+
const countries = [...new Set(SOURCES.map((source) => source.country))]
|
|
224
|
+
const budget = opts.count ? Math.ceil(opts.count / countries.length) : Number.POSITIVE_INFINITY
|
|
225
|
+
const perCountry = new Map(countries.map((country) => [country, 0]))
|
|
226
|
+
const codesByCountry = new Map(countries.map((country) => [country, new Set<string>()]))
|
|
227
|
+
|
|
228
|
+
for (const source of SOURCES) {
|
|
229
|
+
const form = WRITTEN_FORMS.get(source.country)
|
|
230
|
+
|
|
231
|
+
if (!form) continue
|
|
232
|
+
|
|
233
|
+
for await (const row of readCSVRecords(source.csv)) {
|
|
234
|
+
read++
|
|
235
|
+
|
|
236
|
+
const compact = String(row.postcode ?? "")
|
|
237
|
+
.trim()
|
|
238
|
+
.toUpperCase()
|
|
239
|
+
.replaceAll(/\s+/gu, "")
|
|
240
|
+
|
|
241
|
+
const countryCodes = codesByCountry.get(source.country)!
|
|
242
|
+
|
|
243
|
+
if (!compact || isReservedBarePostcode(compact) || countryCodes.has(compact)) {
|
|
244
|
+
skipped++
|
|
245
|
+
|
|
246
|
+
continue
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
if (!form.render(compact).length) {
|
|
250
|
+
skipped++
|
|
251
|
+
|
|
252
|
+
continue
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
countryCodes.add(compact)
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
for (const country of countries) {
|
|
260
|
+
const form = WRITTEN_FORMS.get(country)!
|
|
261
|
+
const maximumCodes = Number.isFinite(budget) ? Math.ceil(budget / 2) : Number.POSITIVE_INFINITY
|
|
262
|
+
const countrySeed = opts.seed ^ (country.charCodeAt(0) << 8) ^ country.charCodeAt(1)
|
|
263
|
+
const selected = selectPostcodes(codesByCountry.get(country)!, maximumCodes, countrySeed)
|
|
264
|
+
|
|
265
|
+
for (const compact of selected) {
|
|
266
|
+
const surfaces = form.render(compact)
|
|
267
|
+
|
|
268
|
+
for (const surface of surfaces) {
|
|
269
|
+
if (perCountry.get(country)! >= budget) break
|
|
270
|
+
|
|
271
|
+
// A surface the detector does not read as a postcode is a disagreement between this table
|
|
272
|
+
// and `known-formats.ts`, and emitting it would teach a string the prior cannot support.
|
|
273
|
+
if (!detectedAsPostcode(surface)) {
|
|
274
|
+
unrecognized++
|
|
275
|
+
|
|
276
|
+
continue
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
const components = { postcode: surface }
|
|
280
|
+
|
|
281
|
+
const canonical = {
|
|
282
|
+
raw: surface,
|
|
283
|
+
components,
|
|
284
|
+
country,
|
|
285
|
+
locale: form.locale,
|
|
286
|
+
source: "synth-bare-postcode",
|
|
287
|
+
source_id: sliceSourceID("synth-bare-postcode", {
|
|
288
|
+
...components,
|
|
289
|
+
c: country,
|
|
290
|
+
}),
|
|
291
|
+
corpus_version: "0.30.0",
|
|
292
|
+
license:
|
|
293
|
+
"Synthetic — bare-postcode; postcodes from OpenAddresses (per-source attribution in the model card)",
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
if (alignAndWrite(write, canonical, "bare-postcode")) {
|
|
297
|
+
emitted++
|
|
298
|
+
perCountry.set(country, perCountry.get(country)! + 1)
|
|
299
|
+
} else {
|
|
300
|
+
skipped++
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
// A surface this table renders and the detector refuses is a contract break, not a data quirk: every
|
|
307
|
+
// form here is one `known-formats.ts` declares a pattern for, so the count is expected to be zero and
|
|
308
|
+
// a non-zero one names which side moved.
|
|
309
|
+
if (unrecognized > 0) {
|
|
310
|
+
throw new Error(
|
|
311
|
+
`${unrecognized} rendered surfaces were not read as a postcode by detectKnownFormats — the ` +
|
|
312
|
+
"WRITTEN_FORMS table and known-formats.ts's PATTERNS disagree. Reconcile them before building."
|
|
313
|
+
)
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
// AN EMPTY BUILD IS A FAILURE, NOT AN EMPTY ANSWER. Required files were preflighted above, so zero
|
|
317
|
+
// rows here means their postcode columns or the written-form rules no longer provide usable data.
|
|
318
|
+
if (emitted === 0) {
|
|
319
|
+
throw new Error(
|
|
320
|
+
`bare-postcode emitted no rows from ${SOURCES.length} readable sources. ` +
|
|
321
|
+
"The postcode columns or the written-form rules changed."
|
|
322
|
+
)
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
return { read, emitted, skipped }
|
|
326
|
+
},
|
|
327
|
+
}
|
|
@@ -12,7 +12,9 @@
|
|
|
12
12
|
* `synthesizeBoundaryStressRow` is NOT re-exported from the corpus index — imported directly here.
|
|
13
13
|
*/
|
|
14
14
|
|
|
15
|
-
import {
|
|
15
|
+
import { mulberry32 as makeMulberry32 } from "@mailwoman/core/utils"
|
|
16
|
+
|
|
17
|
+
import { type CorpusRecipe, sliceSourceID } from "#recipes/scaffold"
|
|
16
18
|
import { type BoundaryStressTemplate, synthesizeBoundaryStressRow } from "#synthesizers/boundary-stress"
|
|
17
19
|
import { alignRow } from "#utils"
|
|
18
20
|
|