Fuzzy name matching, and why a threshold of 50 catches nothing but noise
The intuition is that two unrelated names score near zero, so a threshold of 50 is generously inclusive. Measured, unrelated names run up to 59 while real spelling variants start around 85. The gap between those two numbers is the only thing that should decide where you set the line.
Written · Updated
Put your list and the names to screen into MATCH. It scores every pair with Jaro–Winkler, Levenshtein and Soundex, knows that Catherine and Katherine are the same name and that van, de and bin are particles rather than surnames, and treats "J Smith" against "John Smith" as an initial rather than a failed match. The threshold will not go below 65, and the reason is the whole of this page. Nothing is uploaded and it works with the network off.
Why exact matching does not work
Names arrive transliterated from other alphabets, typed by someone who heard them spoken, entered surname-first, abbreviated to an initial, hyphenated or not, with or without accents. Mohammed is also Muhammad, Mohamad and Muhammed. Any screening that requires an exact string match misses nearly everything it exists to catch.
So the alternative is to score similarity. And that is where the actual difficulty starts, because a similarity score has no natural meaning: you have to decide what number counts as a match, and almost everybody sets it far too low.
The trap: what an unrelated name scores
The intuition is that two unrelated names should score near zero and a real variant near a hundred, so a threshold of 50 is generously inclusive. The intuition is wrong.
Here is Jaro–Winkler on twelve pairs of names with nothing whatever to do with each other:
| Unrelated pair | Score | Unrelated pair | Score |
|---|---|---|---|
| rossi / dubois | 58.9 | mohammed / christopher | 47.7 |
| brown / kowalski | 55.0 | novak / haddad | 45.6 |
| schmidt / ali | 49.2 | johnson / nakamura | 42.3 |
| smith / okonkwo | 0.0 | wang / petrov | 0.0 |
Half of them score zero, because they share no letters close enough together to count. The other half land between 42 and 59. That is the problem: the distribution has a long tail, and a threshold of 50 sits inside it.
Now the same measure on six pairs that genuinely are the same name spelt differently:
| Real variant | Score | Real variant | Score |
|---|---|---|---|
| macdonald / mcdonald | 96.7 | smith / smyth | 89.3 |
| jon / john | 93.3 | steven / stephen | 89.4 |
| catherine / katherine | 92.6 | mohammed / muhammad | 85.0 |
Unrelated names top out around 59. Real variants start around 85. There is a clear gap between them, and the sensible place to stand is inside it. That is why the threshold here has a floor of 65 with the reason printed on the page, rather than a slider that goes to zero and quietly invites you to drag it there.
Why three measures and not one
Each catches a different kind of difference, and each is blind to the others:
- Jaro–Winkler rewards agreement at the start of a string, which suits names, because people get the beginning right and the ending wrong.
- Levenshtein counts insertions, deletions and substitutions, which catches a typed error that Jaro–Winkler forgives.
- Soundex throws away the spelling and keeps the sound, which is the only one of the three that pairs Smith with Schmidt.
A tool that gives you one number from one measure is hiding which kind of similarity it found, and those are not interchangeable when somebody asks you to justify a hit.
The parts that are not arithmetic
Most of the accuracy in name screening is not in the string metric at all:
- Equivalents. Bill and William score badly on every measure and are the same person. A table of known equivalents does more work than any amount of tuning.
- Particles. van, von, de, del, della, di, da, bin, ibn, bint, al, el and the rest are part of the name but not the distinctive part. Treated as surnames they drag scores around arbitrarily.
- Initials. "J Smith" against "John Smith" is not a 40 per cent match; it is an initial that is consistent. It is scored as such, at 0.85, rather than being punished for the letters it does not have.
- Word order. Surname-first and given-name-first are both common, and a comparison that assumes one of them fails on half the world's records.
What a hit is and is not
A score is a reason to look, never a finding. Two different people genuinely have the same name, and common names produce many true-but-useless matches. The output is a ranked list with the score, the measure that produced it and both strings side by side, so that a person can make the decision that the arithmetic cannot.
Equally, a miss is not an all-clear. Transliteration can put a name far enough from your spelling that nothing reaches the threshold, and no metric fixes that; only a better list does.
The short version
| The job | Here | Notes |
|---|---|---|
| Fuzzy match names against a list you hold | Yes | Three measures, shown separately |
| Refuse a threshold that cannot work | Yes | Floored at 65, with the reason on the page |
| Know that Bill is William | Yes | An equivalents table, not tuning |
| Handle particles and word order | Yes | van, de, bin and the rest |
| Score an initial as an initial | Yes | J Smith against John Smith |
| Keep the list and the names off a server | Yes | Works with the network off |
| Supply a sanctions or watchlist | No | You bring the list; it is yours |
| Decide whether a hit is your person | No | It ranks; a person decides |
| Guarantee no misses | No | Transliteration can defeat any metric |
Why it matters that it stays on your machine
Screening is two sensitive things at once: the list, which may be a sanctions list, an internal watchlist or a list of people you have concerns about, and the names being screened, who are your customers, staff or applicants. Uploading either is a disclosure; uploading both together tells a stranger exactly who you are worried about and why.
It is string comparison. Load the page, turn the network off, and screen.
Questions people ask about screening names against a list
What threshold should I use for fuzzy name matching?
Not below 65. Measured on Jaro-Winkler, genuinely unrelated names run as high as 59 while real spelling variants of the same name start around 85, so anything under about 65 sits inside the unrelated distribution.
Why not just use exact matching?
Because names arrive transliterated, misheard, abbreviated to initials, surname-first, hyphenated or not. Exact matching misses nearly everything screening exists to catch.
Why use more than one similarity measure?
Each is blind to what the others catch. Jaro-Winkler rewards agreement at the start of a name, Levenshtein counts typed errors, and Soundex is the only one of the three that pairs Smith with Schmidt.
Does a high score mean it is the same person?
No. Different people genuinely share names, and common names produce many true but useless matches. A score is a reason to look, and the decision belongs to a person.
Does it come with a sanctions list?
No. You bring the list you are screening against, and it stays on your machine along with the names being screened.
Related tools
- Benford's law, and when it tells you nothingThe most misapplied result in auditing. Which columns the leading-digit test holds for, the five kinds it never will, the tests that need no assumption at all, and the threshold test that catches real splitting.
- What is this timestamp?Seventeen formats with their epochs and tick sizes, every one written as the same instant so the shapes can be compared, how to narrow a number down by digit count, and the thing a timestamp will never tell you.
- Why a random sample needs a seed“Randomly” is unfalsifiable in both directions. A seed turns the draw into something anybody can reproduce and check.
- Convert coordinates, and the 700 m misreadingDegrees and decimal minutes read as degrees, minutes and seconds is up to 729 metres out and looks entirely reasonable.
- Why a bar chart has to start at zeroA bar says “this much” by its length, so a cut axis draws a different number.
A letter, now and then
An occasional letter when there is something worth reading: the new guides and what changed in the tools. Never more than once a month and nothing else, and you can leave at any time on the unsubscribe page.