Dit artikel is nog niet vertaald naar het Nederlands — je leest het origineel in het English. Ook beschikbaar in:Deutsch, English, Українська
Serbian Scores 0.0000 Against Itself: Four Ways Cross-Country Name Comparison Fails
We hold Serbian names twice — once in Cyrillic (sr_RS), once in Latin (sr_Latn_RS). Same country, same language, same names, same 1,143 given-name entries and 958 surname entries, identical weight totals. One file is a transliteration of the other.
Measured similarity between them:
| Metric | Score |
|---|---|
| First-name Jaccard | 0.0000 |
| First-name cosine | 0.0000 |
| Surname Jaccard | 0.0000 |
| Surname cosine | 0.0000 |
| Shared entries | 0 |
Perfect dissimilarity between a dataset and a copy of itself. If a comparison method cannot recognise Serbian as Serbian, nothing else it says about Greek and Korean is worth reading.
We ran every pair of the 63 locales the corpus held when the run was made — 1,953 comparisons — and this article is the failure catalogue that came out of it. The findings themselves are in Which Countries Share Names?; this is the part about why most of the matrix is unusable and how to tell which part.
The four failure modes, in order of how badly they burned us:
- Different scripts destroy overlap — half the matrix is zeros that mean nothing
- Shared scripts inflate overlap — Han characters make Japan look Taiwanese
- Overlap is directional — one comparison, two correct and contradictory answers
- Weight scales are not commensurable — 52 of our 64 locales still use relative surname weights
Failure 1: the script barrier
Of 1,953 locale pairs, 981 share zero given names and 1,287 share zero surnames. Half to two-thirds of the entire matrix consists of zeros.
Almost none of them are findings.
Seven locales in our set are the sole occupant of their writing system and consequently share nothing with anyone: Bengali, Greek, Hebrew, Armenian, Georgian, Korean and Nepali. Each returns 0.0% overlap against all 62 others. Read literally, Greek names resemble Ukrainian names exactly as little as they resemble Japanese names — which is nonsense, since Greek and Ukrainian naming share centuries of Orthodox Christian onomastics and a large stock of the same saints' names in different alphabets.
The corrosive part is that this failure is silent and asymmetric in its damage. It never inflates a score, only deflates it, so it looks like caution. And a zero is indistinguishable from a real finding unless you already know the writing systems involved.
The consequence for publication is direct: you cannot publish a "most distant pairs" ranking from raw string comparison. We didn't. The distance ranking our matrix produces is a ranking of alphabets wearing a ranking of naming systems as a costume.
The control that catches it. Put a known-identical pair in your data and check that your method scores it as identical. Serbian in two scripts was ours, by accident. Without it we would have assumed the zeros were meaningful, because every individual zero looked defensible.
Partial remedies, all imperfect. Unicode normalisation and diacritic folding help within a script (Müller/Mueller, Yılmaz/Yilmaz). Transliteration to a common script helps across related ones but is lossy and not round-trippable: Serbian Cyrillic ↔ Latin is one of the few genuinely bijective cases, while Greek, Arabic and Han are not. Phonetic keys (Soundex, Metaphone) are English-shaped and mislead elsewhere. We chose to run strict string matching and label the resulting zeros as unusable, rather than run a transliteration layer and quietly generate different, harder-to-audit errors.
Failure 2: shared scripts inflate overlap
The inverse problem, and the more dangerous one, because it produces impressive numbers instead of empty ones.
Japan's surname corpus shares 339 entries with Taiwan's — covering 75.4% of Japanese surname mass. Taken at face value: Japan and Taiwan have three-quarters the same surnames.
They do not. Here is what those shared entries actually weigh:
| Surname | Share of Taiwan | Share of Japan |
|---|---|---|
| 佐藤 Satō | 0.0003% | 2.609% |
| 鈴木 Suzuki | 0.0002% | 2.426% |
| 高橋 Takahashi | 0.0002% | 1.905% |
| 田中 Tanaka | 0.0001% | 1.826% |
| 陳 Chen | 11.208% | absent |
佐藤 genuinely appears in Taiwan's registry. Taiwan's Ministry of the Interior publishes with no suppression threshold — every surname with at least one bearer is listed — and Taiwan has residents with Japanese surnames from the 1895–1945 colonial period and from later naturalisation. The entry is real. It is also 0.0003% of Taiwan.
The 75.4% is arithmetically correct and substantively worthless. It says: most Japanese people have a surname that at least one person in Taiwan also has. That is a statement about the size of Taiwan's unsuppressed long tail, not about Japanese and Taiwanese naming.
The two writing systems share a character inventory inherited from Classical Chinese. Any two Han-script corpora will overlap for that reason alone, and single-character surnames like 林 and 王 are common in both languages independently.
The check. When overlap looks high, inspect the weights on both sides, not the count of shared entries. If the shared names are heavy on one side and near-zero on the other, you have found a script coincidence.
Failure 3: overlap is directional
Similarity is symmetric; overlap is not. Conflating them is the most common error in name-comparison writing, and it is the one that produces confidently wrong sentences.
"What share of A's name mass consists of names that also exist in B" has two answers:
| Pair | A → B | B → A | Shared entries |
|---|---|---|---|
| Japan → Taiwan (surnames) | 75.4% | 8.4% | 339 |
| Turkey → Germany (surnames) | 17.1% | 2.0% | 24 |
| Vietnam → Czechia (given) | 18.1% | 0.5% | 21 |
| Denmark → Sweden (surnames) | 63.2% | 18.3% | — |
| Spain → Portugal (surnames) | 9.2% | 65.9% | — |
| Canada-fr → Canada-en | 86.0% | 47.5% | 358 |
| Portugal → Brazil | 90.3% | 73.0% | 198 |
Turkey and Germany share 24 surnames. In the Turkish direction those 24 carry 17.1% of the mass, because they are Turkey's biggest names — Yılmaz, Kaya, Demir, Çelik, Yıldız, Şahin, Öztürk. In the German direction the same 24 names carry 2.0%. Both numbers describe the same reality — Turkish surnames entered German registries at percentage-level frequency after the 1961 recruitment agreement without displacing anything — and either number alone misrepresents it.
Spain and Portugal is the pair where direction flips the headline. Portuguese surname mass is 65.9% present in Spain; Spanish mass is 9.2% present in Portugal. Portugal's repertoire is small and concentrated and largely a subset of the larger Iberian pool; Spain's is vast and mostly outside Portugal's. "Spain and Portugal are 65.9% similar" and "Spain and Portugal are 9.2% similar" are both defensible sentences from the same computation.
The rule. Report both directions or report a symmetric metric. Never report one direction as though it were the relationship.
Failure 4: weights are not commensurable across locales
Our corpora carry frequency weights, and it is tempting to compare them. Do not.
Auditing every locale's surname file, as the corpus stood on 18 July 2026:
| Scale type | Locales | Max weight | Sum of weights |
|---|---|---|---|
| Real head counts | 2 | 2,618,994 (zh_TW) | 23,367,536 |
| Relative integers 1–255 | 61 | 20 to 255 | ~1,000 to ~19,000 |
At that point only zh_TW and vi_VN carried raw counts. Taiwan's weights sum to 23,367,536 — Taiwan's registered population — and 陳 weighs 2,618,994. Every other locale used a relative scale whose ceiling varied: 20 for Indonesia, 24 for Belgian Dutch, 40 for Germany and Czechia and Poland, 100 for Britain and Japan, 255 for Spain, France, Russia and Sweden.
Ten more surname corpora have been rebuilt from registries since. Re-counted on 22 July 2026, the corpus holds 64 locales, 12 of them registry-derived and 52 still on relative scales — so the failure below now applies to 52 locales rather than 61. It has shrunk; it has not gone away, and it has grown a second edge, described in the methodology note at the end.
Consequences:
- Raw weights are meaningless across locales. Weight 40 is the top of the German scale and unremarkable in the Spanish one. Every cross-locale computation must normalise first — we use L1 normalisation, so each corpus sums to 1 before any comparison.
- Normalisation removes scale but not depth. A corpus with a 255 ceiling can express a steeper head than one capped at 20. Some of the residual difference between locales after normalising is calibration depth, not naming reality.
- Jaccard is immune but has its own bias. Being set-based, it ignores weights entirely — and therefore penalises depth asymmetry instead. Our corpora range from 184 entries (Korean surnames) to 3,830 (Swedish given names). A deep corpus paired with a shallow one scores low because the union is large, regardless of how well they match.
The two biases pull in opposite directions, which is the only reason running both metrics is worth the effort. The French-language cluster scores so cleanly in our matrix partly because, when the matrix was run, all four French corpora had exactly 798 given-name entries — depth-matched by construction, so Jaccard had nothing to penalise. (fr_FR has since been rebuilt to 30,594 given names; fr_CA, fr_BE and fr_CH still hold 798.)
The one that isn't a failure
One low score in our matrix looked exactly like the script barrier and turned out to be real.
Russia and Ukraine share 16 surnames. Jaccard 0.0041. Directional overlap 0.2% and 3.8%. Two adjacent Slavic countries, and they measure as almost completely unrelated.
But both write in Cyrillic. The script barrier does not apply, and the zeros are not zeros — there are 16 shared names, so the encodings match and the comparison is live. The finding survives.
It is also structurally correct. Russian surnames are overwhelmingly adjectival possessives in -ov/-ev/-in. Ukrainian surnames are dominated by the patronymic -enko and the -uk/-yuk family, with -sky and -ych behind them. The productive suffix systems barely intersect, so the surname repertoires barely intersect. By this measurement Ukraine and Russia are further apart than Britain and India.
The lesson is the useful inverse of failure 1: a low score between same-script locales is informative in a way that a low score across scripts never is. Same-script pairs are where the method actually works. There are far fewer of them than the matrix's 1,953 cells suggest.
The checklist
Before believing any cross-corpus name comparison, including ours:
| Check | How | What failure looks like |
|---|---|---|
| Identity control | Include a known-identical pair; confirm it scores as identical | Serbian ↔ Serbian at 0.0000 |
| Script census | Group locales by writing system before reading any score | 7 isolates sharing nothing with anyone |
| Zero triage | For every zero, ask: different alphabets, or different names? | 981 of 1,953 given-name pairs |
| Weight inspection on both sides | For high overlap, check the shared names' weight in each corpus | 佐藤 at 2.6% vs 0.0003% |
| Both directions | Compute A→B and B→A; publish both | 75.4% vs 8.4% |
| Scale audit | Print max and sum per locale; find out which are real counts | 10 of 63 |
| Depth audit | Print entry counts; flag pairs with large depth mismatch | 184 vs 3,830 entries |
| Two metrics | Set-based and weight-based; investigate where they disagree | Portugal–Brazil: Jaccard 0.294, cosine 0.845 |
The last row earned its place. Portugal and Brazil score modestly on set overlap and third-highest in the entire matrix on weighted overlap — few shared surname forms, but the shared ones are the dominant ones in both. That is a real structural fact about a colonial naming relationship, and it is visible only in the gap between the two metrics. Either metric alone reports a different, incomplete country.
Conclusion
Cross-locale name comparison is more fragile than single-corpus auditing, because every failure mode compounds: a script mismatch zeroes a pair, a script match inflates one, direction doubles the answers, and incommensurable weights corrupt whatever survives.
The discipline it demands is unglamorous. Count your scripts. Triage your zeros. Print both directions. Check what your weights actually are. And put something in your data whose answer you already know, so that when the method breaks it breaks somewhere you are looking.
Ours broke on Serbian, scoring a file at zero against a transliteration of itself. That was the most useful number the whole exercise produced.
Methodology and sources
What was computed. All 63 locales in corpus version share 1.1.7, all 1,953 unordered pairs. Given-name vectors merge the male and female files; surname vectors use lastname_male (the male and female surname files are identical in most locales, so merging both would double every weight without changing any ratio). Per pair: Jaccard on key sets, cosine on L1-normalised weight vectors, and directional weighted overlap in both directions. Matching is exact string equality on the raw file values, with no normalisation, folding or transliteration. Analysis run 2026-07-18. ⚠ The corpus held 63 locales when these figures were measured; en_IE was added on 18 July 2026 and it holds 64 today. The 1,953 pairs are all unordered pairs of those 63; re-running against 64 would give 2,016.
Scale audit results. Maximum weight and weight sum were computed per locale to classify scale type:
| Locale | Max weight | Weight sum | Classification |
|---|---|---|---|
| zh_TW | 2,618,994 | 23,367,536 | real bearer counts |
| en_US | 2,369,644 | 129,931,469 | real bearer counts |
| es_ES | 1,446,937 | 34,026,331 | real bearer counts |
| en_GB | 652,563 | 27,125,558 | real bearer counts |
| fr_FR | 250,013 | 20,114,307 | real bearer counts |
| da_DK | 222,355 | 2,984,886 | real bearer counts |
| sv_SE | 216,488 | 5,594,332 | real bearer counts |
| uk_UA | 107,878 | 9,752,950 | hybrid — see below |
| no_NO | 47,879 | 2,854,195 | real bearer counts |
| vi_VN | 30,492 | 99,441 | shares, not counts |
| id_ID | 20 | 2,378 | relative |
| de_DE | 40 | 1,946 | relative |
| (51 others) | 20–255 | ~970–14,500 | relative |
⚠ "Registry-derived" is not one category, and summing these ten as "locales with real data" overstates their comparability. Three of the rows above are not bearer counts at all:
vi_VNholds shares, not counts. The weights are per-mille × 1,000, which is why they sum to ~100,000 rather than to Vietnam's population.Nguyễn30,492 means 30.5% of the population, not 30,492 people.uk_UAis a hybrid of three different things in one column: ~71 genuine registry counts at the head, 28 entries pinned to a flat 20,000 (a published "≥20,000" band, not a measurement), and 2,123 entries sitting on an honest floor value of 1,000. Two thirds of the file is a placeholder wearing the same units as the head.en_IEwas rebuilt from real counts after this analysis ran and is absent from the table for that reason.
So the corpus today holds 64 locales, 12 registry-derived and 52 relative (re-counted 22 July 2026) — but not all of the twelve are straightforward bearer counts. The commensurability problem this section describes is smaller than it was and has not gone away; it has partly turned into a subtler problem, where two locales carry real-looking large integers that mean different things.
Corpus depth range. Surnames: 184 (ko_KR) to 2,707 (zh_TW). Given names: 484 (vi_VN) to 3,830 (sv_SE).
Zero-overlap counts. Given names: 981 of 1,953 pairs (50.2%). Surnames: 1,287 of 1,953 (65.9%). Script isolates in the set (sole occupant of their writing system, therefore zero overlap with all 62 others): bn_BD, el_GR, he_IL, hy_AM, ka_GE, ko_KR, ne_NP.
Identity control. sr_RS and sr_Latn_RS hold matching entry counts (1,143 given names, 958 surnames) and matching weight totals, consistent with one being a transliteration of the other. Measured similarity between them is 0.0000 on all four metrics with 0 shared entries.
What this article does not do. It does not propose a transliteration or phonetic-matching solution. Every such layer we considered introduces its own error class — lossy for non-bijective scripts, English-shaped for phonetic keys — and would substitute harder-to-audit errors for the visible ones documented here. Strict matching with labelled failures was the deliberate choice. Anyone building a cross-script comparison should treat this as a statement of the problem, not a solution to it.
Related reading: Which Countries Share Names? reports the findings this method produced, and states these limitations alongside them; How to Audit a Name-Frequency Dataset covers single-corpus auditing, including the 255-ceiling and claimed-coverage issues referenced above; Seven Ways Name Data Lies to You (companion article, not yet published) covers substantive rather than methodological traps.