Sahte Kimlik > Makaleler > Serbian Scores 0.0000 Against Itself: Four Ways Cross-Country Name Comparison Fails

Bu makale henüz Türkçe diline çevrilmedi — English dilindeki orijinali okuyorsunuz. Şu dillerde de mevcut: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:

MetricScore
First-name Jaccard0.0000
First-name cosine0.0000
Surname Jaccard0.0000
Surname cosine0.0000
Shared entries0

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:

  1. Different scripts destroy overlap — half the matrix is zeros that mean nothing
  2. Shared scripts inflate overlap — Han characters make Japan look Taiwanese
  3. Overlap is directional — one comparison, two correct and contradictory answers
  4. 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:

SurnameShare of TaiwanShare of Japan
佐藤 Satō0.0003%2.609%
鈴木 Suzuki0.0002%2.426%
高橋 Takahashi0.0002%1.905%
田中 Tanaka0.0001%1.826%
陳 Chen11.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:

PairA → BB → AShared 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-en86.0%47.5%358
Portugal → Brazil90.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 typeLocalesMax weightSum of weights
Real head counts22,618,994 (zh_TW)23,367,536
Relative integers 1–2556120 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:

CheckHowWhat failure looks like
Identity controlInclude a known-identical pair; confirm it scores as identicalSerbian ↔ Serbian at 0.0000
Script censusGroup locales by writing system before reading any score7 isolates sharing nothing with anyone
Zero triageFor every zero, ask: different alphabets, or different names?981 of 1,953 given-name pairs
Weight inspection on both sidesFor high overlap, check the shared names' weight in each corpus佐藤 at 2.6% vs 0.0003%
Both directionsCompute A→B and B→A; publish both75.4% vs 8.4%
Scale auditPrint max and sum per locale; find out which are real counts10 of 63
Depth auditPrint entry counts; flag pairs with large depth mismatch184 vs 3,830 entries
Two metricsSet-based and weight-based; investigate where they disagreePortugal–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:

LocaleMax weightWeight sumClassification
zh_TW2,618,99423,367,536real bearer counts
en_US2,369,644129,931,469real bearer counts
es_ES1,446,93734,026,331real bearer counts
en_GB652,56327,125,558real bearer counts
fr_FR250,01320,114,307real bearer counts
da_DK222,3552,984,886real bearer counts
sv_SE216,4885,594,332real bearer counts
uk_UA107,8789,752,950hybrid — see below
no_NO47,8792,854,195real bearer counts
vi_VN30,49299,441shares, not counts
id_ID202,378relative
de_DE401,946relative
(51 others)20–255~970–14,500relative

"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_VN holds 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ễn 30,492 means 30.5% of the population, not 30,492 people.
  • uk_UA is 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_IE was 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.

← Makaleler