@mailwoman/corpus 8.0.0 → 8.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/out/src/adapter.d.ts +15 -5
- package/out/src/adapter.d.ts.map +1 -1
- package/out/src/adapter.js +11 -9
- package/out/src/adapter.js.map +1 -1
- package/out/src/adapters/ban/adapter.d.ts +7 -0
- package/out/src/adapters/ban/adapter.d.ts.map +1 -1
- package/out/src/adapters/ban/adapter.js +9 -2
- package/out/src/adapters/ban/adapter.js.map +1 -1
- package/out/src/adapters/ban/street-decompose.d.ts.map +1 -1
- package/out/src/adapters/ban/street-decompose.js +5 -1
- package/out/src/adapters/ban/street-decompose.js.map +1 -1
- package/out/src/adapters/fcc-bdc/adapter.d.ts +14 -1
- package/out/src/adapters/fcc-bdc/adapter.d.ts.map +1 -1
- package/out/src/adapters/fcc-bdc/adapter.js +15 -2
- package/out/src/adapters/fcc-bdc/adapter.js.map +1 -1
- package/out/src/adapters/geonames/adapter.d.ts +11 -0
- package/out/src/adapters/geonames/adapter.d.ts.map +1 -1
- package/out/src/adapters/geonames/adapter.js +24 -5
- package/out/src/adapters/geonames/adapter.js.map +1 -1
- package/out/src/adapters/geonames-postal/adapter.d.ts +11 -0
- package/out/src/adapters/geonames-postal/adapter.d.ts.map +1 -1
- package/out/src/adapters/geonames-postal/adapter.js +14 -1
- package/out/src/adapters/geonames-postal/adapter.js.map +1 -1
- package/out/src/adapters/gnaf/adapter.d.ts +10 -1
- package/out/src/adapters/gnaf/adapter.d.ts.map +1 -1
- package/out/src/adapters/gnaf/adapter.js +11 -2
- package/out/src/adapters/gnaf/adapter.js.map +1 -1
- package/out/src/adapters/gnaf/assemble.d.ts +18 -6
- package/out/src/adapters/gnaf/assemble.d.ts.map +1 -1
- package/out/src/adapters/gnaf/assemble.js +16 -6
- package/out/src/adapters/gnaf/assemble.js.map +1 -1
- package/out/src/adapters/index.d.ts.map +1 -1
- package/out/src/adapters/index.js.map +1 -1
- package/out/src/adapters/openaddresses/adapter.d.ts +11 -0
- package/out/src/adapters/openaddresses/adapter.d.ts.map +1 -1
- package/out/src/adapters/openaddresses/adapter.js +18 -3
- package/out/src/adapters/openaddresses/adapter.js.map +1 -1
- package/out/src/adapters/overture/adapter.d.ts +11 -0
- package/out/src/adapters/overture/adapter.d.ts.map +1 -1
- package/out/src/adapters/overture/adapter.js +12 -1
- package/out/src/adapters/overture/adapter.js.map +1 -1
- package/out/src/adapters/state-hi-schools/adapter.d.ts +11 -0
- package/out/src/adapters/state-hi-schools/adapter.d.ts.map +1 -1
- package/out/src/adapters/state-hi-schools/adapter.js +11 -0
- package/out/src/adapters/state-hi-schools/adapter.js.map +1 -1
- package/out/src/adapters/state-ia-contractors/adapter.d.ts +11 -0
- package/out/src/adapters/state-ia-contractors/adapter.d.ts.map +1 -1
- package/out/src/adapters/state-ia-contractors/adapter.js +11 -0
- package/out/src/adapters/state-ia-contractors/adapter.js.map +1 -1
- package/out/src/adapters/state-ny-notaries/adapter.d.ts +11 -0
- package/out/src/adapters/state-ny-notaries/adapter.d.ts.map +1 -1
- package/out/src/adapters/state-ny-notaries/adapter.js +11 -0
- package/out/src/adapters/state-ny-notaries/adapter.js.map +1 -1
- package/out/src/adapters/state-tx-notaries/adapter.d.ts +11 -0
- package/out/src/adapters/state-tx-notaries/adapter.d.ts.map +1 -1
- package/out/src/adapters/state-tx-notaries/adapter.js +15 -2
- package/out/src/adapters/state-tx-notaries/adapter.js.map +1 -1
- package/out/src/adapters/synth-po-box/adapter.d.ts +11 -0
- package/out/src/adapters/synth-po-box/adapter.d.ts.map +1 -1
- package/out/src/adapters/synth-po-box/adapter.js +13 -2
- package/out/src/adapters/synth-po-box/adapter.js.map +1 -1
- package/out/src/adapters/tiger/adapter.d.ts +14 -1
- package/out/src/adapters/tiger/adapter.d.ts.map +1 -1
- package/out/src/adapters/tiger/adapter.js +19 -4
- package/out/src/adapters/tiger/adapter.js.map +1 -1
- package/out/src/adapters/tiger/street-decompose.d.ts.map +1 -1
- package/out/src/adapters/tiger/street-decompose.js.map +1 -1
- package/out/src/adapters/usgov-hrsa-fqhc/adapter.d.ts +11 -0
- package/out/src/adapters/usgov-hrsa-fqhc/adapter.d.ts.map +1 -1
- package/out/src/adapters/usgov-hrsa-fqhc/adapter.js +12 -1
- package/out/src/adapters/usgov-hrsa-fqhc/adapter.js.map +1 -1
- package/out/src/adapters/usgov-imls-pls/adapter.d.ts +11 -0
- package/out/src/adapters/usgov-imls-pls/adapter.d.ts.map +1 -1
- package/out/src/adapters/usgov-imls-pls/adapter.js +11 -0
- package/out/src/adapters/usgov-imls-pls/adapter.js.map +1 -1
- package/out/src/adapters/usgov-irs-bmf/adapter.d.ts +11 -0
- package/out/src/adapters/usgov-irs-bmf/adapter.d.ts.map +1 -1
- package/out/src/adapters/usgov-irs-bmf/adapter.js +17 -2
- package/out/src/adapters/usgov-irs-bmf/adapter.js.map +1 -1
- package/out/src/adapters/usgov-nad/adapter.d.ts +11 -0
- package/out/src/adapters/usgov-nad/adapter.d.ts.map +1 -1
- package/out/src/adapters/usgov-nad/adapter.js +12 -1
- package/out/src/adapters/usgov-nad/adapter.js.map +1 -1
- package/out/src/adapters/usgov-nppes/adapter.d.ts +11 -0
- package/out/src/adapters/usgov-nppes/adapter.d.ts.map +1 -1
- package/out/src/adapters/usgov-nppes/adapter.js +11 -0
- package/out/src/adapters/usgov-nppes/adapter.js.map +1 -1
- package/out/src/adapters/usgov-samhsa-treatment-locator/adapter.d.ts +11 -0
- package/out/src/adapters/usgov-samhsa-treatment-locator/adapter.d.ts.map +1 -1
- package/out/src/adapters/usgov-samhsa-treatment-locator/adapter.js +15 -2
- package/out/src/adapters/usgov-samhsa-treatment-locator/adapter.js.map +1 -1
- package/out/src/adapters/wof-admin-jp/adapter.d.ts +7 -0
- package/out/src/adapters/wof-admin-jp/adapter.d.ts.map +1 -1
- package/out/src/adapters/wof-admin-jp/adapter.js +18 -3
- package/out/src/adapters/wof-admin-jp/adapter.js.map +1 -1
- package/out/src/adapters/wof-admin-json/adapter.d.ts +13 -3
- package/out/src/adapters/wof-admin-json/adapter.d.ts.map +1 -1
- package/out/src/adapters/wof-admin-json/adapter.js +15 -5
- package/out/src/adapters/wof-admin-json/adapter.js.map +1 -1
- package/out/src/adapters/wof-postalcode-json/adapter.d.ts +7 -0
- package/out/src/adapters/wof-postalcode-json/adapter.d.ts.map +1 -1
- package/out/src/adapters/wof-postalcode-json/adapter.js +9 -2
- package/out/src/adapters/wof-postalcode-json/adapter.js.map +1 -1
- package/out/src/align.d.ts +12 -4
- package/out/src/align.d.ts.map +1 -1
- package/out/src/align.js +9 -5
- package/out/src/align.js.map +1 -1
- package/out/src/build.d.ts +24 -8
- package/out/src/build.d.ts.map +1 -1
- package/out/src/build.js +3 -3
- package/out/src/build.js.map +1 -1
- package/out/src/codex/us-fips-state.d.ts +6 -2
- package/out/src/codex/us-fips-state.d.ts.map +1 -1
- package/out/src/codex/us-fips-state.js +3 -1
- package/out/src/codex/us-fips-state.js.map +1 -1
- package/out/src/golden.d.ts +21 -7
- package/out/src/golden.d.ts.map +1 -1
- package/out/src/golden.js +18 -10
- package/out/src/golden.js.map +1 -1
- package/out/src/license.d.ts +3 -1
- package/out/src/license.d.ts.map +1 -1
- package/out/src/license.js +4 -2
- package/out/src/license.js.map +1 -1
- package/out/src/parquet-wrapper/reader.d.ts +4 -2
- package/out/src/parquet-wrapper/reader.d.ts.map +1 -1
- package/out/src/parquet-wrapper/reader.js +5 -4
- package/out/src/parquet-wrapper/reader.js.map +1 -1
- package/out/src/parquet-wrapper/schema.d.ts +14 -10
- package/out/src/parquet-wrapper/schema.d.ts.map +1 -1
- package/out/src/parquet-wrapper/schema.js +6 -2
- package/out/src/parquet-wrapper/schema.js.map +1 -1
- package/out/src/parquet-wrapper/writer.d.ts +12 -4
- package/out/src/parquet-wrapper/writer.d.ts.map +1 -1
- package/out/src/parquet-wrapper/writer.js +12 -4
- package/out/src/parquet-wrapper/writer.js.map +1 -1
- package/out/src/parquet.d.ts +21 -7
- package/out/src/parquet.d.ts.map +1 -1
- package/out/src/parquet.js +15 -4
- package/out/src/parquet.js.map +1 -1
- package/out/src/runner.d.ts +39 -13
- package/out/src/runner.d.ts.map +1 -1
- package/out/src/runner.js +7 -3
- package/out/src/runner.js.map +1 -1
- package/out/src/shard-recipes/anchor-absorption.d.ts +4 -0
- package/out/src/shard-recipes/anchor-absorption.d.ts.map +1 -1
- package/out/src/shard-recipes/anchor-absorption.js +14 -5
- package/out/src/shard-recipes/anchor-absorption.js.map +1 -1
- package/out/src/shard-recipes/boundary-stress.d.ts +4 -0
- package/out/src/shard-recipes/boundary-stress.d.ts.map +1 -1
- package/out/src/shard-recipes/boundary-stress.js +13 -7
- package/out/src/shard-recipes/boundary-stress.js.map +1 -1
- package/out/src/shard-recipes/country-balanced.d.ts +4 -0
- package/out/src/shard-recipes/country-balanced.d.ts.map +1 -1
- package/out/src/shard-recipes/country-balanced.js +39 -11
- package/out/src/shard-recipes/country-balanced.js.map +1 -1
- package/out/src/shard-recipes/cz-pcfirst-preposition.d.ts +4 -0
- package/out/src/shard-recipes/cz-pcfirst-preposition.d.ts.map +1 -1
- package/out/src/shard-recipes/cz-pcfirst-preposition.js +4 -0
- package/out/src/shard-recipes/cz-pcfirst-preposition.js.map +1 -1
- package/out/src/shard-recipes/fr-admin-split.d.ts +4 -0
- package/out/src/shard-recipes/fr-admin-split.d.ts.map +1 -1
- package/out/src/shard-recipes/fr-admin-split.js +14 -3
- package/out/src/shard-recipes/fr-admin-split.js.map +1 -1
- package/out/src/shard-recipes/fr-bare-street.d.ts +4 -0
- package/out/src/shard-recipes/fr-bare-street.d.ts.map +1 -1
- package/out/src/shard-recipes/fr-bare-street.js +4 -0
- package/out/src/shard-recipes/fr-bare-street.js.map +1 -1
- package/out/src/shard-recipes/fr-fragment.d.ts +4 -0
- package/out/src/shard-recipes/fr-fragment.d.ts.map +1 -1
- package/out/src/shard-recipes/fr-fragment.js +25 -8
- package/out/src/shard-recipes/fr-fragment.js.map +1 -1
- package/out/src/shard-recipes/fr-lieudit.d.ts +4 -0
- package/out/src/shard-recipes/fr-lieudit.d.ts.map +1 -1
- package/out/src/shard-recipes/fr-lieudit.js +21 -8
- package/out/src/shard-recipes/fr-lieudit.js.map +1 -1
- package/out/src/shard-recipes/fr-order.d.ts +4 -0
- package/out/src/shard-recipes/fr-order.d.ts.map +1 -1
- package/out/src/shard-recipes/fr-order.js +27 -8
- package/out/src/shard-recipes/fr-order.js.map +1 -1
- package/out/src/shard-recipes/german.d.ts +4 -0
- package/out/src/shard-recipes/german.d.ts.map +1 -1
- package/out/src/shard-recipes/german.js +16 -6
- package/out/src/shard-recipes/german.js.map +1 -1
- package/out/src/shard-recipes/house-venue.d.ts +4 -0
- package/out/src/shard-recipes/house-venue.d.ts.map +1 -1
- package/out/src/shard-recipes/house-venue.js +4 -0
- package/out/src/shard-recipes/house-venue.js.map +1 -1
- package/out/src/shard-recipes/index.d.ts +9 -3
- package/out/src/shard-recipes/index.d.ts.map +1 -1
- package/out/src/shard-recipes/index.js +12 -4
- package/out/src/shard-recipes/index.js.map +1 -1
- package/out/src/shard-recipes/intersection.d.ts +4 -0
- package/out/src/shard-recipes/intersection.d.ts.map +1 -1
- package/out/src/shard-recipes/intersection.js +27 -13
- package/out/src/shard-recipes/intersection.js.map +1 -1
- package/out/src/shard-recipes/locale.d.ts +4 -0
- package/out/src/shard-recipes/locale.d.ts.map +1 -1
- package/out/src/shard-recipes/locale.js +9 -4
- package/out/src/shard-recipes/locale.js.map +1 -1
- package/out/src/shard-recipes/nl-postcode.d.ts +4 -0
- package/out/src/shard-recipes/nl-postcode.d.ts.map +1 -1
- package/out/src/shard-recipes/nl-postcode.js +8 -2
- package/out/src/shard-recipes/nl-postcode.js.map +1 -1
- package/out/src/shard-recipes/no-fragment.d.ts +4 -0
- package/out/src/shard-recipes/no-fragment.d.ts.map +1 -1
- package/out/src/shard-recipes/no-fragment.js +8 -2
- package/out/src/shard-recipes/no-fragment.js.map +1 -1
- package/out/src/shard-recipes/no-street-led.d.ts +4 -0
- package/out/src/shard-recipes/no-street-led.d.ts.map +1 -1
- package/out/src/shard-recipes/no-street-led.js +5 -1
- package/out/src/shard-recipes/no-street-led.js.map +1 -1
- package/out/src/shard-recipes/no-street.d.ts +4 -0
- package/out/src/shard-recipes/no-street.d.ts.map +1 -1
- package/out/src/shard-recipes/no-street.js +4 -0
- package/out/src/shard-recipes/no-street.js.map +1 -1
- package/out/src/shard-recipes/po-box-cedex.d.ts +4 -0
- package/out/src/shard-recipes/po-box-cedex.d.ts.map +1 -1
- package/out/src/shard-recipes/po-box-cedex.js +99 -43
- package/out/src/shard-recipes/po-box-cedex.js.map +1 -1
- package/out/src/shard-recipes/po-box.d.ts +4 -0
- package/out/src/shard-recipes/po-box.d.ts.map +1 -1
- package/out/src/shard-recipes/po-box.js +4 -0
- package/out/src/shard-recipes/po-box.js.map +1 -1
- package/out/src/shard-recipes/scaffold.d.ts +48 -16
- package/out/src/shard-recipes/scaffold.d.ts.map +1 -1
- package/out/src/shard-recipes/scaffold.js +10 -6
- package/out/src/shard-recipes/scaffold.js.map +1 -1
- package/out/src/shard-recipes/si-bare-village.d.ts +4 -0
- package/out/src/shard-recipes/si-bare-village.d.ts.map +1 -1
- package/out/src/shard-recipes/si-bare-village.js +4 -0
- package/out/src/shard-recipes/si-bare-village.js.map +1 -1
- package/out/src/shard-recipes/street-affix.d.ts +4 -0
- package/out/src/shard-recipes/street-affix.d.ts.map +1 -1
- package/out/src/shard-recipes/street-affix.js +29 -10
- package/out/src/shard-recipes/street-affix.js.map +1 -1
- package/out/src/shard-recipes/street-bare.d.ts +4 -0
- package/out/src/shard-recipes/street-bare.d.ts.map +1 -1
- package/out/src/shard-recipes/street-bare.js +4 -0
- package/out/src/shard-recipes/street-bare.js.map +1 -1
- package/out/src/shard-recipes/street.d.ts +4 -0
- package/out/src/shard-recipes/street.d.ts.map +1 -1
- package/out/src/shard-recipes/street.js +4 -0
- package/out/src/shard-recipes/street.js.map +1 -1
- package/out/src/shard-recipes/unit.d.ts +4 -0
- package/out/src/shard-recipes/unit.d.ts.map +1 -1
- package/out/src/shard-recipes/unit.js +45 -14
- package/out/src/shard-recipes/unit.js.map +1 -1
- package/out/src/split.d.ts +18 -6
- package/out/src/split.d.ts.map +1 -1
- package/out/src/split.js +4 -2
- package/out/src/split.js.map +1 -1
- package/out/src/synthesize-anchor-absorption.d.ts +7 -1
- package/out/src/synthesize-anchor-absorption.d.ts.map +1 -1
- package/out/src/synthesize-anchor-absorption.js +28 -14
- package/out/src/synthesize-anchor-absorption.js.map +1 -1
- package/out/src/synthesize-boundary-stress.d.ts +3 -1
- package/out/src/synthesize-boundary-stress.d.ts.map +1 -1
- package/out/src/synthesize-boundary-stress.js +35 -28
- package/out/src/synthesize-boundary-stress.js.map +1 -1
- package/out/src/synthesize-german.d.ts +15 -5
- package/out/src/synthesize-german.d.ts.map +1 -1
- package/out/src/synthesize-german.js +9 -3
- package/out/src/synthesize-german.js.map +1 -1
- package/out/src/synthesize-house-venue.d.ts.map +1 -1
- package/out/src/synthesize-house-venue.js +15 -15
- package/out/src/synthesize-house-venue.js.map +1 -1
- package/out/src/synthesize-intersection.d.ts +9 -3
- package/out/src/synthesize-intersection.d.ts.map +1 -1
- package/out/src/synthesize-intersection.js +25 -6
- package/out/src/synthesize-intersection.js.map +1 -1
- package/out/src/synthesize-no-street.d.ts +3 -1
- package/out/src/synthesize-no-street.d.ts.map +1 -1
- package/out/src/synthesize-no-street.js +5 -6
- package/out/src/synthesize-no-street.js.map +1 -1
- package/out/src/synthesize-po-box.d.ts +15 -5
- package/out/src/synthesize-po-box.d.ts.map +1 -1
- package/out/src/synthesize-po-box.js +21 -7
- package/out/src/synthesize-po-box.js.map +1 -1
- package/out/src/synthesize-street.d.ts +3 -1
- package/out/src/synthesize-street.d.ts.map +1 -1
- package/out/src/synthesize-street.js +6 -1
- package/out/src/synthesize-street.js.map +1 -1
- package/out/src/synthesize.d.ts +39 -13
- package/out/src/synthesize.d.ts.map +1 -1
- package/out/src/synthesize.js +66 -36
- package/out/src/synthesize.js.map +1 -1
- package/out/src/tokenize.d.ts +15 -5
- package/out/src/tokenize.d.ts.map +1 -1
- package/out/src/tokenize.js.map +1 -1
- package/out/src/tools/align-shard.d.ts.map +1 -1
- package/out/src/tools/align-shard.js +3 -1
- package/out/src/tools/align-shard.js.map +1 -1
- package/out/src/tools/audit.d.ts.map +1 -1
- package/out/src/tools/audit.js +20 -8
- package/out/src/tools/audit.js.map +1 -1
- package/out/src/tools/corpus-stats.d.ts.map +1 -1
- package/out/src/tools/corpus-stats.js.map +1 -1
- package/out/src/tools/fetch/ban.d.ts.map +1 -1
- package/out/src/tools/fetch/ban.js +17 -10
- package/out/src/tools/fetch/ban.js.map +1 -1
- package/out/src/tools/fetch/download.d.ts +30 -10
- package/out/src/tools/fetch/download.d.ts.map +1 -1
- package/out/src/tools/fetch/download.js +26 -6
- package/out/src/tools/fetch/download.js.map +1 -1
- package/out/src/tools/fetch/hrsa.d.ts.map +1 -1
- package/out/src/tools/fetch/hrsa.js.map +1 -1
- package/out/src/tools/fetch/imls-pls.d.ts.map +1 -1
- package/out/src/tools/fetch/imls-pls.js +18 -18
- package/out/src/tools/fetch/imls-pls.js.map +1 -1
- package/out/src/tools/fetch/index.d.ts +3 -1
- package/out/src/tools/fetch/index.d.ts.map +1 -1
- package/out/src/tools/fetch/index.js +3 -1
- package/out/src/tools/fetch/index.js.map +1 -1
- package/out/src/tools/fetch/nad.d.ts +21 -7
- package/out/src/tools/fetch/nad.d.ts.map +1 -1
- package/out/src/tools/fetch/nad.js +5 -5
- package/out/src/tools/fetch/nad.js.map +1 -1
- package/out/src/tools/fetch/nppes.d.ts.map +1 -1
- package/out/src/tools/fetch/nppes.js +9 -15
- package/out/src/tools/fetch/nppes.js.map +1 -1
- package/out/src/tools/fetch/openaddresses.d.ts +3 -1
- package/out/src/tools/fetch/openaddresses.d.ts.map +1 -1
- package/out/src/tools/fetch/openaddresses.js +32 -23
- package/out/src/tools/fetch/openaddresses.js.map +1 -1
- package/out/src/tools/fetch/ppd.d.ts +3 -1
- package/out/src/tools/fetch/ppd.d.ts.map +1 -1
- package/out/src/tools/fetch/ppd.js +14 -3
- package/out/src/tools/fetch/ppd.js.map +1 -1
- package/out/src/tools/fetch/state-hi-schools.d.ts.map +1 -1
- package/out/src/tools/fetch/state-hi-schools.js +13 -6
- package/out/src/tools/fetch/state-hi-schools.js.map +1 -1
- package/out/src/tools/fetch/state-sources.d.ts.map +1 -1
- package/out/src/tools/fetch/state-sources.js +8 -3
- package/out/src/tools/fetch/state-sources.js.map +1 -1
- package/out/src/tools/fetch/tiger-full.d.ts +9 -3
- package/out/src/tools/fetch/tiger-full.d.ts.map +1 -1
- package/out/src/tools/fetch/tiger-full.js +35 -20
- package/out/src/tools/fetch/tiger-full.js.map +1 -1
- package/out/src/tools/gb-title-case.d.ts.map +1 -1
- package/out/src/tools/gb-title-case.js.map +1 -1
- package/out/src/tools/golden-expand.d.ts +24 -8
- package/out/src/tools/golden-expand.d.ts.map +1 -1
- package/out/src/tools/golden-expand.js +20 -12
- package/out/src/tools/golden-expand.js.map +1 -1
- package/out/src/tools/golden-promote.d.ts +18 -6
- package/out/src/tools/golden-promote.d.ts.map +1 -1
- package/out/src/tools/golden-promote.js +22 -7
- package/out/src/tools/golden-promote.js.map +1 -1
- package/out/src/tools/ingest-csv.d.ts +3 -1
- package/out/src/tools/ingest-csv.d.ts.map +1 -1
- package/out/src/tools/ingest-csv.js +17 -19
- package/out/src/tools/ingest-csv.js.map +1 -1
- package/out/src/tools/jsonl-to-parquet.d.ts +18 -6
- package/out/src/tools/jsonl-to-parquet.d.ts.map +1 -1
- package/out/src/tools/jsonl-to-parquet.js +11 -5
- package/out/src/tools/jsonl-to-parquet.js.map +1 -1
- package/out/src/tools/lint-shard-vocab.d.ts +36 -12
- package/out/src/tools/lint-shard-vocab.d.ts.map +1 -1
- package/out/src/tools/lint-shard-vocab.js +25 -11
- package/out/src/tools/lint-shard-vocab.js.map +1 -1
- package/out/src/tools/lint-shard.d.ts +30 -10
- package/out/src/tools/lint-shard.d.ts.map +1 -1
- package/out/src/tools/lint-shard.js +33 -20
- package/out/src/tools/lint-shard.js.map +1 -1
- package/out/src/tools/overlay-manifest.d.ts.map +1 -1
- package/out/src/tools/overlay-manifest.js +6 -4
- package/out/src/tools/overlay-manifest.js.map +1 -1
- package/out/src/tools/shard-kryptonite.d.ts +6 -2
- package/out/src/tools/shard-kryptonite.d.ts.map +1 -1
- package/out/src/tools/shard-kryptonite.js +1 -1
- package/out/src/tools/shard-kryptonite.js.map +1 -1
- package/out/src/tools/shard-translit.d.ts +9 -3
- package/out/src/tools/shard-translit.d.ts.map +1 -1
- package/out/src/tools/shard-translit.js +2 -2
- package/out/src/tools/shard-translit.js.map +1 -1
- package/out/src/types.d.ts +51 -17
- package/out/src/types.d.ts.map +1 -1
- package/out/src/wof-json.d.ts +9 -3
- package/out/src/wof-json.d.ts.map +1 -1
- package/out/src/wof-json.js +6 -4
- package/out/src/wof-json.js.map +1 -1
- package/package.json +7 -6
- package/src/adapter.ts +24 -13
- package/src/adapters/ban/adapter.ts +12 -2
- package/src/adapters/ban/street-decompose.ts +7 -1
- package/src/adapters/fcc-bdc/adapter.ts +19 -3
- package/src/adapters/geonames/adapter.ts +28 -5
- package/src/adapters/geonames-postal/adapter.ts +17 -1
- package/src/adapters/gnaf/adapter.ts +15 -2
- package/src/adapters/gnaf/assemble.ts +40 -10
- package/src/adapters/index.ts +13 -0
- package/src/adapters/openaddresses/adapter.ts +22 -3
- package/src/adapters/overture/adapter.ts +18 -2
- package/src/adapters/state-hi-schools/adapter.ts +15 -0
- package/src/adapters/state-ia-contractors/adapter.ts +15 -0
- package/src/adapters/state-ny-notaries/adapter.ts +15 -0
- package/src/adapters/state-tx-notaries/adapter.ts +18 -2
- package/src/adapters/synth-po-box/adapter.ts +19 -2
- package/src/adapters/tiger/adapter.ts +23 -4
- package/src/adapters/tiger/street-decompose.ts +1 -0
- package/src/adapters/usgov-hrsa-fqhc/adapter.ts +18 -2
- package/src/adapters/usgov-imls-pls/adapter.ts +15 -0
- package/src/adapters/usgov-irs-bmf/adapter.ts +19 -2
- package/src/adapters/usgov-nad/adapter.ts +14 -1
- package/src/adapters/usgov-nppes/adapter.ts +13 -0
- package/src/adapters/usgov-samhsa-treatment-locator/adapter.ts +21 -3
- package/src/adapters/wof-admin-jp/adapter.ts +20 -3
- package/src/adapters/wof-admin-json/adapter.ts +22 -7
- package/src/adapters/wof-postalcode-json/adapter.ts +10 -2
- package/src/align.ts +21 -8
- package/src/build.ts +48 -11
- package/src/codex/us-fips-state.ts +6 -2
- package/src/golden.ts +28 -13
- package/src/license.ts +4 -2
- package/src/parquet-wrapper/reader.ts +6 -4
- package/src/parquet-wrapper/schema.ts +14 -10
- package/src/parquet-wrapper/writer.ts +12 -4
- package/src/parquet.ts +39 -8
- package/src/runner.ts +49 -15
- package/src/shard-recipes/anchor-absorption.ts +21 -5
- package/src/shard-recipes/boundary-stress.ts +20 -7
- package/src/shard-recipes/country-balanced.ts +78 -13
- package/src/shard-recipes/cz-pcfirst-preposition.ts +9 -0
- package/src/shard-recipes/fr-admin-split.ts +30 -5
- package/src/shard-recipes/fr-bare-street.ts +10 -0
- package/src/shard-recipes/fr-fragment.ts +33 -8
- package/src/shard-recipes/fr-lieudit.ts +35 -9
- package/src/shard-recipes/fr-order.ts +47 -9
- package/src/shard-recipes/german.ts +32 -6
- package/src/shard-recipes/house-venue.ts +7 -0
- package/src/shard-recipes/index.ts +12 -4
- package/src/shard-recipes/intersection.ts +63 -14
- package/src/shard-recipes/locale.ts +37 -4
- package/src/shard-recipes/nl-postcode.ts +12 -2
- package/src/shard-recipes/no-fragment.ts +12 -2
- package/src/shard-recipes/no-street-led.ts +11 -1
- package/src/shard-recipes/no-street.ts +7 -0
- package/src/shard-recipes/po-box-cedex.ts +145 -45
- package/src/shard-recipes/po-box.ts +7 -0
- package/src/shard-recipes/scaffold.ts +52 -20
- package/src/shard-recipes/si-bare-village.ts +9 -0
- package/src/shard-recipes/street-affix.ts +88 -13
- package/src/shard-recipes/street-bare.ts +10 -0
- package/src/shard-recipes/street.ts +7 -0
- package/src/shard-recipes/unit.ts +79 -16
- package/src/split.ts +28 -7
- package/src/synthesize-anchor-absorption.ts +41 -14
- package/src/synthesize-boundary-stress.ts +57 -30
- package/src/synthesize-german.ts +30 -7
- package/src/synthesize-house-venue.ts +22 -16
- package/src/synthesize-intersection.ts +34 -7
- package/src/synthesize-no-street.ts +18 -10
- package/src/synthesize-po-box.ts +42 -10
- package/src/synthesize-street.ts +10 -2
- package/src/synthesize.ts +81 -38
- package/src/tokenize.ts +15 -5
- package/src/tools/align-shard.ts +6 -1
- package/src/tools/audit.ts +57 -11
- package/src/tools/corpus-stats.ts +9 -0
- package/src/tools/fetch/ban.ts +32 -10
- package/src/tools/fetch/download.ts +49 -12
- package/src/tools/fetch/hrsa.ts +3 -0
- package/src/tools/fetch/imls-pls.ts +28 -18
- package/src/tools/fetch/index.ts +3 -1
- package/src/tools/fetch/nad.ts +39 -12
- package/src/tools/fetch/nppes.ts +17 -15
- package/src/tools/fetch/openaddresses.ts +52 -24
- package/src/tools/fetch/ppd.ts +22 -3
- package/src/tools/fetch/state-hi-schools.ts +17 -6
- package/src/tools/fetch/state-sources.ts +16 -3
- package/src/tools/fetch/tiger-full.ts +66 -23
- package/src/tools/gb-title-case.ts +1 -0
- package/src/tools/golden-expand.ts +64 -20
- package/src/tools/golden-promote.ts +53 -13
- package/src/tools/ingest-csv.ts +41 -26
- package/src/tools/jsonl-to-parquet.ts +30 -10
- package/src/tools/lint-shard-vocab.ts +75 -24
- package/src/tools/lint-shard.ts +75 -31
- package/src/tools/overlay-manifest.ts +7 -4
- package/src/tools/shard-kryptonite.ts +11 -3
- package/src/tools/shard-translit.ts +20 -5
- package/src/types.ts +51 -17
- package/src/wof-json.ts +18 -7
|
@@ -38,9 +38,14 @@ import { alignRow } from "../align.ts"
|
|
|
38
38
|
import type { CanonicalRow } from "../types.ts"
|
|
39
39
|
import { makeMulberry32, type ShardRecipe } from "./scaffold.ts"
|
|
40
40
|
|
|
41
|
-
|
|
41
|
+
/**
|
|
42
|
+
* Matches the `ban` adapter's Tier-B election for BAN data.
|
|
43
|
+
*/
|
|
44
|
+
const DEFAULT_LICENSE = "Licence Ouverte 2.0"
|
|
42
45
|
|
|
43
|
-
/**
|
|
46
|
+
/**
|
|
47
|
+
* One BAN row surviving the lieu-dit filter — the minimal tuple the pool holds.
|
|
48
|
+
*/
|
|
44
49
|
interface LieuDitTuple {
|
|
45
50
|
numero: string
|
|
46
51
|
rep: string | null
|
|
@@ -60,7 +65,7 @@ interface LieuDitTuple {
|
|
|
60
65
|
function departementFiles(banDir: string): string[] {
|
|
61
66
|
const byDept = new Map<string, string>()
|
|
62
67
|
|
|
63
|
-
for (const name of readdirSync(banDir).
|
|
68
|
+
for (const name of readdirSync(banDir).toSorted()) {
|
|
64
69
|
const m = /^adresses-(.+?)\.csv(\.gz)?$/.exec(name)
|
|
65
70
|
|
|
66
71
|
if (!m) continue
|
|
@@ -76,14 +81,16 @@ function departementFiles(banDir: string): string[] {
|
|
|
76
81
|
}
|
|
77
82
|
}
|
|
78
83
|
|
|
79
|
-
return [...byDept.keys()].
|
|
84
|
+
return [...byDept.keys()].toSorted().map((dept) => byDept.get(dept)!)
|
|
80
85
|
}
|
|
81
86
|
|
|
82
|
-
/**
|
|
87
|
+
/**
|
|
88
|
+
* Stream every département file, keeping only rows with a clean `lieuDit` (junk/dup filtering lives in `ban/sdk`).
|
|
89
|
+
*/
|
|
83
90
|
async function readLieuDitPool(banDir: string): Promise<LieuDitTuple[]> {
|
|
84
91
|
const files = departementFiles(banDir)
|
|
85
92
|
|
|
86
|
-
if (files.length
|
|
93
|
+
if (!files.length) {
|
|
87
94
|
throw new Error(
|
|
88
95
|
`No BAN adresses-<dept>.csv files found in ${banDir} — fetch BAN first (\`mailwoman corpus fetch ban\`).`
|
|
89
96
|
)
|
|
@@ -108,10 +115,13 @@ async function readLieuDitPool(banDir: string): Promise<LieuDitTuple[]> {
|
|
|
108
115
|
locality: rec.city,
|
|
109
116
|
dependentLocality: rec.lieuDit,
|
|
110
117
|
})
|
|
118
|
+
|
|
111
119
|
deptCount++
|
|
112
120
|
}
|
|
121
|
+
|
|
113
122
|
console.error(` ${path}: ${deptCount.toLocaleString()} clean lieu-dit rows`)
|
|
114
123
|
}
|
|
124
|
+
|
|
115
125
|
console.error(
|
|
116
126
|
` scanned ${scanned.toLocaleString()} BAN rows across ${files.length} départements → pool=${pool.length.toLocaleString()}`
|
|
117
127
|
)
|
|
@@ -119,7 +129,9 @@ async function readLieuDitPool(banDir: string): Promise<LieuDitTuple[]> {
|
|
|
119
129
|
return pool
|
|
120
130
|
}
|
|
121
131
|
|
|
122
|
-
/**
|
|
132
|
+
/**
|
|
133
|
+
* `house_number` = `numero` + folded `rep` ("10 bis"), matching the `ban` adapter's own composition.
|
|
134
|
+
*/
|
|
123
135
|
function composeHouseNumber(numero: string, rep: string | null): string {
|
|
124
136
|
return rep ? `${numero} ${rep}` : numero
|
|
125
137
|
}
|
|
@@ -142,6 +154,7 @@ function composeRaw(
|
|
|
142
154
|
if (streetLine) {
|
|
143
155
|
lines.push(streetLine)
|
|
144
156
|
}
|
|
157
|
+
|
|
145
158
|
lines.push(dependentLocality)
|
|
146
159
|
const cityLine = [postcode, locality].filter(Boolean).join(" ").trim()
|
|
147
160
|
|
|
@@ -152,7 +165,9 @@ function composeRaw(
|
|
|
152
165
|
return lines.join("\n")
|
|
153
166
|
}
|
|
154
167
|
|
|
155
|
-
/**
|
|
168
|
+
/**
|
|
169
|
+
* Fisher-Yates shuffle, in place, with the recipe's seeded PRNG — reproducible sampling without replacement.
|
|
170
|
+
*/
|
|
156
171
|
function shuffleInPlace<T>(arr: T[], random: () => number): void {
|
|
157
172
|
for (let i = arr.length - 1; i > 0; i--) {
|
|
158
173
|
const j = Math.floor(random() * (i + 1))
|
|
@@ -160,6 +175,10 @@ function shuffleInPlace<T>(arr: T[], random: () => number): void {
|
|
|
160
175
|
}
|
|
161
176
|
}
|
|
162
177
|
|
|
178
|
+
/**
|
|
179
|
+
* Shard recipe registered with the corpus builder — see the file header for the parse behaviour it exists to exercise,
|
|
180
|
+
* and `description` below for the surface form it generates.
|
|
181
|
+
*/
|
|
163
182
|
export const frLieuditRecipe: ShardRecipe = {
|
|
164
183
|
name: "fr-lieudit",
|
|
165
184
|
description: "FR lieu-dit rows: BAN nom_ld → dependent_locality (commune → locality), lieu-dit on its own line",
|
|
@@ -187,7 +206,7 @@ export const frLieuditRecipe: ShardRecipe = {
|
|
|
187
206
|
|
|
188
207
|
const pool = await readLieuDitPool(banDir)
|
|
189
208
|
|
|
190
|
-
if (pool.length
|
|
209
|
+
if (!pool.length) {
|
|
191
210
|
throw new Error(`No clean lieu-dit rows found under ${banDir} — see ban/sdk/extract.ts's cleanLieuDit filter.`)
|
|
192
211
|
}
|
|
193
212
|
|
|
@@ -224,6 +243,7 @@ export const frLieuditRecipe: ShardRecipe = {
|
|
|
224
243
|
|
|
225
244
|
if (!raw) {
|
|
226
245
|
skipped++
|
|
246
|
+
|
|
227
247
|
continue
|
|
228
248
|
}
|
|
229
249
|
|
|
@@ -237,6 +257,7 @@ export const frLieuditRecipe: ShardRecipe = {
|
|
|
237
257
|
const form = forms[Math.floor(random() * forms.length)]!
|
|
238
258
|
raw = `${raw}, ${form}`
|
|
239
259
|
components.country = form
|
|
260
|
+
|
|
240
261
|
countryAppended++
|
|
241
262
|
}
|
|
242
263
|
|
|
@@ -247,6 +268,7 @@ export const frLieuditRecipe: ShardRecipe = {
|
|
|
247
268
|
locality: t.locality,
|
|
248
269
|
postcode: t.postcode ?? undefined,
|
|
249
270
|
})
|
|
271
|
+
|
|
250
272
|
const canonical: CanonicalRow = {
|
|
251
273
|
raw,
|
|
252
274
|
components,
|
|
@@ -257,13 +279,17 @@ export const frLieuditRecipe: ShardRecipe = {
|
|
|
257
279
|
corpus_version: "",
|
|
258
280
|
license: DEFAULT_LICENSE,
|
|
259
281
|
}
|
|
282
|
+
|
|
260
283
|
const aligned = alignRow(canonical)
|
|
261
284
|
|
|
262
285
|
if (aligned.kind !== "labeled" || !aligned.row) {
|
|
263
286
|
skipped++
|
|
287
|
+
|
|
264
288
|
continue
|
|
265
289
|
}
|
|
290
|
+
|
|
266
291
|
write(JSON.stringify({ ...aligned.row, synth_method: source, synth_base_id: null }) + "\n")
|
|
292
|
+
|
|
267
293
|
emitted++
|
|
268
294
|
}
|
|
269
295
|
|
|
@@ -39,16 +39,30 @@ import { alignRow } from "../align.ts"
|
|
|
39
39
|
import type { CanonicalRow } from "../types.ts"
|
|
40
40
|
import { makeMulberry32, type ShardRecipe } from "./scaffold.ts"
|
|
41
41
|
|
|
42
|
+
/* oxlint-disable sister-software/no-unnamed-threshold -- the bare decimals below are weighted-sampler
|
|
43
|
+
cutoffs, not thresholds: `const r = random()` followed by a cascade of `r < 0.4` branches IS the
|
|
44
|
+
output distribution, and reading the cascade top-to-bottom is how you see it. Naming each cutoff
|
|
45
|
+
would hide the distribution behind a wall of identifiers. Genuine thresholds in these files are
|
|
46
|
+
extracted as named constants above. */
|
|
47
|
+
|
|
42
48
|
const SOURCE = { zip: "/tmp/oa-cache/fr__countrywide.zip", csv: "fr/countrywide.csv" }
|
|
43
49
|
|
|
44
|
-
|
|
50
|
+
/**
|
|
51
|
+
* Ordinal suffixes used in French house numbers (BAN corpus), to cover the "8 bis" sub-mode.
|
|
52
|
+
*/
|
|
45
53
|
const ORDINAL_SUFFIXES: readonly string[] = ["bis", "ter", "quater"]
|
|
46
|
-
|
|
54
|
+
/**
|
|
55
|
+
* Probability that a row gets an ordinal suffix injected (matches the golden's ~10-15% rate).
|
|
56
|
+
*/
|
|
47
57
|
const ORDINAL_PROB = 0.12
|
|
48
|
-
|
|
58
|
+
/**
|
|
59
|
+
* Probability that a locality renders ALL-CAPS (another sub-mode: "SAINTE-LIVRADE-SUR-LOT").
|
|
60
|
+
*/
|
|
49
61
|
const ALLCAPS_PROB = 0.1
|
|
50
62
|
|
|
51
|
-
/**
|
|
63
|
+
/**
|
|
64
|
+
* A real FR tuple read out of the cached OA zip.
|
|
65
|
+
*/
|
|
52
66
|
interface FrTuple {
|
|
53
67
|
house_number: string
|
|
54
68
|
street: string
|
|
@@ -56,7 +70,9 @@ interface FrTuple {
|
|
|
56
70
|
postcode: string
|
|
57
71
|
}
|
|
58
72
|
|
|
59
|
-
/**
|
|
73
|
+
/**
|
|
74
|
+
* Minimal RFC-4180-ish splitter (handles quoted fields with doubled-quote escaping).
|
|
75
|
+
*/
|
|
60
76
|
function splitCSV(line: string): string[] {
|
|
61
77
|
const out: string[] = []
|
|
62
78
|
let cur = ""
|
|
@@ -69,6 +85,7 @@ function splitCSV(line: string): string[] {
|
|
|
69
85
|
if (c === '"') {
|
|
70
86
|
if (line[i + 1] === '"') {
|
|
71
87
|
cur += '"'
|
|
88
|
+
|
|
72
89
|
i++
|
|
73
90
|
} else {
|
|
74
91
|
inQ = false
|
|
@@ -85,6 +102,7 @@ function splitCSV(line: string): string[] {
|
|
|
85
102
|
cur += c
|
|
86
103
|
}
|
|
87
104
|
}
|
|
105
|
+
|
|
88
106
|
out.push(cur)
|
|
89
107
|
|
|
90
108
|
return out
|
|
@@ -96,7 +114,8 @@ function splitCSV(line: string): string[] {
|
|
|
96
114
|
* reversed-order rendering to be meaningful).
|
|
97
115
|
*/
|
|
98
116
|
function readTuples(limit: number): FrTuple[] {
|
|
99
|
-
const maxLines = Math.max(limit * 8,
|
|
117
|
+
const maxLines = Math.max(limit * 8, 40_000) + 1
|
|
118
|
+
|
|
100
119
|
const r = spawnSync("bash", ["-c", `unzip -p "${SOURCE.zip}" "${SOURCE.csv}" | head -n ${maxLines}`], {
|
|
101
120
|
maxBuffer: 1024 * 1024 * 1024,
|
|
102
121
|
encoding: "buffer",
|
|
@@ -107,15 +126,18 @@ function readTuples(limit: number): FrTuple[] {
|
|
|
107
126
|
|
|
108
127
|
return []
|
|
109
128
|
}
|
|
129
|
+
|
|
110
130
|
const lines = r.stdout.toString("utf8").split(/\r?\n/)
|
|
111
131
|
|
|
112
132
|
if (lines.length < 2) return []
|
|
113
133
|
const header = splitCSV(lines[0]!).map((h) => h.trim().toLowerCase())
|
|
114
134
|
const idx = (name: string): number => header.indexOf(name)
|
|
135
|
+
|
|
115
136
|
const iNum = idx("number"),
|
|
116
137
|
iStreet = idx("street"),
|
|
117
138
|
iCity = idx("city"),
|
|
118
139
|
iPost = idx("postcode")
|
|
140
|
+
|
|
119
141
|
const get = (cells: string[], i: number): string => (i >= 0 && i < cells.length ? (cells[i] ?? "").trim() : "")
|
|
120
142
|
const tuples: FrTuple[] = []
|
|
121
143
|
const seen = new Set<string>()
|
|
@@ -152,7 +174,9 @@ function maybeAddOrdinal(random: () => number, house_number: string): string {
|
|
|
152
174
|
return `${house_number} ${random() < 0.5 ? suffix : suffix.toUpperCase()}`
|
|
153
175
|
}
|
|
154
176
|
|
|
155
|
-
/**
|
|
177
|
+
/**
|
|
178
|
+
* Render a tuple in CANONICAL French order: "9 Rue de la Promenade, 01200 Villes".
|
|
179
|
+
*/
|
|
156
180
|
function renderCanonical(
|
|
157
181
|
hn: string,
|
|
158
182
|
street: string,
|
|
@@ -164,6 +188,10 @@ function renderCanonical(
|
|
|
164
188
|
return { raw, components: { house_number: hn, street, postcode, locality } }
|
|
165
189
|
}
|
|
166
190
|
|
|
191
|
+
/**
|
|
192
|
+
* Shard recipe registered with the corpus builder — see the file header for the parse behaviour it exists to exercise,
|
|
193
|
+
* and `description` below for the surface form it generates.
|
|
194
|
+
*/
|
|
167
195
|
export const frOrderRecipe: ShardRecipe = {
|
|
168
196
|
name: "fr-order",
|
|
169
197
|
description: "French reversed-order rows (#560): real OA FR tuples rendered canonical + 4 postcode-first variants",
|
|
@@ -182,11 +210,12 @@ export const frOrderRecipe: ShardRecipe = {
|
|
|
182
210
|
const reversedFraction = opts.reversedFraction ?? 0.5
|
|
183
211
|
|
|
184
212
|
// Over-read from the CSV so the dedup + filter pass can fill `count` rows.
|
|
185
|
-
const poolLimit = Math.max(count * 8,
|
|
213
|
+
const poolLimit = Math.max(count * 8, 40_000)
|
|
186
214
|
const pool = readTuples(poolLimit)
|
|
215
|
+
|
|
187
216
|
console.error(` ${SOURCE.csv}: ${pool.length} unique tuples (capped read)`)
|
|
188
217
|
|
|
189
|
-
if (pool.length
|
|
218
|
+
if (!pool.length) {
|
|
190
219
|
throw new Error("No FR tuples found — is /tmp/oa-cache/fr__countrywide.zip present?")
|
|
191
220
|
}
|
|
192
221
|
|
|
@@ -223,6 +252,7 @@ export const frOrderRecipe: ShardRecipe = {
|
|
|
223
252
|
// Variant D: postcode, HN+street, city (reversed top-to-bottom)
|
|
224
253
|
raw = `${postcode}, ${house_number} ${street}, ${locality}`
|
|
225
254
|
}
|
|
255
|
+
|
|
226
256
|
rendered = { raw, components: { house_number, street, postcode, locality } }
|
|
227
257
|
} else {
|
|
228
258
|
rendered = renderCanonical(house_number, street, postcode, locality)
|
|
@@ -235,13 +265,16 @@ export const frOrderRecipe: ShardRecipe = {
|
|
|
235
265
|
|
|
236
266
|
if (!componentValues.every((v) => raw.includes(v))) {
|
|
237
267
|
skipped++
|
|
268
|
+
|
|
238
269
|
continue
|
|
239
270
|
}
|
|
240
271
|
|
|
241
272
|
// --golden: emit per-locale-f1 eval rows ({raw, components, country:"FR"}).
|
|
242
273
|
if (opts.golden) {
|
|
243
274
|
write(JSON.stringify({ raw, components, country: "FR" }) + "\n")
|
|
275
|
+
|
|
244
276
|
emitted++
|
|
277
|
+
|
|
245
278
|
continue
|
|
246
279
|
}
|
|
247
280
|
|
|
@@ -251,6 +284,7 @@ export const frOrderRecipe: ShardRecipe = {
|
|
|
251
284
|
locality: components.locality,
|
|
252
285
|
postcode: components.postcode,
|
|
253
286
|
})
|
|
287
|
+
|
|
254
288
|
const canonical: CanonicalRow = {
|
|
255
289
|
raw,
|
|
256
290
|
components,
|
|
@@ -261,12 +295,15 @@ export const frOrderRecipe: ShardRecipe = {
|
|
|
261
295
|
corpus_version: "0.5.0",
|
|
262
296
|
license: "OpenAddresses FR countrywide tuples, rendered canonical + reversed-order — see ingest SOURCE",
|
|
263
297
|
}
|
|
298
|
+
|
|
264
299
|
const aligned = alignRow(canonical)
|
|
265
300
|
|
|
266
301
|
if (aligned.kind !== "labeled" || !aligned.row) {
|
|
267
302
|
skipped++
|
|
303
|
+
|
|
268
304
|
continue
|
|
269
305
|
}
|
|
306
|
+
|
|
270
307
|
write(
|
|
271
308
|
JSON.stringify({
|
|
272
309
|
...aligned.row,
|
|
@@ -275,6 +312,7 @@ export const frOrderRecipe: ShardRecipe = {
|
|
|
275
312
|
synth_base_id: null,
|
|
276
313
|
}) + "\n"
|
|
277
314
|
)
|
|
315
|
+
|
|
278
316
|
emitted++
|
|
279
317
|
}
|
|
280
318
|
|
|
@@ -31,15 +31,19 @@ interface GermanSource {
|
|
|
31
31
|
region: string
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
34
|
+
/**
|
|
35
|
+
* `region` is the Bundesland the source covers. OA's REGION column is empty for DE, but the region is implied by the
|
|
36
|
+
* per-state file — the international order needs it for the "City, Region Postcode" tail (v0.9.3 / #327). berlin.csv →
|
|
37
|
+
* Berlin (a city-state, region==locality); sn/statewide → Sachsen.
|
|
38
|
+
*/
|
|
37
39
|
const SOURCES: GermanSource[] = [
|
|
38
40
|
{ zip: "/tmp/oa-cache/de__berlin.zip", csv: "de/berlin.csv", region: "Berlin" },
|
|
39
41
|
{ zip: "/tmp/oa-cache/de__sn__statewide.zip", csv: "de/sn/statewide.csv", region: "Sachsen" },
|
|
40
42
|
]
|
|
41
43
|
|
|
42
|
-
/**
|
|
44
|
+
/**
|
|
45
|
+
* Minimal RFC-4180-ish splitter (handles quoted fields).
|
|
46
|
+
*/
|
|
43
47
|
function splitCSV(line: string): string[] {
|
|
44
48
|
const out: string[] = []
|
|
45
49
|
let cur = ""
|
|
@@ -52,6 +56,7 @@ function splitCSV(line: string): string[] {
|
|
|
52
56
|
if (c === '"') {
|
|
53
57
|
if (line[i + 1] === '"') {
|
|
54
58
|
cur += '"'
|
|
59
|
+
|
|
55
60
|
i++
|
|
56
61
|
} else {
|
|
57
62
|
inQ = false
|
|
@@ -68,12 +73,15 @@ function splitCSV(line: string): string[] {
|
|
|
68
73
|
cur += c
|
|
69
74
|
}
|
|
70
75
|
}
|
|
76
|
+
|
|
71
77
|
out.push(cur)
|
|
72
78
|
|
|
73
79
|
return out
|
|
74
80
|
}
|
|
75
81
|
|
|
76
|
-
/**
|
|
82
|
+
/**
|
|
83
|
+
* Stream real German tuples out of a cached OA zip (buffered `unzip -p`).
|
|
84
|
+
*/
|
|
77
85
|
function readGermanTuples(source: GermanSource): LocaleBaseTuple[] {
|
|
78
86
|
const r = spawnSync("unzip", ["-p", source.zip, source.csv], { maxBuffer: 1024 * 1024 * 1024, encoding: "buffer" })
|
|
79
87
|
|
|
@@ -82,16 +90,19 @@ function readGermanTuples(source: GermanSource): LocaleBaseTuple[] {
|
|
|
82
90
|
|
|
83
91
|
return []
|
|
84
92
|
}
|
|
93
|
+
|
|
85
94
|
const lines = r.stdout.toString("utf8").split(/\r?\n/)
|
|
86
95
|
|
|
87
96
|
if (lines.length < 2) return []
|
|
88
97
|
const header = splitCSV(lines[0]!).map((h) => h.trim().toLowerCase())
|
|
89
98
|
const idx = (name: string): number => header.indexOf(name)
|
|
99
|
+
|
|
90
100
|
const iNum = idx("number"),
|
|
91
101
|
iStreet = idx("street"),
|
|
92
102
|
iCity = idx("city"),
|
|
93
103
|
iRegion = idx("region"),
|
|
94
104
|
iPost = idx("postcode")
|
|
105
|
+
|
|
95
106
|
const get = (cells: string[], i: number): string => (i >= 0 && i < cells.length ? (cells[i] ?? "").trim() : "")
|
|
96
107
|
const tuples: LocaleBaseTuple[] = []
|
|
97
108
|
const seen = new Set<string>()
|
|
@@ -119,6 +130,10 @@ function readGermanTuples(source: GermanSource): LocaleBaseTuple[] {
|
|
|
119
130
|
return tuples
|
|
120
131
|
}
|
|
121
132
|
|
|
133
|
+
/**
|
|
134
|
+
* Shard recipe registered with the corpus builder — see the file header for the parse behaviour it exists to exercise,
|
|
135
|
+
* and `description` below for the surface form it generates.
|
|
136
|
+
*/
|
|
122
137
|
export const germanRecipe: ShardRecipe = {
|
|
123
138
|
name: "german",
|
|
124
139
|
description: "German coverage rows from real OA tuples (Berlin/Saxony), both orders → synthesizeGermanRow",
|
|
@@ -133,6 +148,7 @@ export const germanRecipe: ShardRecipe = {
|
|
|
133
148
|
if (!(intlFraction >= 0 && intlFraction <= 1)) {
|
|
134
149
|
throw new Error(`--intl-fraction must be in [0, 1], got ${intlFraction}`)
|
|
135
150
|
}
|
|
151
|
+
|
|
136
152
|
const count = opts.count ?? 4000
|
|
137
153
|
|
|
138
154
|
// Pool real tuples from every German source, then sample `count` rows from it.
|
|
@@ -140,6 +156,7 @@ export const germanRecipe: ShardRecipe = {
|
|
|
140
156
|
|
|
141
157
|
for (const s of SOURCES) {
|
|
142
158
|
const t = readGermanTuples(s)
|
|
159
|
+
|
|
143
160
|
console.error(` ${s.csv}: ${t.length} unique tuples`)
|
|
144
161
|
|
|
145
162
|
for (const x of t) {
|
|
@@ -147,7 +164,7 @@ export const germanRecipe: ShardRecipe = {
|
|
|
147
164
|
} // NOT pool.push(...t) — spreading ~840K args overflows the stack
|
|
148
165
|
}
|
|
149
166
|
|
|
150
|
-
if (pool.length
|
|
167
|
+
if (!pool.length) {
|
|
151
168
|
throw new Error("No German tuples found — are the cached zips present in /tmp/oa-cache?")
|
|
152
169
|
}
|
|
153
170
|
|
|
@@ -165,6 +182,7 @@ export const germanRecipe: ShardRecipe = {
|
|
|
165
182
|
|
|
166
183
|
if (!synth) {
|
|
167
184
|
skipped++
|
|
185
|
+
|
|
168
186
|
continue
|
|
169
187
|
}
|
|
170
188
|
|
|
@@ -172,15 +190,19 @@ export const germanRecipe: ShardRecipe = {
|
|
|
172
190
|
// rides along so the eval can stratify native vs international.
|
|
173
191
|
if (opts.golden) {
|
|
174
192
|
write(JSON.stringify({ raw: synth.raw, components: synth.components, country: "DE", order }) + "\n")
|
|
193
|
+
|
|
175
194
|
emitted++
|
|
195
|
+
|
|
176
196
|
continue
|
|
177
197
|
}
|
|
198
|
+
|
|
178
199
|
const sourceID = stableSourceID(source, {
|
|
179
200
|
street: synth.components.street,
|
|
180
201
|
house_number: synth.components.house_number,
|
|
181
202
|
locality: synth.components.locality,
|
|
182
203
|
postcode: synth.components.postcode,
|
|
183
204
|
})
|
|
205
|
+
|
|
184
206
|
const canonical = {
|
|
185
207
|
raw: synth.raw,
|
|
186
208
|
components: synth.components,
|
|
@@ -191,13 +213,17 @@ export const germanRecipe: ShardRecipe = {
|
|
|
191
213
|
corpus_version: "0.4.0",
|
|
192
214
|
license: `OpenAddresses DE (Berlin/Saxony) tuples, rendered ${order}-order — see ingest SOURCES`,
|
|
193
215
|
}
|
|
216
|
+
|
|
194
217
|
const aligned = alignRow(canonical as Parameters<typeof alignRow>[0])
|
|
195
218
|
|
|
196
219
|
if (aligned.kind !== "labeled" || !aligned.row) {
|
|
197
220
|
skipped++
|
|
221
|
+
|
|
198
222
|
continue
|
|
199
223
|
}
|
|
224
|
+
|
|
200
225
|
write(JSON.stringify({ ...aligned.row, synth_method: "german", synth_order: order, synth_base_id: null }) + "\n")
|
|
226
|
+
|
|
201
227
|
emitted++
|
|
202
228
|
}
|
|
203
229
|
|
|
@@ -15,6 +15,10 @@ import { alignAndWrite, makeLcg, readTuples, shardSourceID, type ShardRecipe } f
|
|
|
15
15
|
|
|
16
16
|
const LICENSE = "Synthetic — derived from CC-BY / public-domain input tuples"
|
|
17
17
|
|
|
18
|
+
/**
|
|
19
|
+
* Shard recipe registered with the corpus builder — see the file header for the parse behaviour it exists to exercise,
|
|
20
|
+
* and `description` below for the surface form it generates.
|
|
21
|
+
*/
|
|
18
22
|
export const houseVenueRecipe: ShardRecipe = {
|
|
19
23
|
name: "house-venue",
|
|
20
24
|
description: "House_number+venue co-occurrence rows: tuples → synthesizeHouseVenueRow → aligned LabeledRow",
|
|
@@ -33,6 +37,7 @@ export const houseVenueRecipe: ShardRecipe = {
|
|
|
33
37
|
|
|
34
38
|
if (!tuple.locality || !tuple.region || !tuple.postcode || !tuple.country) {
|
|
35
39
|
skipped++
|
|
40
|
+
|
|
36
41
|
continue
|
|
37
42
|
}
|
|
38
43
|
|
|
@@ -41,8 +46,10 @@ export const houseVenueRecipe: ShardRecipe = {
|
|
|
41
46
|
|
|
42
47
|
if (!synth) {
|
|
43
48
|
skipped++
|
|
49
|
+
|
|
44
50
|
continue
|
|
45
51
|
}
|
|
52
|
+
|
|
46
53
|
const ok = alignAndWrite(
|
|
47
54
|
write,
|
|
48
55
|
{
|
|
@@ -36,7 +36,9 @@ import { unitRecipe } from "./unit.ts"
|
|
|
36
36
|
|
|
37
37
|
export * from "./scaffold.ts"
|
|
38
38
|
|
|
39
|
-
/**
|
|
39
|
+
/**
|
|
40
|
+
* Every registered recipe, in display order.
|
|
41
|
+
*/
|
|
40
42
|
const RECIPES: readonly ShardRecipe[] = [
|
|
41
43
|
streetRecipe,
|
|
42
44
|
streetBareRecipe,
|
|
@@ -64,15 +66,21 @@ const RECIPES: readonly ShardRecipe[] = [
|
|
|
64
66
|
anchorAbsorptionRecipe,
|
|
65
67
|
]
|
|
66
68
|
|
|
67
|
-
/**
|
|
69
|
+
/**
|
|
70
|
+
* Recipe name → recipe.
|
|
71
|
+
*/
|
|
68
72
|
export const SHARD_RECIPES: ReadonlyMap<string, ShardRecipe> = new Map(RECIPES.map((r) => [r.name, r]))
|
|
69
73
|
|
|
70
|
-
/**
|
|
74
|
+
/**
|
|
75
|
+
* Look up a recipe by its `<recipe>` name.
|
|
76
|
+
*/
|
|
71
77
|
export function getShardRecipe(name: string): ShardRecipe | undefined {
|
|
72
78
|
return SHARD_RECIPES.get(name)
|
|
73
79
|
}
|
|
74
80
|
|
|
75
|
-
/**
|
|
81
|
+
/**
|
|
82
|
+
* All recipes (for `--list` / help).
|
|
83
|
+
*/
|
|
76
84
|
export function listShardRecipes(): readonly ShardRecipe[] {
|
|
77
85
|
return RECIPES
|
|
78
86
|
}
|