Skip to content

How matching works

Names are messy. The same person is Mamadou Ousmane on a bank form, Muhammad Usman on a UN list and Alhaji M. Usman on a transfer. A check that looks only for identical text misses all three; a check that is too loose flags every Mohammed in the country.

SpeculaPro’s matching engine does three things:

  1. Tidies both names the same way, so differences that mean nothing disappear.
  2. Scores how alike the names are, from 0 to 1, word by word.
  3. Adjusts the score with whatever else is known: date of birth, country, ID number, and whether both are people or both are organisations.

A candidate whose final score reaches your match threshold (0.85 by default) is recorded as a potential match, together with an explanation you can read.

The engine runs inside SpeculaPro. Names are not sent anywhere to be matched against the lists.

Before two names are compared, each is put through the same steps:

Step Example
Lower case, accents removed Société Générale becomes societe generale; N'Diaye becomes ndiaye
Other alphabets written in Latin letters Cyrillic, Greek and Arabic script are converted, so a name in its original script can meet its usual transliteration
Titles at the start are dropped Alhaji Chief Dr. Musa Bello becomes musa bello. The list covers general, French, religious, West African traditional, professional and military titles
Suffixes at the end are dropped John Smith Jr, Ama Mensah (Dr)
Joining words are ignored al, el, bin, ibn, ben, ould, de, van, von and similar, because lists write them inconsistently (al-Baghdadi, Al Baghdadi, Baghdadi)
Known spellings of the same name become one Mohammed, Mohamed, Mamadou, Momodou and Muhammadu are all read as muhammad; Ousmane, Osman and Uthman as usman; Jallow and Jalloh as diallo; Koffi as kofi
For organisations, legal forms are dropped instead of titles Acme Trading Ltd and ACME TRADING LIMITED are the same company

Titles are removed only from the start and end of a name, never the middle, because Bishop, Major and Chief are also surnames.

The table of known spellings concentrates on Arabic-origin names in their English, French, Hausa, Fula, Wolof and Mandinka forms, and on common West African surnames and day names.

Each word of one name is paired with the best-fitting word of the other. A pair can match in several ways:

How Meaning Example
exact The same word after tidying mensah and mensah
variant Different spellings that tidying made the same Mamadou read as Muhammad
jaro_winkler Nearly the same letters. Jaro-Winkler is a standard measure of how alike two short words are, generous to a shared beginning Boateng and Boatang
phonetic They sound alike and are close in spelling, though not close enough to match on letters alone Two transliterations of one name
initial A single letter against a full word with that letter K and Kwame
compound Two words on one side written as one on the other Abdul Rahman and Abdulrahman

The name score is how much of each name is covered by good pairs. Word order doesn’t matter: Mensah Ama and Ama Mensah score the same. A list entry is scored on its main name and every alias, and the best one counts.

Five safeguards keep common names and everyday words from flooding you:

  • One matching word is not enough. If only one word of a name with two or more words matches strongly, the name score is capped at 0.70, below any sensible threshold, and the explanation says only one name part matches.
  • An initial needs backing. K. Boateng against Kwame Boateng is capped at 0.84, just under the default threshold. It becomes a potential match only if a date of birth, country or ID number agrees too.
  • Short names are treated strictly. Ama and Ahmad, or Musa and Mustafa, share letters but are different names, so a near-miss is scored down when the shorter word has four letters or fewer and the other is two or more letters longer. A three-letter name that is one letter short of the other is scored down too, unless the two sound alike: Isa and Isah are the same name, Ama and Amar, or Ali and Alim, are two.
  • Generic words identify nobody. Payment records often carry a word such as Wallet, Mobile Money, Agent, Bank, Compte or Banque where a name should be. If the only words that match strongly are generic ones like these, and the two names are not the very same words, the name score is capped at 0.70 and the explanation says only generic words match (wallet, bank, agent, …). So Wallet is not a match for a listed company called Wallex, and Mobile Money is not a match for Mobile Money Transfer Services. A list entry really named Wallet is still found by that exact name, and Bank Melli still matches Bank Melli: the generic word counts once a distinctive word agrees beside it.
  • A lone distinctive word must be close, not just similar. When only one distinctive word matches, and it matches on letters alone (jaro_winkler), it has to pass a stricter test, because two different short words that share a beginning look alike to Jaro-Winkler (Mellat and Mellas). The pair stands if the two words sound alike, or if they differ by few enough letters for their length (the table below). Otherwise the name score is capped at 0.70 and the explanation says the only distinctive name part is spelled differently.
