Deduptio

Fuzzy matching company names

The short answer

Normalize first — case, punctuation, spacing — then score similarity and treat anything above the threshold as a candidate, not a duplicate. Fuzzy name matching earns its keep when it is paired with one exact signal. On its own it is a suggestion engine, and a good one, but not a merge instruction.

Normalization does more work than the algorithm

Most "fuzzy" matches are not fuzzy at all once the values are cleaned up. Before any similarity is computed, these differences should stop existing:

Raw valuesAfter normalizationWhat removed the difference
ACME Ltd. / acme ltdacme ltdLowercasing, punctuation to space, whitespace collapse
Smith & Sons / Smith and Sonssmith sons / smith and sonsSymbols removed — still needs similarity to close the gap
https://www.acme.com/ / acme.comacme.comDomain normalization: scheme, www., path and trailing dot stripped
+1 (555) 010-9999 / 555-010-99995550109999Digits only, compared on the last ten
Bob@Example.COM bob@example.comTrim and lowercase

Only the residue needs a similarity score: real typos, word-order differences, abbreviations and legal-form variants such as ltd against limited.

How the similarity score works

Deduptio uses Jaro-Winkler similarity on normalized values, with a 0.85 threshold — at or above that, two values are treated as the same for matching purposes. Jaro-Winkler rewards a shared prefix, which is the correct bias for names: robert and robrt score highly, while two names that diverge at the start do not.

The other half of the problem is tractability. Comparing every record with every other is quadratic — ten billion comparisons on a 100,000-record object. So comparison is blocked: each value emits coarse block keys from its token prefixes (tokens of three characters or more block on their first three; shorter tokens such as initials or co block whole), and only values sharing a block are ever compared. Blocks stay small, and the pairs that could plausibly match still meet.

The practical consequence: fuzzy matching finds typos and variants within a shared prefix. Two names for the same company that share no token prefix — an acronym against a full name, say — will not be compared, which is a deliberate trade rather than a bug. Acronyms need an alias field or an exact key, not a similarity score.

The pairs no threshold gets right

Raise the threshold and you miss these:

Lower it and you merge these:

There is no threshold that gets both lists right, because the information needed to separate them is not in the string. That is the entire argument for combining signals.

Combine, do not loosen

When a fuzzy name match is paired with one exact signal, precision improves sharply without losing the variants you were trying to catch:

Deduptio enforces this shape: with ALL logic, only one key may be fuzzy and the rest must match exactly. With ANY, as many keys can be fuzzy as you like, because each one stands on its own. Two independent fuzzy keys combined is a guess made twice — the reasoning is in match rules and scanning.

Reviewing fuzzy groups

Fuzzy groups deserve human eyes, and the review goes faster if you know what you are looking for. Sort by what the pair shares beyond the name: two records with the same domain and a similar name are safe; two records with similar names and nothing else in common are the ones to reject. Watch for generic tokens — group, holdings, solutions, partners — which inflate similarity between unrelated businesses.

Skipped groups in Deduptio do not come back, so rejecting a false positive is permanent rather than something you re-decide on every scan.

Try a fuzzy rule on your own names

Fuzzy matching is on the paid plans; dry-run scans are free on every plan and write nothing to Attio, so you can see what a rule would group before deciding whether it is right.

Start a free Attio duplicate scan

Related