Reading a score
How the LinkinLegal match score is built from the name, the birth date, the country, the gender and the identifiers, with measured examples.
Every match result carries a score from 0 to 1 and a features object. score is the decision. features is the evidence behind it, so you can show a reviewer why a record came up.
{
"score": 1,
"match": true,
"features": {
"name": 0.9806,
"birthDate": 0.1,
"country": 0.05,
"identifier": null,
"gender": null
}
}How the score is built
- The name gives the base score, from 0 to 1.
- The birth date, the country and the gender add or take away a small amount.
- The result is cut to the range 0 to 1 and rounded to four decimals.
- An equal identifier is applied last: it lifts the score to at least 0.95, whatever the name did.
score = clamp(name + birthDate + country + gender, 0, 1)A null feature was not compared, because one of the two sides does not carry that field. A missing field never counts against a candidate.
How names are compared
Before the comparison, both sides are cleaned:
- Letters go to lower case and accents are removed.
- Cyrillic and Greek are written in Latin letters, so
ГУЛИНАmeetsGulina. - Legal forms and titles are dropped:
LLC,Ltd,JSC,ООО,АО,Mr,Drand the rest.
Then the words are compared:
- Word order does not matter.
Putin VladimirandVladimir Putinscore the same. - Every name and alias of a candidate is compared, and the best one counts.
- Words are paired one to one and compared letter by letter (Jaro-Winkler). A pair that is too far apart counts as zero, so an unrelated word cannot lift the score.
- A missing middle name keeps the score high: about 0.93.
- One word against a multi-word name reaches 0.70 at most. A lone given name never passes the default threshold. This is deliberate.
The features
name
A number from 0 to 1. The base of the score.
birthDate
| Value | When |
|---|---|
0.1 | The full date is the same. |
0.05 | Only the year is the same. |
-0.3 | Both sides carry a date and no date fits. |
null | One of the two sides carries no date. |
country
Read from citizenship and country together.
| Value | When |
|---|---|
0.05 | At least one country is on both sides. |
-0.05 | Both sides carry a country and none is shared. |
null | One of the two sides carries no country. |
gender
| Value | When |
|---|---|
0 | The same gender. |
-0.03 | Different genders. |
null | One of the two sides carries no gender. |
identifier
Read from idNumber, taxNumber, innCode, registrationNumber, leiCode, swiftBic and imoNumber. Punctuation and case are ignored.
| Value | When | Effect |
|---|---|---|
1 | One identifier is equal on both sides. | The score becomes at least 0.95. |
-1 | Both sides carry an identifier of the same kind, and no value is equal. | −0.30. Two companies with one name and two tax numbers are two companies. |
0 | Both sides carry identifiers, but of different kinds. | Nothing. |
null | One of the two sides carries no identifier. | Nothing. |
Worked examples
Every example below was measured on the live data.
A typo, with a birth date and a country
Subject: name Vladimir Puttin, birth date 1952-10-07, citizenship ru.
| Feature | Value |
|---|---|
name | 0.9806 |
birthDate | 0.1 |
country | 0.05 |
score | 1 (cut from 1.1306) |
The typo cost 0.02. The two extra fields took the result to the maximum.
The right name, the wrong birth date
Subject: name Vladimir Putin, birth date 1985-03-02.
| Feature | Value |
|---|---|
name | 1 |
birthDate | -0.3 |
score | 0.7, match: false |
A perfect name is not enough when the birth date says it is another person. This is why you send the birth date.
A name in another script, without the middle name
Subject: name Marina Gulina. Candidate: МАРИНА КОНСТАНТИНОВНА ГУЛИНА.
| Feature | Value |
|---|---|
name | 0.9333 |
score | 0.9333, match: true |
The Cyrillic name is written in Latin letters first. The missing middle name costs a little. Note that search does not find this record with the text Gulina, because the caption is in Cyrillic.
The wrong company name, the right tax number
Subject: schema Company, name Wrong Name LLC, innCode 7323006644.
| Feature | Value |
|---|---|
name | 0 |
identifier | 1 |
score | 0.95, match: true |
The name says nothing. The identifier decides.
The right company name, the wrong tax number
Subject: schema Company, name Spektr Avia, innCode 9999999999.
| Feature | Value |
|---|---|
name | 1 |
identifier | -1 |
score | 0.7, match: false |
The same name with another tax number of the same kind is another company.
A lone given name
Subject: name Vladimir.
| Feature | Value |
|---|---|
name | 0.7 |
score | 0.7, match: false |
0.70 is the ceiling for one word against a multi-word name. A first name alone never passes the default threshold.
A gender conflict
Subject: name Vladimir Putin, gender female.
| Feature | Value |
|---|---|
name | 1 |
gender | -0.03 |
score | 0.97, match: true |
Gender is a weak signal, so it moves the score a little. It never decides alone.
What to do with the score
- Use
matchfor the yes/no decision. Usescoreto sort your review queue. - Show
featuresto the reviewer. "The birth date does not fit" is a better reason than "score 0.70". - Store
id,scoreandfeatureswith your decision. At the next screening you can then see what changed.
Read Thresholds to pick the line between a hit and a miss.
Last updated on
Match
POST /sanctions/match screens a person or company against sanctions and PEP data and returns a score per candidate. Request, response, batch of 100, and errors.
Thresholds
The LinkinLegal match threshold is 0.8 by default. What changes when you move it, which value fits onboarding or rescreening, and how to run a review queue.