Notre méthode de criblage, publiée

La plupart des éditeurs gardent leur matching secret. Nous publions le nôtre : il est déterministe, il n'a rien à cacher — et vous pouvez le contre-vérifier.

Déterministe, de bout en bout

Le criblage Vulpes est entièrement déterministe : mêmes entrées, mêmes listes, même score — aucune IA, aucun aléa dans la décision. Chaque alerte expose ses composantes (score de nom, date, pays, liste, alias touché) : le rapport est l'explication.

1. Normalisation

Chaque nom soumis est d'abord normalisé : minuscules, traits d'union convertis en séparateurs, caractères parasites retirés, écritures ramenées au latin. Les écritures non latines (cyrillique, arabe…) sont couvertes à deux niveaux : translittération des fiches au chargement des listes, et index de variantes pré-calculées côté recherche (translittération à la volée via ICU lorsque l'extension est présente). Le résultat est prouvé en continu par notre jeu de test : « Владимир Путин » saisi en cyrillique matche sa fiche à 100.

2. Recherche de candidats

Deux voies complémentaires : une recherche par trigrammes PostgreSQL sur les noms normalisés des listes, ancrée sur l'empreinte phonétique Daitch-Mokotoff du patronyme, et un index de plus de 900 000 variantes de noms pré-calculées (translittérations françaises, anglaises, diminutifs slaves et arabes), reconstruit chaque nuit après la synchronisation des six listes officielles (DG Trésor, UE, ONU, OFAC, UK OFSI, SECO).

3. Scoring : le nom, signal primaire

Chaque candidat est scoré sur le nom : combinaison Jaro-Winkler (50 %), Levenshtein normalisé (35 %) et concordance Soundex, comparaison par ensembles de tokens insensible à l'ordre (« Poutine Vladimir » ≡ « Vladimir Poutine »), gestion des particules et noms composés (« el-Assad » ≡ « Assad »), prénoms enrichis de variantes phonétiques (« Iouri » ≡ « Yury »). Pour les personnes morales, les formes juridiques sont neutralisées et une double couverture s'applique : les tokens distinctifs peuvent élever le score ; les mots d'enseigne courants du corpus des raisons sociales françaises discriminent mais ne peuvent jamais porter seuls une correspondance.

4. Date et pays : confirmer ou contredire, jamais s'additionner

La date de naissance et le pays ne s'additionnent pas au nom : ils confirment (bonus plafonnés, accordés seulement si le nom est déjà solide) ou contredisent. Deux règles distinctes selon la nature du tiers : pour les personnes physiques, deux dates complètes différentes infligent un malus de 25 à 60 % et bloquent tout bonus, mais la nationalité ne pénalise jamais (bonus seul — un malus sur la nationalité d'une personne serait discriminatoire) ; pour les personnes morales, une contradiction de juridiction décote de 35 %, sauf si la raison sociale porte réellement le nom de la fiche (une « SBERBANK » saisie avec pays France reste en alerte). Un nom parfait sans date reste détectable ; un homonyme daté ou d'une autre juridiction est écarté — jamais effacé : il reste visible sous le seuil.

5. Seuil et zones

Le seuil d'alerte est fixé à 70 ; la zone 50-69 est conservée comme marge de surveillance, consultable dans chaque criblage. La machine propose, l'analyste décide — toujours.

6. La preuve, en continu

La méthode est prouvée par un jeu adversarial de plus de 125 cas (rappel et précision 100 % exigés avant tout déploiement) et par des bancs sur données publiques réelles — plus de 570 000 tiers criblés : l'intégralité du répertoire des conseillers municipaux (510 758 élus) et 64 000 sociétés Sirene, dont 20 000 jamais vues pour prouver la généralisation. Chaque alerte a été adjugée à la main ; les cas marquants deviennent des cas de test permanents qui interdisent toute régression. La rejouabilité s'entend à listes et versions de moteur constantes — les versions de listes sont figées avec chaque criblage.

Cette page est la transcription de notre document de méthode interne, maintenu avec le code du moteur. Dernière mise à jour : juillet 2026. Pour un audit technique détaillé (harnais, bancs, protocole de tirage) : contact@vulpes.watch.