Normaliser les noms d'entreprises néerlandaises
KVKBase Team

Normaliser les noms d'entreprises néerlandaises

B.V., BV, b.v., « De Gouden Korst » ou « Gouden Korst, De » : normalisez les noms d'entreprises avant le rapprochement, puis passez au numéro KVK.

kvkqualité des donnéesrapprochementapi

Vous importez un tableur de 4 000 clients et voulez relier chacun au registre du commerce. La ligne 17 indique « Bakkerij De Gouden Korst BV », la ligne 912 « Gouden Korst, Bakkerij De B.V. » et la ligne 2 301 « bakkerij de gouden korst b.v. (Zwolle) ». Pour une personne, c’est une seule entreprise. Pour une base de données, ce sont trois chaînes de caractères, et un simple test d’égalité n’en retrouve aucune.

Cet article montre comment normaliser les noms d’entreprises néerlandaises pour que le rapprochement fonctionne dans les cas simples, et comment reconnaître les cas où aucun nettoyage de chaînes ne vous sauvera.

Pourquoi les noms d’entreprises néerlandaises se comparent mal

Un nom d’entreprise néerlandais comporte plus de bruit que la plupart. La forme juridique fait partie du nom enregistré : on l’écrit « B.V. », « BV », « b.v. » ou « besloten vennootschap » selon la personne qui a saisi. Les articles se déplacent : « De Gouden Korst » devient « Gouden Korst, De » dans certains systèmes. La ponctuation et les espaces varient, tout comme les accents et l’esperluette.

De plus, une entreprise possède une dénomination statutaire et souvent un ou plusieurs noms commerciaux, comme l’explique notre page sur le nom commercial et la dénomination statutaire. Un client vous donnera généralement le nom commercial, alors que le registre correspond le mieux à la dénomination statutaire. La normalisation ne peut pas combler seule cet écart, mais elle élimine tout le reste, de sorte que ce qui subsiste est une vraie différence.

L’objectif n’est pas d’obtenir un joli nom. C’est d’obtenir une clé : une chaîne identique pour toutes les graphies d’un même nom. Vous la calculez des deux côtés, pour vos données et pour celles du registre, et vous comparez les clés plutôt que les noms bruts.

Une fonction de normalisation qui fonctionne

Commencez par les étapes toujours sûres : passer en minuscules, retirer les accents, remplacer & par en ou and, et supprimer la ponctuation. Réduisez ensuite les espaces multiples. Ce n’est qu’après que vous retirez les suffixes de forme juridique, car le suffixe est plus facile à reconnaître une fois les points disparus.

import re
import unicodedata

LEGAL_FORMS = {
    "bv", "nv", "vof", "cv", "maatschap", "stichting",
    "vereniging", "coöperatie", "cooperatie", "eenmanszaak",
    "besloten vennootschap", "naamloze vennootschap",
}

def name_key(name: str) -> str:
    s = unicodedata.normalize("NFKD", name.lower())
    s = "".join(c for c in s if not unicodedata.combining(c))
    s = s.replace("&", " en ")
    s = re.sub(r"\(.*?\)", " ", s)        # supprime les notes comme "(Zwolle)"
    s = re.sub(r"[^\w\s]", "", s)          # supprime points, virgules, tirets
    words = [w for w in s.split() if w not in LEGAL_FORMS]
    return " ".join(sorted(words))        # rend l'ordre des mots sans importance

Trier les mots est une astuce grossière, mais elle fait produire la même clé à « Gouden Korst, De » et « De Gouden Korst ». Le revers de la médaille : « Jansen Bouw » et « Bouw Jansen » se confondent aussi en une seule clé. C’est un compromis que vous choisissez en connaissance de cause : utilisez-la pour générer des candidats, pas pour prendre des décisions définitives.

Soyez prudent avec la liste des suffixes. Ne retirez une forme juridique qu’au début ou à la fin du nom, jamais au milieu. Pour une entreprise nommée « Stichting Beheer Vereniging Noord », supprimer chaque mot juridique qu’elle contient n’aide en rien. Une version plus stricte ne contrôle que le premier et le dernier mot.

Utilisez la clé pour trouver des candidats, pas pour décider

Une fois les clés calculées, le rapprochement devient une simple recherche. Cherchez dans le registre le nom nettoyé, calculez la clé de chaque résultat et comparez. Notre endpoint de recherche renvoie le nom, la ville et le statut actif de chaque résultat, ce qui est exactement ce qu’il faut pour une seconde vérification.

import requests

HEADERS = {"Authorization": "Bearer your_api_key"}

def candidates(raw_name: str, city: str | None = None) -> list[dict]:
    r = requests.get(
        "https://api.kvkbase.nl/v1/search",
        params={"q": raw_name, "pageSize": 20},
        headers=HEADERS,
        timeout=10,
    )
    r.raise_for_status()
    wanted = name_key(raw_name)
    hits = [c for c in r.json()["results"]
            if c["isActive"] and name_key(c["name"]) == wanted]
    if city:
        hits = [c for c in hits if c["city"].lower() == city.lower()]
    return hits

Classez ensuite les résultats en trois catégories. Un seul résultat : reliez-le automatiquement et enregistrez le numéro KVK. Plusieurs résultats : montrez-les à une personne, avec la ville à côté de chaque nom. Aucun résultat : essayez une recherche plus large avec moins de mots, et si elle échoue encore, envoyez la ligne en revue manuelle.

L’habitude essentielle est la dernière étape de la première catégorie. Dès qu’une ligne possède un numéro KVK, abandonnez le nom comme identifiant. Le numéro est stable et unique, alors que le nom est une étiquette qui change quand l’entreprise change d’image de marque.

Là où la normalisation ne suffit plus

Certaines divergences, aucune fonction de chaînes ne peut les corriger. Un client qui saisit « Jansen » pour « Jansen Installatietechniek Midden-Nederland B.V. » vous donne un préfixe, pas un nom. Une société holding et sa société d’exploitation partagent souvent la plupart de leurs mots et ne diffèrent que par un seul : « Beheer ». Une entreprise qui a changé de marque peut n’avoir aucun mot en commun avec son ancien nom.

Dans ces cas, ajoutez un second signal plutôt qu’un algorithme plus malin. Un code postal, une ville, un domaine d’e-mail ou un numéro de téléphone réduit vingt résultats à un bien mieux que n’importe quelle distance d’édition. S’il vous reste deux candidats après cela, une décision humaine coûte moins cher qu’une fusion erronée. Fusionner deux clients par erreur est bien plus difficile à défaire que de laisser un doublon pour plus tard.

Il est aussi utile de conserver la saisie brute à côté du rapprochement. Enregistrez la chaîne d’origine, la clé calculée, le numéro KVK relié et la manière dont vous y êtes arrivé (automatiquement ou confirmé par une personne). Lorsqu’un rapprochement se révèle faux six mois plus tard, vous pouvez comprendre pourquoi.

Nettoyer ce que vous possédez déjà

Si votre base de données est déjà remplie de noms approximatifs, appliquez-lui la même clé. Regroupez les lignes par clé et vous verrez immédiatement les groupes de doublons. C’est la première étape du nettoyage décrit dans dédoublonner les entreprises dans votre CRM. Plus vous rattachez de lignes à un numéro KVK, moins vous dépendez du rapprochement par nom, et les bases de cette recherche sont couvertes dans notre guide complet de la recherche de numéro KVK.

Envie d’essayer ? Créez un compte KVKBase, prenez vingt lignes de votre propre liste de clients et passez-les dans l’endpoint de recherche pour voir combien se relient proprement.