Korea resolves to a coordinate. The name is another story.
Date: 2026-06-05 Scope: the second CJK localelocaleThe combination of language and country an address comes from. en-US and fr-FR are the locales Mailwoman ships weights for. — South Korea coarse resolution. An inverted build (point-primary, not name-primary) feeding the same resolverresolverThe component that converts parsed address components (locality, region, postcode) into coordinates by looking them up in the gazetteer. The resolver ranks candidates by name match, population, and proximity, and returns the best-matching place with its centroid or polygon. strategy, why it lands provinceregionThe first-level administrative subdivision of a country — a US state, a French region, a province. The component between country and locality. + sub-kilometre but only 26% name-confirmed, and where the ceiling actually is.
Japan landed at 94% name-matched (the CJK arena writeup). We pointed the same machinery at Korea expecting a re-run, and Korea handed back a different shape of data — so the build had to invert, and the honest result is a partial: the coordinate and the provinceregionThe first-level administrative subdivision of a country — a US state, a French region, a province. The component between country and locality. come out clean, the administrative name mostly doesn't, and the reason is a gap in the gazetteergazetteerA geographical index that maps place names and postcodes to real-world coordinates. Mailwoman uses a custom-built Who's On First (WOF) SQLite database as its gazetteer — the 'atlas' half of the grammar/atlas architecture., not in the approach.
The data inverts, so the build inverts
Japan's build is name-primary: ask Japan Post (KEN_ALL) for the municipalitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy. name behind a postcodepostcodeThe country-specific postal code (US ZIP, French code postal, etc.). Mailwoman handles postcode parsing entirely by rule classifier — a regex problem, not an ML one., then find that name in WOFWOF (Who's On First). An open-source gazetteer of places maintained by Mapzen/whosonfirst. Mailwoman builds a custom SQLite database from WOF GeoJSON repos, extended with postcode data, importance scores, and coincident-role relations.. It works because KEN_ALL ships a romanized edition (SAPPORO SHI CHUO KU) in the same alphabet as WOFWOF (Who's On First). An open-source gazetteer of places maintained by Mapzen/whosonfirst. Mailwoman builds a custom SQLite database from WOF GeoJSON repos, extended with postcode data, importance scores, and coincident-role relations.'s romanized place namestoponymA proper name for a geographic place..
Korea hands you the opposite. The GeoNamesGeoNamesA free global gazetteer combining administrative, postal, and POI data across 200+ countries. Supplements Who's On First for postcode centroids and places where WOF has gaps. postal file for KR already carries postcode → (place_name, province, latitude, longitude) in one source — no separate postal-authority fetch — but the names are Hangul (추자면), while WOFWOF (Who's On First). An open-source gazetteer of places maintained by Mapzen/whosonfirst. Mailwoman builds a custom SQLite database from WOF GeoJSON repos, extended with postcode data, importance scores, and coincident-role relations.'s spr.name for Korea is romanized (Chuja-myeon, except it isn't even that; it's whatever transliterationtransliterationConverting a name from one writing system to another while preserving pronunciation (Cyrillic → Latin, for instance). Needed for multilingual address handling and corpus synthesis. WOFWOF (Who's On First). An open-source gazetteer of places maintained by Mapzen/whosonfirst. Mailwoman builds a custom SQLite database from WOF GeoJSON repos, extended with postcode data, importance scores, and coincident-role relations. happened to file). The alphabets don't line up, so name-first matching against spr.name is a non-starter. That was the original "KR is blocked" read.
It's only half true. WOFWOF (Who's On First). An open-source gazetteer of places maintained by Mapzen/whosonfirst. Mailwoman builds a custom SQLite database from WOF GeoJSON repos, extended with postcode data, importance scores, and coincident-role relations.'s names table does carry Hangul — 13,120 kor entries plus ~7,500 Hangul-bearing und (undetermined-language) names — so a Hangul-to-Hangul join is possible. And every postcodepostcodeThe country-specific postal code (US ZIP, French code postal, etc.). Mailwoman handles postcode parsing entirely by rule classifier — a regex problem, not an ML one. comes with a coordinate. So Korea's build is point-primary: take the postcodepostcodeThe country-specific postal code (US ZIP, French code postal, etc.). Mailwoman handles postcode parsing entirely by rule classifier — a regex problem, not an ML one.'s GeoNamesGeoNamesA free global gazetteer combining administrative, postal, and POI data across 200+ countries. Supplements Who's On First for postcode centroids and places where WOF has gaps. coordinate, find the nearest WOFWOF (Who's On First). An open-source gazetteer of places maintained by Mapzen/whosonfirst. Mailwoman builds a custom SQLite database from WOF GeoJSON repos, extended with postcode data, importance scores, and coincident-role relations. localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy., and use the Hangul name as a confirmation signal where it exists. Different first move, same destination — it writes the identical postcode_locality table the postcode_area_resolution strategy already reads. That's the part that generalizes: one strategy, a second build shaped to the countrycountryThe top-level address component (an ISO country). Closed-vocabulary, so it is best handled by a deterministic matcher feeding a proposal rather than a retrained model head.'s data.
What lands cleanly: the coordinate and the province
WOFWOF (Who's On First). An open-source gazetteer of places maintained by Mapzen/whosonfirst. Mailwoman builds a custom SQLite database from WOF GeoJSON repos, extended with postcode data, importance scores, and coincident-role relations.'s Korean localities are dense — 21,139 of them, essentially every 동/리 (dong/ri) — so the nearest one to a postcodepostcodeThe country-specific postal code (US ZIP, French code postal, etc.). Mailwoman handles postcode parsing entirely by rule classifier — a regex problem, not an ML one. point is p50 0.96 km, p90 2.36 km away. Coordinate resolution is excellent and total: 34,244 of 34,249 postcodespostcodeThe country-specific postal code (US ZIP, French code postal, etc.). Mailwoman handles postcode parsing entirely by rule classifier — a regex problem, not an ML one. (100%) resolve to a localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy. point inside a couple of kilometres.
The provinceregionThe first-level administrative subdivision of a country — a US state, a French region, a province. The component between country and locality. is free and exact. GeoNamesGeoNamesA free global gazetteer combining administrative, postal, and POI data across 200+ countries. Supplements Who's On First for postcode centroids and places where WOF has gaps.' admin1 (제주특별자치도, 강원도, …) matches WOFWOF (Who's On First). An open-source gazetteer of places maintained by Mapzen/whosonfirst. Mailwoman builds a custom SQLite database from WOF GeoJSON repos, extended with postcode data, importance scores, and coincident-role relations.'s regionregionThe first-level administrative subdivision of a country — a US state, a French region, a province. The component between country and locality. Hangul names 17/17, 100% — provincesregionThe first-level administrative subdivision of a country — a US state, a French region, a province. The component between country and locality. are large and uniquely named, so there's no ambiguity to lose. Any address the parser hands us, we can anchor to the right provinceregionThe first-level administrative subdivision of a country — a US state, a French region, a province. The component between country and locality. and a sub-kilometre coordinate with full coveragecoverageThe fraction of a population or region for which a data source has real, non-placeholder entries — e.g. 47% rooftop coverage on Texas addresses. Distinct from accuracy on the rows that are present.. For a geocoder that's already a usable coarse fix.
What doesn't: the administrative name (26%, and here's why)
The name confirmation only fires for 9,020 / 34,249 postcodespostcodeThe country-specific postal code (US ZIP, French code postal, etc.). Mailwoman handles postcode parsing entirely by rule classifier — a regex problem, not an ML one. — 26.3%. Japan was 94.9%. The gap is entirely a data-coveragecoverageThe fraction of a population or region for which a data source has real, non-placeholder entries — e.g. 47% rooftop coverage on Texas addresses. Distinct from accuracy on the rows that are present. story, and it has two parts worth naming because they tell you where to dig next.
Granularity mismatch. GeoNamesGeoNamesA free global gazetteer combining administrative, postal, and POI data across 200+ countries. Supplements Who's On First for postcode centroids and places where WOF has gaps.' place_name is at the eup/myeon/dong level — 추자면 (Chuja-myeon). WOFWOF (Who's On First). An open-source gazetteer of places maintained by Mapzen/whosonfirst. Mailwoman builds a custom SQLite database from WOF GeoJSON repos, extended with postcode data, importance scores, and coincident-role relations.'s localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy. layerlayerOne transformer block — attention plus a feed-forward network, with normalization and residual connections — applied to every position. Stacking layers lets the model build up richer representations; Mailwoman's encoder has 6. is finer, at the ri/village level — so the nearest point to that postcodepostcodeThe country-specific postal code (US ZIP, French code postal, etc.). Mailwoman handles postcode parsing entirely by rule classifier — a regex problem, not an ML one. is "Mung," a hamlet inside Chuja-myeon, spatially dead-on but nominally a different unitunitA subdivision of a building — apartment, suite, floor — that refines a street address. Mailwoman's unit component; a designator plus identifier forms a subpremise.. The two sources are both right and don't agree, because they're describing different rungs of the ladder. (This is also why the name-confirmed tiertierInternal versioning of which label classes the model emits. Tier 1 is the coarse components (country, region, locality, postcode); Tier 2 adds venue, street, house_number; Tier 3 (future) would add attention, po_box, and POI venue subtyping. Historically called 'Stage 1/2/3' before the runtime-pipeline naming made that ambiguous. averages 4.8 km while the point tiertierInternal versioning of which label classes the model emits. Tier 1 is the coarse components (country, region, locality, postcode); Tier 2 adds venue, street, house_number; Tier 3 (future) would add attention, po_box, and POI venue subtyping. Historically called 'Stage 1/2/3' before the runtime-pipeline naming made that ambiguous. averages 1.2 km: confirming the name pulls the answer up to the coarser, correctly-named unitunitA subdivision of a building — apartment, suite, floor — that refines a street address. Mailwoman's unit component; a designator plus identifier forms a subpremise., which sits a little farther from the postcodepostcodeThe country-specific postal code (US ZIP, French code postal, etc.). Mailwoman handles postcode parsing entirely by rule classifier — a regex problem, not an ML one. centroid. That's the trade you want from a coarse resolverresolverThe component that converts parsed address components (locality, region, postcode) into coordinates by looking them up in the gazetteer. The resolver ranks candidates by name match, population, and proximity, and returns the best-matching place with its centroid or polygon., so the build prefers it — is_containing=1.)
Missing 구 districts. The single largest miss bucket is 구 (gu, urban districts) — 9,515 postcodespostcodeThe country-specific postal code (US ZIP, French code postal, etc.). Mailwoman handles postcode parsing entirely by rule classifier — a regex problem, not an ML one., the Gangnam-gu / Haeundae-gu level that dominates Seoul and Busan addressing. WOFWOF (Who's On First). An open-source gazetteer of places maintained by Mapzen/whosonfirst. Mailwoman builds a custom SQLite database from WOF GeoJSON repos, extended with postcode data, importance scores, and coincident-role relations. KR simply doesn't carry these as named localities, so there's nothing to confirm against. The most address-dense slice of the countrycountryThe top-level address component (an ISO country). Closed-vocabulary, so it is best handled by a deterministic matcher feeding a proposal rather than a retrained model head. is the slice WOFWOF (Who's On First). An open-source gazetteer of places maintained by Mapzen/whosonfirst. Mailwoman builds a custom SQLite database from WOF GeoJSON repos, extended with postcode data, importance scores, and coincident-role relations. is thinnest on.
One bug worth writing down
The first build reported 56% name-confirmed — and it was wrong. Korean place namestoponymA proper name for a geographic place. repeat heavily across the countrycountryThe top-level address component (an ISO country). Closed-vocabulary, so it is best handled by a deterministic matcher feeding a proposal rather than a retrained model head. (homonymous villages), and the matcher was finding name matches globally and then taking the nearest homonym. The "nearest" 신촌 can be in another provinceregionThe first-level administrative subdivision of a country — a US state, a French region, a province. The component between country and locality.; the name-confirmed tiertierInternal versioning of which label classes the model emits. Tier 1 is the coarse components (country, region, locality, postcode); Tier 2 adds venue, street, house_number; Tier 3 (future) would add attention, po_box, and POI venue subtyping. Historically called 'Stage 1/2/3' before the runtime-pipeline naming made that ambiguous. came out at 71 km mean, 537 km max. The fix is the same proximity constraint Japan's builder already used: a name only confirms if the matched localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy. is also within the search radius. That dropped the tiertierInternal versioning of which label classes the model emits. Tier 1 is the coarse components (country, region, locality, postcode); Tier 2 adds venue, street, house_number; Tier 3 (future) would add attention, po_box, and POI venue subtyping. Historically called 'Stage 1/2/3' before the runtime-pipeline naming made that ambiguous. to its honest 26% — and to a 4.8 km mean, 20 km max. Two signals have to agree; one signal pretending to be two is worse than the point alone.
Verdict: a working coarse resolver, an honest name ceiling
Korea is a partial, and labelling it anything else would be dishonest. ProvinceregionThe first-level administrative subdivision of a country — a US state, a French region, a province. The component between country and locality. and coordinate resolve at 100%; the administrative name resolves at 26%, capped by WOFWOF (Who's On First). An open-source gazetteer of places maintained by Mapzen/whosonfirst. Mailwoman builds a custom SQLite database from WOF GeoJSON repos, extended with postcode data, importance scores, and coincident-role relations. KR's Hangul-name coveragecoverageThe fraction of a population or region for which a data source has real, non-placeholder entries — e.g. 47% rooftop coverage on Texas addresses. Distinct from accuracy on the rows that are present. — the ri-granularity offset and the absent 구 districts. The architecture carried over intact (point-primary build, same strategy, no resolverresolverThe component that converts parsed address components (locality, region, postcode) into coordinates by looking them up in the gazetteer. The resolver ranks candidates by name match, population, and proximity, and returns the best-matching place with its centroid or polygon. code changed), which is what the "less special" mandate was really testing. What it can't manufacture is admin names WOFWOF (Who's On First). An open-source gazetteer of places maintained by Mapzen/whosonfirst. Mailwoman builds a custom SQLite database from WOF GeoJSON repos, extended with postcode data, importance scores, and coincident-role relations. doesn't hold.
The path to a Japan-grade KR name tiertierInternal versioning of which label classes the model emits. Tier 1 is the coarse components (country, region, locality, postcode); Tier 2 adds venue, street, house_number; Tier 3 (future) would add attention, po_box, and POI venue subtyping. Historically called 'Stage 1/2/3' before the runtime-pipeline naming made that ambiguous. runs through a better source — Korea's 도로명주소 (Juso) road-name address database, which carries the 구/동 names natively. It's key-walled behind a government API, so it's a deliberate acquisition, not a scrape. Until then, Korea ships as an experimental point-primary table: trustworthy for provinceregionThe first-level administrative subdivision of a country — a US state, a French region, a province. The component between country and locality. and coordinate, explicit about the 26% name tiertierInternal versioning of which label classes the model emits. Tier 1 is the coarse components (country, region, locality, postcode); Tier 2 adds venue, street, house_number; Tier 3 (future) would add attention, po_box, and POI venue subtyping. Historically called 'Stage 1/2/3' before the runtime-pipeline naming made that ambiguous.. It is not promoted into the default resolverresolverThe component that converts parsed address components (locality, region, postcode) into coordinates by looking them up in the gazetteer. The resolver ranks candidates by name match, population, and proximity, and returns the best-matching place with its centroid or polygon. bundle.
Taiwan is the next CJK localelocaleThe combination of language and country an address comes from. en-US and fr-FR are the locales Mailwoman ships weights for. and a harder start: no GeoNamesGeoNamesA free global gazetteer combining administrative, postal, and POI data across 200+ countries. Supplements Who's On First for postcode centroids and places where WOF has gaps. postal file at all, and admin-tw.db isn't even built yet (only the WOFWOF (Who's On First). An open-source gazetteer of places maintained by Mapzen/whosonfirst. Mailwoman builds a custom SQLite database from WOF GeoJSON repos, extended with postcode data, importance scores, and coincident-role relations. repo is on disk). That one begins one rung lower, by building the admin DB.
Numbers
| signal | KR (point-primary) | JP (name-primary) |
|---|---|---|
| postcodespostcodeThe country-specific postal code (US ZIP, French code postal, etc.). Mailwoman handles postcode parsing entirely by rule classifier — a regex problem, not an ML one. | 34,249 | 124,788 |
| resolved (coordinate) | 100.0% | — |
| provinceregionThe first-level administrative subdivision of a country — a US state, a French region, a province. The component between country and locality. match (admin1→regionregionThe first-level administrative subdivision of a country — a US state, a French region, a province. The component between country and locality.) | 100.0% | — |
| name-confirmed (precise tiertierInternal versioning of which label classes the model emits. Tier 1 is the coarse components (country, region, locality, postcode); Tier 2 adds venue, street, house_number; Tier 3 (future) would add attention, po_box, and POI venue subtyping. Historically called 'Stage 1/2/3' before the runtime-pipeline naming made that ambiguous.) | 26.3% | 94.9% |
| dist p50 / p90 (km) | 0.96 / 2.36 | — |
| build | GeoNamesGeoNamesA free global gazetteer combining administrative, postal, and POI data across 200+ countries. Supplements Who's On First for postcode centroids and places where WOF has gaps. postal + WOFWOF (Who's On First). An open-source gazetteer of places maintained by Mapzen/whosonfirst. Mailwoman builds a custom SQLite database from WOF GeoJSON repos, extended with postcode data, importance scores, and coincident-role relations. Hangul names | KEN_ALL romaji + GeoNamesGeoNamesA free global gazetteer combining administrative, postal, and POI data across 200+ countries. Supplements Who's On First for postcode centroids and places where WOF has gaps. points |
Build: scripts/build-postcode-locality-kr.py. Source: GeoNamesGeoNamesA free global gazetteer combining administrative, postal, and POI data across 200+ countries. Supplements Who's On First for postcode centroids and places where WOF has gaps. postal KR + custom admin-kr.db (whosonfirst-data-admin-kr), built from source — no prebuilt dumps.