The distinctive word is One letter different is accepted from Two letters different from
The whole name (Rosneft) 7 letters 12 letters
Beside other matching words, even generic ones (Bank Melli) 5 letters 10 letters

A letter added, dropped, changed, or two neighbouring letters swapped each count as one. The length is that of the shorter of the two words.

Names that are the same words (in any order), spelling variants and transliterations (Mamadou and Muhammad), words that sound alike (Hammas and Hamas, Gadafi and Gaddafi), and typos in names of several words (Kwame Mensa and Kwame Mensah) score as they always did.

The name score is then moved by other facts, when both sides have them. A fact that is missing on either side changes nothing.

Fact Effect on the score
ID number matches Raised to at least 0.95, whatever the name score. If the names are quite different (name score under 0.50), to at least 0.86: still worth a look. With an ID match, the date of birth is shown but not counted, and a different country or kind doesn’t lower the score
Date of birth identical +0.05
Same year, when one side has only a year (or year and month) +0.02
Same year, different day or month −0.05
One year apart −0.04
Further apart −0.20
Country or nationality matches +0.02
Country or nationality differs −0.07
One is a person, the other an organisation, vessel or aircraft −0.15

When a list gives several dates of birth for one entry, the most favourable comparison is used.

The final score is kept between 0 and 1 and rounded to two decimal places.

The match threshold decides which candidates become potential matches.

Threshold What you get
Lower (towards 0.50) More spelling variants found, many more false positives
0.85 (the default) Chosen to favour finding real matches over a quiet queue: a missed sanctioned person is the costly mistake
Higher (towards 0.99) Fewer false positives, and a real risk of missing a listed person whose name is spelled differently in your records

You can set it anywhere from 0.50 to 0.99. Changing it screens everyone again. See Screening settings.

A change to how names are scored applies to people as they are screened from then on. It does not go back over matches already in your queue. After upgrading to the release that added the generic-word, lone-word and short-name safeguards, re-screen everyone once in each workspace: open matches that no longer reach the threshold, such as Wallet against Wallex, or a customer called Ama against a listed Amar, are closed as No longer matches, and nothing you already decided is changed.

Every potential match and every on-demand result carries an explanation. Its text is a one-line summary:

name 0.93 (Jaro-Winkler token set; mamadou≈muhammad variant), DOB year match, nationality/country mismatch (GH vs NG)

Read it left to right:

  • name 0.93: the name score, before anything else.
  • in brackets: the word pairs that did not match letter for letter, and how they matched.
  • after the brackets: each fact that was compared.

The full explanation also has:

Field Meaning
score The final score
name_score The name score alone
query_name, matched_name The name screened, and the list name or alias it matched best
tokens Each word pair: the two words, how alike (sim) and how
factors Each fact compared, with a code, its effect on the score and a detail

The factor codes are id_match, dob_exact, dob_year, dob_same_year, dob_near, dob_mismatch, country_match, country_mismatch, kind_mismatch and weak_name.

weak_name means the name score was capped at 0.70. Its detail says why:

detail Meaning
only one name part matches One word of a name with two or more words matched strongly
only generic words match (wallet, bank, agent, …) Nothing distinctive matched
the only distinctive name part is spelled differently The one distinctive word is similar in letters but neither sounds alike nor is close enough for its length

Sanctions lists hold many thousands of names, a lot of them common. Any large customer base has people who share a name with someone listed. Screening is designed to bring those to a person, because only a person can weigh the photograph, the address, the occupation and the history.

You reduce false positives by giving the engine more to work with:

  • Send dates of birth and nationalities for customers. A wrong decade takes 0.20 off the score; a missing date takes nothing.
  • Send the customer type (person or business), so a company isn’t compared as a person.
  • Send counterparty names in full where your system has them.

See Sending customers.