Fuzzy Name Matching Sample Dataset: Hard-Case Corpus for Person and Organization Name Matching
This 300-row corpus covers the name-matching cases a naive string-distance matcher gets wrong: transliteration, hyphenated surnames, married-name changes, OCR artifacts, DBA trade names, legal suffix toggles, merger prefixes, subsidiary suffixes, and hard negatives (distinct entities that share an identical name). Each row carries a Master ID and a variant-class label.
License: As of 2026-08-02, no public license has been published for this sample dataset. License metadata is omitted until a license is published.
What this corpus covers
Twelve variant classes across PERSON and ORG entity types. Unlike the fuzzy matching test data, full guide easy-class download, every class here is one where a naive Levenshtein or Soundex matcher typically fails. For full-customer-record resolution (name plus address, email, phone), see the duplicate customer records for name matching.
Preview
| record_id | master_id | entity_type | duplicate_type | name_original | name_variant | generator_scenario |
|---|---|---|---|---|---|---|
| 1 | 1 | PERSON | MASTER | María García | María García | |
| 2 | 1 | PERSON | TRANSLITERATION | María García | Maria Garcia | scenario_transliteration |
| 3 | 1 | PERSON | HYPHENATED_SURNAME | María García | María García-Lopez | scenario_hyphenated_surname |
| 4 | 2 | PERSON | MASTER | Catherine Smith | Catherine Smith | |
| 5 | 2 | PERSON | MARRIED_NAME_CHANGE | Catherine Smith | Catherine Williams | scenario_married_name_change |
| 6 | 2 | PERSON | OCR_SCAN | Catherine Smith | CATHERINE SMYTH | scenario_ocr_scan |
| 7 | 3 | ORG | MASTER | Acme Technologies Inc. | Acme Technologies Inc. | |
| 8 | 3 | ORG | LEGAL_SUFFIX_TOGGLE | Acme Technologies Inc. | Acme Technologies LLC | scenario_legal_suffix_toggle |
| 9 | 3 | ORG | DBA_TRADE_NAME | Acme Technologies Inc. | Acme Technologies Inc. dba Acme Solutions | scenario_dba_trade_name |
| 295 | 55 | PERSON | HARD_NEGATIVE | María García | María García |
Data dictionary
| Column | Type | Description |
|---|---|---|
| record_id | integer | Unique row identifier, 1 to N. |
| master_id | integer | Canonical identity ID. Primary groups: 1 to 50. Hard-negative identities: 51 to 100. |
| entity_type | enum | PERSON or ORG. |
| duplicate_type | enum | Page-authored variant class. See variant class reference. |
| name_original | string | Canonical name form the matcher should resolve to. |
| name_variant | string | Variant name form on this row. Equals name_original on MASTER and HARD_NEGATIVE. |
| generator_scenario | string (nullable) | Scenario function key from scenarios_person.py or scenarios_org.py. Empty on MASTER and HARD_NEGATIVE. |
Variant class reference
| duplicate_type | Entity type | Definition | Why naive fails |
|---|---|---|---|
| MASTER | PERSON or ORG | Canonical reference record. | Baseline |
| TRANSLITERATION | PERSON | Diacritics stripped or ASCII-folded. | UTF-8 byte Levenshtein inflates distance |
| TRANSLITERATION_PARTIAL | PERSON | Transliteration plus a blanked contact field. | False non-match after blocking on missing field |
| HYPHENATED_SURNAME | PERSON | Hyphenated second surname component added. | Raw last-name edit distance equals appended length |
| DOUBLE_SURNAME_REORDER | PERSON | Two-part last name components swapped. | Concatenated Levenshtein fails; token-set works |
| MARRIED_NAME_CHANGE | PERSON | Last name fully replaced; first name unchanged. | Whole-name distance high; only first name agrees |
| LEGAL_NAME_CHANGE | PERSON | Last name replaced; address also changes. | Name and address both diverge |
| OCR_SCAN | PERSON or ORG | Uppercased with 0 to 2 character noise edits. | Case-sensitive match fails at tight thresholds |
| DBA_TRADE_NAME | ORG | DBA or shortened trade name form. | Large whole-string distance to legal name |
| LEGAL_SUFFIX_TOGGLE | ORG | Legal suffix swapped (Inc ↔ LLC, etc.). | Suffix-sensitive exact match fails |
| MERGER_PREFIX | ORG | Acquirer name prepended with dba separator. | Original name is a suffix token only |
| SUBSIDIARY_SUFFIX | ORG | Division label appended with an em dash. | Prefix-unaware Levenshtein fails on length |
| HARD_NEGATIVE | PERSON or ORG | Distinct entity sharing an exact name. | Name-only exact match returns false MATCH |
Worked example test cases
| duplicate_type | name_original | name_variant | Expected verdict | Why naive fails |
|---|---|---|---|---|
| TRANSLITERATION | María García | Maria Garcia | MATCH | Byte-level exact match fails; NFD + ASCII fold needed |
| TRANSLITERATION_PARTIAL | María García | Maria Garcia (contact blank) | MATCH | Same as transliteration, plus missing blocking field |
| HYPHENATED_SURNAME | García | García-Lopez | MATCH | Edit distance equals appended component length |
| DOUBLE_SURNAME_REORDER | García López | López García | MATCH | Sorted-token comparison resolves; raw Levenshtein does not |
| MARRIED_NAME_CHANGE | Catherine Smith | Catherine Williams | MATCH | Only first-name token agrees |
| LEGAL_NAME_CHANGE | Catherine Smith | Catherine Johnson | MATCH | Name and address both change |
| OCR_SCAN | Jonathan Reyes | JONATHAN REYES | MATCH | Case-sensitive exact match fails |
| DBA_TRADE_NAME | Acme Technologies Inc. | Acme Technologies Inc. dba Acme Solutions | MATCH | Trade name distance is large |
| LEGAL_SUFFIX_TOGGLE | Acme Technologies Inc. | Acme Technologies LLC | MATCH | Needs strip-suffix normalization |
| MERGER_PREFIX | Acme Technologies | GlobalCo dba Acme Technologies | MATCH | Original name is a suffix token |
| SUBSIDIARY_SUFFIX | Acme Technologies | Acme Technologies: A Division | MATCH | Prefix match / token-subset needed |
| HARD_NEGATIVE | María García (master_id 1) | María García (master_id 55) | NO MATCH | Exact name, distinct entities |
Organization-name variation and hard-negative collisions
Four ORG classes (DBA_TRADE_NAME, LEGAL_SUFFIX_TOGGLE, MERGER_PREFIX, SUBSIDIARY_SUFFIX) cover legal-name versus trade-name and suffix/prefix noise. HARD_NEGATIVE rows share an exact name_original with a primary group but use master_id 51 to 100: the correct verdict is NO MATCH. Name-only matchers cannot resolve that case without non-name context, which is intentionally absent here.
Generate a larger version
Need more rows, a different variant mix, or additional entity types? Open the Generate-Data schema builder, add Name fields, switch on duplicate generation mode, set your variation-type mix, and export in CSV, JSON, XML, Parquet, XLSX, JSONL, or HuggingFace Datasets format. Anonymous use is free with no signup, capped at 100 rows, 6 fields, 3 exports, and CSV only. Sign in for larger exports and the full format menu.
Synthetic data: no real people, no real organizations, no real PII. No accuracy claim is made about any matching algorithm. Seed recorded as 20260801 for reproducibility.
Frequently asked questions
What makes this dataset different from the existing fuzzy-matching-test-data download?
The existing /fuzzy-matching-test-data file covers 7 easy-class variants where Levenshtein or Soundex usually gets the right answer. This corpus covers 12 hard-case classes where naive string distance fails, adds organization-name variants, and introduces hard negatives: distinct entities that share an exact name.
What is a hard negative in name matching?
A hard negative is a record pair where the names are exactly identical but the entities are distinct. A naive name-only matcher returns MATCH; the correct verdict is NO MATCH. In this corpus, hard-negative rows carry master_id values in range 51 to 100 and duplicate_type HARD_NEGATIVE.
Why does transliteration break string-distance matching?
Raw Levenshtein on UTF-8 multi-byte codepoints inflates edit distance for accented characters. The correct technique is Unicode NFD normalization followed by ASCII folding before comparison.
How do I use the master_id column as an answer key?
All rows sharing the same master_id represent the same synthetic entity. HARD_NEGATIVE rows use master_id 51 to 100 and are distinct entities despite sharing a name with a primary group. Compare your matcher output against this key to compute precision and recall.
Can I generate a larger version of this corpus with my own field set?
Yes. The Generate-Data schema builder supports duplicate generation mode with a configurable variant-type mix. Anonymous use is free with no signup, capped at 100 rows, 6 fields, 3 exports, and CSV only. Sign in for larger exports and the full format menu.