A Practical Guide To Entity Resolution in Python (No Database, No Machine Learning)

Learn a very simple way to normalize, dedupe, and fuzzy-match records that refer to the same real-world entity in Python, without a database or any ML pipelines.

By Prithwish Nath

•Published on June 1, 2026

I was working on a Crunchbase dataset last Friday. I joined it against our CRM, and got 56 hits out of 96. The other 40 were sitting right there in both tables — Necker FinTech in the extracted data was Necker FinTech Holdings Inc. in the CRM; Investing.com in the data was Fusion Media Limited in the CRM — but JOIN ... ON name = name obviously doesn't care, it will shrug and return nothing. If I'd shipped that, some sales rep would end up cold-pitching an existing customer because of it. 😅

This is the core problem of entity resolution: the same real-world entity wearing different names in different systems. Naive text equality checks are borderline useless in the real world. I’d been meaning to do something less embarrassing than a raw == for a while, so I spent the rest of the weekend on a simple pipeline — scrape company names from Crunchbase hubs via Bright Data, normalize, deduplicate, and fuzzy-match against the CRM list using RapidFuzz (fuzz.WRatio). Deliberately choosing to NOT use ML, vector embeddings, or a database.

The join rate on this dataset jumped from ~58% to 100%.

Metric Exact (normalized string) Fuzzy (WRatio ≥ 90)
Scraped hub rows → CRM 58.3% (56 / 96) 100% (96 / 96)
CRM rows → scraped data 34.8% (48 / 138) 100% (138 / 138)

The reason exact matching loses so badly is that any real CRM list you’re handed will almost always have multiple legal-name variants per company — I had three different Necker spellings pointing at one hub listing alone. Fuzzy matching earns its keep by collapsing those variants back into a single canonical cluster, and that’s most of what the rest of this post is about.

I’ll walk through it; I hope it’s useful for anyone starting with fuzzy algorithms!

What Is Entity Resolution vs Fuzzy Matching?

Entity resolution matches records that describe the same company under different surface strings.

If you use exact matching, you ask: are these two strings identical? After you lowercase and strip punctuation, `