Bedrijfsnamen normaliseren voor betrouwbaar matchen
B.V., BV en b.v., of 'De Gouden Korst' en 'Gouden Korst, De': zo normaliseer je Nederlandse bedrijfsnamen voor het matchen en wanneer je beter het KVK-nummer gebruikt.
Je importeert een spreadsheet met 4.000 klanten en wilt elke regel koppelen aan het Handelsregister. Regel 17 zegt “Bakkerij De Gouden Korst BV”, regel 912 “Gouden Korst, Bakkerij De B.V.” en regel 2.301 “bakkerij de gouden korst b.v. (Zwolle)”. Voor een mens is dat één bedrijf. Voor een database zijn het drie losse teksten, en een gewone gelijkheidscheck vindt er geen enkele van.
In dit artikel laten we zien hoe je Nederlandse bedrijfsnamen normaliseert zodat het matchen werkt voor de makkelijke gevallen, en hoe je de gevallen herkent waar geen tekstopschoning meer helpt.
Waarom Nederlandse bedrijfsnamen lastig te vergelijken zijn
Een Nederlandse bedrijfsnaam bevat veel ruis. De rechtsvorm hoort bij de ingeschreven naam en wordt geschreven als “B.V.”, “BV”, “b.v.” of “besloten vennootschap”, afhankelijk van wie het intypte. Lidwoorden schuiven: “De Gouden Korst” wordt in sommige systemen “Gouden Korst, De”. Leestekens en spaties verschillen, net als accenten en het ampersand.
Daar komt bij dat een bedrijf een statutaire naam heeft en vaak een of meer handelsnamen, zoals uitgelegd op onze pagina over handelsnaam versus statutaire naam. Een klant noemt meestal de handelsnaam, terwijl het register het best matcht op de statutaire naam. Normaliseren overbrugt dat verschil niet, maar het haalt al het andere weg, zodat alleen een echt verschil overblijft.
Het doel is geen mooie naam, maar een sleutel: een tekst die voor elke schrijfwijze van dezelfde naam gelijk is. Die bereken je aan beide kanten, in je eigen data en in de registerdata, en je vergelijkt sleutels in plaats van ruwe namen.
Een normalisatiefunctie die werkt
Begin met de stappen die altijd veilig zijn: kleine letters, accenten weg, & vervangen door en en leestekens verwijderen. Daarna voeg je dubbele spaties samen. Pas dan haal je rechtsvormen weg, want het achtervoegsel herken je makkelijker zonder de punten.
import re
import unicodedata
RECHTSVORMEN = {
"bv", "nv", "vof", "cv", "maatschap", "stichting",
"vereniging", "coöperatie", "cooperatie", "eenmanszaak",
"besloten vennootschap", "naamloze vennootschap",
}
def naam_sleutel(naam: str) -> str:
s = unicodedata.normalize("NFKD", naam.lower())
s = "".join(c for c in s if not unicodedata.combining(c))
s = s.replace("&", " en ")
s = re.sub(r"\(.*?\)", " ", s) # "(Zwolle)" weghalen
s = re.sub(r"[^\w\s]", "", s) # punten, komma's, streepjes weg
woorden = [w for w in s.split() if w not in RECHTSVORMEN]
return " ".join(sorted(woorden)) # woordvolgorde speelt geen rol
De woorden sorteren is een botte truc, maar “Gouden Korst, De” en “De Gouden Korst” krijgen er dezelfde sleutel door. De prijs is dat “Jansen Bouw” en “Bouw Jansen” ook samenvallen. Dat is een afweging die je bewust maakt: gebruik het om kandidaten te vinden, niet om definitief te beslissen.
Wees voorzichtig met de lijst rechtsvormen. Haal een rechtsvorm alleen weg aan het begin of het einde van de naam, nooit in het midden. Een bedrijf als “Stichting Beheer Vereniging Noord” heeft er niets aan als je elk juridisch woord schrapt. Een strengere variant kijkt alleen naar het eerste en het laatste woord.
Gebruik de sleutel voor kandidaten, niet voor de beslissing
Als je sleutels hebt, wordt matchen een opzoeking. Zoek in het register op de opgeschoonde naam, bereken de sleutel van elke treffer en vergelijk. Ons zoek-endpoint geeft per resultaat naam, plaats en actief-status terug, precies wat je nodig hebt voor een tweede controle.
import requests
HEADERS = {"Authorization": "Bearer your_api_key"}
def kandidaten(ruwe_naam: str, plaats: str | None = None) -> list[dict]:
r = requests.get(
"https://api.kvkbase.nl/v1/search",
params={"q": ruwe_naam, "pageSize": 20},
headers=HEADERS,
timeout=10,
)
r.raise_for_status()
gezocht = naam_sleutel(ruwe_naam)
hits = [c for c in r.json()["results"]
if c["isActive"] and naam_sleutel(c["name"]) == gezocht]
if plaats:
hits = [c for c in hits if c["city"].lower() == plaats.lower()]
return hits
Verdeel de uitkomst daarna over drie bakjes. Precies één treffer: koppel automatisch en bewaar het KVK-nummer. Meerdere treffers: laat een mens kiezen, met de plaats naast elke naam. Geen treffers: probeer een ruimere zoekopdracht met minder woorden, en lukt dat ook niet, stuur de regel dan naar handmatige controle.
De belangrijkste gewoonte zit in de laatste stap van het eerste bakje. Zodra een regel een KVK-nummer heeft, is de naam niet meer je identifier. Het nummer is stabiel en uniek, terwijl een naam een label is dat verandert als het bedrijf een nieuwe naam kiest.
Waar normaliseren ophoudt te helpen
Sommige verschillen lost geen tekstfunctie op. Een klant die “Jansen” typt voor “Jansen Installatietechniek Midden-Nederland B.V.” geeft je een beginstuk, geen naam. Een holding en haar werkmaatschappij delen vaak bijna alle woorden en verschillen in één: “Beheer”. Een bedrijf dat van naam is veranderd heeft soms geen enkel woord meer gemeen met de oude naam.
Voeg in zulke gevallen een tweede signaal toe in plaats van een slimmer algoritme. Een postcode, plaats, e-maildomein of telefoonnummer maakt van twintig treffers er één, veel beter dan welke bewerkingsafstand ook. Houd je dan nog twee kandidaten over, dan is een menselijke keuze goedkoper dan een foute samenvoeging. Twee klanten per ongeluk samenvoegen is veel moeilijker terug te draaien dan een dubbele regel laten staan.
Bewaar ook de ruwe invoer naast de koppeling: de originele tekst, de berekende sleutel, het gekoppelde KVK-nummer en hoe je daar kwam (automatisch of bevestigd door een persoon). Blijkt een koppeling na een half jaar fout, dan zie je waarom.
Ruim op wat je al hebt
Staat je database al vol losse namen, laat dan dezelfde sleutel erover lopen. Groepeer de regels op sleutel en je ziet de dubbele clusters meteen. Dat is de eerste stap van de opschoning uit dubbele bedrijven in je CRM opschonen. Hoe meer regels een KVK-nummer krijgen, hoe minder je op naamsmatching leunt, en de basis van die opzoeking staat in onze complete gids voor KVK-nummer opzoeken.
Zin om het te proberen? Maak een KVKBase-account, neem twintig regels uit je eigen klantenlijst en haal ze door het zoek-endpoint om te zien hoeveel er netjes koppelen.