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.
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