diff --git a/data/synthetic/.gitignore b/data/synthetic/.gitignore new file mode 100644 index 0000000..61c829e --- /dev/null +++ b/data/synthetic/.gitignore @@ -0,0 +1,8 @@ +__pycache__/ +*.py[cod] +.venv/ +dist/ +build/ +*.egg-info/ +.pytest_cache/ +.ruff_cache/ diff --git a/data/synthetic/DATACARD.md b/data/synthetic/DATACARD.md new file mode 100644 index 0000000..9d12670 --- /dev/null +++ b/data/synthetic/DATACARD.md @@ -0,0 +1,225 @@ +# `ng_supplier_v0` — a synthetic supplier world with labelled disagreement + +**What it is, what it is not, and every number measured on the file in this directory.** + +Licence: CC-BY-4.0, unpatterned.org. Generated by `build_ng_supplier_v0.py` at `arche_synthetic` 0.0.1, seed 42. Reproducible: the same pack, seed and scale rebuild it in about seven seconds, and `manifest.yaml` carries a content fingerprint per table so a rebuild can be checked without comparing Parquet bytes. + +## The one thing this set has that others do not + +Every disagreement between two records is labelled with **why it happened**, and the answer is not always "error": + +| kind | rows | what it means | are both records true? | +|---|---:|---|---| +| `change` | 1,763 | the supplier moved, was renamed, changed director or changed bank between the two observations | **yes**, at their respective times | +| `representation` | 18,437 | same fact, different encoding — `Limited` / `Ltd`, `and` / `&`, capitals, `Road` / `Rd` | yes | +| `error` | 12,772 | one record is wrong — typo, OCR misread, truncation, mutated digit | no | + +That first row is the point. Existing synthetic ER benchmarks build duplicates by corrupting a canonical record, so every difference is an error by construction. A matcher tuned on that learns that all disagreement is evidence of a different entity, and then splits entities in production when a supplier moves. **1,189 record pairs here differ because the entity legitimately changed**, and the truth says so, with the event id that caused it. + +## What is in the directory + +| file | rows | what it is | +|---|---:|---| +| `observations.parquet` | 6,130 | **everything a matcher is given.** No truth column — enforced at write time, not just tested | +| `truth.parquet` | 6,130 | `record_id` → `truth_entity_id`, plus which state each record saw | +| `differences.parquet` | 32,972 | one row per (pair, attribute, kind): the labelled disagreements | +| `events.parquet` | 1,717 | 1,435 lifecycle events, flattened one row per attribute moved | +| `schema/*.json` | 4 | JSON Schema per file | +| `manifest.yaml` | | seed, versions, counts, provenance, content fingerprints | + +**The contract is these files, not a Python class.** A Splink, Zingg, R or SQL user can consume this without installing anything of ours; the moment the truth is only readable through our own types, matcher-neutrality is gone and the benchmark is only useful to us. + +## The world + +2,000 organisations, 3,000 people, 1,500 places, over 2019-01-01 to 2026-01-01. Nigerian supplier domain: a company has an RC number, a TIN, a registered address, a director, a phone and a bank account. + +Three sources observe it, and they disagree for different reasons by design: + +| source | records | what it is | why it differs | +|---|---:|---|---| +| `erp` | 1,687 | the vendor master somebody typed once | **stale** — 30 to 900 days behind. This is what produces `change` | +| `registry` | 2,000 | CAC. Authoritative, fresh, full legal name and RC | barely — it is the source a matcher would most like to have | +| `invoice` | 2,443 | OCR'd, 1–3 per supplier over the horizon | heavy representation variation and OCR error, rarely an identifier | + +1,859 of 2,000 suppliers have more than one record. 141 have exactly one — singletons a matcher should not merge into anything. + +Events generated: 1,435 in total — 445 relocations, 406 director changes, 302 renames, 282 account changes. `events.parquet` has 1,717 rows because an account change moves two attributes (the bank and the number) and is flattened to one row each. + +## Every cause, with its count + +``` +change ORG_RELOCATED 985 error ocr_confusion 4555 +change ORG_RENAMED 407 error typo 4115 +change ACCOUNT_CHANGED 262 error truncation 3127 +change DIRECTOR_CHANGED 109 error digit_mutation 975 + +representation case_upper 10462 representation legal_suffix_abbreviated 3093 +representation address_abbreviated 3469 representation legal_suffix_dropped 956 +representation ampersand 424 representation diacritic_loss 33 +``` + +**Read `representation` by cause, never in aggregate.** `case_upper` is 57% of that kind, and every matcher normalises case before comparing, so those rows measure nothing. The informative ones are `legal_suffix_dropped` (956) and `legal_suffix_abbreviated` (3,093). `diacritic_loss` at 33 rows is too thin to score — it is reported, not a stratum. + +## What this set is not + +**It is not records from the wild.** Recall measured here says a matcher handles the variation this generator was told to produce. It does not say what happens on an actual vendor master, which is a set that still has to be acquired or adjudicated by hand. + +**The name frequencies are not Nigeria's.** Surnames are drawn Zipf so that names *collide* — 30% of suppliers share a first-token surname with another, which is most of what makes matching hard, and a benchmark without it is easy in a way real data never is. But arche's shipped lexicon carries no frequency data at all (two fields, `name` and `name_type`), so the *shape* of the distribution is modelled and the *ranking inside it is arbitrary and seeded*. `manifest.yaml` classes this as `synthetic-assumption`, not `public-data-derived`. Replacing the ranking with a real frequency table is a drop-in change and the first thing a curator should do. + +**The event rates are declared, not measured.** 22% of suppliers relocate over seven years because that is what the parameter says, not because anybody measured Nigerian supplier churn. They were raised once already, from a first pass where a rename produced exactly one labelled difference in a 100-supplier world — a stratum with one pair in it is not a stratum. + +**A null has two meanings.** Either the source does not store that field at all (the invoice has no TIN column) or the value was dropped by the `missing` rule. That ambiguity is true of real data too, so it is kept; the generator knows which is which and `differences.parquet` only ever compares fields both records carry. Null rates as published: `tin` 68%, `rc_number` 43%, `director_name` 43%, `phone` 41%, `account_number` 41%, `address` 9%, `name` 0%. + +**Only organisations are observed.** People and places exist as truth and appear *inside* supplier records — a director's name, an address — which is how they appear in a real vendor master. Observing them as independent records is a v0.2 extension. + +**No adversarial records.** Bank-account substitution and lookalike suppliers are deliberately absent. Legitimate account change has to be representable before the fraudulent version means anything, and it now is: 262 labelled `ACCOUNT_CHANGED` differences. + +## The invariants, enforced rather than promised + +1. **`observations.parquet` carries no truth column.** Refused at write time by `export.check_no_leak`, not only checked by a test — a test can be deleted, a writer that refuses cannot. +2. **No observed value is an entity id.** A column-name check alone would not catch a leak through a value. +3. **`record_id` holds no entity information.** It is `sha256(world_id, source, sequence)` — the entity was never in the payload, so the id is opaque by construction rather than by hoping the hash holds. This matters: ids shaped `obs:erp:org_991:1` make the truth recoverable by string manipulation, and a benchmark that ships the answer inside the question scores well and says nothing. +4. **Identifiers are valid by construction.** Every RC number and TIN passes arche's own CAC/FIRS validator at build time. +5. **A legitimate change is never filed as an error.** Tested by comparing the *true* state values each record saw, independently of the generator's own event lookup. + +`packages/arche-core/tests/test_synthetic_world.py` holds all five, plus reproducibility. + +## How large this world can honestly get: about 4,000 suppliers + +Measured 2026-09-09. The generator will produce any number of records; past a few thousand suppliers it stops producing a *realistic* one. Exact-duplicate company names, against the **12.0%** measured on 51,022 real GRID3 facility names: + +| organisations | exact-duplicate names | commonest surname used | +|---:|---:|---:| +| 2,000 | 8.1% | 205 times | +| 3,000 | 11.0% | 306 | +| **4,000** | **12.0%** | 392 | +| 6,000 | 16.8% | 653 | +| 10,000 | 20.2% | 1,067 | +| 40,000 | 33.8% | 4,249 | + +All measured through `build()`, so **after** the lifecycle renames — which is what the benchmark actually contains. Measuring the initial names instead (`generate()` alone) gives a slightly higher rate, because a rename spreads a name out; mixing the two methods in one table is an easy and misleading mistake. + +The binding constraint is not the record count, it is the **name space**: 12,369 usable surnames x 18 trades x 10 legal forms, drawn Zipf so the head is used far more often than the tail. At 40,000 suppliers a third of companies share an exact name with another, nearly three times the real rate, and every one of those collisions is region-random rather than structured. + +**So: 4,000 organisations is where this world's difficulty matches the real register, and 2,000-3,000 leaves headroom.** Larger runs are legitimate for measuring *throughput*, and their accuracy numbers should not be compared with the real-world figures in this card. Widening the naming model (plan N1) is what raises the ceiling; more records is not. + +## Three world packs, and why v0 was not fixed in place + +`ng_supplier_v0` is what everything in `RESULTS.md` was measured on. **It has not been changed**, because a benchmark that moves under its own name cannot be cited. The name defect below is real and stays in v0. + +`ng_supplier_v1` is N1: both halves of a name are drawn from **one country's real given+family pairs** (Wikidata, CC0, `datasets/data/wikidata_name_pairs.jsonl`) rather than independently from a pan-African lexicon. + +``` +v0: Zubeyde Saliou, Bachir Edwards, Fabiano Anaehobi, nk Regina +v1: Babatunde Williams, Samuel Okafor, John Obi, Beatrice Ajibola +``` + +**Two separate provenance claims, and they need separating.** *Which* names exist and plausibly go together is `public-data-derived`. *How concentrated* the distribution is cannot be: Wikidata holds **notable** people, where almost every name occurs once, and drawing on those raw counts made the world far too easy — 2.8% duplicate company names at 4,000 suppliers against 12.0% in the real register. A population is much more concentrated than its celebrities. So the real counts decide the **order** and a Zipf curve supplies the **shape**, and the manifest says both on their own lines. + +**The trade v1 makes.** The Nigerian pool is 546 given x 652 family, against the lexicon's 6,003 x 6,366. Realistic pairing costs name-space size, so v1's honest ceiling is lower: + +| organisations | v0 duplicates | v1 duplicates | +|---:|---:|---:| +| 2,000 | 8.1% | **12.8%** | +| 3,000 | 11.0% | 17.3% | +| 4,000 | **12.0%** | 19.6% | + +Against the real 12.0%: **generate v0 at 4,000 or v1 at 2,000.** + +### `africa_supplier_v1` — N1b, four countries + +v1 conditions on country, and a single-country world cannot show that: a Nigerian name cannot fail to predict a Nigerian city. So `africa_supplier_v1` spans **NG, KE, GH and ZA**, each with its own name pool, cities, streets, legal forms, phone prefixes and banks. + +``` +[ZA] Head Supplies (Pty) Ltd Cape Town Standard Bank +[GH] Boateng Pharmaceuticals Company Limited Accra GCB Bank +[KE] Korir Farms Limited Nakuru KCB Bank +[NG] Bello Freight Nigeria Limited Kano Fidelity Bank +``` + +`(Pty) Ltd` is South African and nothing else is; `and Sons Limited` is Nigerian. Those are signals a matcher can learn, and a world that shared them across countries would teach nothing about where a record came from. + +**Measured with notebook 24's own H3 test** — the share of frequent name tokens that are concentrated in one region at three times the baseline rate: + +| | | | +|---|---|---:| +| real GRID3 facility names | by state | 90.4% | +| `ng_supplier_v0` | by city | 0.0% | +| `ng_supplier_v1` | by city | 0.0% | +| **`africa_supplier_v1`** | **by country** | **24.1%** | + +The marked tokens are `and` and `sons` (Nigeria's *and Sons Limited*, at 4.2x) and surnames like `okafor` and `bello`. Both halves of the naming carry country now. + +**24.1% is not 90.4%, and the gap is honest.** Real facility names embed the settlement they sit in, which is a far stronger locator than a surname and a legal form. Company names are not facility names, and closing the rest of that gap would mean generating company names that contain their city — which some real ones do and most do not. + +**What none of the three packs fix.** Nigeria's Yoruba, Igbo and Hausa naming are not separated. The pull has 931 Nigerian pairs with 548 distinct given names, 653 distinct family names and **zero repeated pairs**, which cannot support sub-national conditioning; its commonest given names (Joseph, Henry, John, Samuel) are Anglophone Christian names that genuinely cross Nigerian ethnic lines. + +**What v1 still does not fix.** It conditions on *country*, and that world is entirely Nigerian, so a name still cannot predict a city — notebook 24's H3 will not move for `ng_supplier_v1`. Nigeria's Yoruba, Igbo and Hausa naming are not separated either: the pull has 931 Nigerian pairs with **548 distinct given names, 653 distinct family names and zero repeated pairs**, which is too sparse to learn sub-national structure from. Its commonest given names — Joseph, Henry, John, Samuel — are Anglophone Christian names that genuinely cross Nigerian ethnic lines, so the sparsity is partly real and partly Wikidata's notability bias. Making country conditioning visible needs a multi-country world; making tradition conditioning possible needs data this pull does not contain. + +## A second kind of world: `artists_v0` + +The supplier worlds ask *is this the same company after it moved, renamed and changed bank?* The artist world asks one narrower question, put to us by Splink's author: **what is a name-variant list worth to a matcher, and what does it cost?** + +`Wizkid` and `Ayodeji Ibrahim Balogun` are one person and share nothing an edit distance can see. No string method, no term-frequency weighting and no phonetic key will ever pair them. Only a list that says they are the same can, and until now nobody has measured how much such a list buys on real alias data. + +### Where the truth comes from, and why it is not the list + +**The truth is not invented.** Every alias group is a real African musician with the alternate names Wikidata records for them (CC0; `datasets/pull_wikidata.py aliases`, 1,468 artists). Filler artists are real people's names from the same pull, one name each. The generator decides *which* alias each catalogue writes and *what it does to it*; it never decides what an artist is called. + +**The list a matcher is given comes from somewhere else.** MusicBrainz alias sets (CC0), joined to the truth by Wikidata property P434 -- an identifier, never a name, because a name search for `Tyla` returns a UK artist of the same name. Two editorial communities, two opinions about what an artist is called. Where they disagree is where the experiment lives; a list derived from the truth would win by construction and prove nothing. **Coverage** -- the share of truth pairs the list knows -- is reported before any matcher runs and bounds the gain. + +### Sources + +| source | coverage | writes | habit | +|---|---:|---|---| +| `catalogue` | 90% | the stage name, mostly | clean | +| `press` | 60% | whatever the journalist used | loses diacritics, 3% typos | +| `lineup` | 50% | the stage name, IN CAPITALS | 45% upper-cased, truncates | +| `registry` | 35% | the legal name (longest alias) | loses diacritics | + +### Strata + +| difference | cause | meaning | +|---|---|---| +| representation | `alias` | two records name the artist differently and the names are **not** string-similar (Jaro-Winkler < 0.88). The list's whole case | +| representation | `spelling` | different names, string-similar (`Wiz Kid` / `Wizkid`). A matcher already handles these; the list should add little | +| representation | `case_upper`, `diacritic_loss` | a catalogue's house style | +| error | `typo`, `truncation` | a mistake | + +0.88 is Splink's own second Jaro-Winkler level, so a stratum here maps onto a comparison level there. + +**Collisions** -- two *different* artists sharing a name exactly -- are written to `collisions.parquet`. They are found in the data, not made: the wrong-Tyla case is real. A false merge on a collision pair is the cost a variant list is expected to have, and the file exists so the evaluator can say what that cost was. + +### Seed 42, 10,000 records + +``` +artists 2,941 (1,468 with 2+ names, 1,473 filler) +records 9,944 +differences 7,656 + alias 3,002 spelling 832 + case_upper 2,847 diacritics 157 + typo 677 truncation 141 +collisions 28 +``` + +`--scale` sets the record target; the alias groups are always all present and filler makes up the rest, so a bigger world has a thinner alias share, not more aliases. + +### What it is not + +- **Not a statistical replica of any catalogue.** Source coverage and error rates are declared assumptions; the names, aliases and countries are public data. The manifest says which is which. +- **Not evidence about African names in general.** Wikidata's alias coverage is uneven -- well-known artists carry legal and stage names, lesser-known ones a single spelling variant -- and the filler is notable people, not the population. +- **Not a benchmark of arche against anyone.** The experiment it exists for runs Splink four ways (plan §7d), and arche appears as one arm for the record. + +## Found while building it + +The generator drew `njirimara ezinụlọnjirimara ezinụlọ Steel Global` as a company name — Igbo for "family identifier", doubled. That is not a generator bug: **770 of the 13,342 entries in arche's shipped name lexicon (5.8%) are not names.** 514 are raw Wikidata blank-node URLs (`http://www.wikidata.org/.well-known/genid/…`), 153 are property labels in various languages (`Abas (nom de famille)`, `Akinfenwa (aha ezinụlọ)`), and the rest are titles and full person names filed as surnames. + +A second pass found 139 more that survived every other check: `almaerifaa.com`, and the Wikidata concept labels `femme blanche`, `homme blanc`, `pessoa branca` and `humano branco` in four languages -- all lowercase, where names in this lexicon are capitalised. The filter cannot simply require an initial capital, because `d'Arboussier` and `de Sardan` are real surname forms, and `Ba`, `Ka`, `Sy` and `Ly` are real Senegalese and Malian surnames that a length cut would delete; it requires an uppercase letter *somewhere*. **12,369 of 13,342 entries survive -- 7.3% of the shipped lexicon is not a name.** The generator filters them (`world._usable`); the lexicon needs fixing at source, and the published "13,342 names" figure is overstated by that much. + +## Reproducing + +```bash +python data/synthetic/build_ng_supplier_v0.py # the full world, ~7s +python data/synthetic/build_ng_supplier_v0.py --scale 100 # a small one to read +python -m arche_synthetic --world-pack artists_v0 --scale 10000 --out worlds/artists_v0 +``` diff --git a/data/synthetic/LICENSE b/data/synthetic/LICENSE new file mode 100644 index 0000000..aeb9ee9 --- /dev/null +++ b/data/synthetic/LICENSE @@ -0,0 +1,190 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to the Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by the Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding any notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + Copyright 2026 Unpatterned Labs + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/data/synthetic/README.md b/data/synthetic/README.md new file mode 100644 index 0000000..109b5eb --- /dev/null +++ b/data/synthetic/README.md @@ -0,0 +1,105 @@ +# arche-synthetic + +Known entity worlds, imperfect observations, exact ground truth — and every disagreement labelled with **why it happened**. + +```bash +pip install arche-synthetic # pyarrow and pyyaml. Nothing else. +python -m arche_synthetic --scale 400 --out ./worlds/ng +``` + +```python +from arche_synthetic import Benchmark, Predictions, build + +world, manifest = build("ng_supplier_v0", seed=42, out=Path("worlds/ng")) + +bench = Benchmark.load(Path("worlds/ng")) +report = bench.score(Predictions(arm="mine", pairs=my_predicted_pairs)) +report["recall_by_stratum"]["change/ORG_RELOCATED"] # the column nobody else has +``` + +From a checkout of this repository, run the scripts **from the repo root**. `data/synthetic` has its own `pyproject.toml`, so `uv run` with the working directory inside it resolves to the standalone project and will not find arche: + +```bash +python data/synthetic/build_ng_supplier_v0.py # ~7s, writes worlds/ng_supplier_v0/ +python data/synthetic/run_benchmark.py --world data/synthetic/worlds/ng_supplier_v0_s150 +``` + +## A second world: artists, for the variant-list question + +`artists_v0` is 9,944 records of 2,941 real African musicians under their real Wikidata aliases, built to answer one question put to us by Splink's author: what is a name-variant list worth to a matcher? The world, the independent MusicBrainz-derived list, a ninety-line Splink example and the full six-arm result are in [`datasets/artists_dataops/`](../../datasets/artists_dataops/README.md). + +```bash +python -m arche_synthetic --world-pack artists_v0 --scale 10000 --out data/synthetic/worlds/artists_v0 +``` + +## Why this exists + +arche keeps being blocked by data licensing. ai4privacy's 300k is academic-only and forbids derivatives; i2b2 needs a data-use agreement; OpenSanctions Pairs is a purchase. Every one of those is somebody else's permission. This is the path that needs nobody's. + +And one thing arche can do had never been measured: `ledger.observe()` — add evidence about a record, re-decide its open pairs, supersede rather than overwrite — had no benchmark, because measuring it needs data where an entity *legitimately changed* and the truth says so. No public entity-resolution benchmark has that column. This generates it, and [RESULTS.md](RESULTS.md) is what it found. + +## The idea in one table + +| kind | example | are both records true? | +|---|---|---| +| `change` | the supplier moved; the director resigned; the account was replaced | **yes**, at their respective times | +| `representation` | `Établissements Koné & Fils SARL` → `ETS Kone & Fils` | yes — same fact, different encoding | +| `error` | typo, OCR misread, truncation, mutated digit | no — one is a distortion | + +Existing synthetic ER benchmarks produce only the third row: take a record, corrupt it, call the result a duplicate. A matcher tuned on that learns that all disagreement means "different entity", and then splits entities in production the first time a supplier moves. + +The labels are computed **by construction**. Every observed value carries a note of which state it came from and which transforms were applied, so a difference is explained by comparing provenance rather than by guessing from the strings. + +## The modules + +``` +arche_synthetic/ +├── ids.py opaque record ids — the invariant that keeps truth out of the input +├── world.py entities, states, relationships; the frequency-weighted name draw +├── lifecycle.py events: relocation, rename, director change, account change +├── observe.py sources, representation rules, corruption rules, difference labelling +├── export.py Parquet + JSON Schema + manifest, and the write-time leak check +├── evaluate.py the stratified scorer — recall stratifies, precision does not +└── data/ the vendored name lexicon (CC-BY-4.0) +``` + +**Nothing imports `arche` at all.** The name lexicon is vendored (from arche's `african_names_v1`, itself built from Wikidata/ParaNames), and the RC/TIN format checks are local — with `test_synthetic_world.py::test_the_local_validators_agree_with_arches` asserting they still agree with arche's, which is stronger than importing either, because a one-sided import would hide a drift. + +Verified rather than asserted: installed into an empty virtualenv with only `pyarrow` and `pyyaml` beside it, the package generates a world whose content fingerprints are **identical** to one built inside this repo. + +## Is it realistic enough to measure on? + +`examples/notebooks/24_is_the_synthetic_world_realistic.ipynb` holds this world up against **51,023 real Nigerian facility names** (GRID3) and tests three hypotheses stated in advance. Summary: the collision *rate* is realistic (13.5% against 12.0%), the vocabulary is 2.8x thinner at matched sample size, and **0.0% of generated name tokens carry regional signal against 90.4% of real ones** — the correlation defect, measured rather than asserted. Which published numbers that does and does not affect is the notebook's last cell. + +## Output + +See [DATACARD.md](DATACARD.md) for what the shipped world contains, every measured number, and — as importantly — what it is not. + +**The contract is the files, not a Python class.** Parquet with documented columns, a JSON Schema beside each one, a manifest with provenance. A Splink, Zingg, R or SQL user consumes it without installing anything of ours. The moment the truth is only readable through our own types, matcher-neutrality is gone. + +## Running the benchmark + +```bash +python data/synthetic/run_benchmark.py --world data/synthetic/worlds/ng_supplier_v0_s150 +python data/synthetic/run_benchmark.py --arms exact,jaro_winkler # the fast ones +``` + +Seven arms: `exact` (normalised name + city join), `jaro_winkler`, `splink` (Fellegi-Sunter, its own decision boundary), `arche/pack`, `arche/custom`, and the two ledger arms — `arche/ledger` (records ingested in arrival order) and `arche/ledger+observe` (plus the operator's registry lookup). **Measured results and their caveats: [RESULTS.md](RESULTS.md).** The short version — every engine that reads the address fails on relocated suppliers, and the ledger path is the only thing that moves the number. + +The arms are extras, so the base install stays two dependencies: `pip install "arche-synthetic[bench]"` for the baselines, `[splink]` for the Splink arm, `[arche]` for the arche and ledger arms, `[all]` for everything. + +### Cutting the repository + +The trigger the plan set was *a stratified result **and** arche not being the only arm*. Both hold: Splink runs on this data and lands within 0.007 recall of `arche/pack`. + +This directory is now a complete standalone project — `pyproject.toml`, `LICENSE`, `.gitignore`, a vendored lexicon, no arche import anywhere, installable and verified in a clean environment. What remains is one command to extract its history and one to publish it: + +```bash +git subtree split -P data/synthetic -b arche-synthetic +``` + +then push that branch to a newly created `unpatterned-labs/arche-synthetic` and set `main` to it. + +**Publishing is the owner's to do.** Nothing in this branch creates a remote, pushes, or uploads anything; the repository's guards block an agent from doing so, and that is the correct arrangement. + +Afterwards, in this repository: drop the directory, add `arche-synthetic` as a dev dependency, and keep a thin consumer that runs the arche arms against the published package. The three test files in `packages/arche-core/tests/` move last — they become the new repo's `tests/`, and until the cut they are what keeps the generator honest inside arche's CI. diff --git a/data/synthetic/RESULTS.md b/data/synthetic/RESULTS.md new file mode 100644 index 0000000..57e0e1f --- /dev/null +++ b/data/synthetic/RESULTS.md @@ -0,0 +1,132 @@ +# Stratified results — `ng_supplier_v0`, seven arms + +**Measured 2026-09-08** by `run_benchmark.py`, on the world files currently in `worlds/`. Every number was produced on the machine that printed it. + +```bash +python data/synthetic/build_ng_supplier_v0.py --scale 150 --out data/synthetic/worlds/ng_supplier_v0_s150 +python data/synthetic/run_benchmark.py --world data/synthetic/worlds/ng_supplier_v0_s150 +``` + +## 0. Read this first: how much a single number here can carry + +A previous version of this file quoted numbers measured on worlds that were then regenerated after a name-pool fix. Re-measuring, I predicted the figures would "move only slightly." **That was wrong**, and finding out how wrong is the most useful thing in this document. + +Five seeds at 150 suppliers, the three fast arms (the arche arms are too slow to sweep): + +``` +arm metric min max spread stdev +exact recall 0.367 0.466 0.099 0.044 +exact change 0.167 0.272 0.105 0.046 +exact reloc 0.018 0.079 0.061 0.024 +jaro_winkler recall 0.861 0.934 0.074 0.028 +jaro_winkler precision 0.669 0.887 0.218 0.091 +jaro_winkler change 0.837 0.965 0.128 0.050 +jaro_winkler reloc 0.818 0.980 0.162 0.066 +splink recall 0.706 0.783 0.077 0.033 +splink precision 0.925 0.988 0.063 0.024 +splink reloc 0.163 0.309 0.146 0.066 +``` + +The worlds themselves vary: 439–473 records, 521–625 true pairs, **38–55 relocated pairs** for the same nominal 150 suppliers. + +**The rule this sets.** For an *unpaired* comparison between two arms at this scale, a difference below **~0.10 on overall recall** or **~0.15 on relocation recall** cannot be distinguished from which world you happened to draw. Several comparisons in earlier drafts of this file sat inside that band and have been withdrawn below. + +**Paired comparisons are a different matter** and are much more sensitive: two arms run on the *same* world see identical records, so world-to-world variation largely cancels. Section 3 is a paired result and is treated accordingly. + +This is a property of the benchmark at 150 suppliers, not of the engines. The fix is more suppliers or more seeds, and both cost arche-runtime — which is the binding constraint recorded in the caveats. + +## 1. The table — 150 suppliers, 444 records, 545 true pairs, seed 42 + +``` +arm P R F1 cover change represent error falseMrg blockR secs +exact 1.000 0.466 0.636 0.466 0.261 0.440 0.329 0.000 0.466 0.0 +jaro_winkler 0.882 0.861 0.871 0.861 0.837 0.854 0.805 0.042 0.947 0.0 +splink 0.988 0.783 0.874 0.783 0.533 0.792 0.761 0.024 0.974 7.5 +arche/pack 0.995 0.745 0.852 0.969 0.391 0.725 0.663 0.005 0.980 343.4 +arche/custom 1.000 0.694 0.819 0.921 0.370 0.669 0.591 0.000 0.985 260.4 +arche/ledger 1.000 0.778 0.875 0.778 0.522 0.773 0.717 0.000 n/a 547.1 +arche/ledger+observe 0.944 0.796 0.864 0.796 0.576 0.792 0.738 0.000 n/a 436.7 +``` + +`cover` counts pairs an engine *surfaced for review* as well as merged — without it an engine with three answers is scored as though it had two. The stratum columns are **recall only**: a false merge joins two different entities, has no difference row, and belongs to no stratum. `blockR` is `n/a` for the ledger arms because they do not enumerate a candidate set, and filling it in with their own recall would be a lie in the flattering direction. + +## 2. Relocation defeats every engine that reads the address + +Recall on the 55 relocated pairs — the stratum this dataset exists to expose: + +``` +exact 0.018 arche/pack 0.145 +arche/custom 0.164 splink 0.309 +arche/ledger 0.309 arche/ledger+observe 0.400 +jaro_winkler 0.818 ← reads names only +``` + +**This is the finding, and it is the one comfortably outside the noise.** Jaro-Winkler sits at 0.818–0.980 across five seeds; every engine that reads the address sits below 0.41. That gap is five times the measured spread. A rule join finds 2% of relocated suppliers; arche finds 15%; Splink — an independent Fellegi-Sunter implementation — finds 31%. + +Not "arche is bad at relocation" but **"a changed address is treated as refuting evidence by every engine that reads it, so a supplier moving is indistinguishable from a supplier being a different company."** No published entity-resolution benchmark can show this, because none label *why* two records disagree. + +Jaro-Winkler's 0.818 is not competence. It compares names and nothing else, so a changed address cannot hurt it — and the bill arrives in the precision column: 0.882 here, and 0.669 on the worst of five seeds, against Splink's 0.925–0.988. **An arm can top the change stratum by ignoring evidence.** + +The middle of that list — arche 0.145 vs Splink 0.309 vs ledger 0.309 — spans less than the 0.146 seed spread measured for Splink alone. **Do not read an ordering into it.** + +## 3. The ledger does beat batch — paired across three worlds + +`arche/pack` reaches 0.145 on relocation while its `cover` is 0.969: it is not *missing* those pairs, it is **refusing** them. The `organisation` pack compares `address` with a `premises` comparator declared `refutes_below: 0.5`, so a wholly changed address demotes the pair to `review` however well the name and RC number agree. + +The single-seed gap could not carry that claim — 0.16 on relocation is inside the unpaired noise band. But both arms run on the *same* records, so the honest test is paired: does the difference keep its sign across worlds? Three worlds, 90 suppliers, `arche/pack` against `arche/ledger`: + +``` +seed arm recall prec reloc change +42 arche/pack 0.739 0.978 0.121 0.346 +42 arche/ledger 0.797 0.944 0.151 0.462 + delta +0.058 -0.034 +0.030 +0.115 +43 arche/pack 0.735 0.975 0.053 0.378 +43 arche/ledger 0.812 0.895 0.158 0.540 + delta +0.077 -0.081 +0.105 +0.162 +44 arche/pack 0.757 1.000 0.115 0.460 +44 arche/ledger 0.800 1.000 0.308 0.580 + delta +0.043 +0.000 +0.192 +0.120 +``` + +**Overall recall, the `change` stratum and relocation are positive in all three worlds.** The most consistent of them is the whole `change` stratum: **+0.115, +0.162, +0.120** — the ledger recovers twelve to sixteen points of legitimate change that one-shot batch comparison declines. Relocation moves in the same direction every time but with a much wider range (+0.03 to +0.19), so the *direction* is the claim and the magnitude is not. + +**What this is and is not.** Three worlds agreeing on sign is p = 0.125 under a sign test — suggestive, not significant, and it should not be described as significant. What lifts it above a coincidence is that there is a mechanism: the pack refuses on a changed address, and the ledger's later-evidence-supersedes-earlier-decision path is precisely the thing that can revisit a refusal. A consistent sign plus a mechanism that predicts that sign is a reasonable claim; either alone would not be. + +**Precision is the honest other half, and it flips.** −0.034, −0.081, 0.000: the ledger is never *more* precise than batch and is sometimes less, because it links transitively and a wrong link propagates through an entity in a way a pairwise merge does not. That is a smaller and less consistent cost than the single-seed table implied, and it is a real trade: which end of it is right depends on whether a false merge or a false split costs more in the workflow. The benchmark can now price both. + +`arche/ledger+observe` is an **assisted** number wherever it appears, and was not part of this paired test. The lookup key is the RC number, an identifier the records carry, never the truth mapping — but two records sharing an RC number are already strong evidence, so it measures whether `observe()` propagates and re-decides correctly, not whether arche finds the link unaided. + +## 4. Splink and arche are close — how close is not measurable here + +``` +splink P 0.988 R 0.783 F1 0.874 7.5 s +arche/pack P 0.995 R 0.745 F1 0.852 343.4 s +``` + +Two independently written engines, one of them not ours, landing within 0.04 recall and 0.007 precision. **The gap is inside the noise band, so the correct statement is that they are indistinguishable at this scale — not that either leads.** An earlier draft of this file claimed they agreed "to three decimal places," which was one draw dressed up as a measurement. + +What the row does support is the thing that matters: an engine we did not write, on our data, lands in the same region as ours. That is evidence the benchmark measures the problem rather than a quirk of our implementation, and it **completes the trigger for cutting the separate repository**. Splink is also ~46× faster. + +Getting this arm to be fair took two corrections, both recorded because both would have flattered arche: + +- **The first version scored 0.000 on relocations.** Not a Splink limitation — `block_on` is case-sensitive, 57% of this world's representation differences are a source that stores records IN CAPITALS, and every blocking key broke on case alone. Blocking recall was 0.404. Normalising before loading, which every Splink user does, took it to 0.974. +- **The threshold was borrowed and wrong.** 0.99, taken from the existing Febrl benchmark, cost about 0.5 recall: at 0.99 Splink scores R 0.207/P 1.000; at its own 0.5 decision boundary R 0.731/P 0.940. Imposing an arche-flavoured caution on an engine that has no third answer is the same error as scoring arche on a probability cut, which this project already knows not to make. + +A badly configured competitor is worse than no competitor. + +## 5. Reading more fields made matching worse + +`arche/custom` maps in the four fields the shipped pack ignores — phone, TIN, account number, director. Recall falls 0.745 → 0.694, and `ACCOUNT_CHANGED` recall falls 0.889 → 0.333. + +The reason is structural. Those fields are disproportionately the ones that *legitimately change* or are *absent*, so they disagree on exactly the pairs that most need linking, and each disagreement pulls the weighted mean down. `error/digit_mutation` shows the same shape, 0.407 → 0.185, because a mutated digit in an identifier now actively argues against a match. Precision rises to 1.000, which is the honest other half. + +**A comparator that helps on the stable case can hurt on the changing one**, and no benchmark without a `change` column would have shown it. The overall recall gap (0.051) is inside the noise band; the `ACCOUNT_CHANGED` and `digit_mutation` drops are large and mechanistically explained, which is why they are reported and the headline recall difference is not. + +## Caveats that belong with any use of these numbers + +- **Read section 0 before quoting anything.** At 150 suppliers, unpaired differences below ~0.10 recall are not measurable. +- **The names have no correlation.** Given name and surname are drawn independently, so this world contains `Zübeyde Saliou` and `Fabiano Anaehobi`. That corrupts the `common_names` stratum specifically — real collisions are structured by region and these are random. See `DATACARD.md` and plan §7b (N1). +- **`ORG_RENAMED` is easier here than it should be.** The rename mostly swaps the legal form, which every arm normalises away. Until N2 lands, the rename numbers flatter every arm. +- **`DIRECTOR_CHANGED` has n=7** at this scale, `ACCOUNT_CHANGED` n=9. Reported, not scoreable. `diacritic_loss` did not populate at all. +- **arche's runtime is the binding constraint.** ~160 pairs/second, measured as *not* the frequency table (75 s vs 81 s with `tf` off on a fixed subset). It caps the scale, which is what makes the noise band as wide as it is. +- **Company names are `
` over 18 trades and 10 forms**, which makes token blocking collapse harder than on a real register. diff --git a/data/synthetic/arche_synthetic/__init__.py b/data/synthetic/arche_synthetic/__init__.py new file mode 100644 index 0000000..ff237d5 --- /dev/null +++ b/data/synthetic/arche_synthetic/__init__.py @@ -0,0 +1,79 @@ +# Copyright 2026 unpatterned.org +# SPDX-License-Identifier: Apache-2.0 + +"""arche-synthetic — known entity worlds, imperfect observations, exact truth. + + from arche_synthetic import build + + world, manifest = build("ng_supplier_v0", seed=42, out=Path("worlds/ng")) + +The object is a **benchmark, not a platform**: a world with known entities and +known state changes, observed through source systems that are stale, that +abbreviate, and that make mistakes -- with every resulting disagreement +labelled by *why it happened*. That last column is the one no published +entity-resolution benchmark has, and it is the reason to build this rather +than use SPIDER or FEBRL. + +Why it exists at all: arche keeps being blocked by data licensing. ai4privacy +is academic-only and forbids derivatives; i2b2 needs a data-use agreement; +OpenSanctions is a purchase. Every one of those is somebody else's permission. +This is the path that needs nobody's. + +The directory is named ``arche_synthetic`` inside the arche repo on purpose: +when it earns its own repository -- the trigger is a stratified result with +more than one matcher in it -- the move is a rename of its parent and nothing +else. Nothing here imports ``arche`` at module scope; the two uses (the name +lexicon and the identifier validators) are dev-time and local to a function. +""" + +from __future__ import annotations + +from datetime import date +from pathlib import Path +from typing import Any + +from . import artists, evaluate, export, ids, lifecycle, observe, world +from .evaluate import Benchmark, Predictions + +__version__ = "0.0.1" + +#: Default horizon. Long enough that a supplier can move, be renamed, change a +#: director and change a bank account without the events piling into one month. +HORIZON = (date(2019, 1, 1), date(2026, 1, 1)) + +#: The world packs this generator knows. `ng_supplier_v0` is the one +#: `RESULTS.md` was measured on -- names drawn from a pan-African lexicon, with +#: the correlation defect that notebook 24 measured. `ng_supplier_v1` draws +#: both halves of a name from one country's real pairs (Wikidata, CC0). v0 is +#: kept unchanged rather than fixed in place, because a benchmark that changes +#: under its own name cannot be cited. +#: +#: v0.1 scale. Small enough to run in CI and to audit by hand, big enough that +#: a Zipf surname draw actually collides. The detection set that moved arche's +#: numbers most was 240 rows; scale is not the thing that makes a benchmark +#: informative, and a stratum with 40 pairs in it is not a stratum. +SCALE = {"organisations": 2000, "people": 3000, "places": 1500} + + +def build(world_pack: str = "ng_supplier_v0", *, seed: int = 42, + out: Path | None = None, scale: dict[str, int] | None = None, + horizon: tuple[date, date] = HORIZON) -> tuple[world.World, dict[str, Any]]: + """Generate a world, age it, observe it, and (with ``out``) write it. + + Deterministic: the same pack, seed, scale and horizon produce the same + world, checked by content fingerprint rather than by file bytes. + """ + counts = {**SCALE, **(scale or {})} + built = world.generate(world_pack, seed, **counts) + lifecycle.run(built, *horizon, seed=seed) + observe.run(built, *horizon, seed=seed) + manifest: dict[str, Any] = {} + if out is not None: + manifest = export.write(built, out, generator_version=__version__, + world_pack=world_pack, + notes={"horizon": [d.isoformat() for d in horizon]}) + return built, manifest + + +__all__ = ["HORIZON", "SCALE", "Benchmark", "Predictions", "__version__", "artists", + "build", "evaluate", "export", "ids", "lifecycle", "observe", "world"] diff --git a/data/synthetic/arche_synthetic/__main__.py b/data/synthetic/arche_synthetic/__main__.py new file mode 100644 index 0000000..97a0889 --- /dev/null +++ b/data/synthetic/arche_synthetic/__main__.py @@ -0,0 +1,52 @@ +# Copyright 2026 unpatterned.org +# SPDX-License-Identifier: Apache-2.0 + +"""``python -m arche_synthetic`` — build a world without a checkout. + + python -m arche_synthetic --scale 400 --out ./worlds/ng_supplier_v0 +""" + +from __future__ import annotations + +import argparse +from pathlib import Path + +from . import SCALE, artists, build + + +def main(argv: list[str] | None = None) -> int: + ap = argparse.ArgumentParser(prog="arche-synthetic", + description=__doc__.splitlines()[0]) + ap.add_argument("--world-pack", default="ng_supplier_v0") + ap.add_argument("--seed", type=int, default=42) + ap.add_argument("--scale", type=int, default=None, + help="organisations (people and places scale with it); for " + "artists_v0, records") + ap.add_argument("--out", default="worlds/ng_supplier_v0") + args = ap.parse_args(argv) + + scale = None + if args.scale: + ratio = args.scale / SCALE["organisations"] + scale = {"organisations": args.scale, + "people": max(2, int(SCALE["people"] * ratio)), + "places": max(2, int(SCALE["places"] * ratio))} + + if args.world_pack == artists.WORLD_PACK: + # A different kind of world: `--scale` is records, not organisations. + _, manifest = artists.build(seed=args.seed, records=args.scale or 10_000, + out=Path(args.out)) + else: + _, manifest = build(args.world_pack, seed=args.seed, out=Path(args.out), + scale=scale) + counts = manifest["counts"] + print(f" {manifest['world_id']} seed {manifest['seed']}") + print(f" entities {counts['entities']}") + print(f" observations {counts['observations']}") + print(f" differences {counts['differences']} {counts['difference_kinds']}") + print(f" written to {args.out}") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/data/synthetic/arche_synthetic/artists.py b/data/synthetic/arche_synthetic/artists.py new file mode 100644 index 0000000..f9995de --- /dev/null +++ b/data/synthetic/arche_synthetic/artists.py @@ -0,0 +1,418 @@ +# Copyright 2026 unpatterned.org +# SPDX-License-Identifier: Apache-2.0 + +"""The artist world — real alias sets, imperfect catalogues, exact truth. + + from arche_synthetic.artists import build + world, manifest = build(seed=42, records=10_000, out=Path("worlds/artists_v0")) + +What it is for +-------------- +One experiment (plan §7d): *what is a name-variant list worth to a matcher?* +`Wizkid` and `Ayodeji Ibrahim Balogun` are one person and share no letters +that matter. No edit distance, no term frequency and no phonetic key will +ever put them together; only a list that says so can. This world exists to +measure how much that list buys, and what it costs. + +Where the truth comes from +-------------------------- +**Not invented.** Every alias group is a real artist with the alternate names +Wikidata records for them (CC0, pulled by `datasets/pull_wikidata.py aliases`). +Filler artists -- the crowd a real catalogue has -- are real people's names +from the same Wikidata pull, one name each. The generator decides *which* +alias each source uses and *what it does to it*; it never decides what an +artist is called. + +That matters for the ablation's honesty. The variant list a matcher is given +comes from **MusicBrainz**, a different editorial community, so the list and +the truth can disagree. A list derived from the truth would win by +construction and prove nothing. + +The three strata a difference can fall in +----------------------------------------- +- ``representation/alias`` -- two records name the artist differently and the + names are not string-similar (Jaro-Winkler < 0.88). The list's whole case. +- ``representation/spelling`` -- different names, string-similar (`Wiz Kid`, + `Wizkid`). A good matcher already handles these; the list should add + little. +- ``error/`` -- a typo, a shouting catalogue, lost diacritics, a + truncated field. Applied on top of whichever name the source chose. + +The 0.88 boundary is Splink's own second Jaro-Winkler level, so a stratum +here maps onto a comparison level there. + +Collisions +---------- +Two *different* artists that share a name -- exactly, after casefolding -- are +recorded in ``collisions.parquet``. Nobody invented them: they are what the +data contains (the wrong-Tyla case, two artists both called Tyla). A false +merge on a collision pair is the cost a variant list is expected to have, and +the evaluator needs to be able to find those pairs to say what the cost was. + +The file contract is the supplier world's: ``observations.parquet`` with no +truth column, ``truth.parquet``, ``differences.parquet``, a schema beside +each, and a manifest with content fingerprints and provenance. +""" + +from __future__ import annotations + +import json +import random +from dataclasses import dataclass +from datetime import date, timedelta +from pathlib import Path +from typing import Any + +from . import export +from .ids import difference_id, entity_id, record_id +from .observe import CORRUPTION, REPRESENTATION, Difference, Observation +from .world import Entity, State, World + +_REPO = Path(__file__).resolve().parents[3] +TRUTH = _REPO / "datasets" / "data" / "wikidata_artist_aliases.jsonl" +FILLER = _REPO / "datasets" / "data" / "wikidata_name_pairs.jsonl" + +WORLD_PACK = "artists_v0" +COLUMNS = ("record_id", "source", "observed_at", "name", "country") +HORIZON = (date(2015, 1, 1), date(2026, 1, 1)) + +#: Splink's second Jaro-Winkler level. Above it two names are "spelling"; +#: below it they are "alias", and only a list can bring them together. +SPELLING_BOUNDARY = 0.88 + +#: Wikidata's country labels for the alias pull, as ISO codes, so the two +#: pulls agree on how a country is written. +_ISO = {"Nigeria": "NG", "South Africa": "ZA", "Ghana": "GH", "Cameroon": "CM", + "Uganda": "UG", "Tanzania": "TZ", "Ivory Coast": "CI", "Zimbabwe": "ZW", + "Ethiopia": "ET", "Senegal": "SN", "Kenya": "KE", "Zambia": "ZM"} + + +# ------------------------------------------------------------- similarity -- + +def jaro_winkler(a: str, b: str) -> float: + """Jaro-Winkler similarity, in-module so generation needs no matcher library. + + Standard definition: Jaro with a prefix bonus of 0.1 per shared leading + character, up to four. Casefolded, because the stratum boundary is about + what the names are, not how a catalogue capitalises them. + """ + a, b = a.casefold(), b.casefold() + if a == b: + return 1.0 + if not a or not b: + return 0.0 + window = max(len(a), len(b)) // 2 - 1 + match_a = [False] * len(a) + match_b = [False] * len(b) + matches = 0 + for i, ca in enumerate(a): + lo, hi = max(0, i - window), min(len(b), i + window + 1) + for j in range(lo, hi): + if not match_b[j] and b[j] == ca: + match_a[i] = match_b[j] = True + matches += 1 + break + if not matches: + return 0.0 + transpositions = 0 + k = 0 + for i, ca in enumerate(a): + if match_a[i]: + while not match_b[k]: + k += 1 + if ca != b[k]: + transpositions += 1 + k += 1 + jaro = (matches / len(a) + matches / len(b) + + (matches - transpositions / 2) / matches) / 3 + prefix = 0 + for ca, cb in zip(a[:4], b[:4], strict=False): + if ca != cb: + break + prefix += 1 + return jaro + prefix * 0.1 * (1 - jaro) + + +# ------------------------------------------------------------- sources ----- + +@dataclass(frozen=True) +class ArtistSource: + """One catalogue, and what it habitually does to a name. + + ``alias_bias`` is how the source picks which name to write: ``stage`` + prefers the canonical (stage) name, ``legal`` prefers the longest alias + (which for a musician is usually the legal name), ``any`` is uniform. + A press archive writes whatever the journalist used; a rights registry + writes the legal name; a festival line-up writes the stage name in + capitals. + """ + + name: str + coverage: float + repeats: tuple[int, int] + alias_bias: str # stage | legal | any + country_missing: float + representation: dict[str, float] + error: dict[str, float] + + +CATALOGUE = ArtistSource("catalogue", 0.90, (1, 2), "stage", 0.10, + {"diacritic_loss": 0.05}, {"typo": 0.01}) +PRESS = ArtistSource("press", 0.60, (1, 3), "any", 0.40, + {"case_upper": 0.05, "diacritic_loss": 0.20}, {"typo": 0.03}) +LINEUP = ArtistSource("lineup", 0.50, (1, 1), "stage", 0.70, + {"case_upper": 0.45}, {"truncation": 0.04, "typo": 0.02}) +REGISTRY = ArtistSource("registry", 0.35, (1, 1), "legal", 0.05, + {"diacritic_loss": 0.30, "case_upper": 0.15}, {"typo": 0.02}) +SOURCES = {s.name: s for s in (CATALOGUE, PRESS, LINEUP, REGISTRY)} + + +# ------------------------------------------------------------- loading ----- + +def load_truth(path: Path = TRUTH) -> list[dict[str, Any]]: + """Wikidata alias groups: canonical, variants, country, Wikidata id.""" + groups = [] + for line in path.read_text(encoding="utf-8").splitlines(): + if not line.strip(): + continue + g = json.loads(line) + names = [g["canonical"], *g.get("variants", [])] + # Distinct after casefolding; a variant that only differs in case is + # not an alias, it is a representation, and the sources supply those. + seen: dict[str, str] = {} + for n in names: + key = n.casefold().strip() + if key and key not in seen: + seen[key] = n.strip() + if len(seen) < 2: + continue + groups.append({"wikidata": g["entity_id"], "canonical": g["canonical"].strip(), + "names": list(seen.values()), + "country": _ISO.get(g.get("country", ""), g.get("country"))}) + return groups + + +def load_filler(path: Path = FILLER) -> list[dict[str, str]]: + """Real people's names, one each, as the crowd around the alias groups.""" + rows = [] + for line in path.read_text(encoding="utf-8").splitlines(): + if not line.strip(): + continue + r = json.loads(line) + rows.append({"name": f"{r['given']} {r['family']}", "country": r["country"]}) + return rows + + +# ------------------------------------------------------------- generation -- + +class ArtistGenerator: + """Builds a world of artists, observes it, and labels every disagreement.""" + + def __init__(self, seed: int, *, records: int, world_id: str = WORLD_PACK, + truth_path: Path = TRUTH, filler_path: Path = FILLER) -> None: + self.rng = random.Random(seed) + self.world = World(world_id=world_id, seed=seed) + self.records_target = records + self.groups = load_truth(truth_path) + self.filler = load_filler(filler_path) + self._n = 0 + self._seq = 0 + # Truth-side memory of which name each record was *meant* to carry, + # before any corruption. Never exported; it is what decides whether a + # pair is an alias difference or a spelling one. + self._intended: dict[str, str] = {} + + # -- entities ------------------------------------------------------------ + + def _add(self, names: list[str], country: str | None, *, kind: str, + wikidata: str | None = None) -> str: + eid = entity_id(self.world.world_id, "artist", self._n) + self._n += 1 + self.world.entities[eid] = Entity(eid, "artist") + self.world.states[eid] = [State(eid, HORIZON[0], None, { + "names": names, "canonical": names[0], "country": country, + "kind": kind, "wikidata": wikidata})] + return eid + + def populate(self) -> None: + """Every alias group, then enough filler to reach the record target.""" + for g in self.groups: + self._add(g["names"], g["country"], kind="alias", wikidata=g["wikidata"]) + # How many records the alias groups will produce, on average, decides + # how much filler is needed. Estimated from the source parameters so + # the target is approximately met rather than hit by trial. + per_entity = sum(s.coverage * (s.repeats[0] + s.repeats[1]) / 2 + for s in SOURCES.values()) + need = max(0, int(self.records_target / per_entity) - len(self.groups)) + pool = list(self.filler) + self.rng.shuffle(pool) + for row in pool[:need]: + self._add([row["name"]], row["country"], kind="filler") + + # -- observation --------------------------------------------------------- + + def _choose_name(self, names: list[str], source: ArtistSource) -> str: + if len(names) == 1 or source.alias_bias == "any": + return self.rng.choice(names) + if source.alias_bias == "legal": + longest = max(names, key=len) + return longest if self.rng.random() < 0.75 else self.rng.choice(names) + # stage: the canonical most of the time, any alias otherwise + return names[0] if self.rng.random() < 0.75 else self.rng.choice(names) + + def observe_one(self, eid: str, source: ArtistSource, when: date) -> Observation: + state = self.world.states[eid][0] + intended = self._choose_name(state.attributes["names"], source) + value = intended + applied: dict[str, list[tuple[str, str]]] = {"name": []} + for rule, p in sorted(source.representation.items()): + if self.rng.random() < p: + out = REPRESENTATION[rule](value, self.rng) + if out is not None and out != value: + value = out + applied["name"].append(("representation", rule)) + for rule, p in sorted(source.error.items()): + if self.rng.random() < p: + out = CORRUPTION[rule](value, self.rng) + if out is not None and out != value: + value = out + applied["name"].append(("error", rule)) + attributes = {"name": value} + if self.rng.random() >= source.country_missing and state.attributes["country"]: + attributes["country"] = state.attributes["country"] + rid = record_id(self.world.world_id, source.name, self._seq) + self._seq += 1 + self._intended[rid] = intended + return Observation(rid, source.name, when, attributes, + entity_id=eid, state_index=0, applied=applied) + + def observe(self) -> None: + start, end = HORIZON + span = (end - start).days + out: list[Observation] = [] + for eid in sorted(self.world.entities): + for source in SOURCES.values(): + if self.rng.random() >= source.coverage: + continue + for _ in range(self.rng.randint(*source.repeats)): + when = start + timedelta(days=self.rng.randrange(span)) + out.append(self.observe_one(eid, source, when)) + # Shuffle so record order carries nothing about entity membership. + self.rng.shuffle(out) + self.world.observations = out + + # -- labelling ----------------------------------------------------------- + + def differences(self) -> None: + """One row per (pair, kind): alias or spelling from the intended + names, plus every corruption either record carries.""" + by_entity: dict[str, list[Observation]] = {} + for o in self.world.observations: + by_entity.setdefault(o.entity_id, []).append(o) + out: list[Difference] = [] + for eid, group in sorted(by_entity.items()): + group = sorted(group, key=lambda o: o.record_id) + for i, a in enumerate(group): + for b in group[i + 1:]: + if a.attributes["name"] == b.attributes["name"]: + continue + kinds: list[tuple[str, str]] = [] + ia, ib = self._intended[a.record_id], self._intended[b.record_id] + if ia.casefold() != ib.casefold(): + sim = jaro_winkler(ia, ib) + kinds.append(("representation", + "spelling" if sim >= SPELLING_BOUNDARY else "alias")) + seen: set[tuple[str, str]] = set() + for note in (*a.applied.get("name", ()), *b.applied.get("name", ())): + if note not in seen: + seen.add(note) + kinds.append(note) + for kind, cause in kinds: + out.append(Difference( + difference_id(a.record_id, b.record_id, "name", kind), + eid, a.record_id, b.record_id, "name", kind, cause, None)) + self.world.differences = out + + def collisions(self) -> list[dict[str, Any]]: + """Distinct entities that share a name exactly. Found, not made.""" + by_name: dict[str, set[str]] = {} + for eid, chain in self.world.states.items(): + for n in chain[0].attributes["names"]: + by_name.setdefault(n.casefold().strip(), set()).add(eid) + rows = [] + for name, owners in sorted(by_name.items()): + if len(owners) < 2: + continue + owners_sorted = sorted(owners) + for i, a in enumerate(owners_sorted): + for b in owners_sorted[i + 1:]: + rows.append({"entity_a": a, "entity_b": b, "shared_name": name, + "kind_a": self.world.states[a][0].attributes["kind"], + "kind_b": self.world.states[b][0].attributes["kind"]}) + return rows + + def build(self) -> World: + self.populate() + self.observe() + self.differences() + alias_entities = sum(1 for s in self.world.states.values() + if s[0].attributes["kind"] == "alias") + self.world.provenance.append({ + "asset": "artist alias groups (the truth)", + "source": ("Wikidata skos:altLabel for African musicians (CC0), via " + "datasets/pull_wikidata.py aliases"), + "method": ("every alias group is a real artist; the generator chooses " + "which alias each source writes and what it does to it, never " + "what the artist is called"), + "class": "public-data-derived", + "pool": f"{alias_entities:,} artists with 2+ names", + "limitation": ("Wikidata's alias coverage is uneven: well-known artists " + "carry legal names and stage names, lesser-known ones a " + "single spelling variant"), + }) + self.world.provenance.append({ + "asset": "filler artists", + "source": "Wikidata given+family pairs (CC0), via datasets/pull_wikidata.py names", + "method": "one real name each, no aliases; only corruptions apply", + "class": "public-data-derived", + "pool": f"{len(self.world.states) - alias_entities:,} names", + }) + self.world.provenance.append({ + "asset": "the variant list a matcher may be given", + "source": "MusicBrainz alias sets (CC0), via datasets/artists_dataops/pull_musicbrainz.py", + "method": ("joined to the truth by Wikidata P434, never by name; a " + "different editorial community from the one that supplied " + "the truth, so the two can disagree"), + "class": "public-data-derived", + "note": ("NOT used to build this world. It is the ablation's independent " + "variable and lives beside the world, not inside it"), + }) + return self.world + + +# ------------------------------------------------------------- entry ------- + +def build(*, seed: int = 42, records: int = 10_000, out: Path | None = None, + truth_path: Path = TRUTH, filler_path: Path = FILLER, + generator_version: str = "0.0.1") -> tuple[World, dict[str, Any]]: + """Generate the artist world and, with ``out``, write it.""" + gen = ArtistGenerator(seed, records=records, truth_path=truth_path, + filler_path=filler_path) + world = gen.build() + manifest: dict[str, Any] = {} + if out is not None: + collisions = gen.collisions() + manifest = export.write( + world, out, generator_version=generator_version, world_pack=WORLD_PACK, + columns=COLUMNS, entity_type="artist", + extra_tables={"collisions": (collisions, + ["entity_a", "entity_b", "shared_name"])}, + notes={"horizon": [d.isoformat() for d in HORIZON], + "spelling_boundary": SPELLING_BOUNDARY, + "collisions": len(collisions)}) + return world, manifest + + +__all__ = ["COLUMNS", "HORIZON", "SOURCES", "SPELLING_BOUNDARY", "WORLD_PACK", + "ArtistGenerator", "ArtistSource", "build", "jaro_winkler", + "load_filler", "load_truth"] diff --git a/data/synthetic/arche_synthetic/data/african_names_v1.jsonl.gz b/data/synthetic/arche_synthetic/data/african_names_v1.jsonl.gz new file mode 100644 index 0000000..2deaa37 Binary files /dev/null and b/data/synthetic/arche_synthetic/data/african_names_v1.jsonl.gz differ diff --git a/data/synthetic/arche_synthetic/evaluate.py b/data/synthetic/arche_synthetic/evaluate.py new file mode 100644 index 0000000..1f49e16 --- /dev/null +++ b/data/synthetic/arche_synthetic/evaluate.py @@ -0,0 +1,315 @@ +# Copyright 2026 unpatterned.org +# SPDX-License-Identifier: Apache-2.0 + +"""Scoring a matcher against a world whose disagreements are labelled. + + from evaluate import Benchmark, Predictions + + bench = Benchmark.load(Path("worlds/ng_supplier_v0")) + report = bench.score(Predictions(arm="exact", pairs=..., candidates=...)) + +**The one thing to get right: precision does not stratify.** + +`differences.parquet` only ever describes pairs of records *of the same +entity* -- a "difference" is a disagreement between two views of one thing. So +a false merge, which joins records of two *different* entities, has no +difference row and belongs to no stratum. "Precision on the legitimate-change +stratum" is not a quantity that exists, and a report that prints one is +inventing a number that looks authoritative and means nothing. + +Therefore: + +* **recall is the stratified axis** -- of the true pairs that differ because + the supplier moved, how many did the matcher find? That is well defined, and + it is the number this whole benchmark exists to produce; +* **precision is reported once, overall**; +* **false merges get their own taxonomy**, by what the two records shared -- + the same surname head, the same city, the same bank. That is the honest way + to say "this matcher fails on common names", and it is where a stratified + precision column would have gone. + +The same trap sank an earlier arche benchmark from the other side: the London +hospitals set can measure recall and cannot measure precision, because its +truth labels are structurally incomplete. Different cause, same discipline -- +say which axis a set can carry, and refuse the other. + +**Score each arm on the vocabulary it emits.** arche's crosswalk returns +`decision in {match, review}` and its gate demotes a pair to `review` *without +lowering the score*, so cutting the arche arm at `score >= 0.7` once reported +398 false merges where the engine's own decision reported 2. Splink emits a +probability and no decision, so it gets a probability cut. An arm supplies the +positive set it stands behind; this module never re-derives one from scores. +""" + +from __future__ import annotations + +from collections import Counter, defaultdict +from dataclasses import dataclass, field +from pathlib import Path +from typing import Any + +Pair = tuple[str, str] + + +def pair(a: str, b: str) -> Pair: + """A pair as an unordered key, so (a,b) and (b,a) are one thing.""" + return (a, b) if a <= b else (b, a) + + +@dataclass +class Predictions: + """What one matcher claims, in its own vocabulary. + + ``pairs`` is the set of *positive* claims -- the pairs this arm stands + behind, however it decided. ``abstentions`` are pairs it surfaced and + declined to assert (arche's ``review``); they are reported, never scored as + either right or wrong, because an abstention is a third answer and folding + it into one of the other two would make it decorative. + """ + + arm: str + pairs: set[Pair] + candidates: set[Pair] = field(default_factory=set) + clusters: list[list[str]] | None = None + abstentions: set[Pair] = field(default_factory=set) + seconds: float = 0.0 + notes: dict[str, Any] = field(default_factory=dict) + + +def _components(records: list[str], pairs: set[Pair]) -> list[list[str]]: + """Transitive closure over the positive pairs: the implied clustering.""" + parent = {r: r for r in records} + + def find(x: str) -> str: + while parent[x] != x: + parent[x] = parent[parent[x]] + x = parent[x] + return x + + for a, b in pairs: + if a in parent and b in parent: + ra, rb = find(a), find(b) + if ra != rb: + parent[ra] = rb + groups: dict[str, list[str]] = defaultdict(list) + for r in records: + groups[find(r)].append(r) + return list(groups.values()) + + +@dataclass +class Benchmark: + """A generated world, loaded as truth to score against.""" + + world: Path + observations: list[dict[str, Any]] + truth: dict[str, str] # record_id -> entity_id + by_entity: dict[str, list[str]] + true_pairs: set[Pair] + by_kind: dict[str, set[Pair]] # difference_kind -> true pairs + by_cause: dict[str, set[Pair]] # cause -> true pairs + + @classmethod + def load(cls, world: Path) -> Benchmark: + import pyarrow.parquet as pq + + observations = pq.read_table(world / "observations.parquet").to_pylist() + truth = {r["record_id"]: r["truth_entity_id"] + for r in pq.read_table(world / "truth.parquet").to_pylist()} + by_entity: dict[str, list[str]] = defaultdict(list) + for record_id, entity in truth.items(): + by_entity[entity].append(record_id) + + true_pairs = set() + for members in by_entity.values(): + members = sorted(members) + for i, a in enumerate(members): + for b in members[i + 1:]: + true_pairs.add(pair(a, b)) + + by_kind: dict[str, set[Pair]] = defaultdict(set) + by_cause: dict[str, set[Pair]] = defaultdict(set) + for row in pq.read_table(world / "differences.parquet").to_pylist(): + key = pair(row["observation_a"], row["observation_b"]) + by_kind[row["difference_kind"]].add(key) + by_cause[f"{row['difference_kind']}/{row['cause']}"].add(key) + return cls(world, observations, truth, dict(by_entity), true_pairs, + dict(by_kind), dict(by_cause)) + + # -- what two records share, for the false-merge taxonomy ---------------- + + def _shared(self, a: str, b: str) -> list[str]: + by_id = getattr(self, "_index", None) + if by_id is None: + by_id = self._index = {o["record_id"]: o for o in self.observations} + ra, rb = by_id.get(a, {}), by_id.get(b, {}) + shared = [] + na, nb = (ra.get("name") or "").upper(), (rb.get("name") or "").upper() + if na and nb and na.split()[:1] == nb.split()[:1]: + shared.append("surname_head") + if na and na == nb: + shared.append("whole_name") + for column in ("city", "bank", "phone", "address", "rc_number"): + if ra.get(column) and ra.get(column) == rb.get(column): + shared.append(column) + return shared or ["nothing_obvious"] + + # -- scoring ------------------------------------------------------------- + + def score(self, predictions: Predictions) -> dict[str, Any]: + """The report for one arm.""" + claimed = {p for p in predictions.pairs if p[0] in self.truth and p[1] in self.truth} + hits = claimed & self.true_pairs + false = claimed - self.true_pairs + precision = len(hits) / len(claimed) if claimed else 0.0 + recall = len(hits) / len(self.true_pairs) if self.true_pairs else 0.0 + f1 = (2 * precision * recall / (precision + recall)) if precision + recall else 0.0 + + # Recall by stratum. Precision deliberately absent -- see the module + # docstring: a false merge belongs to no stratum, so there is no + # denominator to put it over. + strata = {} + for name, pairs_in in sorted({**self.by_kind, **self.by_cause}.items()): + true_here = pairs_in & self.true_pairs + if not true_here: + continue + strata[name] = { + "true_pairs": len(true_here), + "recall": round(len(true_here & hits) / len(true_here), 4), + } + + records = list(self.truth) + clusters = predictions.clusters or _components(records, claimed) + bcubed = self._bcubed(clusters) + + merged = [c for c in clusters + if len({self.truth[r] for r in c if r in self.truth}) > 1] + entity_clusters: dict[str, set[int]] = defaultdict(set) + for i, c in enumerate(clusters): + for r in c: + if r in self.truth: + entity_clusters[self.truth[r]].add(i) + split = [e for e, cs in entity_clusters.items() if len(cs) > 1] + + taxonomy = Counter() + for a, b in false: + for label in self._shared(a, b): + taxonomy[label] += 1 + + report: dict[str, Any] = { + "arm": predictions.arm, + "seconds": round(predictions.seconds, 2), + "overall": { + "claimed_pairs": len(claimed), + "true_pairs": len(self.true_pairs), + "precision": round(precision, 4), + "recall": round(recall, 4), + "f1": round(f1, 4), + # An engine that can say "a person should look at this" is not + # comparable on recall alone to one that can only say yes or + # no. `recall` counts automatic merges; `coverage` counts the + # true pairs it either merged OR surfaced for review. Reporting + # only the first understates every engine with a refusal + # mechanism, which is most of the reason arche has one. + "abstentions": len(predictions.abstentions), + "coverage": round( + len((claimed | predictions.abstentions) & self.true_pairs) + / len(self.true_pairs), 4) if self.true_pairs else 0.0, + }, + "bcubed": bcubed, + "recall_by_stratum": strata, + "entities": { + "clusters": len(clusters), + "true_entities": len(self.by_entity), + "false_merge_clusters": len(merged), + "false_merge_rate": round(len(merged) / len(clusters), 4) if clusters else 0.0, + "false_split_entities": len(split), + "false_split_rate": round(len(split) / len(self.by_entity), 4), + }, + "false_merges_by_what_was_shared": dict(taxonomy.most_common()), + "blocking": self._blocking(predictions), + "notes": predictions.notes, + } + return report + + def _bcubed(self, clusters: list[list[str]]) -> dict[str, float]: + """Cluster quality per record, averaged. Handles singletons correctly.""" + cluster_of = {r: i for i, c in enumerate(clusters) for r in c} + sizes = {i: len(c) for i, c in enumerate(clusters)} + precision = recall = 0.0 + n = 0 + for record, entity in self.truth.items(): + if record not in cluster_of: + continue + members = clusters[cluster_of[record]] + same = sum(1 for m in members if self.truth.get(m) == entity) + precision += same / sizes[cluster_of[record]] + recall += same / len(self.by_entity[entity]) + n += 1 + precision, recall = (precision / n, recall / n) if n else (0.0, 0.0) + f1 = (2 * precision * recall / (precision + recall)) if precision + recall else 0.0 + return {"precision": round(precision, 4), "recall": round(recall, 4), + "f1": round(f1, 4)} + + def _blocking(self, predictions: Predictions) -> dict[str, Any]: + """What the arm's own blocker kept, and what it threw away. + + Reported per arm rather than over a shared candidate set: handing every + arm the same candidates would measure the scorers and hide the + blockers, and blocking recall is one of the gaps this dataset exists to + close -- arche computes it (`reconcile(truth_pairs=)`) and exactly one + benchmark passes it today, on a product catalogue. + + **It never falls back to the positive pairs.** An arm that does not + enumerate its candidates gets ``measured: False``, or the figure it + reported itself, clearly labelled as such. Defaulting to `pairs` would + print the arm's *recall* under the heading "blocking recall" -- the two + would be identical by construction, and the number would be a lie in + the flattering direction. + """ + total = len(self.truth) * (len(self.truth) - 1) / 2 + reported = predictions.notes.get("blocking_recall_reported_by_arche") + if not predictions.candidates: + if reported is None: + return {"measured": False, + "why": "the arm does not enumerate its candidate pairs"} + return {"measured": True, "source": "reported by the arm, not recomputed", + "recall": reported, + "candidate_pairs": predictions.notes.get("candidate_pairs"), + "reduction_ratio": ( + round(1 - predictions.notes["candidate_pairs"] / total, 6) + if predictions.notes.get("candidate_pairs") and total else None)} + kept = predictions.candidates & self.true_pairs + return { + "measured": True, + "source": "recomputed from the candidate pairs the arm reported", + "candidate_pairs": len(predictions.candidates), + "recall": round(len(kept) / len(self.true_pairs), 4) if self.true_pairs else 0.0, + "reduction_ratio": round(1 - len(predictions.candidates) / total, 6) if total else 0.0, + "pairs_per_record": round(len(predictions.candidates) / len(self.truth), 3), + } + + +def table(reports: list[dict[str, Any]], strata: tuple[str, ...] = ( + "change", "representation", "error")) -> str: + """The comparison, as the plan's table. Empty cells mean not measured.""" + head = (f"{'arm':<16}{'P':>7}{'R':>7}{'F1':>7}{'cover':>7} " + + "".join(f"{s[:9]:>10}" for s in strata) + + f"{'falseMrg':>10}{'blockR':>9}{'secs':>8}") + lines = [head, "-" * len(head)] + for r in reports: + o = r["overall"] + block = r["blocking"].get("recall") + block = float("nan") if block is None else block + cells = "".join( + f"{r['recall_by_stratum'].get(s, {}).get('recall', float('nan')):>10.3f}" + for s in strata) + lines.append( + f"{r['arm']:<16}{o['precision']:>7.3f}{o['recall']:>7.3f}{o['f1']:>7.3f}" + f"{o['coverage']:>7.3f} " + f"{cells}{r['entities']['false_merge_rate']:>10.3f}" + f"{block:>9.3f}{r['seconds']:>8.1f}") + return "\n".join(lines) + + +__all__ = ["Benchmark", "Pair", "Predictions", "pair", "table"] diff --git a/data/synthetic/arche_synthetic/export.py b/data/synthetic/arche_synthetic/export.py new file mode 100644 index 0000000..b418c78 --- /dev/null +++ b/data/synthetic/arche_synthetic/export.py @@ -0,0 +1,205 @@ +# Copyright 2026 unpatterned.org +# SPDX-License-Identifier: Apache-2.0 + +"""Writing the benchmark out — and refusing to write a broken one. + +**The contract is these files, not a Python class.** A Splink user, a Zingg +user, an R user or somebody with a SQL prompt has to be able to consume this +without installing anything of ours; the moment the truth is only readable +through our own dataclasses, matcher-neutrality is gone and the benchmark is +only useful to us. So: Parquet with documented columns, a JSON Schema beside +each file, and a manifest that says how the data was made. + +The two invariants are enforced **here, at write time**, not only in a test: + +1. ``observations.parquet`` may not contain a truth column. A benchmark that + ships the answer inside the question is worse than no benchmark, because it + scores well and says nothing. +2. no observed value may be an entity id. Belt and braces on the same rule -- + a leak through a *value* would pass a column-name check. + +A test can be skipped or deleted. A generator that refuses to write cannot. +""" + +from __future__ import annotations + +import json +from dataclasses import asdict +from pathlib import Path +from typing import Any + +import yaml + +from .ids import content_fingerprint +from .world import World + +#: Column names that may never appear in the file a matcher is given. +FORBIDDEN = ("entity_id", "truth_entity_id", "truth", "state_index", "difference_kind", + "cause", "event_id", "applied") + +#: The observation columns, in the order they are written. +OBSERVATION_COLUMNS = ("record_id", "source", "observed_at", "name", "rc_number", "tin", + "phone", "email", "address", "city", "bank", "account_number", + "director_name", "incorporated_on") + + +class LeakError(AssertionError): + """The generator produced a dataset that would give the answer away.""" + + +def _rows_observations(world: World, columns: tuple[str, ...] = OBSERVATION_COLUMNS + ) -> list[dict[str, Any]]: + rows = [] + for o in world.observations: + row: dict[str, Any] = {"record_id": o.record_id, "source": o.source, + "observed_at": o.observed_at.isoformat()} + for column in columns[3:]: + row[column] = o.attributes.get(column) + rows.append(row) + return rows + + +def _rows_truth(world: World, entity_type: str = "organisation") -> list[dict[str, Any]]: + return [{"record_id": o.record_id, "truth_entity_id": o.entity_id, + "entity_type": entity_type, "source": o.source, + "state_index": o.state_index} + for o in world.observations] + + +def _rows_differences(world: World) -> list[dict[str, Any]]: + return [asdict(d) for d in world.differences] + + +def _rows_events(world: World) -> list[dict[str, Any]]: + """One row per attribute an event moved: flat, joinable, no nested values.""" + rows = [] + for e in world.events: + for attribute, (old, new) in sorted(e.changes.items()): + rows.append({"event_id": e.event_id, "entity_id": e.entity_id, + "kind": e.kind, "event_at": e.event_at.isoformat(), + "attribute": attribute, "old_value": str(old), + "new_value": str(new)}) + return rows + + +def check_no_leak(observations: list[dict[str, Any]], world: World) -> None: + """Refuse to publish a dataset that carries its own answer.""" + if not observations: + raise LeakError("no observations to write") + columns = set(observations[0]) + bad = columns & set(FORBIDDEN) + if bad: + raise LeakError( + f"observations carry truth column(s) {sorted(bad)}; a matcher given this " + "file could read the answer instead of deciding it") + entity_ids = set(world.entities) + for row in observations: + for column, value in row.items(): + if isinstance(value, str) and value in entity_ids: + raise LeakError( + f"observation {row['record_id']} leaks entity id {value!r} in " + f"column {column!r}") + + +def _schema(name: str, rows: list[dict[str, Any]], required: list[str]) -> dict[str, Any]: + """A JSON Schema for one file, so the contract is readable without Python.""" + def kind(value: Any) -> str: + return {int: "integer", float: "number", bool: "boolean"}.get(type(value), "string") + + properties = {} + for column in rows[0]: + sample = next((r[column] for r in rows if r[column] is not None), "") + properties[column] = {"type": [kind(sample), "null"] + if column not in required else kind(sample)} + return {"$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": f"https://arche.dev/schemas/synthetic/{name}-v0.json", + "title": name, "type": "object", "required": required, + "properties": properties, "additionalProperties": False} + + +def _write_parquet(path: Path, rows: list[dict[str, Any]]) -> None: + import pyarrow as pa + import pyarrow.parquet as pq + + columns = list(rows[0]) + table = pa.table({c: pa.array([r.get(c) for r in rows]) for c in columns}) + pq.write_table(table, path) + + +def write(world: World, out: Path, *, generator_version: str, + world_pack: str, notes: dict[str, Any] | None = None, + columns: tuple[str, ...] = OBSERVATION_COLUMNS, + entity_type: str = "organisation", + extra_tables: dict[str, tuple[list[dict[str, Any]], list[str]]] | None = None, + ) -> dict[str, Any]: + """Write the whole benchmark and return its manifest. + + ``columns``, ``entity_type`` and ``extra_tables`` exist so a second kind of + world (artists) can use the same contract, the same leak check and the + same manifest without a second copy of this function. Their defaults are + the supplier world's, so nothing about that world's output moved when they + were added -- checked by fingerprint. + """ + out.mkdir(parents=True, exist_ok=True) + (out / "schema").mkdir(exist_ok=True) + + tables = { + "observations": (_rows_observations(world, columns), + ["record_id", "source", "observed_at"]), + "truth": (_rows_truth(world, entity_type), ["record_id", "truth_entity_id"]), + "differences": (_rows_differences(world), + ["difference_id", "observation_a", "observation_b", + "attribute", "difference_kind"]), + "events": (_rows_events(world), ["event_id", "entity_id", "kind", "event_at"]), + **(extra_tables or {}), + } + check_no_leak(tables["observations"][0], world) + + fingerprints = {} + for name, (rows, required) in tables.items(): + if not rows: + continue + _write_parquet(out / f"{name}.parquet", rows) + (out / "schema" / f"{name}.json").write_text( + json.dumps(_schema(name, rows, required), indent=2) + "\n", + encoding="utf-8", newline="\n") + fingerprints[name] = content_fingerprint(rows) + + kinds: dict[str, int] = {} + for row in tables["differences"][0]: + kinds[row["difference_kind"]] = kinds.get(row["difference_kind"], 0) + 1 + + manifest = { + "world_id": world.world_id, + "world_pack": world_pack, + "seed": world.seed, + "generator_version": generator_version, + "schema_version": 0, + "counts": { + "entities": {t: len(world.of_type(t)) + for t in sorted({e.entity_type for e in world.entities.values()})}, + "observations": len(world.observations), + "events": len(world.events), + "differences": len(world.differences), + "difference_kinds": dict(sorted(kinds.items())), + }, + "content_fingerprints": fingerprints, + "provenance": world.provenance, + "invariants": [ + "observations.parquet carries no truth column (enforced at write time)", + "no observed value is an entity id (enforced at write time)", + "record_id is a hash of (world_id, source, sequence) and holds no entity " + "information", + ], + **(notes or {}), + } + # newline="\n" is not cosmetic: without it Windows writes CRLF into files + # the repository pins to LF, so a rebuild of an unchanged world shows as a + # diff and the "identical world" check has to be read past it. + (out / "manifest.yaml").write_text( + yaml.safe_dump(manifest, sort_keys=False, allow_unicode=True), + encoding="utf-8", newline="\n") + return manifest + + +__all__ = ["FORBIDDEN", "LeakError", "OBSERVATION_COLUMNS", "check_no_leak", "write"] diff --git a/data/synthetic/arche_synthetic/ids.py b/data/synthetic/arche_synthetic/ids.py new file mode 100644 index 0000000..b955329 --- /dev/null +++ b/data/synthetic/arche_synthetic/ids.py @@ -0,0 +1,80 @@ +# Copyright 2026 unpatterned.org +# SPDX-License-Identifier: Apache-2.0 + +"""Identifiers for a synthetic world, and the one rule they must obey. + +**A record id must not let a matcher recover the entity it belongs to.** That +sounds obvious and it is the easiest invariant in this whole package to break: +write ``obs:erp:org_991:1`` and the truth is derivable from the input by +string manipulation, so every score on the benchmark is meaningless and +nothing about the file says so. The v0.2 PRD's own examples (``syn:org:88``, +``obs:erp:991``) have this shape. + +So a ``record_id`` is a hash over the world id, the source, and a counter -- +**nothing about the entity goes into the payload**, which makes the id opaque +by construction rather than by hoping the hash holds. Truth-side ids +(``entity_id``, ``event_id``) may be readable, because they only ever appear +in files a matcher must not be given. + +Deliberately self-contained: no ``arche`` import, no dependency beyond the +standard library, so this package can move to its own repository unchanged. +The id shape mirrors arche's (``prefix:sha256:hex``) so the two are legible +side by side, but nothing here requires arche to be installed. +""" + +from __future__ import annotations + +import hashlib +import json +from typing import Any + +#: Hex characters kept from the digest. 16 gives a 64-bit space -- at the +#: scale this generator works in (10^4-10^6 records) a collision is far below +#: the probability of a bug elsewhere, and short ids keep the Parquet small +#: and a debugging session readable. +_WIDTH = 16 + + +def _digest(payload: Any) -> str: + """sha256 over canonical JSON: sorted keys, compact, no whitespace drift.""" + text = json.dumps(payload, sort_keys=True, separators=(",", ":"), ensure_ascii=False) + return hashlib.sha256(text.encode("utf-8")).hexdigest() + + +def record_id(world_id: str, source: str, sequence: int) -> str: + """An opaque id for one observation. + + The payload is ``(world_id, source, sequence)`` and nothing else. No entity + id, no attribute, no timestamp that correlates with one -- there is nothing + in here for a matcher to invert, because the entity was never in the input. + """ + return "rec_" + _digest([world_id, source, sequence])[:_WIDTH] + + +def entity_id(world_id: str, entity_type: str, sequence: int) -> str: + """A truth-side entity id. Readable on purpose: it never leaves the truth files.""" + return f"syn:{entity_type}:{sequence:06d}" + + +def event_id(world_id: str, sequence: int) -> str: + """A truth-side event id, referenced by `differences.parquet`.""" + return f"evt:{sequence:06d}" + + +def difference_id(observation_a: str, observation_b: str, attribute: str, kind: str) -> str: + """Stable id for one labelled difference, so a report can be diffed run to run.""" + return "dif_" + _digest([observation_a, observation_b, attribute, kind])[:_WIDTH] + + +def content_fingerprint(rows: list[dict[str, Any]]) -> str: + """A digest over a table's logical content, order-independent. + + Reproducibility is asserted against this rather than against the bytes of a + Parquet file: Parquet embeds a writer version and its own metadata, so two + byte-different files can hold identical data and a byte comparison would + fail for a reason that has nothing to do with the generator. + """ + return _digest(sorted(json.dumps(r, sort_keys=True, default=str) for r in rows)) + + +__all__ = ["content_fingerprint", "difference_id", "entity_id", "event_id", "record_id"] diff --git a/data/synthetic/arche_synthetic/lifecycle.py b/data/synthetic/arche_synthetic/lifecycle.py new file mode 100644 index 0000000..646f4fb --- /dev/null +++ b/data/synthetic/arche_synthetic/lifecycle.py @@ -0,0 +1,208 @@ +# Copyright 2026 unpatterned.org +# SPDX-License-Identifier: Apache-2.0 + +"""Legitimate change: the thing this benchmark exists to measure. + +Every published ER benchmark builds duplicates the same way -- take a record, +apply a transformation, call the result a corrupted copy. That model says +every difference between two records is an error. It is wrong about real data +often enough to matter: a supplier really did move, a director really did +resign, an account really was replaced. **Both records are true, at their +respective times.** A matcher tuned on data where all disagreement is noise +learns to treat legitimate change as evidence of a different entity, and then +splits entities in production. + +So this module generates change, and labels it as change. An event: + +1. closes the entity's current state at the event date; +2. opens a new state carrying the new values; +3. records which attributes moved, from what, to what. + +:mod:`observe` then lets different sources see different states -- the ERP +still holding the pre-move address while the registry holds the new one -- and +the resulting disagreement is labelled ``change`` with this event's id, not +``error``. That is the column no public benchmark has. + +Note what is *not* here: a rate model calibrated against real supplier +churn. The default rates are declared parameters, not measurements, and the +manifest says so. What matters for the benchmark is that changed pairs exist +in known quantity and are labelled; the exact hazard rate is a knob. +""" + +from __future__ import annotations + +import random +from dataclasses import dataclass, field +from datetime import date, timedelta +from typing import Any + +from .ids import event_id +from .world import Relationship, State, World + +#: Per-entity probability of each event kind over the world's whole horizon. +#: Declared parameters, not measured rates -- see the module docstring. +DEFAULT_RATES = { + # Raised from a first pass at 0.18/0.07/0.12/0.10: at that setting a rename + # or a director change produced ONE labelled difference in a 100-supplier + # world, because a difference needs two observations that straddle the + # event and most events had none. A stratum with one pair in it is not a + # stratum. Still declared parameters, not measured churn rates. + "ORG_RELOCATED": 0.22, + "ORG_RENAMED": 0.16, + "DIRECTOR_CHANGED": 0.20, + "ACCOUNT_CHANGED": 0.14, +} + + +@dataclass(frozen=True) +class Event: + """One legitimate change, and exactly which attributes it moved.""" + + event_id: str + entity_id: str + kind: str + event_at: date + changes: dict[str, tuple[Any, Any]] = field(default_factory=dict) # attr -> (old, new) + + +class Lifecycle: + """Applies events to a world, preserving every historical state.""" + + def __init__(self, world: World, seed: int) -> None: + self.world = world + self.rng = random.Random(seed ^ 0xE4E17) + self._n = 0 + + def _apply(self, entity_id_: str, kind: str, when: date, + new_values: dict[str, Any]) -> Event | None: + """Close the current state, open a new one, and record what moved.""" + chain = self.world.states[entity_id_] + current = chain[-1] + if when <= current.valid_from: + return None # two events in one interval: keep the world monotonic + changes = {k: (current.attributes.get(k), v) + for k, v in new_values.items() + if current.attributes.get(k) != v} + if not changes: + return None + current.valid_to = when + chain.append(State(entity_id_, when, None, + {**current.attributes, **new_values})) + self._n += 1 + event = Event(event_id(self.world.world_id, self._n), entity_id_, kind, when, changes) + self.world.events.append(event) + return event + + # -- the four events ----------------------------------------------------- + + def relocate(self, org: str, when: date, places: list[str]) -> Event | None: + """The supplier moved. The old address stays true for its interval. + + Within its own country. An earlier version drew from every place in the + world, so a Lagos supplier could relocate to Eldoret and keep its + Nigerian bank -- which is not a relocation, it is a different company, + and it would have taught a matcher that country is not evidence. + """ + current = self.world.current(org).attributes["place_id"] + home = self.world.current(current).attributes.get("country") + options = [p for p in places + if p != current + and (not self.world.countries + or self.world.current(p).attributes.get("country") == home)] + if not options: + return None + return self._apply(org, "ORG_RELOCATED", when, + {"place_id": self.rng.choice(options)}) + + def rename(self, org: str, when: date) -> Event | None: + """A rebrand or a change of legal form. Same company, new name. + + This is the hardest legitimate change for a matcher, because the name + is usually the strongest signal it has -- and here the strongest signal + is the one that legitimately moved. + """ + name = self.world.current(org).attributes["legal_name"] + head = name.rsplit(" ", 1)[0] if " " in name else name + options = [f"{head} Nigeria Limited", f"{head} Group Limited", + f"{head} Holdings Limited", f"{head} Plc"] + return self._apply(org, "ORG_RENAMED", when, + {"legal_name": self.rng.choice( + [o for o in options if o != name])}) + + def change_director(self, org: str, when: date, people: list[str]) -> Event | None: + """One director resigns, another is appointed. Both relationships stay true.""" + current = self.world.current(org).attributes["director_id"] + options = [p for p in people if p != current] + successor = self.rng.choice(options) + event = self._apply(org, "DIRECTOR_CHANGED", when, {"director_id": successor}) + if event is not None: + for rel in self.world.relationships: + if (rel.subject == current and rel.predicate == "DIRECTOR_OF" + and rel.object == org and rel.valid_to is None): + self.world.relationships.remove(rel) + self.world.relationships.append( + Relationship(current, "DIRECTOR_OF", org, rel.valid_from, when)) + break + self.world.relationships.append( + Relationship(successor, "DIRECTOR_OF", org, when)) + return event + + def change_account(self, org: str, when: date) -> Event | None: + """A new bank account. In the real product this is the fraud-adjacent one: + a supplier's account changing is exactly what an invoice-redirection + attack looks like, which is why *legitimate* account change has to be + representable before the adversarial version means anything.""" + from .world import _V0_BANKS, COUNTRY_PROFILES + + attributes = self.world.current(org).attributes + current = attributes["bank"] + # A Nigerian supplier does not move its account to Capitec. In a + # multi-country world the replacement comes from the same country's + # banks, which is also what makes a changed bank weak evidence of a + # different entity rather than strong evidence of a different country. + place = self.world.current(attributes["place_id"]).attributes + profile = (COUNTRY_PROFILES.get(place.get("country")) + if self.world.countries else None) + banks = profile["banks"] if profile else _V0_BANKS + options = [b for b in banks if b != current] or [b for b in _V0_BANKS + if b != current] + bank = self.rng.choice(options) + return self._apply(org, "ACCOUNT_CHANGED", when, { + "bank": bank, + "account_number": "".join(str(self.rng.randint(0, 9)) for _ in range(10)), + }) + + # -- the run ------------------------------------------------------------- + + def run(self, start: date, end: date, rates: dict[str, float] | None = None) -> list[Event]: + """Roll events for every organisation, in entity order, over the horizon.""" + rates = {**DEFAULT_RATES, **(rates or {})} + places = [e.entity_id for e in self.world.of_type("place")] + people = [e.entity_id for e in self.world.of_type("person")] + span = (end - start).days + for org in sorted(e.entity_id for e in self.world.of_type("organisation")): + # Sorted by date so state chains stay monotonic whatever order the + # kinds are rolled in. + due: list[tuple[date, str]] = [] + for kind, rate in sorted(rates.items()): + if self.rng.random() < rate: + due.append((start + timedelta(days=self.rng.randint(1, span)), kind)) + for when, kind in sorted(due): + if kind == "ORG_RELOCATED": + self.relocate(org, when, places) + elif kind == "ORG_RENAMED": + self.rename(org, when) + elif kind == "DIRECTOR_CHANGED": + self.change_director(org, when, people) + elif kind == "ACCOUNT_CHANGED": + self.change_account(org, when) + return self.world.events + + +def run(world: World, start: date, end: date, *, seed: int, + rates: dict[str, float] | None = None) -> list[Event]: + """Generate the world's lifecycle. Deterministic under ``seed``.""" + return Lifecycle(world, seed).run(start, end, rates) + + +__all__ = ["DEFAULT_RATES", "Event", "Lifecycle", "run"] diff --git a/data/synthetic/arche_synthetic/observe.py b/data/synthetic/arche_synthetic/observe.py new file mode 100644 index 0000000..c4abbc0 --- /dev/null +++ b/data/synthetic/arche_synthetic/observe.py @@ -0,0 +1,461 @@ +# Copyright 2026 unpatterned.org +# SPDX-License-Identifier: Apache-2.0 + +"""Imperfect views of a known world, and why each of them differs. + +This is where the world becomes a dataset a matcher can be given, and where +the one claim that makes this benchmark worth building gets made: **when two +records disagree, we know why, and the why is not always "error".** + +Three causes, kept apart on purpose: + +``change`` + The two records saw the entity at different times, and it moved between + them. Both are true. The ERP holds the address from before the relocation + because it has not refreshed; the registry holds the one from after. A + matcher that treats this as evidence of two different suppliers will split + the entity, and no existing benchmark can tell you whether it does. + +``representation`` + Same fact, different encoding. ``Okafor Engineering Limited`` and ``Okafor + Engineering Ltd`` are the same name written two ways, and neither source is + wrong. Legal-suffix handling, ampersands, case, address abbreviation. + +``error`` + One record is actually wrong. A typo, an OCR misread, a truncated field, a + mutated digit. + +The labels are **computed by construction, never inferred afterwards**. Every +observed value carries a note of which state it came from and which transforms +were applied to it, so a difference between two observations is explained by +comparing their provenance rather than by guessing from the strings. That is +the same discipline the constructed detection set uses for spans, and it is +what makes the ground truth trustworthy enough to score against. + +Scope note for v0.1: only organisations are observed. People and places exist +in the world as truth and appear *inside* supplier records (a director's name, +an address), which is how they appear in a real vendor master. Observing them +as independent records is a v0.2 extension. +""" + +from __future__ import annotations + +import random +import unicodedata +from dataclasses import dataclass, field +from datetime import date, timedelta +from typing import Any + +from .ids import difference_id, record_id +from .world import World + +# ---------------------------------------------------------------- sources -- + + +@dataclass(frozen=True) +class Source: + """A system that observes suppliers, with its own habits and its own faults.""" + + name: str + coverage: float # fraction of organisations it holds at all + lag: tuple[int, int] # days between the truth moving and this source seeing it + repeats: tuple[int, int] # how many records it writes per supplier + fields: tuple[str, ...] # which attributes it stores + representation: dict[str, float] + error: dict[str, float] + #: Fields this source is obliged to hold; `missing` never applies to them. + never_missing: tuple[str, ...] = () + + +#: The ERP is the stale one, and staleness is the point: a vendor master is +#: keyed on a record somebody typed once, and nothing makes it re-read the +#: registry. Its lag is what produces `change` differences. +ERP = Source( + name="erp", coverage=0.85, lag=(30, 900), repeats=(1, 1), + fields=("name", "rc_number", "phone", "address", "city", "bank", + "account_number", "director_name"), + representation={"legal_suffix_abbreviated": 0.45, "legal_suffix_dropped": 0.15, + "ampersand": 0.3, "case_upper": 0.25, "address_abbreviated": 0.4}, + error={"typo": 0.10, "truncation": 0.12, "digit_mutation": 0.04, "missing": 0.10}, + never_missing=("name",), +) + +#: The registry is authoritative and fresh: the full legal name, the RC number, +#: the TIN. It is the source a matcher would most like to have and the one a +#: procurement team most often does not. +REGISTRY = Source( + name="registry", coverage=1.0, lag=(0, 25), repeats=(1, 1), + fields=("name", "rc_number", "tin", "address", "city", "director_name", + "incorporated_on"), + representation={"case_upper": 0.1}, + # The registry is the authoritative source: it does not lose the company's + # name or its RC number. `never_missing` says which fields a source is + # obliged to hold, so `missing` cannot quietly gut the one record a matcher + # was supposed to be able to rely on. + error={"typo": 0.01, "missing": 0.02}, + never_missing=("name", "rc_number"), +) + +#: Invoices are read by OCR and written by whoever typed the header. Heavy +#: representation variation, heavy OCR error, and rarely an identifier. +INVOICE = Source( + name="invoice", coverage=0.6, lag=(0, 120), repeats=(1, 3), + # Several invoices per supplier over the horizon: that repetition is what + # makes an observation pair straddle an event, which is what a `change` + # difference needs to exist at all. + fields=("name", "phone", "address", "city", "bank", "account_number"), + representation={"legal_suffix_abbreviated": 0.5, "legal_suffix_dropped": 0.3, + "ampersand": 0.4, "case_upper": 0.35, "diacritic_loss": 0.5, + "address_abbreviated": 0.5}, + error={"ocr_confusion": 0.18, "typo": 0.08, "truncation": 0.10, + "digit_mutation": 0.05, "missing": 0.14}, + never_missing=("name",), +) + +SOURCES = {s.name: s for s in (ERP, REGISTRY, INVOICE)} + + +@dataclass +class Observation: + """One record as a source holds it, plus the truth of how it got that way.""" + + record_id: str + source: str + observed_at: date + attributes: dict[str, str] + # -- truth side; never written to observations.parquet -- + entity_id: str = "" + state_index: int = 0 + #: attribute -> [(kind, cause), ...]. What was done to this value. + applied: dict[str, list[tuple[str, str]]] = field(default_factory=dict) + + +@dataclass(frozen=True) +class Difference: + """One labelled disagreement between two observations of the same entity.""" + + difference_id: str + entity_id: str + observation_a: str + observation_b: str + attribute: str + difference_kind: str # change | representation | error + cause: str + event_id: str | None = None + + +# -------------------------------------------------- representation rules -- +# Valid alternate encodings of the same fact. NOT errors: no information is +# lost that the source was obliged to keep, and no reader would call either +# form wrong. + +#: Rules decided once per record rather than per field -- see `observe_one`. +_RECORD_STYLES = frozenset({"case_upper", "diacritic_loss"}) + +_SUFFIXES = ["Limited", "Enterprises", "Plc"] + + +def _legal_suffix_abbreviated(value: str, rng: random.Random) -> str | None: + for long, short in (("Limited", "Ltd"), ("Enterprises", "Ent."), ("Nigeria", "Nig.")): + if value.endswith(long) or f" {long} " in value: + return value.replace(long, short) + return None + + +def _legal_suffix_dropped(value: str, rng: random.Random) -> str | None: + for suffix in _SUFFIXES: + if value.endswith(" " + suffix): + return value[: -len(suffix) - 1].strip() + return None + + +def _ampersand(value: str, rng: random.Random) -> str | None: + return value.replace(" and ", " & ") if " and " in value else None + + +def _case_upper(value: str, rng: random.Random) -> str | None: + return value.upper() if value != value.upper() else None + + +def _diacritic_loss(value: str, rng: random.Random) -> str | None: + stripped = "".join(c for c in unicodedata.normalize("NFD", value) + if not unicodedata.combining(c)) + return stripped if stripped != value else None + + +def _address_abbreviated(value: str, rng: random.Random) -> str | None: + for long, short in (("Road", "Rd"), ("Street", "St"), ("Crescent", "Cres"), + ("Avenue", "Ave"), ("Way", "Wy")): + if long in value: + return value.replace(long, short) + return None + + +REPRESENTATION = { + "legal_suffix_abbreviated": _legal_suffix_abbreviated, + "legal_suffix_dropped": _legal_suffix_dropped, + "ampersand": _ampersand, + "case_upper": _case_upper, + "diacritic_loss": _diacritic_loss, + "address_abbreviated": _address_abbreviated, +} + +# ------------------------------------------------------- corruption rules -- +# Actual error. One of the two records is wrong, and a reader shown the truth +# would say so. + +_OCR = {"O": "0", "0": "O", "I": "1", "l": "1", "S": "5", "B": "8", "G": "6", "Z": "2"} + + +def _typo(value: str, rng: random.Random) -> str | None: + """A slip of the finger, in the same alphabet as what it replaced. + + Substituting a lowercase letter regardless of context produced `0803 12a + 4567` as a phone number and `OKAFOR ENGINEERINg` in an all-caps vendor + master -- neither of which anybody types, and both of which a matcher + would find easier to spot than a real typo. So a digit is replaced by a + digit, and a letter by a letter of the same case. + """ + if len(value) < 4: + return None + i = rng.randrange(1, len(value) - 1) + kind = rng.choice(("transpose", "delete", "substitute")) + if kind == "transpose": + return value[:i] + value[i + 1] + value[i] + value[i + 2:] + if kind == "delete": + return value[:i] + value[i + 1:] + original = value[i] + if original.isdigit(): + alphabet = "0123456789" + elif original.isalpha(): + alphabet = ("ABCDEFGHIJKLMNOPQRSTUVWXYZ" if original.isupper() + else "abcdefghijklmnopqrstuvwxyz") + else: + return None # never mangle a separator into a letter + return value[:i] + rng.choice([c for c in alphabet if c != original]) + value[i + 1:] + + +def _ocr_confusion(value: str, rng: random.Random) -> str | None: + positions = [i for i, c in enumerate(value) if c in _OCR] + if not positions: + return None + i = rng.choice(positions) + return value[:i] + _OCR[value[i]] + value[i + 1:] + + +def _truncation(value: str, rng: random.Random) -> str | None: + if len(value) < 12: + return None + return value[: rng.randint(8, len(value) - 2)].strip() + + +def _digit_mutation(value: str, rng: random.Random) -> str | None: + positions = [i for i, c in enumerate(value) if c.isdigit()] + if not positions: + return None + i = rng.choice(positions) + replacement = rng.choice([d for d in "0123456789" if d != value[i]]) + return value[:i] + replacement + value[i + 1:] + + +CORRUPTION = { + "typo": _typo, + "ocr_confusion": _ocr_confusion, + "truncation": _truncation, + "digit_mutation": _digit_mutation, +} + +# ------------------------------------------------------------- observing -- + + +class Observer: + """Turns world states into source records, remembering what it did.""" + + def __init__(self, world: World, seed: int) -> None: + self.world = world + self.rng = random.Random(seed ^ 0x0B5E4) + self._sequence = 0 + + def _flatten(self, state_attributes: dict[str, Any]) -> dict[str, str]: + """The entity's true state as a flat record, resolving place and director.""" + place = self.world.current(state_attributes["place_id"]).attributes + director = self.world.current(state_attributes["director_id"]).attributes + return { + "name": state_attributes["legal_name"], + "rc_number": state_attributes["rc_number"], + "tin": state_attributes["tin"], + "phone": state_attributes["phone"], + "email": state_attributes["email"], + "address": f"{place['street']}, {place['area']}", + "city": place["city"], + "bank": state_attributes["bank"], + "account_number": state_attributes["account_number"], + "director_name": director["full_name"], + "incorporated_on": state_attributes["incorporated_on"], + } + + def observe_one(self, entity_id_: str, source: Source, when: date) -> Observation: + """One record: what this source believed about this supplier on this date.""" + lag = timedelta(days=self.rng.randint(*source.lag)) + index, state = self.world.state_at(entity_id_, when - lag) + truth = self._flatten(state.attributes) + attributes: dict[str, str] = {} + applied: dict[str, list[tuple[str, str]]] = {} + styles = {rule for rule in source.representation + if rule in _RECORD_STYLES + and self.rng.random() < source.representation[rule]} + + for name in source.fields: + value = truth.get(name) + if value is None: + continue + notes: list[tuple[str, str]] = [] + + # Representation first: a valid re-encoding of the true value. + for rule, probability in sorted(source.representation.items()): + # `case_upper` is a house style, decided once per record: a + # vendor master that stores NAMES IN CAPITALS stores addresses + # in capitals too. Rolling it per field produced records that + # shouted one column and whispered the next, which no real + # system does and which inflated the representation stratum + # with differences a matcher would never see. + if rule in _RECORD_STYLES: + if rule not in styles: + continue + elif self.rng.random() >= probability: + continue + rewritten = REPRESENTATION[rule](value, self.rng) + if rewritten is not None and rewritten != value: + value = rewritten + notes.append(("representation", rule)) + + # Then error, applied to whatever the source ended up writing. + if (name not in source.never_missing + and self.rng.random() < source.error.get("missing", 0.0)): + applied[name] = [*notes, ("error", "missing")] + continue + for rule, probability in sorted(source.error.items()): + if rule == "missing" or rule not in CORRUPTION: + continue + if self.rng.random() < probability: + broken = CORRUPTION[rule](value, self.rng) + if broken is not None and broken != value: + value = broken + notes.append(("error", rule)) + + attributes[name] = value + applied[name] = notes + + self._sequence += 1 + return Observation( + record_id=record_id(self.world.world_id, source.name, self._sequence), + source=source.name, observed_at=when, attributes=attributes, + entity_id=entity_id_, state_index=index, applied=applied, + ) + + def run(self, start: date, end: date) -> list[Observation]: + """Observe every supplier through every source that covers it.""" + span = (end - start).days + out: list[Observation] = [] + for entity in sorted(e.entity_id for e in self.world.of_type("organisation")): + for source in (ERP, REGISTRY, INVOICE): + if self.rng.random() > source.coverage: + continue + for _ in range(self.rng.randint(*source.repeats)): + when = start + timedelta(days=self.rng.randint(0, span)) + out.append(self.observe_one(entity, source, when)) + self.world.observations = out + return out + + +# ------------------------------------------------------------ differences -- + + +#: A flat record field is carried by a state field: `address` and `city` both +#: come from `place_id`, `name` from `legal_name`, `director_name` from +#: `director_id`. +_CARRIER = {"address": "place_id", "city": "place_id", "name": "legal_name", + "director_name": "director_id", "bank": "bank", + "account_number": "account_number"} + + +def _index_events(world: World) -> dict[tuple[str, Any], list[Any]]: + """Events keyed by (entity, date), built once. + + The previous version scanned `world.events` for every difference it had to + explain. At 2,000 suppliers that is 1,435 events against 33,000 + differences and merely wasteful; at 40,000 it is the reason the generator + stops finishing. + """ + index: dict[tuple[str, Any], list[Any]] = {} + for event in world.events: + index.setdefault((event.entity_id, event.event_at), []).append(event) + return index + + +def _event_for(index: dict[tuple[str, Any], list[Any]], world: World, + entity_id_: str, attribute: str, + state_a: int, state_b: int) -> Any | None: + """The event that moved ``attribute`` between two states of one entity.""" + carrier = _CARRIER.get(attribute, attribute) + low, high = sorted((state_a, state_b)) + for state in world.states[entity_id_][low + 1: high + 1]: + for event in index.get((entity_id_, state.valid_from), ()): + if carrier in event.changes: + return event + return None + + +def differences(world: World) -> list[Difference]: + """Explain every disagreement between two observations of the same entity. + + One row per (pair, attribute, kind): an attribute that differs for two + reasons -- the supplier moved *and* the invoice OCR mangled the new address + -- produces two rows, so the evaluator can put that pair in both strata + rather than having to choose one. + """ + by_entity: dict[str, list[Observation]] = {} + for observation in world.observations: + by_entity.setdefault(observation.entity_id, []).append(observation) + index = _index_events(world) + + out: list[Difference] = [] + for entity_id_, group in sorted(by_entity.items()): + for i, a in enumerate(group): + for b in group[i + 1:]: + for attribute in sorted(set(a.attributes) & set(b.attributes)): + if a.attributes[attribute] == b.attributes[attribute]: + continue + kinds: list[tuple[str, str, str | None]] = [] + + if a.state_index != b.state_index: + event = _event_for(index, world, entity_id_, attribute, + a.state_index, b.state_index) + if event is not None: + kinds.append(("change", event.kind, event.event_id)) + + seen: set[tuple[str, str]] = set() + for note in (*a.applied.get(attribute, ()), + *b.applied.get(attribute, ())): + if note not in seen: + seen.add(note) + kinds.append((note[0], note[1], None)) + + for kind, cause, event_ref in kinds: + out.append(Difference( + difference_id(a.record_id, b.record_id, attribute, kind), + entity_id_, a.record_id, b.record_id, attribute, + kind, cause, event_ref)) + world.differences = out + return out + + +def run(world: World, start: date, end: date, *, + seed: int) -> tuple[list[Observation], list[Difference]]: + """Observe the world, then explain every disagreement it produced.""" + observations = Observer(world, seed).run(start, end) + return observations, differences(world) + + +__all__ = ["CORRUPTION", "Difference", "ERP", "INVOICE", "Observation", "Observer", + "REGISTRY", "REPRESENTATION", "SOURCES", "Source", "differences", "run"] diff --git a/data/synthetic/arche_synthetic/world.py b/data/synthetic/arche_synthetic/world.py new file mode 100644 index 0000000..ae2c2c9 --- /dev/null +++ b/data/synthetic/arche_synthetic/world.py @@ -0,0 +1,699 @@ +# Copyright 2026 unpatterned.org +# SPDX-License-Identifier: Apache-2.0 + +"""The world: known entities, their true state, and how they relate. + +Everything here is *truth*. Nothing in this module is ever shown to a matcher +-- that is :mod:`observe`'s job, and it only ever shows imperfect views of +what is built here. + +Two things are worth reading before changing anything. + +**Frequency is modelled, and the model is declared.** A benchmark whose names +are drawn uniformly is easy in a way real data never is: no two suppliers +share a surname, so a name match is almost a key. Real populations are +Zipf-ish -- a few surnames carry a large share of the population and a long +tail carries the rest -- and that collision structure is most of what makes +entity resolution hard. So surnames are drawn Zipf, not uniformly. + +But be exact about what that claims. arche's shipped lexicon +(``african_names_v1.jsonl.gz``, 13,342 names, CC-BY) carries **no frequency +data at all** -- two fields, ``name`` and ``name_type``. So the *shape* of the +distribution is modelled and the *ranking within it is arbitrary and seeded*. +This produces realistic collision rates; it does **not** claim that the names +that come out common are actually common in Nigeria. The manifest records this +as ``synthetic-assumption`` rather than ``public-data-derived``, and the data +card says it in the same words. Replacing the ranking with a real frequency +table is a drop-in change and the first thing a curator should do. + +**Identifiers are valid by construction.** Every RC number and TIN is checked +against arche's own validator at build time, the way the constructed detection +set is. That discipline has already earned itself once: it caught a generator +bug (Kenyan phone lengths) before the data shipped, and a benchmark whose +identifiers fail the validator measures the generator, not the detector. +""" + +from __future__ import annotations + +import gzip +import json +import random +import re +from dataclasses import dataclass, field +from datetime import date, timedelta +from pathlib import Path +from typing import Any + +from .ids import entity_id + +#: A local copy, if one has been vendored in. Checked first so this package +#: keeps working when it moves to its own repository and arche is not present. +_LOCAL_LEXICON = Path(__file__).resolve().parent / "data" / "african_names_v1.jsonl.gz" + +#: Real given+family pairs pulled from Wikidata (CC0) by +#: `datasets/pull_wikidata.py`. Optional: without it the generator falls back to +#: the lexicon, and says so in the manifest rather than pretending. +_PAIRS_NAME = "wikidata_name_pairs.jsonl" +_PAIRS_CANDIDATES = ( + Path(__file__).resolve().parent / "data" / _PAIRS_NAME, + Path(__file__).resolve().parents[3] / "datasets" / "data" / _PAIRS_NAME, +) + + +def _pairs_path() -> Path | None: + for candidate in _PAIRS_CANDIDATES: + if candidate.exists(): + return candidate + return None + + +def _lexicon_path() -> Path: + """Where the name pool lives. + + Vendored into this package (CC-BY-4.0, 13,342 entries, from arche's + `african_names_v1`, itself built from Wikidata/ParaNames) so a world can be + generated with nothing else installed. Falls back to a copy inside an + installed arche, which keeps the two in step during development. + + Attribution and the caveat that ~5.8% of the entries are not names at all + are in `DATACARD.md`; `_usable` filters them. + """ + if _LOCAL_LEXICON.exists(): + return _LOCAL_LEXICON + import arche # pragma: no cover - the vendored copy is normally present + + return Path(arche.__file__).resolve().parent / "_data" / "african_names_v1.jsonl.gz" + +#: Entries in the shipped lexicon that are not names, and must never become one. +#: Measured 2026-09-08 on `african_names_v1.jsonl.gz`: 770 of 13,342 (5.8%) -- +#: 514 raw Wikidata blank-node URLs (`http://www.wikidata.org/.well-known/genid/…`), +#: 153 property labels in various languages (`Abas (nom de famille)`, +#: `Akinfenwa (aha ezinụlọ)`, `njirimara ezinụlọ` = Igbo for "family identifier"), +#: and a tail of titles and full person names filed as surnames. Drawing from an +#: unfiltered pool produced the company `njirimara ezinụlọnjirimara ezinụlọ Steel +#: Global`, which is how this was found. The lexicon itself needs fixing at +#: source; until then this filter is not optional, and a generator that silently +#: emits junk names measures nothing. +_NOT_A_NAME = re.compile(r"https?://|[()\d]|[^\w\s'\-.]", re.UNICODE) + + +def _cumulative(weights: list[float] | list[int]) -> list[float]: + """Running totals, for `random.choices(cum_weights=)`. + + Precomputed on purpose: `random.choices(weights=)` rebuilds this on every + call, measured at 1,113 us a draw against 4.3 us here. + """ + out, running = [], 0.0 + for w in weights: + running += w + out.append(running) + return out + + +def _usable(name: str) -> bool: + """A name pool entry: one or two tokens, no markup, no metadata. + + The uppercase requirement is doing more work than it looks. A further 139 + entries survive every other check while being obvious rubbish -- + `almaerifaa.com`, and the Wikidata concept labels `femme blanche`, `homme + blanc`, `pessoa branca`, `humano branco` in four languages. They are all + lowercase, and names in this lexicon are capitalised. But the test cannot + be "the first character is uppercase": `d'Arboussier` and `de Sardan` are + real surname forms that start lowercase, and `Ba`, `Ka`, `Sy` and `Ly` are + real Senegalese and Malian surnames that a length cut would delete. So the + rule is that a name must contain an uppercase letter *somewhere*, which + keeps the particles and the two-letter surnames and drops the concept + labels. + """ + return (2 <= len(name) <= 24 + and name.count(" ") <= 1 + and any(c.isupper() for c in name) + and not _NOT_A_NAME.search(name)) + + +# -- identifier formats ------------------------------------------------------- +# Held locally so this package generates a valid world with nothing else +# installed. arche has the same two validators, and +# `test_synthetic_world.py::test_the_local_validators_agree_with_arches` asserts +# the pair still agree -- which is stronger than depending on either alone, +# because it catches a drift that a one-sided import would hide. + +_RC = re.compile(r"^(RC|BN)\d{5,8}$") + + +def valid_rc(text: str) -> bool: + """A Nigerian CAC registration number: `RC`/`BN` then 5-8 digits.""" + return bool(_RC.match(text.upper().replace(" ", ""))) + + +def valid_tin(text: str) -> bool: + """A Nigerian FIRS tax identification number: 10 digits, or 14 with a branch.""" + cleaned = re.sub(r"[\s-]", "", text) + return cleaned.isdigit() and len(cleaned) in (10, 14) + + +#: What each world pack means. A published benchmark must not change under its +#: own name: `ng_supplier_v0` is what RESULTS.md was measured on and keeps +#: drawing from the pan-African lexicon, defect and all. N1 arrives as +#: `ng_supplier_v1`, and anyone comparing the two is comparing the fix. +WORLD_PACKS = { + "ng_supplier_v0": {"countries": (), "names": "lexicon"}, + "ng_supplier_v1": {"countries": ("NG",), "names": "wikidata-pairs"}, + # N1b. Country conditioning cannot show up in a single-country world: a + # Nigerian name cannot fail to predict a Nigerian city. Four countries, each + # with its own name pool, cities, legal forms, phone shapes, banks and + # registration identifier, is what makes "does a name predict where it is" + # a question with an answer. + "africa_supplier_v1": {"countries": ("NG", "KE", "GH", "ZA"), + "names": "wikidata-pairs"}, +} + + +#: Zipf exponent for the surname draw. 1.0 is the classic Zipf law and gives a +#: heavy head: with 2,000 organisations over a few thousand ranked surnames, +#: the commonest surname lands on roughly 1 in 12. That is the collision rate +#: the `common_names` stratum exists to measure. +ZIPF_ALPHA = 1.0 + +#: Nigerian company-name furniture. Legal forms carry real weight here: the +#: suffix is the single most abbreviated, dropped and re-cased token in a +#: supplier master, which is exactly why `representation` is its own kind. +#: Used only by `ng_supplier_v0`, which predates the country profiles and must +#: keep generating exactly what RESULTS.md was measured on. +_LEGAL_FORMS = ["Limited", "Limited", "Limited", "Nigeria Limited", "Ventures Limited", + "and Sons Limited", "Global Limited", "International Limited", + "Enterprises", "Nigeria Enterprises"] +_V0_CITIES = { + "Lagos": ["Ikeja", "Apapa", "Surulere", "Yaba", "Victoria Island", "Ojota"], + "Kano": ["Fagge", "Nassarawa", "Dala", "Gwale", "Tarauni"], + "Abuja": ["Garki", "Wuse", "Maitama", "Gwarinpa", "Utako"], + "Port Harcourt": ["Diobu", "Trans Amadi", "GRA", "Rumuokoro"], + "Ibadan": ["Bodija", "Dugbe", "Ring Road", "Mokola"], + "Enugu": ["Independence Layout", "New Haven", "Ogui", "Achara Layout"], +} +_V0_STATES = {"Lagos": "Lagos", "Kano": "Kano", "Abuja": "FCT", + "Port Harcourt": "Rivers", "Ibadan": "Oyo", "Enugu": "Enugu"} +_V0_STREETS = ["Zaria Road", "Awolowo Way", "Aminu Kano Crescent", "Ahmadu Bello Way", + "Herbert Macaulay Street", "Murtala Muhammed Road", "Ikot Ekpene Road", + "Nnamdi Azikiwe Street", "Marina Road", "Allen Avenue", "Broad Street"] +_V0_BANKS = ["Zenith Bank", "First Bank", "GTBank", "Access Bank", "UBA", "Fidelity Bank", + "Union Bank", "Sterling Bank", "Ecobank", "Stanbic IBTC"] +_V0_TRADES = ["Engineering", "Logistics", "Supplies", "Agro", "Foods", "Petroleum", + "Construction", "Technologies", "Pharmaceuticals", "Textiles", "Motors", + "Chemicals", "Trading", "Farms", "Steel", "Printing", "Services", "Haulage"] +#: Widened from 18. Notebook 24 measured the generated naming vocabulary as +#: 2.8x thinner than a real register's at matched sample size, and the +#: descriptive middle -- what the company actually does -- is where the +#: shortfall sits. +_TRADES = ["Engineering", "Logistics", "Supplies", "Agro", "Foods", "Petroleum", + "Construction", "Technologies", "Pharmaceuticals", "Textiles", "Motors", + "Chemicals", "Trading", "Farms", "Steel", "Printing", "Services", "Haulage", + "Fisheries", "Poultry", "Cement", "Plastics", "Packaging", "Timber", + "Mining", "Energy", "Telecom", "Consulting", "Security", "Catering", + "Garments", "Furniture", "Glass", "Paints", "Fertilisers", "Aluminium", + "Beverages", "Dairy", "Milling", "Tyres", "Cables", "Roofing", + "Plumbing", "Electricals", "Automotive", "Marine", "Aviation", "Freight", + "Warehousing", "Refrigeration", "Irrigation", "Seeds", "Feeds", "Brewing"] + + + +#: What differs by country, and it is more than the city list. A South African +#: company is a `(Pty) Ltd` and a Ghanaian one is not; a Kenyan supplier carries +#: a KRA PIN where a Nigerian one carries an RC number. Those are the signals a +#: matcher can learn from, and a world that shares them across countries teaches +#: nothing about where a record came from. +COUNTRY_PROFILES = { + "NG": { + "name": "Nigeria", + "cities": { + "Lagos": (["Ikeja", "Apapa", "Surulere", "Yaba", "Victoria Island"], "Lagos"), + "Kano": (["Fagge", "Nassarawa", "Dala", "Gwale"], "Kano"), + "Abuja": (["Garki", "Wuse", "Maitama", "Gwarinpa"], "FCT"), + "Port Harcourt": (["Diobu", "Trans Amadi", "GRA"], "Rivers"), + "Ibadan": (["Bodija", "Dugbe", "Ring Road"], "Oyo"), + "Enugu": (["Independence Layout", "New Haven", "Ogui"], "Enugu"), + }, + "streets": ["Zaria Road", "Awolowo Way", "Aminu Kano Crescent", + "Ahmadu Bello Way", "Herbert Macaulay Street", "Marina Road"], + "forms": ["Limited", "Limited", "Nigeria Limited", "Ventures Limited", + "and Sons Limited", "Enterprises", "Plc"], + "phones": ["0803", "0805", "0806", "0703", "0810", "0813", "0816", "0902"], + "banks": ["Zenith Bank", "First Bank", "GTBank", "Access Bank", "UBA", + "Fidelity Bank", "Union Bank", "Sterling Bank"], + }, + "KE": { + "name": "Kenya", + "cities": { + "Nairobi": (["Westlands", "Karen", "Industrial Area", "Kilimani"], "Nairobi"), + "Mombasa": (["Nyali", "Likoni", "Changamwe"], "Mombasa"), + "Kisumu": (["Milimani", "Nyalenda", "Mamboleo"], "Kisumu"), + "Nakuru": (["Lanet", "Naka", "Section 58"], "Nakuru"), + "Eldoret": (["Langas", "Kapsoya", "Huruma"], "Uasin Gishu"), + }, + "streets": ["Moi Avenue", "Kenyatta Avenue", "Ngong Road", "Thika Road", + "Haile Selassie Avenue", "Waiyaki Way"], + "forms": ["Limited", "Limited", "Company Limited", "Ltd", "Enterprises", + "Holdings Limited"], + "phones": ["0722", "0733", "0710", "0720", "0740", "0790"], + "banks": ["Equity Bank", "KCB Bank", "Co-operative Bank", "NCBA Bank", + "Absa Bank Kenya", "Stanbic Bank Kenya"], + }, + "GH": { + "name": "Ghana", + "cities": { + "Accra": (["Osu", "Adabraka", "East Legon", "Dansoman"], "Greater Accra"), + "Kumasi": (["Adum", "Asokwa", "Bantama"], "Ashanti"), + "Takoradi": (["Market Circle", "Effia", "Anaji"], "Western"), + "Tamale": (["Lamashegu", "Sagnarigu", "Vittin"], "Northern"), + }, + "streets": ["Liberation Road", "Independence Avenue", "Ring Road Central", + "Oxford Street", "Spintex Road", "Kwame Nkrumah Avenue"], + "forms": ["Limited", "Company Limited", "Limited", "Ltd", "Enterprise", + "Ventures Limited"], + "phones": ["024", "054", "055", "059", "020", "050"], + "banks": ["GCB Bank", "Ecobank Ghana", "Absa Bank Ghana", + "Fidelity Bank Ghana", "Stanbic Bank Ghana", "CalBank"], + }, + "ZA": { + "name": "South Africa", + "cities": { + "Johannesburg": (["Sandton", "Braamfontein", "Randburg", "Midrand"], + "Gauteng"), + "Cape Town": (["Woodstock", "Claremont", "Bellville", "Century City"], + "Western Cape"), + "Durban": (["Umhlanga", "Pinetown", "Westville"], "KwaZulu-Natal"), + "Pretoria": (["Hatfield", "Centurion", "Arcadia"], "Gauteng"), + "Gqeberha": (["Newton Park", "Walmer", "Summerstrand"], "Eastern Cape"), + }, + "streets": ["Commissioner Street", "Long Street", "West Street", + "Church Street", "Rivonia Road", "Voortrekker Road"], + # The distinctive one: a South African company is a (Pty) Ltd. + "forms": ["(Pty) Ltd", "(Pty) Ltd", "Proprietary Limited", + "Holdings (Pty) Ltd", "CC", "Limited"], + "phones": ["082", "083", "072", "074", "076", "084"], + "banks": ["Standard Bank", "ABSA", "FNB", "Nedbank", "Capitec Bank", + "Investec"], + }, +} + + +@dataclass(frozen=True) +class Entity: + """A synthetic real-world thing. Identity persists; state does not.""" + + entity_id: str + entity_type: str # organisation | person | place + + +@dataclass +class State: + """What was true about an entity over one interval. + + An entity with three states moved twice. ``valid_to is None`` marks the + current state. A source that observed the entity during an earlier interval + and never refreshed is *stale*, not wrong -- the distinction the whole + benchmark exists to measure. + """ + + entity_id: str + valid_from: date + valid_to: date | None + attributes: dict[str, Any] + + def covers(self, when: date) -> bool: + return self.valid_from <= when and (self.valid_to is None or when < self.valid_to) + + +@dataclass(frozen=True) +class Relationship: + subject: str + predicate: str # DIRECTOR_OF | LOCATED_AT + object: str + valid_from: date + valid_to: date | None = None + + +@dataclass +class World: + """A generated world, and the only object that holds truth.""" + + world_id: str + seed: int + #: The countries this world was built for. Empty for `ng_supplier_v0`, + #: which predates the country profiles: its places say `country: NG`, but + #: it must draw from the original flat lists, not from NG's profile. Code + #: downstream asks the world rather than inferring from a place, because + #: inferring is exactly what silently changed every v0 world once. + countries: tuple[str, ...] = () + entities: dict[str, Entity] = field(default_factory=dict) + states: dict[str, list[State]] = field(default_factory=dict) + relationships: list[Relationship] = field(default_factory=list) + events: list[Any] = field(default_factory=list) # filled by lifecycle + observations: list[Any] = field(default_factory=list) # filled by observe + differences: list[Any] = field(default_factory=list) # filled by observe + provenance: list[dict[str, Any]] = field(default_factory=list) + + def of_type(self, entity_type: str) -> list[Entity]: + return [e for e in self.entities.values() if e.entity_type == entity_type] + + def state_at(self, entity_id: str, when: date) -> tuple[int, State]: + """The state true at ``when``, with its index. Falls back to the earliest.""" + chain = self.states[entity_id] + for i, s in enumerate(chain): + if s.covers(when): + return i, s + return (0, chain[0]) if when < chain[0].valid_from else (len(chain) - 1, chain[-1]) + + def current(self, entity_id: str) -> State: + return self.states[entity_id][-1] + + +class Names: + """Names drawn from a country's own pool, with the frequencies it really has. + + **What changed, and why it was needed.** The first version drew a given name + and a family name independently from one pan-African lexicon of 12,369 + entries, ranked by a seeded shuffle and weighted Zipf. That produced + `Zubeyde Saliou` -- a Turkish given name on a West African surname -- and, + measured against 51,022 real Nigerian facility names, **0.0% of generated + name tokens carried regional signal against 90.4% of real ones**. Robin + Linacre named the defect from the design; the notebook measured it. + + Now both halves come from the **same country's** pool, built from real + given+family pairs on real people (Wikidata, CC0), and weighted by the + frequency each name actually has in that pool rather than by an invented + rank. Two things improve at once: a generated name is one a person from + that country plausibly has, and the frequency distribution is + `public-data-derived` instead of `synthetic-assumption`. + + **What it still does not do.** Nigeria's naming is Yoruba, Igbo, Hausa, + Efik and more, and this conditions only on the country. Measured on the + 931 Nigerian pairs: 548 distinct given names and 653 distinct family names, + with **zero repeated pairs** against 0.9 expected under independence -- the + sample is too sparse to learn sub-national structure from, and its + commonest given names (Joseph, Henry, John, Samuel) are Anglophone + Christian names that genuinely cross Nigerian ethnic lines. So a Hausa + given name can still meet an Igbo surname here. Conditioning at that level + needs data this pull does not contain, and the world being single-country + means country conditioning cannot show up in a name-predicts-city test + either. Both are open; see the plan. + """ + + def __init__(self, rng: random.Random, country: str | None = None, + countries: tuple[str, ...] = ()) -> None: + # A multi-country world needs one pool per country, so that a name can + # carry information about where its owner is. `countries` builds those; + # `country` is the single-country form v1 uses. + self.pools: dict[str, Names] = {} + if countries: + for iso in countries: + self.pools[iso] = Names(random.Random(rng.random() * 1e9), country=iso) + self.country = countries[0] + self.source = "wikidata:" + "+".join(countries) + self.dropped = 0 + first = self.pools[countries[0]] + self.given, self.family = first.given, first.family + self._given_cw, self._family_cw = first._given_cw, first._family_cw + self._rng = rng + return + self.country = country + self.source = "lexicon" + self.dropped = 0 + pairs = _pairs_path() + if country and pairs is not None: + given_counts: dict[str, int] = {} + family_counts: dict[str, int] = {} + with pairs.open(encoding="utf-8") as handle: + for line in handle: + row = json.loads(line) + if row.get("country") != country: + continue + for value, counts in ((row["given"], given_counts), + (row["family"], family_counts)): + if _usable(value): + counts[value] = counts.get(value, 0) + 1 + # A pool too thin to draw from would produce a handful of names + # repeated thousands of times, which is worse than the defect it + # was meant to fix. + if len(given_counts) >= 100 and len(family_counts) >= 100: + self.source = f"wikidata:{country}" + # Two separate claims, and they need separate treatment. + # + # WHICH names exist and go together comes from real people, and + # is `public-data-derived`. HOW CONCENTRATED the distribution is + # cannot come from this sample: Wikidata holds *notable* people, + # where almost every name occurs once or twice, and drawing on + # those raw counts made the world far too easy -- 2.8% duplicate + # company names at 4,000 suppliers against 12.0% in the real + # register. A population is much more concentrated than its + # celebrities. + # + # So the real counts decide the ORDER (which names are commoner) + # and a Zipf curve supplies the SHAPE. The ordering is evidence; + # the shape stays a declared assumption, and the manifest says + # so on its own line. + self.given = sorted(given_counts, key=lambda n: (-given_counts[n], n)) + self.family = sorted(family_counts, key=lambda n: (-family_counts[n], n)) + self._given_cw = self._zipf_cumulative(len(self.given)) + self._family_cw = self._zipf_cumulative(len(self.family)) + self._rng = rng + return + + with gzip.open(_lexicon_path(), "rt", encoding="utf-8") as handle: + rows = [json.loads(line) for line in handle] + self.family = [r["name"] for r in rows + if r.get("name_type") == "family" and _usable(r["name"])] + self.given = [r["name"] for r in rows + if r.get("name_type") != "family" and _usable(r["name"])] + self.dropped = len(rows) - len(self.family) - len(self.given) + rng.shuffle(self.family) + rng.shuffle(self.given) + # `cum_weights`, not `weights`. `random.choices(weights=...)` rebuilds + # the cumulative distribution on EVERY call, which is O(12,369) per + # name: measured at 1,113 us a draw against 4.3 us when the cumulative + # weights are precomputed -- 257x, and the difference between a world + # of 2,000 suppliers and one of 100,000. + self._family_cw = self._zipf_cumulative(len(self.family)) + self._given_cw = self._zipf_cumulative(len(self.given)) + self._rng = rng + + @staticmethod + def _zipf_cumulative(n: int) -> list[float]: + return _cumulative([1.0 / ((i + 1) ** ZIPF_ALPHA) for i in range(n)]) + + def _pool(self, country: str | None) -> Names: + return self.pools.get(country, self) if country else self + + def surname(self, country: str | None = None) -> str: + pool = self._pool(country) + return pool._rng.choices(pool.family, cum_weights=pool._family_cw, k=1)[0] + + def given_name(self, country: str | None = None) -> str: + pool = self._pool(country) + return pool._rng.choices(pool.given, cum_weights=pool._given_cw, k=1)[0] + + def person(self, country: str | None = None) -> str: + return f"{self.given_name(country)} {self.surname(country)}" + + +class Generator: + """Seeded construction of a Nigerian supplier world.""" + + def __init__(self, world_id: str, seed: int, country: str | None = None) -> None: + pack = WORLD_PACKS.get(world_id, WORLD_PACKS["ng_supplier_v0"]) + self.countries = pack["countries"] if country is None else (country,) + self.country = self.countries[0] if self.countries else None + self.multi = len(self.countries) > 1 + self.rng = random.Random(seed) + self.world = World(world_id=world_id, seed=seed, countries=self.countries) + self.names = Names(random.Random(seed ^ 0x5EED), + country=None if self.multi else self.country, + countries=self.countries if self.multi else ()) + self._n = {"organisation": 0, "person": 0, "place": 0} + self.start = date(2019, 1, 1) + + # -- identifiers, valid by construction --------------------------------- + + def rc_number(self) -> str: + """A CAC company registration number: RC or BN, then 5-8 digits.""" + while True: + candidate = f"RC{self.rng.randint(100000, 99999999)}" + if valid_rc(candidate): + return candidate + + def tin(self) -> str: + """A FIRS TIN: 10 digits, or 14 with a branch suffix. Format-only -- + FIRS publishes no check-digit specification.""" + while True: + candidate = "".join(str(self.rng.randint(0, 9)) for _ in range(10)) + if valid_tin(candidate): + return candidate + + def phone(self, country: str | None = None) -> str: + prefixes = (COUNTRY_PROFILES[country]["phones"] if country and self.multi + else ["0803", "0805", "0806", "0703", "0810", "0813", "0814", + "0816", "0701", "0902", "0903", "0905", "0704"]) + prefix = self.rng.choice(prefixes) + rest = "".join(str(self.rng.randint(0, 9)) for _ in range(7)) + return f"{prefix} {rest[:3]} {rest[3:]}" + + def account(self, country: str | None = None) -> tuple[str, str]: + banks = (COUNTRY_PROFILES[country]["banks"] if country and self.multi + else _V0_BANKS) + return (self.rng.choice(banks), + "".join(str(self.rng.randint(0, 9)) for _ in range(10))) + + # -- entities ------------------------------------------------------------ + + def _new(self, entity_type: str, attributes: dict[str, Any], when: date) -> str: + self._n[entity_type] += 1 + eid = entity_id(self.world.world_id, entity_type, self._n[entity_type]) + self.world.entities[eid] = Entity(eid, entity_type) + self.world.states[eid] = [State(eid, when, None, attributes)] + return eid + + def place(self) -> str: + if not self.multi: + city = self.rng.choice(list(_V0_CITIES)) + return self._new("place", { + "street": f"{self.rng.randint(1, 240)} {self.rng.choice(_V0_STREETS)}", + "area": self.rng.choice(_V0_CITIES[city]), + "city": city, + "state": _V0_STATES[city], + "country": "NG", + }, self.start) + iso = self.rng.choice(self.countries) + profile = COUNTRY_PROFILES[iso] + city = self.rng.choice(list(profile["cities"])) + areas, region = profile["cities"][city] + return self._new("place", { + "street": f"{self.rng.randint(1, 240)} {self.rng.choice(profile['streets'])}", + "area": self.rng.choice(areas), + "city": city, + "state": region, + "country": iso, + }, self.start) + + def person(self, country: str | None = None) -> str: + full = self.names.person(country) + return self._new("person", { + "full_name": full, + "phone": self.phone(), + "email": (full.lower().replace(" ", ".") + + "@" + self.rng.choice(["gmail.com", "yahoo.com", "outlook.com"])), + }, self.start) + + def organisation(self, places: list[str], people: list[str]) -> str: + """One supplier, with a director, a registered place and an account. + + The legal name is built from a Zipf-drawn surname, so common surnames + produce genuinely colliding company names -- ``Okafor Engineering + Limited`` twice, owned by different people, in different cities. That + pair is the false-merge trap the benchmark needs, and it is generated + rather than hoped for. + """ + # The place is chosen first, and everything else follows from where it + # is: the surname comes from that country's pool, the legal form from + # its company law, the phone from its numbering plan, the bank from its + # banks. That chain is the whole point of N1b -- it is what lets a name + # carry information about where a record is from, which is what the + # single-country world could not express. + if self.multi: + place = self.rng.choice(places) + iso = self.world.current(place).attributes.get("country") + profile = COUNTRY_PROFILES[iso] + surname = self.names.surname(iso) + trade = self.rng.choice(_TRADES) + form = self.rng.choice(profile["forms"]) + else: + # v0's original order, preserved exactly. Drawing the place first -- + # which the multi-country path must do, because the place decides + # the country and the country decides the name -- consumes the + # random stream differently and changes every v0 world. + iso = None + surname = self.names.surname() + trade = self.rng.choice(_V0_TRADES) + form = self.rng.choice(_LEGAL_FORMS) + place = self.rng.choice(places) + director = self.rng.choice(people) + bank, account = self.account(iso) + incorporated = self.start - timedelta(days=self.rng.randint(200, 5000)) + domain = {"NG": "com.ng", "KE": "co.ke", "GH": "com.gh", + "ZA": "co.za"}.get(iso or "NG", "com.ng") + oid = self._new("organisation", { + "legal_name": f"{surname} {trade} {form}", + "rc_number": self.rc_number(), + "tin": self.tin(), + "phone": self.phone(iso), + "email": f"info@{surname.lower()}{trade.lower()}.{domain}", + "place_id": place, + "director_id": director, + "bank": bank, + "account_number": account, + "incorporated_on": incorporated.isoformat(), + }, self.start) + self.world.relationships.append( + Relationship(director, "DIRECTOR_OF", oid, self.start)) + self.world.relationships.append( + Relationship(oid, "LOCATED_AT", place, self.start)) + return oid + + def build(self, organisations: int, people: int, places: int) -> World: + """Generate the world in a fixed order, so the seed fully determines it.""" + place_ids = [self.place() for _ in range(places)] + people_ids = [self.person(self.rng.choice(self.countries) if self.multi else None) + for _ in range(people)] + for _ in range(organisations): + self.organisation(place_ids, people_ids) + from_wikidata = self.names.source.startswith("wikidata") + self.world.provenance.append({ + "asset": "given and family names", + "source": ("Wikidata given+family pairs (CC0) for " + f"{'+'.join(self.countries)}, via datasets/pull_wikidata.py" + if from_wikidata else + "arche african_names_v1 lexicon (Wikidata/ParaNames, CC-BY-4.0)"), + "method": ("pool and pairing from one country's real names; names " + "ordered by the frequency they have in that sample, then " + f"weighted Zipf alpha={ZIPF_ALPHA} for concentration" + if from_wikidata else + f"seeded rank shuffle, Zipf weighting alpha={ZIPF_ALPHA}"), + "class": ("public-data-derived (which names exist and co-occur); " + "synthetic-assumption (how concentrated the distribution is)" + if from_wikidata else "synthetic-assumption"), + "pool": f"{len(self.names.given):,} given, {len(self.names.family):,} family", + "limitation": ("conditions on country only; Nigeria's Yoruba, Igbo and " + "Hausa naming are not separated, because the pull has " + "931 Nigerian pairs with zero repeats and cannot support it" + if from_wikidata else + "given and family names are drawn independently, so the " + "two halves of a name need not belong together"), + "filtered": (f"{self.names.dropped} lexicon entries excluded as not-names " + "(Wikidata blank-node URLs, property labels, titles); see " + "world._NOT_A_NAME"), + "note": ("the lexicon carries no frequency data; the distribution SHAPE is " + "modelled and the ranking is arbitrary. Collision rates are " + "realistic; the specific common names are not a claim about " + "Nigeria."), + }) + self.world.provenance.append({ + "asset": "RC numbers and TINs", + "source": "arche.detect.ng.ids validators", + "method": "generate-and-validate; every identifier passes at build time", + "class": "public-data-derived", + }) + return self.world + + +def generate(world_id: str, seed: int, *, organisations: int, people: int, + places: int, country: str | None = None) -> World: + """Build a world. Same arguments and seed produce the same world. + + ``country`` is normally left to the world pack; pass it only to override. + """ + return Generator(world_id, seed, country=country).build( + organisations, people, places) + + +__all__ = ["WORLD_PACKS", "Entity", "Generator", "Names", "Relationship", + "State", "World", + "ZIPF_ALPHA", "generate", "valid_rc", "valid_tin"] diff --git a/data/synthetic/arm_ledger.py b/data/synthetic/arm_ledger.py new file mode 100644 index 0000000..79ca1c6 --- /dev/null +++ b/data/synthetic/arm_ledger.py @@ -0,0 +1,167 @@ +# Copyright 2026 unpatterned.org +# SPDX-License-Identifier: Apache-2.0 + +"""The ledger arm (B9 S5) — resolution as records arrive, not as a batch. + +Every other arm is handed all 1,198 records at once and asked which are the +same. That is not how a vendor master is built. Records arrive over years: the +ERP row is typed in 2019, the registry is checked in 2022, an invoice is filed +in 2025, and in between the supplier moves. So this arm feeds the world into +:func:`arche.attach`'s ledger **in `observed_at` order**, calling +``resolve()`` on each new record against everything already stored, and reads +the entities the ledger has formed at the end. + +Why this is the arm that matters. S3 measured `arche/pack` at **0.088 recall on +relocated suppliers** with **0.978 coverage** -- it is not missing them, it is +refusing them, because the `organisation` pack's `premises` comparator is +declared ``refutes_below: 0.5`` and a wholly changed address demotes the pair +to `review`. The question this arm asks is whether the ledger's second +mechanism -- evidence arriving later, decisions superseded rather than +overwritten -- recovers what the one-shot batch comparison declines. + +Two variants are measured and reported separately, because one of them uses an +outside lookup and the other does not: + +``arche/ledger`` + Pure incremental resolution. No oracle, no truth, nothing the records do + not already carry. + +``arche/ledger+observe`` + The same, then the operator's move: for each pair the ledger left open, + look up the **registry record carrying the same RC number** and feed its + address in with ``observe()``. That is a real workflow -- an open case + sends somebody to the companies register -- and it uses an identifier + present in the data rather than the answer key. It is still an *assisted* + number and is labelled as one: two records sharing an RC number are + already strong evidence of one supplier, so this measures whether + ``observe`` propagates and re-decides correctly, not whether arche can find + the link unaided. +""" + +from __future__ import annotations + +import time +from typing import Any + +from arche_synthetic.evaluate import Predictions, pair +from arms import _as_arche_record + +#: Our record id, carried through the ledger as an ordinary attribute so the +#: entities it forms can be mapped back. `resolve` drops the `id_field`, and +#: the `organisation` pack declares `ignores_everything_else`, so an extra +#: column is stored and never compared. +PASSTHROUGH = "source_record_id" + + +def _record(observation: dict[str, Any]) -> dict[str, Any]: + return {**_as_arche_record(observation), + PASSTHROUGH: observation["record_id"]} + + +def _clusters(book, entity_type: str = "organisation") -> list[list[str]]: + """The ledger's entities, in our record ids.""" + out = [] + for view in book.entities(entity_type): + members = [r.attributes.get(PASSTHROUGH) for r in view.records] + members = [m for m in members if m] + if members: + out.append(members) + return out + + +def _pairs(clusters: list[list[str]]) -> set[tuple[str, str]]: + """Every within-cluster pair: the ledger's positive claims, at entity level. + + The ledger links transitively -- A matched B and B matched C groups all + three -- so its claim is the entity, and the pairwise form of that claim is + the clique. `held_together_by` records which clusters were never fully + compared; that is reported in the notes rather than silently flattened. + """ + out: set[tuple[str, str]] = set() + for members in clusters: + members = sorted(members) + for i, a in enumerate(members): + for b in members[i + 1:]: + out.add(pair(a, b)) + return out + + +def ledger_arm(observations: list[dict[str, Any]], *, observe: bool = False, + entity_type: str = "organisation", + truth_pairs=None) -> Predictions: + """Ingest in arrival order; optionally run the operator's lookup afterwards.""" + import arche + + ordered = sorted(observations, key=lambda o: (o["observed_at"], o["record_id"])) + started = time.perf_counter() + notes: dict[str, Any] = {"ingested_in": "observed_at order", + "records": len(ordered)} + + with arche.attach("duckdb:///:memory:") as book: + for observation in ordered: + book.resolve(_record(observation), entity_type=entity_type) + notes["open_cases_after_ingest"] = len(book.cases(entity_type)) + + if observe: + notes.update(_observe_pass(book, ordered, entity_type)) + + clusters = _clusters(book, entity_type) + held = [v.held_together_by for v in book.entities(entity_type)] + + seconds = time.perf_counter() - started + notes["clusters"] = len(clusters) + notes["transitive_clusters"] = sum(1 for h in held if h == "transitive") + return Predictions( + arm="arche/ledger+observe" if observe else "arche/ledger", + pairs=_pairs(clusters), clusters=clusters, seconds=seconds, notes=notes) + + +def _observe_pass(book, ordered: list[dict[str, Any]], + entity_type: str) -> dict[str, Any]: + """The operator's move: an open case sends somebody to the register. + + For each still-open case, find the **registry** record sharing the RC + number of one of its records and feed that record's address in. The lookup + key is an identifier the data carries, never the truth mapping -- but it is + still an assisted result, because two records sharing an RC number are + already strong evidence, and the number is labelled accordingly. + """ + by_rc: dict[str, dict[str, Any]] = {} + for observation in ordered: + if observation["source"] == "registry" and observation.get("rc_number"): + by_rc[observation["rc_number"].upper()] = observation + + looked_up = observed = 0 + for case in book.cases(entity_type): + # `Case.record_a` / `.record_b` are Record objects, not ids. + for record in (case.record_a, case.record_b): + if record is None: + continue + rc = (record.attributes.get("registration_id") or "").upper() + authority = by_rc.get(rc) + if not authority: + continue + looked_up += 1 + address = ", ".join( + x for x in (authority.get("address"), authority.get("city")) if x) + if address and address != record.attributes.get("address"): + book.observe(record.record_id, {"address": address}) + observed += 1 + break + return {"cases_with_a_registry_lookup": looked_up, + "records_updated_by_observe": observed, + "open_cases_after_observe": len(book.cases(entity_type)), + "assisted": ("addresses were re-fetched from the registry record " + "sharing each record's RC number; an identifier in the " + "data, not the answer key, but an assist")} + + +def arche_ledger(observations, truth_pairs=None) -> Predictions: + return ledger_arm(observations, observe=False) + + +def arche_ledger_observe(observations, truth_pairs=None) -> Predictions: + return ledger_arm(observations, observe=True) + + +__all__ = ["PASSTHROUGH", "arche_ledger", "arche_ledger_observe", "ledger_arm"] diff --git a/data/synthetic/arm_splink.py b/data/synthetic/arm_splink.py new file mode 100644 index 0000000..d45301f --- /dev/null +++ b/data/synthetic/arm_splink.py @@ -0,0 +1,190 @@ +# Copyright 2026 unpatterned.org +# SPDX-License-Identifier: Apache-2.0 + +"""The Splink arm (B9 S4) — a second, independent engine on the same world. + +Splink is the reference probabilistic linker: Fellegi-Sunter with parameters +estimated from the data by expectation-maximisation. It matters here for one +reason above all — **until a second engine that we did not write runs on this +data, the benchmark says how four of our own configurations behave, not how +entity resolution behaves.** That is also the trigger for cutting the separate +repository. + +Two things this module is careful about, both learned the hard way. + +**Seed the u-estimation.** ``estimate_u_using_random_sampling`` samples, and +unseeded it moves: an earlier arche benchmark quoted a Febrl recall of 0.9210 +as a constant and re-running the same recipe twice in one session gave 0.9534 +and 0.9528. A stale or unseeded reference makes whatever it is compared with +look better or worse than it is. The seed is fixed and recorded, and +``--splink-repeats`` re-runs with different seeds to report the spread rather +than one flattering decimal. + +**Cut on probability, not on a decision.** Splink emits ``match_probability`` +and has no third answer. arche emits ``decision in {match, review}`` and its +gate demotes a pair to ``review`` *without lowering the score*, so cutting +arche at a score threshold once reported 398 false merges where the engine's +own decision reported 2. Each engine is scored on the vocabulary it actually +emits; that is why this arm is a separate module rather than a flag. +""" + +from __future__ import annotations + +import time +from typing import Any + +from arche_synthetic.evaluate import Predictions, pair + +#: The probability at which a Splink pair is counted as a claim. +#: +#: **0.5, which is the model's own decision boundary** -- above it the model +#: says these two are more likely one thing than two. The first version of this +#: arm used 0.99, imported from the existing Febrl benchmark, and that was the +#: same mistake this module's docstring warns about in the other direction: +#: imposing an arche-flavoured caution on an engine that does not have one. +#: Measured on this world, the difference is not small: +#: +#: t=0.50 recall 0.731 precision 0.940 +#: t=0.90 recall 0.259 precision 1.000 +#: t=0.99 recall 0.207 precision 1.000 +#: +#: The sweep is reported in every run's notes rather than hidden behind one +#: decimal, because a single threshold is a policy choice and the reader's may +#: differ from ours. +DEFAULT_THRESHOLD = 0.5 + +#: Fixed so the arm is reproducible. See the module docstring. +DEFAULT_SEED = 42 + + +def _frame(observations: list[dict[str, Any]]): + """Records as Splink should be given them: normalised. + + The first version of this arm handed Splink the raw strings and scored + **0.000 on relocated suppliers** -- not because Splink cannot link them but + because `block_on` is case-sensitive and 57% of the representation + differences in this world are a source that stores its records IN CAPITALS. + Every block key broke on case alone, blocking recall was 0.404, and the arm + was measuring my configuration rather than the engine. + + Normalising before loading is what every Splink user does, so it is what a + fair arm does. A badly configured competitor is worse than no competitor: + it makes whatever it is compared against look good for a reason that has + nothing to do with the comparison. + """ + import pandas as pd + + from arms import normalise + + def lower(value: str | None) -> str | None: + return value.lower().strip() if value else None + + rows = [] + for o in observations: + name = normalise(o.get("name")) or None + rows.append({ + "unique_id": o["record_id"], + "name": name, + # A short prefix of the normalised name, so a blocking rule + # survives a dropped legal suffix and a changed city. + "name_head": name[:4] if name else None, + "registration_id": (o.get("rc_number") or "").upper() or None, + "address": lower(o.get("address")), + "city": lower(o.get("city")), + "phone": "".join(c for c in (o.get("phone") or "") if c.isdigit()) or None, + }) + return pd.DataFrame(rows) + + +def _settings(): + import splink.comparison_library as cl + from splink import SettingsCreator, block_on + + return SettingsCreator( + link_type="dedupe_only", + comparisons=[ + # Term-frequency adjustment is the whole reason a Fellegi-Sunter + # linker belongs on this data: the surnames are Zipf-drawn, so + # agreeing on a common one is weak evidence and agreeing on a rare + # one is strong. A comparator that cannot express that difference + # is the gap this world was built to expose. + cl.NameComparison("name").configure(term_frequency_adjustments=True), + cl.ExactMatch("registration_id").configure(term_frequency_adjustments=True), + cl.LevenshteinAtThresholds("address", [2, 5]), + cl.ExactMatch("city").configure(term_frequency_adjustments=True), + cl.ExactMatch("phone"), + ], + # Deliberately looser than the first attempt. A rule that keys on the + # city cannot retrieve a supplier that moved, and one that keys on a + # long name prefix cannot retrieve one that was renamed -- so the set + # has to include rules that survive each kind of change this world + # generates, or the arm measures the blocker and reports it as recall. + blocking_rules_to_generate_predictions=[ + block_on("registration_id"), + block_on("name_head"), + block_on("phone"), + block_on("city", "substr(address, 1, 6)"), + ], + retain_intermediate_calculation_columns=False, + ) + + +def _train(linker, seed: int) -> None: + from splink import block_on + + linker.training.estimate_probability_two_random_records_match( + [block_on("registration_id"), block_on("name", "city")], recall=0.8) + linker.training.estimate_u_using_random_sampling(max_pairs=1e6, seed=seed) + for rule in (block_on("city"), block_on("name_head")): + linker.training.estimate_parameters_using_expectation_maximisation(rule) + + +def splink_arm(observations: list[dict[str, Any]], *, + threshold: float = DEFAULT_THRESHOLD, + seed: int = DEFAULT_SEED, + truth_pairs=None) -> Predictions: + """One Splink run over the world, cut at ``threshold``.""" + import logging + + from splink import DuckDBAPI, Linker + + logging.getLogger("splink").setLevel(logging.ERROR) + + frame = _frame(observations) + started = time.perf_counter() + linker = Linker(frame, _settings(), db_api=DuckDBAPI()) + _train(linker, seed) + predictions = linker.inference.predict(threshold_match_probability=0.01) + df = predictions.as_pandas_dataframe() + seconds = time.perf_counter() - started + + candidates = {pair(a, b) for a, b in + zip(df["unique_id_l"], df["unique_id_r"], strict=False)} + kept = df[df["match_probability"] >= threshold] + pairs = {pair(a, b) for a, b in + zip(kept["unique_id_l"], kept["unique_id_r"], strict=False)} + sweep = {str(t): int((df["match_probability"] >= t).sum()) + for t in (0.5, 0.9, 0.95, 0.99)} + return Predictions( + arm="splink", pairs=pairs, candidates=candidates, seconds=seconds, + notes={"threshold": threshold, "seed": seed, + "scored_pairs": int(len(df)), + "claims_at_threshold": sweep, + "note": ("candidates are the pairs Splink scored above 0.01, so " + "blocking recall is a lower bound on what its blocking " + "rules retrieved")}) + + +def splink_spread(observations, *, repeats: int = 3, threshold: float = DEFAULT_THRESHOLD, + seeds: tuple[int, ...] = (42, 43, 44)) -> list[Predictions]: + """The same recipe under several seeds. + + ``estimate_u_using_random_sampling`` samples; one decimal from one seed is + not a measurement. Reporting the spread is the difference between a number + and a claim. + """ + return [splink_arm(observations, threshold=threshold, seed=s) + for s in seeds[:repeats]] + + +__all__ = ["DEFAULT_SEED", "DEFAULT_THRESHOLD", "splink_arm", "splink_spread"] diff --git a/data/synthetic/arms.py b/data/synthetic/arms.py new file mode 100644 index 0000000..3c2dc16 --- /dev/null +++ b/data/synthetic/arms.py @@ -0,0 +1,252 @@ +# Copyright 2026 unpatterned.org +# SPDX-License-Identifier: Apache-2.0 + +"""The matchers under test, each answering in its own vocabulary. + +Four arms, in increasing order of what they are allowed to know: + +``exact`` + Normalise the name, join on equality with the city. This is the + rule-baseline shape that scores 1.000 on SPIDER, and **its result on the + `legitimate_change` stratum is the headline of the whole benchmark**: a + supplier that moved has a different city, and one that was renamed has a + different name, so the rule that looks strong overall should collapse + there. If it does not, the generator is producing changes too small to + matter and S1 needs revisiting before anything else is worth running. + +``jaro_winkler`` + Name similarity over a cheap block. The classic weak baseline. + +``arche/pack`` + ``dedupe(entity="organisation")`` -- what a user gets today. + +``arche/custom`` + The same engine with every field mapped. The shipped ``organisation`` pack + reads ``name``, ``registration_id``, ``address``, ``lat``/``lon`` and + ``entity_class`` and declares ``ignores_everything_else``, so it is + structurally blind to phone, director, account and TIN -- where 371 of the + 1,763 labelled `change` differences live. The gap between these two arms + measures what the pack does not read, which is a finding about arche + rather than about the data. + +Each arm returns the positive set **it** stands behind. Nothing here re-derives +a decision from a score: arche's gate demotes a pair to ``review`` without +lowering its score, so a score cut would report false merges the engine +explicitly refused to make. +""" + +from __future__ import annotations + +import re +import time +from typing import Any + +from arche_synthetic.evaluate import Predictions, pair + +#: Legal-form words to set aside before an exact join. Without this the `exact` +#: arm would be beaten by `Ltd` vs `Limited` alone, which measures the +#: normaliser rather than the matcher. +_FORMS = {"limited", "ltd", "plc", "enterprises", "ent", "nigeria", "nig", + "ventures", "global", "international", "group", "holdings", "and", "sons"} +_PUNCT = re.compile(r"[^\w\s]", re.UNICODE) + + +def normalise(name: str | None) -> str: + """Case, punctuation and legal form removed -- the fair floor for a join.""" + if not name: + return "" + tokens = _PUNCT.sub(" ", name).lower().split() + kept = [t for t in tokens if t not in _FORMS] + return " ".join(kept or tokens) + + +def _pairs_within(groups: dict[Any, list[str]], cap: int = 400) -> set[tuple[str, str]]: + """All pairs inside each group. + + ``cap`` guards against a degenerate block: a group of 3,000 records is + 4.5M pairs and says nothing except that the blocking key was useless. A + capped group is recorded in the arm's notes rather than silently dropped. + """ + out: set[tuple[str, str]] = set() + for members in groups.values(): + if len(members) > cap: + continue + members = sorted(members) + for i, a in enumerate(members): + for b in members[i + 1:]: + out.add(pair(a, b)) + return out + + +def _oversized(groups: dict[Any, list[str]], cap: int = 400) -> int: + return sum(1 for m in groups.values() if len(m) > cap) + + +# ------------------------------------------------------------------ arms -- + + +def exact(observations: list[dict[str, Any]]) -> Predictions: + """Normalised name plus city, joined on equality.""" + started = time.perf_counter() + groups: dict[tuple[str, str], list[str]] = {} + for o in observations: + key = (normalise(o.get("name")), (o.get("city") or "").upper()) + if not key[0]: + continue + groups.setdefault(key, []).append(o["record_id"]) + pairs = _pairs_within(groups) + return Predictions( + arm="exact", pairs=pairs, candidates=pairs, + seconds=time.perf_counter() - started, + notes={"rule": "normalised name + city, exact", + # For a pure equality join the blocker and the matcher are the + # same operation, so blocking recall equals recall here -- that + # is a property of the arm, not the reporting bug it resembles. + "blocking_note": "candidates == claims; a join blocks by deciding", + "oversized_blocks": _oversized(groups)}) + + +def jaro_winkler(observations: list[dict[str, Any]], threshold: float = 0.92) -> Predictions: + """Name similarity above a threshold, blocked on the first three characters.""" + import jellyfish + + started = time.perf_counter() + blocks: dict[str, list[tuple[str, str]]] = {} + for o in observations: + name = normalise(o.get("name")) + if not name: + continue + blocks.setdefault(name[:3], []).append((o["record_id"], name)) + + candidates: set[tuple[str, str]] = set() + pairs: set[tuple[str, str]] = set() + for members in blocks.values(): + if len(members) > 400: + continue + members = sorted(members) + for i, (ida, na) in enumerate(members): + for idb, nb in members[i + 1:]: + key = pair(ida, idb) + candidates.add(key) + if jellyfish.jaro_winkler_similarity(na, nb) >= threshold: + pairs.add(key) + return Predictions( + arm="jaro_winkler", pairs=pairs, candidates=candidates, + seconds=time.perf_counter() - started, + notes={"threshold": threshold, "block": "first 3 chars of normalised name", + "oversized_blocks": sum(1 for m in blocks.values() if len(m) > 400)}) + + +#: The generator's columns, in the vocabulary the `organisation` pack reads. +def _as_arche_record(o: dict[str, Any]) -> dict[str, Any]: + address = ", ".join(x for x in (o.get("address"), o.get("city")) if x) + return { + "id": o["record_id"], + "name": o.get("name") or "", + "registration_id": o.get("rc_number") or "", + "address": address, + # read by `arche/custom` only; the shipped pack ignores these + "phone": o.get("phone") or "", + "tin": o.get("tin") or "", + "account_number": o.get("account_number") or "", + "director_name": o.get("director_name") or "", + "email": o.get("email") or "", + } + + +#: The shipped pack, plus the four fields it does not read. Weights are chosen +#: to be defensible rather than tuned: an account number and a TIN are exact +#: identifiers and rank with the RC number; a phone is strong but shared +#: between businesses; a director's name is weak evidence on its own. +def _custom_comparators() -> list[dict[str, Any]]: + from arche.resolve import ENTITY_PACKS + + return [ + *[c for c in ENTITY_PACKS["organisation"] if c.get("kind") != "geo"], + {"field": "tin", "kind": "id", "weight": 2.5}, + {"field": "account_number", "kind": "id", "weight": 2.0}, + {"field": "phone", "kind": "phone", "weight": 1.5}, + {"field": "email", "kind": "email", "weight": 1.0}, + {"field": "director_name", "kind": "name", "weight": 1.0}, + ] + + +def _arche(observations: list[dict[str, Any]], *, arm: str, + entity: str | None = None, + comparators: list[dict[str, Any]] | None = None, + truth_pairs: list[tuple[str, str]] | None = None) -> Predictions: + from arche.resolve import dedupe + + records = [_as_arche_record(o) for o in observations] + started = time.perf_counter() + kwargs: dict[str, Any] = {"id_field": "id", "tf": "default"} + if entity: + kwargs["entity"] = entity + else: + kwargs["comparators"] = comparators + if truth_pairs is not None: + kwargs["truth_pairs"] = truth_pairs + result = dedupe(records, **kwargs) + seconds = time.perf_counter() - started + + # arche's own vocabulary: `match` is the claim, `review` is the refusal. + pairs = {pair(e["a_id"], e["b_id"]) for e in result["matches"] + if e.get("decision") == "match"} + abstentions = {pair(e["a_id"], e["b_id"]) for e in result["matches"] + if e.get("decision") == "review"} + abstentions |= {pair(e["a_id"], e["b_id"]) for e in result.get("review", [])} + clusters = [c["members"] for c in result.get("clusters", [])] or None + blocking = result.get("blocking", {}) + return Predictions( + arm=arm, pairs=pairs, abstentions=abstentions, clusters=clusters, + seconds=seconds, + notes={"engine": result.get("pins", {}).get("engine"), + "candidate_pairs": blocking.get("candidate_pairs"), + "blocking_recall_reported_by_arche": blocking.get("recall")}) + + +def arche_pack(observations, truth_pairs=None) -> Predictions: + """`dedupe(entity="organisation")` -- the shipped pack, unmodified.""" + return _arche(observations, arm="arche/pack", entity="organisation", + truth_pairs=truth_pairs) + + +def arche_custom(observations, truth_pairs=None) -> Predictions: + """The same engine with phone, TIN, account and director mapped in.""" + return _arche(observations, arm="arche/custom", + comparators=_custom_comparators(), truth_pairs=truth_pairs) + + +def splink(observations, truth_pairs=None) -> Predictions: + """Splink 4, Fellegi-Sunter with EM-estimated parameters. See `arm_splink`.""" + from arm_splink import splink_arm + + return splink_arm(observations) + + +def arche_ledger(observations, truth_pairs=None) -> Predictions: + """Incremental resolution in arrival order. See `arm_ledger`.""" + from arm_ledger import arche_ledger as run + + return run(observations) + + +def arche_ledger_observe(observations, truth_pairs=None) -> Predictions: + """The same, plus the operator's registry lookup. See `arm_ledger`.""" + from arm_ledger import arche_ledger_observe as run + + return run(observations) + + +ARMS = { + "exact": exact, + "jaro_winkler": jaro_winkler, + "splink": splink, + "arche/pack": arche_pack, + "arche/custom": arche_custom, + "arche/ledger": arche_ledger, + "arche/ledger+observe": arche_ledger_observe, +} + +__all__ = ["ARMS", "arche_custom", "arche_ledger", "arche_ledger_observe", + "arche_pack", "exact", "jaro_winkler", "normalise", "splink"] diff --git a/data/synthetic/build_ng_supplier_v0.py b/data/synthetic/build_ng_supplier_v0.py new file mode 100644 index 0000000..a63ac61 --- /dev/null +++ b/data/synthetic/build_ng_supplier_v0.py @@ -0,0 +1,60 @@ +#!/usr/bin/env python +# Copyright 2026 unpatterned.org +# SPDX-License-Identifier: Apache-2.0 + +"""Build the `ng_supplier_v0` world. + + python data/synthetic/build_ng_supplier_v0.py + python data/synthetic/build_ng_supplier_v0.py --scale 200 --out /tmp/small + +Writes `worlds/ng_supplier_v0/` beside this file: `observations.parquet` (all a +matcher is given), `truth.parquet`, `differences.parquet`, `events.parquet`, a +JSON Schema per file, and `manifest.yaml`. Reproducible under the seed; the +manifest carries a content fingerprint per table so a rebuild can be checked +without comparing Parquet bytes. +""" + +from __future__ import annotations + +import argparse +import sys +from pathlib import Path + +_HERE = Path(__file__).resolve().parent +_REPO = _HERE.parents[1] +sys.path.insert(0, str(_HERE)) +sys.path.insert(0, str(_REPO / "packages" / "arche-core" / "src")) + +from arche_synthetic import SCALE, build # noqa: E402 + + +def main() -> int: + ap = argparse.ArgumentParser(description=__doc__.splitlines()[0]) + ap.add_argument("--seed", type=int, default=42) + ap.add_argument("--scale", type=int, default=None, + help="organisations; people and places scale with it") + ap.add_argument("--out", default=None, help="output directory") + args = ap.parse_args() + + scale = None + if args.scale: + ratio = args.scale / SCALE["organisations"] + scale = {"organisations": args.scale, + "people": max(2, int(SCALE["people"] * ratio)), + "places": max(2, int(SCALE["places"] * ratio))} + out = Path(args.out) if args.out else _HERE / "worlds" / "ng_supplier_v0" + + _, manifest = build("ng_supplier_v0", seed=args.seed, out=out, scale=scale) + + counts = manifest["counts"] + print(f" world {manifest['world_id']} seed {manifest['seed']}") + print(f" entities {counts['entities']}") + print(f" observations{counts['observations']:>7}") + print(f" events {counts['events']:>7}") + print(f" differences {counts['differences']:>7} {counts['difference_kinds']}") + print(f" written to {out}") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/data/synthetic/run_benchmark.py b/data/synthetic/run_benchmark.py new file mode 100644 index 0000000..9e8a1ad --- /dev/null +++ b/data/synthetic/run_benchmark.py @@ -0,0 +1,91 @@ +#!/usr/bin/env python +# Copyright 2026 unpatterned.org +# SPDX-License-Identifier: Apache-2.0 + +"""Run the arms over a generated world and write the stratified report. + + python data/synthetic/run_benchmark.py + python data/synthetic/run_benchmark.py --arms exact,arche/pack + python data/synthetic/run_benchmark.py --world worlds/small --out /tmp/r.json + +Writes `benchmark_result.json` beside the world and prints the table. Every +number is measured on the machine it printed on; nothing here carries a +constant from a previous run. +""" + +from __future__ import annotations + +import argparse +import json +import sys +from pathlib import Path + +_HERE = Path(__file__).resolve().parent +_REPO = _HERE.parents[1] +sys.path.insert(0, str(_HERE)) +sys.path.insert(0, str(_REPO / "packages" / "arche-core" / "src")) + +from arche_synthetic.evaluate import Benchmark, table # noqa: E402 +from arms import ARMS # noqa: E402 + + +def main() -> int: + ap = argparse.ArgumentParser(description=__doc__.splitlines()[0]) + ap.add_argument("--world", default=str(_HERE / "worlds" / "ng_supplier_v0")) + ap.add_argument("--arms", default=",".join(ARMS), + help=f"comma-separated subset of: {', '.join(ARMS)}") + ap.add_argument("--out", default=None) + args = ap.parse_args() + + world = Path(args.world) + bench = Benchmark.load(world) + print(f" world {world.name}") + print(f" records {len(bench.truth)}") + print(f" entities {len(bench.by_entity)}") + print(f" true pairs {len(bench.true_pairs)}") + print(f" strata {', '.join(sorted(bench.by_kind))}\n") + + # arche computes its own blocking recall when given the truth; the other + # arms have theirs computed from the candidate set they report. + truth_pairs = [tuple(p) for p in sorted(bench.true_pairs)] + + reports = [] + for name in [a.strip() for a in args.arms.split(",") if a.strip()]: + if name not in ARMS: + print(f" unknown arm {name!r}; known: {', '.join(ARMS)}", file=sys.stderr) + return 2 + print(f" running {name} …", flush=True) + arm = ARMS[name] + predictions = (arm(bench.observations, truth_pairs=truth_pairs) + if name.startswith("arche/") else arm(bench.observations)) + reports.append(bench.score(predictions)) + + print("\n" + table(reports) + "\n") + print(" recall by cause (the column no other benchmark has):") + causes = sorted({c for r in reports for c in r["recall_by_stratum"] if "/" in c}) + width = max((len(c) for c in causes), default=10) + header = " " * (width + 4) + "".join(f"{r['arm'][:13]:>15}" for r in reports) + print(header) + for cause in causes: + row = f" {cause:<{width}}" + for r in reports: + entry = r["recall_by_stratum"].get(cause) + row += f"{entry['recall']:>15.3f}" if entry else f"{'—':>15}" + n = next((r['recall_by_stratum'][cause]['true_pairs'] + for r in reports if cause in r['recall_by_stratum']), 0) + print(f"{row} (n={n})") + + out = Path(args.out) if args.out else world / "benchmark_result.json" + # newline="\n": the repository pins LF, and without it every run of the + # benchmark on Windows rewrites this file entirely as a line-ending diff. + out.write_text(json.dumps({"world": world.name, + "records": len(bench.truth), + "true_pairs": len(bench.true_pairs), + "arms": reports}, indent=2) + "\n", + encoding="utf-8", newline="\n") + print(f"\n written to {out}") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/data/synthetic/worlds/artists_v0/collisions.parquet b/data/synthetic/worlds/artists_v0/collisions.parquet new file mode 100644 index 0000000..b21c44e Binary files /dev/null and b/data/synthetic/worlds/artists_v0/collisions.parquet differ diff --git a/data/synthetic/worlds/artists_v0/differences.parquet b/data/synthetic/worlds/artists_v0/differences.parquet new file mode 100644 index 0000000..f597484 Binary files /dev/null and b/data/synthetic/worlds/artists_v0/differences.parquet differ diff --git a/data/synthetic/worlds/artists_v0/manifest.yaml b/data/synthetic/worlds/artists_v0/manifest.yaml new file mode 100644 index 0000000..5c591e7 --- /dev/null +++ b/data/synthetic/worlds/artists_v0/manifest.yaml @@ -0,0 +1,50 @@ +world_id: artists_v0 +world_pack: artists_v0 +seed: 42 +generator_version: 0.0.1 +schema_version: 0 +counts: + entities: + artist: 2941 + observations: 9944 + events: 0 + differences: 7656 + difference_kinds: + error: 818 + representation: 6838 +content_fingerprints: + observations: 84574e870ade449611667bca3f86449a3f48ee0984a51e2956419e15668c5126 + truth: b510c4245f164059dd3f21a8d6c2b04ec22cfec973e7b9331f575d0550fdf16e + differences: 53866b5e0ad865d6ce7a06466af78e1a97cdbf872d64230ab401496cc1eccade + collisions: 4ed00a689d9c755a42365cd53ad1f2871825fa20a2932d7a676c0199c2fb9033 +provenance: +- asset: artist alias groups (the truth) + source: Wikidata skos:altLabel for African musicians (CC0), via datasets/pull_wikidata.py + aliases + method: every alias group is a real artist; the generator chooses which alias each + source writes and what it does to it, never what the artist is called + class: public-data-derived + pool: 1,464 artists with 2+ names + limitation: 'Wikidata''s alias coverage is uneven: well-known artists carry legal + names and stage names, lesser-known ones a single spelling variant' +- asset: filler artists + source: Wikidata given+family pairs (CC0), via datasets/pull_wikidata.py names + method: one real name each, no aliases; only corruptions apply + class: public-data-derived + pool: 1,477 names +- asset: the variant list a matcher may be given + source: MusicBrainz alias sets (CC0), via datasets/artists_dataops/pull_musicbrainz.py + method: joined to the truth by Wikidata P434, never by name; a different editorial + community from the one that supplied the truth, so the two can disagree + class: public-data-derived + note: NOT used to build this world. It is the ablation's independent variable and + lives beside the world, not inside it +invariants: +- observations.parquet carries no truth column (enforced at write time) +- no observed value is an entity id (enforced at write time) +- record_id is a hash of (world_id, source, sequence) and holds no entity information +horizon: +- '2015-01-01' +- '2026-01-01' +spelling_boundary: 0.88 +collisions: 28 diff --git a/data/synthetic/worlds/artists_v0/observations.parquet b/data/synthetic/worlds/artists_v0/observations.parquet new file mode 100644 index 0000000..f751ec8 Binary files /dev/null and b/data/synthetic/worlds/artists_v0/observations.parquet differ diff --git a/data/synthetic/worlds/artists_v0/schema/collisions.json b/data/synthetic/worlds/artists_v0/schema/collisions.json new file mode 100644 index 0000000..b53e241 --- /dev/null +++ b/data/synthetic/worlds/artists_v0/schema/collisions.json @@ -0,0 +1,35 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://arche.dev/schemas/synthetic/collisions-v0.json", + "title": "collisions", + "type": "object", + "required": [ + "entity_a", + "entity_b", + "shared_name" + ], + "properties": { + "entity_a": { + "type": "string" + }, + "entity_b": { + "type": "string" + }, + "shared_name": { + "type": "string" + }, + "kind_a": { + "type": [ + "string", + "null" + ] + }, + "kind_b": { + "type": [ + "string", + "null" + ] + } + }, + "additionalProperties": false +} diff --git a/data/synthetic/worlds/artists_v0/schema/differences.json b/data/synthetic/worlds/artists_v0/schema/differences.json new file mode 100644 index 0000000..a583da2 --- /dev/null +++ b/data/synthetic/worlds/artists_v0/schema/differences.json @@ -0,0 +1,49 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://arche.dev/schemas/synthetic/differences-v0.json", + "title": "differences", + "type": "object", + "required": [ + "difference_id", + "observation_a", + "observation_b", + "attribute", + "difference_kind" + ], + "properties": { + "difference_id": { + "type": "string" + }, + "entity_id": { + "type": [ + "string", + "null" + ] + }, + "observation_a": { + "type": "string" + }, + "observation_b": { + "type": "string" + }, + "attribute": { + "type": "string" + }, + "difference_kind": { + "type": "string" + }, + "cause": { + "type": [ + "string", + "null" + ] + }, + "event_id": { + "type": [ + "string", + "null" + ] + } + }, + "additionalProperties": false +} diff --git a/data/synthetic/worlds/artists_v0/schema/observations.json b/data/synthetic/worlds/artists_v0/schema/observations.json new file mode 100644 index 0000000..6a33a1b --- /dev/null +++ b/data/synthetic/worlds/artists_v0/schema/observations.json @@ -0,0 +1,35 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://arche.dev/schemas/synthetic/observations-v0.json", + "title": "observations", + "type": "object", + "required": [ + "record_id", + "source", + "observed_at" + ], + "properties": { + "record_id": { + "type": "string" + }, + "source": { + "type": "string" + }, + "observed_at": { + "type": "string" + }, + "name": { + "type": [ + "string", + "null" + ] + }, + "country": { + "type": [ + "string", + "null" + ] + } + }, + "additionalProperties": false +} diff --git a/data/synthetic/worlds/artists_v0/schema/truth.json b/data/synthetic/worlds/artists_v0/schema/truth.json new file mode 100644 index 0000000..cb76b8e --- /dev/null +++ b/data/synthetic/worlds/artists_v0/schema/truth.json @@ -0,0 +1,37 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://arche.dev/schemas/synthetic/truth-v0.json", + "title": "truth", + "type": "object", + "required": [ + "record_id", + "truth_entity_id" + ], + "properties": { + "record_id": { + "type": "string" + }, + "truth_entity_id": { + "type": "string" + }, + "entity_type": { + "type": [ + "string", + "null" + ] + }, + "source": { + "type": [ + "string", + "null" + ] + }, + "state_index": { + "type": [ + "integer", + "null" + ] + } + }, + "additionalProperties": false +} diff --git a/data/synthetic/worlds/artists_v0/truth.parquet b/data/synthetic/worlds/artists_v0/truth.parquet new file mode 100644 index 0000000..d6d0e20 Binary files /dev/null and b/data/synthetic/worlds/artists_v0/truth.parquet differ diff --git a/data/synthetic/worlds/ng_supplier_v0/differences.parquet b/data/synthetic/worlds/ng_supplier_v0/differences.parquet new file mode 100644 index 0000000..2ebc97f Binary files /dev/null and b/data/synthetic/worlds/ng_supplier_v0/differences.parquet differ diff --git a/data/synthetic/worlds/ng_supplier_v0/events.parquet b/data/synthetic/worlds/ng_supplier_v0/events.parquet new file mode 100644 index 0000000..29eb613 Binary files /dev/null and b/data/synthetic/worlds/ng_supplier_v0/events.parquet differ diff --git a/data/synthetic/worlds/ng_supplier_v0/manifest.yaml b/data/synthetic/worlds/ng_supplier_v0/manifest.yaml new file mode 100644 index 0000000..c083cc5 --- /dev/null +++ b/data/synthetic/worlds/ng_supplier_v0/manifest.yaml @@ -0,0 +1,43 @@ +world_id: ng_supplier_v0 +world_pack: ng_supplier_v0 +seed: 42 +generator_version: 0.0.1 +schema_version: 0 +counts: + entities: + organisation: 2000 + person: 3000 + place: 1500 + observations: 6144 + events: 1435 + differences: 32596 + difference_kinds: + change: 1676 + error: 12713 + representation: 18207 +content_fingerprints: + observations: c1aab11eec979854653f2481fa48eb0e759c33f4269f5a5be46f694e69fe6af4 + truth: 193c35f994dbb1f473a8f7d55de94c3a39bafbb989844caadd54bba381b0327b + differences: 1b9c716d3e7ba2bcea67c7faf6d3bb8f936ede31861154f3adeb386c3fd8626d + events: 0ae1b0c65adce314989016af93b5ed113168dd3745b194e57349d92463d8f7fb +provenance: +- asset: given and family names + source: arche african_names_v1 lexicon (Wikidata/ParaNames, CC-BY-4.0) + method: seeded rank shuffle, Zipf weighting alpha=1.0 + class: synthetic-assumption + filtered: 973 lexicon entries excluded as not-names (Wikidata blank-node URLs, property + labels, titles); see world._NOT_A_NAME + note: the lexicon carries no frequency data; the distribution SHAPE is modelled + and the ranking is arbitrary. Collision rates are realistic; the specific common + names are not a claim about Nigeria. +- asset: RC numbers and TINs + source: arche.detect.ng.ids validators + method: generate-and-validate; every identifier passes at build time + class: public-data-derived +invariants: +- observations.parquet carries no truth column (enforced at write time) +- no observed value is an entity id (enforced at write time) +- record_id is a hash of (world_id, source, sequence) and holds no entity information +horizon: +- '2019-01-01' +- '2026-01-01' diff --git a/data/synthetic/worlds/ng_supplier_v0/observations.parquet b/data/synthetic/worlds/ng_supplier_v0/observations.parquet new file mode 100644 index 0000000..0c74c98 Binary files /dev/null and b/data/synthetic/worlds/ng_supplier_v0/observations.parquet differ diff --git a/data/synthetic/worlds/ng_supplier_v0/schema/differences.json b/data/synthetic/worlds/ng_supplier_v0/schema/differences.json new file mode 100644 index 0000000..a583da2 --- /dev/null +++ b/data/synthetic/worlds/ng_supplier_v0/schema/differences.json @@ -0,0 +1,49 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://arche.dev/schemas/synthetic/differences-v0.json", + "title": "differences", + "type": "object", + "required": [ + "difference_id", + "observation_a", + "observation_b", + "attribute", + "difference_kind" + ], + "properties": { + "difference_id": { + "type": "string" + }, + "entity_id": { + "type": [ + "string", + "null" + ] + }, + "observation_a": { + "type": "string" + }, + "observation_b": { + "type": "string" + }, + "attribute": { + "type": "string" + }, + "difference_kind": { + "type": "string" + }, + "cause": { + "type": [ + "string", + "null" + ] + }, + "event_id": { + "type": [ + "string", + "null" + ] + } + }, + "additionalProperties": false +} diff --git a/data/synthetic/worlds/ng_supplier_v0/schema/events.json b/data/synthetic/worlds/ng_supplier_v0/schema/events.json new file mode 100644 index 0000000..a5f9fdd --- /dev/null +++ b/data/synthetic/worlds/ng_supplier_v0/schema/events.json @@ -0,0 +1,45 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://arche.dev/schemas/synthetic/events-v0.json", + "title": "events", + "type": "object", + "required": [ + "event_id", + "entity_id", + "kind", + "event_at" + ], + "properties": { + "event_id": { + "type": "string" + }, + "entity_id": { + "type": "string" + }, + "kind": { + "type": "string" + }, + "event_at": { + "type": "string" + }, + "attribute": { + "type": [ + "string", + "null" + ] + }, + "old_value": { + "type": [ + "string", + "null" + ] + }, + "new_value": { + "type": [ + "string", + "null" + ] + } + }, + "additionalProperties": false +} diff --git a/data/synthetic/worlds/ng_supplier_v0/schema/observations.json b/data/synthetic/worlds/ng_supplier_v0/schema/observations.json new file mode 100644 index 0000000..35da803 --- /dev/null +++ b/data/synthetic/worlds/ng_supplier_v0/schema/observations.json @@ -0,0 +1,89 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://arche.dev/schemas/synthetic/observations-v0.json", + "title": "observations", + "type": "object", + "required": [ + "record_id", + "source", + "observed_at" + ], + "properties": { + "record_id": { + "type": "string" + }, + "source": { + "type": "string" + }, + "observed_at": { + "type": "string" + }, + "name": { + "type": [ + "string", + "null" + ] + }, + "rc_number": { + "type": [ + "string", + "null" + ] + }, + "tin": { + "type": [ + "string", + "null" + ] + }, + "phone": { + "type": [ + "string", + "null" + ] + }, + "email": { + "type": [ + "string", + "null" + ] + }, + "address": { + "type": [ + "string", + "null" + ] + }, + "city": { + "type": [ + "string", + "null" + ] + }, + "bank": { + "type": [ + "string", + "null" + ] + }, + "account_number": { + "type": [ + "string", + "null" + ] + }, + "director_name": { + "type": [ + "string", + "null" + ] + }, + "incorporated_on": { + "type": [ + "string", + "null" + ] + } + }, + "additionalProperties": false +} diff --git a/data/synthetic/worlds/ng_supplier_v0/schema/truth.json b/data/synthetic/worlds/ng_supplier_v0/schema/truth.json new file mode 100644 index 0000000..cb76b8e --- /dev/null +++ b/data/synthetic/worlds/ng_supplier_v0/schema/truth.json @@ -0,0 +1,37 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://arche.dev/schemas/synthetic/truth-v0.json", + "title": "truth", + "type": "object", + "required": [ + "record_id", + "truth_entity_id" + ], + "properties": { + "record_id": { + "type": "string" + }, + "truth_entity_id": { + "type": "string" + }, + "entity_type": { + "type": [ + "string", + "null" + ] + }, + "source": { + "type": [ + "string", + "null" + ] + }, + "state_index": { + "type": [ + "integer", + "null" + ] + } + }, + "additionalProperties": false +} diff --git a/data/synthetic/worlds/ng_supplier_v0/truth.parquet b/data/synthetic/worlds/ng_supplier_v0/truth.parquet new file mode 100644 index 0000000..a54bb51 Binary files /dev/null and b/data/synthetic/worlds/ng_supplier_v0/truth.parquet differ diff --git a/data/synthetic/worlds/ng_supplier_v0_s150/benchmark_result.json b/data/synthetic/worlds/ng_supplier_v0_s150/benchmark_result.json new file mode 100644 index 0000000..4b521a9 --- /dev/null +++ b/data/synthetic/worlds/ng_supplier_v0_s150/benchmark_result.json @@ -0,0 +1,774 @@ +{ + "world": "ng_supplier_v0_s150", + "records": 444, + "true_pairs": 545, + "arms": [ + { + "arm": "exact", + "seconds": 0.0, + "overall": { + "claimed_pairs": 254, + "true_pairs": 545, + "precision": 1.0, + "recall": 0.4661, + "f1": 0.6358, + "abstentions": 0, + "coverage": 0.4661 + }, + "bcubed": { + "precision": 1.0, + "recall": 0.6598, + "f1": 0.7951 + }, + "recall_by_stratum": { + "change": { + "true_pairs": 92, + "recall": 0.2609 + }, + "change/ACCOUNT_CHANGED": { + "true_pairs": 9, + "recall": 0.5556 + }, + "change/DIRECTOR_CHANGED": { + "true_pairs": 7, + "recall": 0.4286 + }, + "change/ORG_RELOCATED": { + "true_pairs": 55, + "recall": 0.0182 + }, + "change/ORG_RENAMED": { + "true_pairs": 31, + "recall": 0.4839 + }, + "error": { + "true_pairs": 389, + "recall": 0.329 + }, + "error/digit_mutation": { + "true_pairs": 54, + "recall": 0.3889 + }, + "error/ocr_confusion": { + "true_pairs": 204, + "recall": 0.2549 + }, + "error/truncation": { + "true_pairs": 174, + "recall": 0.2586 + }, + "error/typo": { + "true_pairs": 241, + "recall": 0.2905 + }, + "representation": { + "true_pairs": 480, + "recall": 0.4396 + }, + "representation/address_abbreviated": { + "true_pairs": 244, + "recall": 0.4836 + }, + "representation/ampersand": { + "true_pairs": 23, + "recall": 0.3043 + }, + "representation/case_upper": { + "true_pairs": 225, + "recall": 0.36 + }, + "representation/legal_suffix_abbreviated": { + "true_pairs": 256, + "recall": 0.4336 + }, + "representation/legal_suffix_dropped": { + "true_pairs": 64, + "recall": 0.4688 + } + }, + "entities": { + "clusters": 273, + "true_entities": 150, + "false_merge_clusters": 0, + "false_merge_rate": 0.0, + "false_split_entities": 84, + "false_split_rate": 0.56 + }, + "false_merges_by_what_was_shared": {}, + "blocking": { + "measured": true, + "source": "recomputed from the candidate pairs the arm reported", + "candidate_pairs": 254, + "recall": 0.4661, + "reduction_ratio": 0.997417, + "pairs_per_record": 0.572 + }, + "notes": { + "rule": "normalised name + city, exact", + "blocking_note": "candidates == claims; a join blocks by deciding", + "oversized_blocks": 0 + } + }, + { + "arm": "jaro_winkler", + "seconds": 0.01, + "overall": { + "claimed_pairs": 532, + "true_pairs": 545, + "precision": 0.8816, + "recall": 0.8606, + "f1": 0.8709, + "abstentions": 0, + "coverage": 0.8606 + }, + "bcubed": { + "precision": 0.9465, + "recall": 0.9206, + "f1": 0.9334 + }, + "recall_by_stratum": { + "change": { + "true_pairs": 92, + "recall": 0.837 + }, + "change/ACCOUNT_CHANGED": { + "true_pairs": 9, + "recall": 0.8889 + }, + "change/DIRECTOR_CHANGED": { + "true_pairs": 7, + "recall": 0.8571 + }, + "change/ORG_RELOCATED": { + "true_pairs": 55, + "recall": 0.8182 + }, + "change/ORG_RENAMED": { + "true_pairs": 31, + "recall": 0.871 + }, + "error": { + "true_pairs": 389, + "recall": 0.8046 + }, + "error/digit_mutation": { + "true_pairs": 54, + "recall": 0.8704 + }, + "error/ocr_confusion": { + "true_pairs": 204, + "recall": 0.7696 + }, + "error/truncation": { + "true_pairs": 174, + "recall": 0.7471 + }, + "error/typo": { + "true_pairs": 241, + "recall": 0.7344 + }, + "representation": { + "true_pairs": 480, + "recall": 0.8542 + }, + "representation/address_abbreviated": { + "true_pairs": 244, + "recall": 0.8648 + }, + "representation/ampersand": { + "true_pairs": 23, + "recall": 0.9565 + }, + "representation/case_upper": { + "true_pairs": 225, + "recall": 0.8578 + }, + "representation/legal_suffix_abbreviated": { + "true_pairs": 256, + "recall": 0.8477 + }, + "representation/legal_suffix_dropped": { + "true_pairs": 64, + "recall": 0.8438 + } + }, + "entities": { + "clusters": 165, + "true_entities": 150, + "false_merge_clusters": 7, + "false_merge_rate": 0.0424, + "false_split_entities": 23, + "false_split_rate": 0.1533 + }, + "false_merges_by_what_was_shared": { + "surname_head": 59, + "whole_name": 12, + "nothing_obvious": 4 + }, + "blocking": { + "measured": true, + "source": "recomputed from the candidate pairs the arm reported", + "candidate_pairs": 1792, + "recall": 0.9468, + "reduction_ratio": 0.981779, + "pairs_per_record": 4.036 + }, + "notes": { + "threshold": 0.92, + "block": "first 3 chars of normalised name", + "oversized_blocks": 0 + } + }, + { + "arm": "splink", + "seconds": 7.54, + "overall": { + "claimed_pairs": 432, + "true_pairs": 545, + "precision": 0.9884, + "recall": 0.7835, + "f1": 0.8741, + "abstentions": 0, + "coverage": 0.7835 + }, + "bcubed": { + "precision": 0.9807, + "recall": 0.9344, + "f1": 0.957 + }, + "recall_by_stratum": { + "change": { + "true_pairs": 92, + "recall": 0.5326 + }, + "change/ACCOUNT_CHANGED": { + "true_pairs": 9, + "recall": 0.7778 + }, + "change/DIRECTOR_CHANGED": { + "true_pairs": 7, + "recall": 1.0 + }, + "change/ORG_RELOCATED": { + "true_pairs": 55, + "recall": 0.3091 + }, + "change/ORG_RENAMED": { + "true_pairs": 31, + "recall": 0.7419 + }, + "error": { + "true_pairs": 389, + "recall": 0.7609 + }, + "error/digit_mutation": { + "true_pairs": 54, + "recall": 0.6667 + }, + "error/ocr_confusion": { + "true_pairs": 204, + "recall": 0.7402 + }, + "error/truncation": { + "true_pairs": 174, + "recall": 0.6782 + }, + "error/typo": { + "true_pairs": 241, + "recall": 0.7635 + }, + "representation": { + "true_pairs": 480, + "recall": 0.7917 + }, + "representation/address_abbreviated": { + "true_pairs": 244, + "recall": 0.8279 + }, + "representation/ampersand": { + "true_pairs": 23, + "recall": 0.7826 + }, + "representation/case_upper": { + "true_pairs": 225, + "recall": 0.7422 + }, + "representation/legal_suffix_abbreviated": { + "true_pairs": 256, + "recall": 0.793 + }, + "representation/legal_suffix_dropped": { + "true_pairs": 64, + "recall": 0.7656 + } + }, + "entities": { + "clusters": 166, + "true_entities": 150, + "false_merge_clusters": 4, + "false_merge_rate": 0.0241, + "false_split_entities": 19, + "false_split_rate": 0.1267 + }, + "false_merges_by_what_was_shared": { + "city": 4, + "address": 2, + "surname_head": 2, + "nothing_obvious": 1 + }, + "blocking": { + "measured": true, + "source": "recomputed from the candidate pairs the arm reported", + "candidate_pairs": 1432, + "recall": 0.9743, + "reduction_ratio": 0.985439, + "pairs_per_record": 3.225 + }, + "notes": { + "threshold": 0.5, + "seed": 42, + "scored_pairs": 1432, + "claims_at_threshold": { + "0.5": 432, + "0.9": 251, + "0.95": 139, + "0.99": 124 + }, + "note": "candidates are the pairs Splink scored above 0.01, so blocking recall is a lower bound on what its blocking rules retrieved" + } + }, + { + "arm": "arche/pack", + "seconds": 343.39, + "overall": { + "claimed_pairs": 408, + "true_pairs": 545, + "precision": 0.9951, + "recall": 0.745, + "f1": 0.852, + "abstentions": 704, + "coverage": 0.9688 + }, + "bcubed": { + "precision": 0.994, + "recall": 0.8698, + "f1": 0.9278 + }, + "recall_by_stratum": { + "change": { + "true_pairs": 92, + "recall": 0.3913 + }, + "change/ACCOUNT_CHANGED": { + "true_pairs": 9, + "recall": 0.8889 + }, + "change/DIRECTOR_CHANGED": { + "true_pairs": 7, + "recall": 0.4286 + }, + "change/ORG_RELOCATED": { + "true_pairs": 55, + "recall": 0.1455 + }, + "change/ORG_RENAMED": { + "true_pairs": 31, + "recall": 0.5484 + }, + "error": { + "true_pairs": 389, + "recall": 0.6632 + }, + "error/digit_mutation": { + "true_pairs": 54, + "recall": 0.4074 + }, + "error/ocr_confusion": { + "true_pairs": 204, + "recall": 0.6324 + }, + "error/truncation": { + "true_pairs": 174, + "recall": 0.592 + }, + "error/typo": { + "true_pairs": 241, + "recall": 0.6432 + }, + "representation": { + "true_pairs": 480, + "recall": 0.725 + }, + "representation/address_abbreviated": { + "true_pairs": 244, + "recall": 0.7418 + }, + "representation/ampersand": { + "true_pairs": 23, + "recall": 0.7826 + }, + "representation/case_upper": { + "true_pairs": 225, + "recall": 0.7022 + }, + "representation/legal_suffix_abbreviated": { + "true_pairs": 256, + "recall": 0.7227 + }, + "representation/legal_suffix_dropped": { + "true_pairs": 64, + "recall": 0.7344 + } + }, + "entities": { + "clusters": 195, + "true_entities": 150, + "false_merge_clusters": 1, + "false_merge_rate": 0.0051, + "false_split_entities": 40, + "false_split_rate": 0.2667 + }, + "false_merges_by_what_was_shared": { + "surname_head": 2, + "whole_name": 1 + }, + "blocking": { + "measured": true, + "source": "reported by the arm, not recomputed", + "recall": 0.9798, + "candidate_pairs": 32210, + "reduction_ratio": 0.672483 + }, + "notes": { + "engine": "crosswalk.v1", + "candidate_pairs": 32210, + "blocking_recall_reported_by_arche": 0.9798 + } + }, + { + "arm": "arche/custom", + "seconds": 260.36, + "overall": { + "claimed_pairs": 378, + "true_pairs": 545, + "precision": 1.0, + "recall": 0.6936, + "f1": 0.8191, + "abstentions": 385, + "coverage": 0.9211 + }, + "bcubed": { + "precision": 1.0, + "recall": 0.8752, + "f1": 0.9335 + }, + "recall_by_stratum": { + "change": { + "true_pairs": 92, + "recall": 0.3696 + }, + "change/ACCOUNT_CHANGED": { + "true_pairs": 9, + "recall": 0.3333 + }, + "change/DIRECTOR_CHANGED": { + "true_pairs": 7, + "recall": 0.4286 + }, + "change/ORG_RELOCATED": { + "true_pairs": 55, + "recall": 0.1636 + }, + "change/ORG_RENAMED": { + "true_pairs": 31, + "recall": 0.6774 + }, + "error": { + "true_pairs": 389, + "recall": 0.5913 + }, + "error/digit_mutation": { + "true_pairs": 54, + "recall": 0.1852 + }, + "error/ocr_confusion": { + "true_pairs": 204, + "recall": 0.5147 + }, + "error/truncation": { + "true_pairs": 174, + "recall": 0.5115 + }, + "error/typo": { + "true_pairs": 241, + "recall": 0.5477 + }, + "representation": { + "true_pairs": 480, + "recall": 0.6687 + }, + "representation/address_abbreviated": { + "true_pairs": 244, + "recall": 0.6721 + }, + "representation/ampersand": { + "true_pairs": 23, + "recall": 0.5652 + }, + "representation/case_upper": { + "true_pairs": 225, + "recall": 0.6356 + }, + "representation/legal_suffix_abbreviated": { + "true_pairs": 256, + "recall": 0.6641 + }, + "representation/legal_suffix_dropped": { + "true_pairs": 64, + "recall": 0.6406 + } + }, + "entities": { + "clusters": 194, + "true_entities": 150, + "false_merge_clusters": 0, + "false_merge_rate": 0.0, + "false_split_entities": 40, + "false_split_rate": 0.2667 + }, + "false_merges_by_what_was_shared": {}, + "blocking": { + "measured": true, + "source": "reported by the arm, not recomputed", + "recall": 0.9853, + "candidate_pairs": 33964, + "reduction_ratio": 0.654648 + }, + "notes": { + "engine": "crosswalk.v1", + "candidate_pairs": 33964, + "blocking_recall_reported_by_arche": 0.9853 + } + }, + { + "arm": "arche/ledger", + "seconds": 547.12, + "overall": { + "claimed_pairs": 424, + "true_pairs": 545, + "precision": 1.0, + "recall": 0.778, + "f1": 0.8751, + "abstentions": 0, + "coverage": 0.778 + }, + "bcubed": { + "precision": 1.0, + "recall": 0.9414, + "f1": 0.9698 + }, + "recall_by_stratum": { + "change": { + "true_pairs": 92, + "recall": 0.5217 + }, + "change/ACCOUNT_CHANGED": { + "true_pairs": 9, + "recall": 0.8889 + }, + "change/DIRECTOR_CHANGED": { + "true_pairs": 7, + "recall": 0.5714 + }, + "change/ORG_RELOCATED": { + "true_pairs": 55, + "recall": 0.3091 + }, + "change/ORG_RENAMED": { + "true_pairs": 31, + "recall": 0.6129 + }, + "error": { + "true_pairs": 389, + "recall": 0.7172 + }, + "error/digit_mutation": { + "true_pairs": 54, + "recall": 0.5556 + }, + "error/ocr_confusion": { + "true_pairs": 204, + "recall": 0.7206 + }, + "error/truncation": { + "true_pairs": 174, + "recall": 0.6782 + }, + "error/typo": { + "true_pairs": 241, + "recall": 0.6846 + }, + "representation": { + "true_pairs": 480, + "recall": 0.7729 + }, + "representation/address_abbreviated": { + "true_pairs": 244, + "recall": 0.8033 + }, + "representation/ampersand": { + "true_pairs": 23, + "recall": 0.8696 + }, + "representation/case_upper": { + "true_pairs": 225, + "recall": 0.7644 + }, + "representation/legal_suffix_abbreviated": { + "true_pairs": 256, + "recall": 0.7578 + }, + "representation/legal_suffix_dropped": { + "true_pairs": 64, + "recall": 0.7812 + } + }, + "entities": { + "clusters": 115, + "true_entities": 150, + "false_merge_clusters": 0, + "false_merge_rate": 0.0, + "false_split_entities": 1, + "false_split_rate": 0.0067 + }, + "false_merges_by_what_was_shared": {}, + "blocking": { + "measured": false, + "why": "the arm does not enumerate its candidate pairs" + }, + "notes": { + "ingested_in": "observed_at order", + "records": 444, + "open_cases_after_ingest": 642, + "clusters": 115, + "transitive_clusters": 30 + } + }, + { + "arm": "arche/ledger+observe", + "seconds": 436.72, + "overall": { + "claimed_pairs": 460, + "true_pairs": 545, + "precision": 0.9435, + "recall": 0.7963, + "f1": 0.8637, + "abstentions": 0, + "coverage": 0.7963 + }, + "bcubed": { + "precision": 1.0, + "recall": 1.0177, + "f1": 1.0088 + }, + "recall_by_stratum": { + "change": { + "true_pairs": 92, + "recall": 0.5761 + }, + "change/ACCOUNT_CHANGED": { + "true_pairs": 9, + "recall": 0.8889 + }, + "change/DIRECTOR_CHANGED": { + "true_pairs": 7, + "recall": 0.7143 + }, + "change/ORG_RELOCATED": { + "true_pairs": 55, + "recall": 0.4 + }, + "change/ORG_RENAMED": { + "true_pairs": 31, + "recall": 0.6452 + }, + "error": { + "true_pairs": 389, + "recall": 0.7378 + }, + "error/digit_mutation": { + "true_pairs": 54, + "recall": 0.5926 + }, + "error/ocr_confusion": { + "true_pairs": 204, + "recall": 0.7353 + }, + "error/truncation": { + "true_pairs": 174, + "recall": 0.6897 + }, + "error/typo": { + "true_pairs": 241, + "recall": 0.7137 + }, + "representation": { + "true_pairs": 480, + "recall": 0.7917 + }, + "representation/address_abbreviated": { + "true_pairs": 244, + "recall": 0.8156 + }, + "representation/ampersand": { + "true_pairs": 23, + "recall": 0.8696 + }, + "representation/case_upper": { + "true_pairs": 225, + "recall": 0.7822 + }, + "representation/legal_suffix_abbreviated": { + "true_pairs": 256, + "recall": 0.7891 + }, + "representation/legal_suffix_dropped": { + "true_pairs": 64, + "recall": 0.7812 + } + }, + "entities": { + "clusters": 117, + "true_entities": 150, + "false_merge_clusters": 0, + "false_merge_rate": 0.0, + "false_split_entities": 1, + "false_split_rate": 0.0067 + }, + "false_merges_by_what_was_shared": { + "surname_head": 26, + "whole_name": 26, + "rc_number": 26, + "bank": 25, + "city": 24, + "phone": 24, + "address": 23 + }, + "blocking": { + "measured": false, + "why": "the arm does not enumerate its candidate pairs" + }, + "notes": { + "ingested_in": "observed_at order", + "records": 444, + "open_cases_after_ingest": 642, + "cases_with_a_registry_lookup": 473, + "records_updated_by_observe": 129, + "open_cases_after_observe": 602, + "assisted": "addresses were re-fetched from the registry record sharing each record's RC number; an identifier in the data, not the answer key, but an assist", + "clusters": 117, + "transitive_clusters": 44 + } + } + ] +} diff --git a/data/synthetic/worlds/ng_supplier_v0_s150/differences.parquet b/data/synthetic/worlds/ng_supplier_v0_s150/differences.parquet new file mode 100644 index 0000000..f80af04 Binary files /dev/null and b/data/synthetic/worlds/ng_supplier_v0_s150/differences.parquet differ diff --git a/data/synthetic/worlds/ng_supplier_v0_s150/events.parquet b/data/synthetic/worlds/ng_supplier_v0_s150/events.parquet new file mode 100644 index 0000000..e9c05cf Binary files /dev/null and b/data/synthetic/worlds/ng_supplier_v0_s150/events.parquet differ diff --git a/data/synthetic/worlds/ng_supplier_v0_s150/manifest.yaml b/data/synthetic/worlds/ng_supplier_v0_s150/manifest.yaml new file mode 100644 index 0000000..68e6111 --- /dev/null +++ b/data/synthetic/worlds/ng_supplier_v0_s150/manifest.yaml @@ -0,0 +1,43 @@ +world_id: ng_supplier_v0 +world_pack: ng_supplier_v0 +seed: 42 +generator_version: 0.0.1 +schema_version: 0 +counts: + entities: + organisation: 150 + person: 225 + place: 112 + observations: 444 + events: 118 + differences: 2283 + difference_kinds: + change: 143 + error: 859 + representation: 1281 +content_fingerprints: + observations: 943e92d1f8b3835cfdc9034b812248cfd277802748bdd8f682d9bd40ca41870f + truth: 79207ca0c8c78360096c17708674a1709abb9316bb387d05d79367abb93bf14f + differences: 02931ec67aff7503f3a47c1f2b83ba606e3ff08532ab3ec80b02b3c4d89bc1f0 + events: fa7f4e5baac627ce051d465454f5610b3a84f9ff3c7762fbb9c88cc0e9467bdc +provenance: +- asset: given and family names + source: arche african_names_v1 lexicon (Wikidata/ParaNames, CC-BY-4.0) + method: seeded rank shuffle, Zipf weighting alpha=1.0 + class: synthetic-assumption + filtered: 973 lexicon entries excluded as not-names (Wikidata blank-node URLs, property + labels, titles); see world._NOT_A_NAME + note: the lexicon carries no frequency data; the distribution SHAPE is modelled + and the ranking is arbitrary. Collision rates are realistic; the specific common + names are not a claim about Nigeria. +- asset: RC numbers and TINs + source: arche.detect.ng.ids validators + method: generate-and-validate; every identifier passes at build time + class: public-data-derived +invariants: +- observations.parquet carries no truth column (enforced at write time) +- no observed value is an entity id (enforced at write time) +- record_id is a hash of (world_id, source, sequence) and holds no entity information +horizon: +- '2019-01-01' +- '2026-01-01' diff --git a/data/synthetic/worlds/ng_supplier_v0_s150/observations.parquet b/data/synthetic/worlds/ng_supplier_v0_s150/observations.parquet new file mode 100644 index 0000000..b99c7cd Binary files /dev/null and b/data/synthetic/worlds/ng_supplier_v0_s150/observations.parquet differ diff --git a/data/synthetic/worlds/ng_supplier_v0_s150/schema/differences.json b/data/synthetic/worlds/ng_supplier_v0_s150/schema/differences.json new file mode 100644 index 0000000..a583da2 --- /dev/null +++ b/data/synthetic/worlds/ng_supplier_v0_s150/schema/differences.json @@ -0,0 +1,49 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://arche.dev/schemas/synthetic/differences-v0.json", + "title": "differences", + "type": "object", + "required": [ + "difference_id", + "observation_a", + "observation_b", + "attribute", + "difference_kind" + ], + "properties": { + "difference_id": { + "type": "string" + }, + "entity_id": { + "type": [ + "string", + "null" + ] + }, + "observation_a": { + "type": "string" + }, + "observation_b": { + "type": "string" + }, + "attribute": { + "type": "string" + }, + "difference_kind": { + "type": "string" + }, + "cause": { + "type": [ + "string", + "null" + ] + }, + "event_id": { + "type": [ + "string", + "null" + ] + } + }, + "additionalProperties": false +} diff --git a/data/synthetic/worlds/ng_supplier_v0_s150/schema/events.json b/data/synthetic/worlds/ng_supplier_v0_s150/schema/events.json new file mode 100644 index 0000000..a5f9fdd --- /dev/null +++ b/data/synthetic/worlds/ng_supplier_v0_s150/schema/events.json @@ -0,0 +1,45 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://arche.dev/schemas/synthetic/events-v0.json", + "title": "events", + "type": "object", + "required": [ + "event_id", + "entity_id", + "kind", + "event_at" + ], + "properties": { + "event_id": { + "type": "string" + }, + "entity_id": { + "type": "string" + }, + "kind": { + "type": "string" + }, + "event_at": { + "type": "string" + }, + "attribute": { + "type": [ + "string", + "null" + ] + }, + "old_value": { + "type": [ + "string", + "null" + ] + }, + "new_value": { + "type": [ + "string", + "null" + ] + } + }, + "additionalProperties": false +} diff --git a/data/synthetic/worlds/ng_supplier_v0_s150/schema/observations.json b/data/synthetic/worlds/ng_supplier_v0_s150/schema/observations.json new file mode 100644 index 0000000..35da803 --- /dev/null +++ b/data/synthetic/worlds/ng_supplier_v0_s150/schema/observations.json @@ -0,0 +1,89 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://arche.dev/schemas/synthetic/observations-v0.json", + "title": "observations", + "type": "object", + "required": [ + "record_id", + "source", + "observed_at" + ], + "properties": { + "record_id": { + "type": "string" + }, + "source": { + "type": "string" + }, + "observed_at": { + "type": "string" + }, + "name": { + "type": [ + "string", + "null" + ] + }, + "rc_number": { + "type": [ + "string", + "null" + ] + }, + "tin": { + "type": [ + "string", + "null" + ] + }, + "phone": { + "type": [ + "string", + "null" + ] + }, + "email": { + "type": [ + "string", + "null" + ] + }, + "address": { + "type": [ + "string", + "null" + ] + }, + "city": { + "type": [ + "string", + "null" + ] + }, + "bank": { + "type": [ + "string", + "null" + ] + }, + "account_number": { + "type": [ + "string", + "null" + ] + }, + "director_name": { + "type": [ + "string", + "null" + ] + }, + "incorporated_on": { + "type": [ + "string", + "null" + ] + } + }, + "additionalProperties": false +} diff --git a/data/synthetic/worlds/ng_supplier_v0_s150/schema/truth.json b/data/synthetic/worlds/ng_supplier_v0_s150/schema/truth.json new file mode 100644 index 0000000..cb76b8e --- /dev/null +++ b/data/synthetic/worlds/ng_supplier_v0_s150/schema/truth.json @@ -0,0 +1,37 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://arche.dev/schemas/synthetic/truth-v0.json", + "title": "truth", + "type": "object", + "required": [ + "record_id", + "truth_entity_id" + ], + "properties": { + "record_id": { + "type": "string" + }, + "truth_entity_id": { + "type": "string" + }, + "entity_type": { + "type": [ + "string", + "null" + ] + }, + "source": { + "type": [ + "string", + "null" + ] + }, + "state_index": { + "type": [ + "integer", + "null" + ] + } + }, + "additionalProperties": false +} diff --git a/data/synthetic/worlds/ng_supplier_v0_s150/truth.parquet b/data/synthetic/worlds/ng_supplier_v0_s150/truth.parquet new file mode 100644 index 0000000..4bb162b Binary files /dev/null and b/data/synthetic/worlds/ng_supplier_v0_s150/truth.parquet differ diff --git a/data/synthetic/worlds/ng_supplier_v0_s400/benchmark_result.json b/data/synthetic/worlds/ng_supplier_v0_s400/benchmark_result.json new file mode 100644 index 0000000..94814f1 --- /dev/null +++ b/data/synthetic/worlds/ng_supplier_v0_s400/benchmark_result.json @@ -0,0 +1,470 @@ +{ + "world": "ng_supplier_v0_s400", + "records": 1198, + "true_pairs": 1485, + "arms": [ + { + "arm": "exact", + "seconds": 0.0, + "overall": { + "claimed_pairs": 718, + "true_pairs": 1485, + "precision": 0.8579, + "recall": 0.4148, + "f1": 0.5592, + "abstentions": 0, + "coverage": 0.4148 + }, + "bcubed": { + "precision": 0.9685, + "recall": 0.6207, + "f1": 0.7566 + }, + "recall_by_stratum": { + "change": { + "true_pairs": 249, + "recall": 0.261 + }, + "change/ACCOUNT_CHANGED": { + "true_pairs": 35, + "recall": 0.2571 + }, + "change/DIRECTOR_CHANGED": { + "true_pairs": 19, + "recall": 0.6842 + }, + "change/ORG_RELOCATED": { + "true_pairs": 125, + "recall": 0.072 + }, + "change/ORG_RENAMED": { + "true_pairs": 94, + "recall": 0.3723 + }, + "error": { + "true_pairs": 1110, + "recall": 0.2874 + }, + "error/digit_mutation": { + "true_pairs": 137, + "recall": 0.4161 + }, + "error/ocr_confusion": { + "true_pairs": 579, + "recall": 0.2245 + }, + "error/truncation": { + "true_pairs": 468, + "recall": 0.2244 + }, + "error/typo": { + "true_pairs": 625, + "recall": 0.248 + }, + "representation": { + "true_pairs": 1316, + "recall": 0.3959 + }, + "representation/address_abbreviated": { + "true_pairs": 651, + "recall": 0.3825 + }, + "representation/ampersand": { + "true_pairs": 49, + "recall": 0.2449 + }, + "representation/case_upper": { + "true_pairs": 693, + "recall": 0.3579 + }, + "representation/diacritic_loss": { + "true_pairs": 4, + "recall": 0.0 + }, + "representation/legal_suffix_abbreviated": { + "true_pairs": 584, + "recall": 0.4058 + }, + "representation/legal_suffix_dropped": { + "true_pairs": 187, + "recall": 0.3636 + } + }, + "entities": { + "clusters": 753, + "true_entities": 400, + "false_merge_clusters": 19, + "false_merge_rate": 0.0252, + "false_split_entities": 255, + "false_split_rate": 0.6375 + }, + "false_merges_by_what_was_shared": { + "surname_head": 102, + "city": 73, + "address": 5, + "whole_name": 3, + "bank": 3 + }, + "blocking": { + "measured": true, + "source": "recomputed from the candidate pairs the arm reported", + "candidate_pairs": 718, + "recall": 0.4148, + "reduction_ratio": 0.998999, + "pairs_per_record": 0.599 + }, + "notes": { + "rule": "normalised name + city, exact", + "oversized_blocks": 0 + } + }, + { + "arm": "jaro_winkler", + "seconds": 0.06, + "overall": { + "claimed_pairs": 3161, + "true_pairs": 1485, + "precision": 0.4277, + "recall": 0.9104, + "f1": 0.582, + "abstentions": 0, + "coverage": 0.9104 + }, + "bcubed": { + "precision": 0.8028, + "recall": 0.9536, + "f1": 0.8717 + }, + "recall_by_stratum": { + "change": { + "true_pairs": 249, + "recall": 0.9237 + }, + "change/ACCOUNT_CHANGED": { + "true_pairs": 35, + "recall": 0.8857 + }, + "change/DIRECTOR_CHANGED": { + "true_pairs": 19, + "recall": 0.9474 + }, + "change/ORG_RELOCATED": { + "true_pairs": 125, + "recall": 0.928 + }, + "change/ORG_RENAMED": { + "true_pairs": 94, + "recall": 0.9255 + }, + "error": { + "true_pairs": 1110, + "recall": 0.8802 + }, + "error/digit_mutation": { + "true_pairs": 137, + "recall": 0.8978 + }, + "error/ocr_confusion": { + "true_pairs": 579, + "recall": 0.8428 + }, + "error/truncation": { + "true_pairs": 468, + "recall": 0.8697 + }, + "error/typo": { + "true_pairs": 625, + "recall": 0.8752 + }, + "representation": { + "true_pairs": 1316, + "recall": 0.9027 + }, + "representation/address_abbreviated": { + "true_pairs": 651, + "recall": 0.9171 + }, + "representation/ampersand": { + "true_pairs": 49, + "recall": 0.9796 + }, + "representation/case_upper": { + "true_pairs": 693, + "recall": 0.9019 + }, + "representation/diacritic_loss": { + "true_pairs": 4, + "recall": 0.0 + }, + "representation/legal_suffix_abbreviated": { + "true_pairs": 584, + "recall": 0.8904 + }, + "representation/legal_suffix_dropped": { + "true_pairs": 187, + "recall": 0.8877 + } + }, + "entities": { + "clusters": 361, + "true_entities": 400, + "false_merge_clusters": 32, + "false_merge_rate": 0.0886, + "false_split_entities": 36, + "false_split_rate": 0.09 + }, + "false_merges_by_what_was_shared": { + "surname_head": 1736, + "city": 136, + "whole_name": 74, + "nothing_obvious": 69, + "bank": 25, + "address": 7 + }, + "blocking": { + "measured": true, + "source": "recomputed from the candidate pairs the arm reported", + "candidate_pairs": 24887, + "recall": 0.9684, + "reduction_ratio": 0.96529, + "pairs_per_record": 20.774 + }, + "notes": { + "threshold": 0.92, + "block": "first 3 chars of normalised name", + "oversized_blocks": 0 + } + }, + { + "arm": "arche/pack", + "seconds": 720.97, + "overall": { + "claimed_pairs": 1258, + "true_pairs": 1485, + "precision": 0.8831, + "recall": 0.7481, + "f1": 0.8101, + "abstentions": 4441, + "coverage": 0.9778 + }, + "bcubed": { + "precision": 0.8881, + "recall": 0.8849, + "f1": 0.8865 + }, + "recall_by_stratum": { + "change": { + "true_pairs": 249, + "recall": 0.4056 + }, + "change/ACCOUNT_CHANGED": { + "true_pairs": 35, + "recall": 0.6 + }, + "change/DIRECTOR_CHANGED": { + "true_pairs": 19, + "recall": 0.6316 + }, + "change/ORG_RELOCATED": { + "true_pairs": 125, + "recall": 0.088 + }, + "change/ORG_RENAMED": { + "true_pairs": 94, + "recall": 0.6489 + }, + "error": { + "true_pairs": 1110, + "recall": 0.682 + }, + "error/digit_mutation": { + "true_pairs": 137, + "recall": 0.3431 + }, + "error/ocr_confusion": { + "true_pairs": 579, + "recall": 0.6701 + }, + "error/truncation": { + "true_pairs": 468, + "recall": 0.6346 + }, + "error/typo": { + "true_pairs": 625, + "recall": 0.6768 + }, + "representation": { + "true_pairs": 1316, + "recall": 0.7386 + }, + "representation/address_abbreviated": { + "true_pairs": 651, + "recall": 0.7097 + }, + "representation/ampersand": { + "true_pairs": 49, + "recall": 0.6122 + }, + "representation/case_upper": { + "true_pairs": 693, + "recall": 0.7287 + }, + "representation/diacritic_loss": { + "true_pairs": 4, + "recall": 0.5 + }, + "representation/legal_suffix_abbreviated": { + "true_pairs": 584, + "recall": 0.7449 + }, + "representation/legal_suffix_dropped": { + "true_pairs": 187, + "recall": 0.7005 + } + }, + "entities": { + "clusters": 463, + "true_entities": 400, + "false_merge_clusters": 15, + "false_merge_rate": 0.0324, + "false_split_entities": 98, + "false_split_rate": 0.245 + }, + "false_merges_by_what_was_shared": { + "surname_head": 143, + "city": 8, + "address": 6, + "whole_name": 6, + "bank": 2, + "nothing_obvious": 2 + }, + "blocking": { + "measured": true, + "source": "reported by the arm, not recomputed", + "recall": 0.9953, + "candidate_pairs": 106884, + "reduction_ratio": 0.850929 + }, + "notes": { + "engine": "crosswalk.v1", + "candidate_pairs": 106884, + "blocking_recall_reported_by_arche": 0.9953 + } + }, + { + "arm": "arche/custom", + "seconds": 652.39, + "overall": { + "claimed_pairs": 1073, + "true_pairs": 1485, + "precision": 0.9478, + "recall": 0.6848, + "f1": 0.7952, + "abstentions": 2169, + "coverage": 0.936 + }, + "bcubed": { + "precision": 0.9047, + "recall": 0.8888, + "f1": 0.8967 + }, + "recall_by_stratum": { + "change": { + "true_pairs": 249, + "recall": 0.3414 + }, + "change/ACCOUNT_CHANGED": { + "true_pairs": 35, + "recall": 0.2286 + }, + "change/DIRECTOR_CHANGED": { + "true_pairs": 19, + "recall": 0.6316 + }, + "change/ORG_RELOCATED": { + "true_pairs": 125, + "recall": 0.072 + }, + "change/ORG_RENAMED": { + "true_pairs": 94, + "recall": 0.6064 + }, + "error": { + "true_pairs": 1110, + "recall": 0.5973 + }, + "error/digit_mutation": { + "true_pairs": 137, + "recall": 0.1606 + }, + "error/ocr_confusion": { + "true_pairs": 579, + "recall": 0.5406 + }, + "error/truncation": { + "true_pairs": 468, + "recall": 0.5406 + }, + "error/typo": { + "true_pairs": 625, + "recall": 0.5776 + }, + "representation": { + "true_pairs": 1316, + "recall": 0.6733 + }, + "representation/address_abbreviated": { + "true_pairs": 651, + "recall": 0.6421 + }, + "representation/ampersand": { + "true_pairs": 49, + "recall": 0.6531 + }, + "representation/case_upper": { + "true_pairs": 693, + "recall": 0.6436 + }, + "representation/diacritic_loss": { + "true_pairs": 4, + "recall": 0.25 + }, + "representation/legal_suffix_abbreviated": { + "true_pairs": 584, + "recall": 0.6558 + }, + "representation/legal_suffix_dropped": { + "true_pairs": 187, + "recall": 0.6096 + } + }, + "entities": { + "clusters": 465, + "true_entities": 400, + "false_merge_clusters": 13, + "false_merge_rate": 0.028, + "false_split_entities": 94, + "false_split_rate": 0.235 + }, + "false_merges_by_what_was_shared": { + "surname_head": 54, + "city": 5, + "address": 4, + "whole_name": 2, + "nothing_obvious": 1 + }, + "blocking": { + "measured": true, + "source": "reported by the arm, not recomputed", + "recall": 0.9973, + "candidate_pairs": 120506, + "reduction_ratio": 0.831931 + }, + "notes": { + "engine": "crosswalk.v1", + "candidate_pairs": 120506, + "blocking_recall_reported_by_arche": 0.9973 + } + } + ] +} diff --git a/data/synthetic/worlds/ng_supplier_v0_s400/differences.parquet b/data/synthetic/worlds/ng_supplier_v0_s400/differences.parquet new file mode 100644 index 0000000..f08069c Binary files /dev/null and b/data/synthetic/worlds/ng_supplier_v0_s400/differences.parquet differ diff --git a/data/synthetic/worlds/ng_supplier_v0_s400/events.parquet b/data/synthetic/worlds/ng_supplier_v0_s400/events.parquet new file mode 100644 index 0000000..057be7e Binary files /dev/null and b/data/synthetic/worlds/ng_supplier_v0_s400/events.parquet differ diff --git a/data/synthetic/worlds/ng_supplier_v0_s400/manifest.yaml b/data/synthetic/worlds/ng_supplier_v0_s400/manifest.yaml new file mode 100644 index 0000000..9ebf59c --- /dev/null +++ b/data/synthetic/worlds/ng_supplier_v0_s400/manifest.yaml @@ -0,0 +1,43 @@ +world_id: ng_supplier_v0 +world_pack: ng_supplier_v0 +seed: 42 +generator_version: 0.0.1 +schema_version: 0 +counts: + entities: + organisation: 400 + person: 600 + place: 300 + observations: 1215 + events: 300 + differences: 6192 + difference_kinds: + change: 359 + error: 2377 + representation: 3456 +content_fingerprints: + observations: f708e4843d6405f027fb044315db067e6372e5728bf2aefdd8a67ec67882e1e9 + truth: 80ff9013dc761db4ea798bd698d00619c551e9cfeb6d3070f17fd7ebdda02a05 + differences: 4a47c6d72551d39a773db92886f50b07b1172dfa3559ca4c64efb2b533dd24f3 + events: 4ddade945f87c7730ecfbc222753cc70cc312e1b86eb537f02a30254a8b94b99 +provenance: +- asset: given and family names + source: arche african_names_v1 lexicon (Wikidata/ParaNames, CC-BY-4.0) + method: seeded rank shuffle, Zipf weighting alpha=1.0 + class: synthetic-assumption + filtered: 973 lexicon entries excluded as not-names (Wikidata blank-node URLs, property + labels, titles); see world._NOT_A_NAME + note: the lexicon carries no frequency data; the distribution SHAPE is modelled + and the ranking is arbitrary. Collision rates are realistic; the specific common + names are not a claim about Nigeria. +- asset: RC numbers and TINs + source: arche.detect.ng.ids validators + method: generate-and-validate; every identifier passes at build time + class: public-data-derived +invariants: +- observations.parquet carries no truth column (enforced at write time) +- no observed value is an entity id (enforced at write time) +- record_id is a hash of (world_id, source, sequence) and holds no entity information +horizon: +- '2019-01-01' +- '2026-01-01' diff --git a/data/synthetic/worlds/ng_supplier_v0_s400/observations.parquet b/data/synthetic/worlds/ng_supplier_v0_s400/observations.parquet new file mode 100644 index 0000000..d452734 Binary files /dev/null and b/data/synthetic/worlds/ng_supplier_v0_s400/observations.parquet differ diff --git a/data/synthetic/worlds/ng_supplier_v0_s400/schema/differences.json b/data/synthetic/worlds/ng_supplier_v0_s400/schema/differences.json new file mode 100644 index 0000000..a583da2 --- /dev/null +++ b/data/synthetic/worlds/ng_supplier_v0_s400/schema/differences.json @@ -0,0 +1,49 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://arche.dev/schemas/synthetic/differences-v0.json", + "title": "differences", + "type": "object", + "required": [ + "difference_id", + "observation_a", + "observation_b", + "attribute", + "difference_kind" + ], + "properties": { + "difference_id": { + "type": "string" + }, + "entity_id": { + "type": [ + "string", + "null" + ] + }, + "observation_a": { + "type": "string" + }, + "observation_b": { + "type": "string" + }, + "attribute": { + "type": "string" + }, + "difference_kind": { + "type": "string" + }, + "cause": { + "type": [ + "string", + "null" + ] + }, + "event_id": { + "type": [ + "string", + "null" + ] + } + }, + "additionalProperties": false +} diff --git a/data/synthetic/worlds/ng_supplier_v0_s400/schema/events.json b/data/synthetic/worlds/ng_supplier_v0_s400/schema/events.json new file mode 100644 index 0000000..a5f9fdd --- /dev/null +++ b/data/synthetic/worlds/ng_supplier_v0_s400/schema/events.json @@ -0,0 +1,45 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://arche.dev/schemas/synthetic/events-v0.json", + "title": "events", + "type": "object", + "required": [ + "event_id", + "entity_id", + "kind", + "event_at" + ], + "properties": { + "event_id": { + "type": "string" + }, + "entity_id": { + "type": "string" + }, + "kind": { + "type": "string" + }, + "event_at": { + "type": "string" + }, + "attribute": { + "type": [ + "string", + "null" + ] + }, + "old_value": { + "type": [ + "string", + "null" + ] + }, + "new_value": { + "type": [ + "string", + "null" + ] + } + }, + "additionalProperties": false +} diff --git a/data/synthetic/worlds/ng_supplier_v0_s400/schema/observations.json b/data/synthetic/worlds/ng_supplier_v0_s400/schema/observations.json new file mode 100644 index 0000000..35da803 --- /dev/null +++ b/data/synthetic/worlds/ng_supplier_v0_s400/schema/observations.json @@ -0,0 +1,89 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://arche.dev/schemas/synthetic/observations-v0.json", + "title": "observations", + "type": "object", + "required": [ + "record_id", + "source", + "observed_at" + ], + "properties": { + "record_id": { + "type": "string" + }, + "source": { + "type": "string" + }, + "observed_at": { + "type": "string" + }, + "name": { + "type": [ + "string", + "null" + ] + }, + "rc_number": { + "type": [ + "string", + "null" + ] + }, + "tin": { + "type": [ + "string", + "null" + ] + }, + "phone": { + "type": [ + "string", + "null" + ] + }, + "email": { + "type": [ + "string", + "null" + ] + }, + "address": { + "type": [ + "string", + "null" + ] + }, + "city": { + "type": [ + "string", + "null" + ] + }, + "bank": { + "type": [ + "string", + "null" + ] + }, + "account_number": { + "type": [ + "string", + "null" + ] + }, + "director_name": { + "type": [ + "string", + "null" + ] + }, + "incorporated_on": { + "type": [ + "string", + "null" + ] + } + }, + "additionalProperties": false +} diff --git a/data/synthetic/worlds/ng_supplier_v0_s400/schema/truth.json b/data/synthetic/worlds/ng_supplier_v0_s400/schema/truth.json new file mode 100644 index 0000000..cb76b8e --- /dev/null +++ b/data/synthetic/worlds/ng_supplier_v0_s400/schema/truth.json @@ -0,0 +1,37 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://arche.dev/schemas/synthetic/truth-v0.json", + "title": "truth", + "type": "object", + "required": [ + "record_id", + "truth_entity_id" + ], + "properties": { + "record_id": { + "type": "string" + }, + "truth_entity_id": { + "type": "string" + }, + "entity_type": { + "type": [ + "string", + "null" + ] + }, + "source": { + "type": [ + "string", + "null" + ] + }, + "state_index": { + "type": [ + "integer", + "null" + ] + } + }, + "additionalProperties": false +} diff --git a/data/synthetic/worlds/ng_supplier_v0_s400/truth.parquet b/data/synthetic/worlds/ng_supplier_v0_s400/truth.parquet new file mode 100644 index 0000000..6ebac34 Binary files /dev/null and b/data/synthetic/worlds/ng_supplier_v0_s400/truth.parquet differ diff --git a/datasets/artists_dataops/README.md b/datasets/artists_dataops/README.md new file mode 100644 index 0000000..bc83d3c --- /dev/null +++ b/datasets/artists_dataops/README.md @@ -0,0 +1,79 @@ +# The artist world: Splink with and without a name-variant list + +Robin Linacre asked one question: *run Splink over the same records with the variant list and without it, and say what the difference is.* This directory is that experiment, and this page is how to run it. + +## What is here + +| file | what it is | +|---|---| +| `data/synthetic/worlds/artists_v0/` | **the world.** 9,944 records of 2,941 real African artists, every disagreement labelled by cause. Parquet + JSON schema + manifest. No truth column in the file a matcher is given | +| `datasets/data/artist_variants.jsonl` | **the list.** 449 groups: MusicBrainz alias sets (joined to the truth by Wikidata P434, never by name) plus 38 curated groups | +| `example_splink_with_variants.py` | the experiment in one file, ~90 lines, imports nothing from arche | +| `bench_splink_variants.py` | the full version: six arms, strata, collisions, threshold sweeps, an oracle arm | +| `coverage.py` | how much of the truth the list knows, measured before any matcher runs | +| `pull_musicbrainz.py` | how the list was built | +| `RESULTS.md` | what we found | + +**Where the truth comes from.** Every alias group is a real artist with the alternate names Wikidata records for them (CC0). The generator decides which alias each of four catalogues writes and what it does to it — lost diacritics, a typo, capitals — and never decides what an artist is called. The list Splink is given comes from MusicBrainz, a different editorial community, so the list and the truth can disagree. A list derived from the truth would win by construction. + +**What the list covers.** 10.5% of the truth's alias pairs. That number bounds the gain before anything runs; `coverage.py` prints it. + +## Run it + +From the repository root, with Splink installed (`uv sync --extra splink`, or `pip install splink pyarrow pandas`): + +```sh +uv run python datasets/artists_dataops/example_splink_with_variants.py +``` + +```text +arm precision recall alias recall false +splink, raw 0.835 0.389 0.004 1,169 +splink + variants 0.840 0.401 0.068 1,158 +``` + +Both arms at p ≥ 0.5. **`alias recall`** is the column the experiment is about: the 3,002 pairs where two records name the artist differently and the names are not string-similar — `Wizkid` against `Ayodeji Ibrahim Balogun`. Raw Splink finds four in a thousand of them. With the list it finds one in fifteen, at the same precision — which is what a list that covers one alias in ten should buy, and no more. + +The example does three things, and they are the whole method: + +1. reads `observations.parquet` and maps each name to its list group (`name_variants`, and a `canonical` key for blocking); +2. builds two Splink models that differ by one comparison level — `ArrayIntersectLevel("name_variants")` between exact match and Jaro-Winkler — and one blocking rule on the canonical key, so pairs that share no prefix can be proposed at all; +3. scores both against `truth.parquet`, and against `differences.parquet` for the alias stratum. + +## The full result + +```sh +uv run python datasets/artists_dataops/bench_splink_variants.py +``` + +Six arms — raw, canonicalised, the native level, both, and each list arm again with the truth's own aliases as an **oracle** (100% coverage, leakage by construction, labelled as such) — at five thresholds, with recall by stratum and false merges on the 327 record pairs where two *different* artists genuinely share a name. Two minutes. `RESULTS.md` walks through it; the two numbers to know: + +- **Splink priced the list itself at +10.7 bits** — the same as an exact name match. EM was not told to trust the list; it looked at how list-asserted pairs behaved and concluded that. +- **A complete list is worth 0.2 of F1** (0.743 → 0.944). The independent list, at 10.5% coverage, buys 2.8 recall points. The gap is the value of building the list. + +## Regenerate everything + +```sh +python -m arche_synthetic --world-pack artists_v0 --scale 10000 --out data/synthetic/worlds/artists_v0 +uv run python datasets/artists_dataops/pull_musicbrainz.py # ~15 min at MusicBrainz's 1 req/s, cached +uv run python datasets/artists_dataops/coverage.py # the 10.5%; writes artist_variants.jsonl +uv run python datasets/artists_dataops/bench_splink_variants.py +``` + +The world is seeded and fingerprinted: the same seed produces the same content, checked by hash rather than by file bytes. + +## Two things to know before quoting a number + +**Train the name on a rule that does not mention it.** Splink treats any comparison whose column appears in the EM blocking rule as untrainable in that session. Block on `substr(name,1,2)` to train the name and every name level stays at its default; the first version of the example did exactly that and reported a model that had never learned what a name is worth. Both scripts train the name while blocking on `country`. + +**The world has two fields, and it shows.** Best operating points sit at 0.1–0.3, not 0.9, and unseeded u-sampling moved one arm's false-merge count from 1,180 to 4,258 between runs while recall by stratum did not move at all. Comparisons *between arms* at a matched threshold are what the tables support; the absolute probabilities are a property of a thin world. `bench_splink_variants.py` seeds the sampling so a run is reproducible, and says so rather than pretending that makes the number stable. + +## What Robin asked for, and what is and is not here + +| asked | status | +|---|---| +| artist / stage-name matching, Splink with and without variants | **done** — this directory | +| MusicBrainz as the source of variants | **done** — `pull_musicbrainz.py`, joined by identifier | +| names with correlation (a *Mary* is not an *Ahmed*) | **done** in the supplier worlds — `ng_supplier_v1` and `africa_supplier_v1` draw both halves of a name from one country's real pairs | +| 10k, then 100k | **10k done**; `--scale 100000` runs, but the alias groups are fixed at 1,468 so a bigger world is thinner in aliases, not richer | +| African *person* names with lexicon-driven spelling variants, Splink with and without | **not done, and not honestly doable yet.** The name-equivalence lists we hold are CC-BY-NC-SA and there is no second public source of "Mohammed is Muhammad for this person" to keep the list and the truth apart. Corrupting with a lexicon and testing with the same lexicon measures an upper bound at 100% coverage, which is the oracle arm here without the honest arm beside it | diff --git a/datasets/artists_dataops/RESULTS.md b/datasets/artists_dataops/RESULTS.md new file mode 100644 index 0000000..fd17dd9 --- /dev/null +++ b/datasets/artists_dataops/RESULTS.md @@ -0,0 +1,96 @@ +# What a name-variant list is worth to Splink + +*Measured 2026-09-13 on `artists_v0` (seed 42): 9,944 records of 2,941 real African artists, 15,171 true pairs, every disagreement labelled by cause. Every arm is Splink 4.0.16. Script: `bench_splink_variants.py`. Reproducible: u-sampling is seeded and two consecutive runs agree to the last digit.* + +--- + +## The question + +`Wizkid` and `Ayodeji Ibrahim Balogun` are one person. No edit distance, term-frequency weight or phonetic key will ever pair them; only a list that says they are the same can. Splink's author asked what such a list actually buys. This is the answer on real alias data, with the cost printed beside the gain. + +## The lists, and why there are two + +| list | source | coverage of the truth's alias pairs | +|---|---|---:| +| **independent** | MusicBrainz alias sets joined by Wikidata P434, plus 38 curated groups | **10.5%** of name pairs, 13.4% of record pairs | +| **oracle** | the truth's own alias groups — **leakage, labelled** | 100% | + +The truth is Wikidata; the independent list is a different editorial community, joined by identifier and never by name, so the two can disagree and a list derived from the truth cannot win by construction. `coverage.py` measured the 10.5% before any matcher ran. The oracle exists to say what a *complete* list would be worth; the gap between the two arms is the value of building one. + +## The arms + +| arm | what Splink sees | +|---|---| +| **raw** | name and country, term frequency on. What a Splink user runs today | +| **canon** | each name replaced by its list group's canonical form before Splink sees it | +| **level** | raw name kept; a `name_variants` array added and an `ArrayIntersect` comparison level placed between exact and Jaro-Winkler, **with its m and u estimated by EM like any other level** | +| **both** | canonical name and the variant level | + +Blocking is part of the treatment: the list arms also block on the list key, because a pair that shares no prefix is otherwise never proposed. That is what a list is for, and the `block` column says how much of each arm's recall was reachable at all. + +## The result + +Recall by stratum. `alias` is two records naming the artist differently with Jaro-Winkler < 0.88 on the intended names; **`<0.7`** is the sub-stratum below 0.7 on the observed names — 2,016 pairs no string method can see. `spell` is `Wiz Kid` / `Wizkid`. `coll.` is false merges on the 327 record pairs where two *different* artists genuinely share a name. + +Each arm at its own best-F1 threshold, and at a matched 0.5: + +| arm | p ≥ | prec | recall | F1 | false | coll. | alias | **<0.7** | spell | typo | block | +|---|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:| +| raw | 0.15 | 0.712 | 0.777 | 0.743 | 4,759 | 125 | 0.059 | **0.000** | 0.657 | 0.530 | 0.807 | +| canon / indep | 0.15 | 0.710 | 0.805 | 0.755 | 4,981 | 126 | 0.200 | **0.161** | 0.677 | 0.533 | 0.832 | +| level / indep | 0.15 | 0.719 | 0.805 | 0.759 | 4,769 | 131 | 0.184 | **0.141** | 0.710 | 0.530 | 0.831 | +| canon / oracle | 0.30 | 0.925 | 0.963 | 0.944 | 1,180 | 159 | 0.943 | **0.944** | 0.963 | 0.953 | 1.000 | +| level / oracle | 0.10 | 0.756 | 1.000 | 0.861 | 4,902 | 264 | 1.000 | **1.000** | 1.000 | 1.000 | 1.000 | +| | | | | | | | | | | | | +| raw | 0.5 | 0.835 | 0.389 | 0.531 | 1,169 | 90 | 0.004 | **0.000** | 0.435 | 0.253 | 0.807 | +| canon / indep | 0.5 | 0.835 | 0.403 | 0.543 | 1,208 | 95 | 0.079 | **0.078** | 0.415 | 0.256 | 0.832 | +| level / indep | 0.5 | 0.840 | 0.401 | 0.543 | 1,158 | 79 | 0.068 | **0.067** | 0.441 | 0.253 | 0.831 | +| canon / oracle | 0.5 | 0.869 | 0.510 | 0.643 | 1,163 | 142 | 0.494 | **0.481** | 0.506 | 0.473 | 1.000 | +| level / oracle | 0.5 | 0.957 | 0.492 | 0.650 | 338 | 126 | 0.481 | **0.465** | 0.492 | 0.464 | 1.000 | + +`both` is omitted: with a consistent list it is identical to `canon`, because two records with intersecting variants always share a canonical form, so the exact level fires first and the variant level is never observed (Splink reports it untrained). The full sweep at 0.1 / 0.2 / 0.3 / 0.5 / 0.9 is in `bench_splink_variants_result.json`. + +## What it says + +**1. On the pairs no string method can see, raw Splink finds none — at any threshold.** The `<0.7` column is 0.000 for the raw arm at 0.1, 0.15, 0.2, 0.3, 0.5 and 0.9. Its blocking never proposes them (`block` 0.807: nineteen percent of all true pairs are unreachable) and if it did, "all other comparisons" is priced at −6.7 bits. This is the stratum the list exists for, and it is exactly as unreachable as the argument said. + +**2. Splink's own estimate of the list: +10.7 bits.** With the variant level in the model, EM priced "the two records' variant sets intersect" at **+10.7 bits — the same as an exact match on the name (+10.75)**, for both the independent list and the oracle. That is Splink saying, from the data and without being told, that a list-asserted alias is worth as much as the names being identical. It is the number to quote. + +**3. The independent list delivers about what its coverage promised, and no more.** It can reach 13.4% of alias record pairs; it recovers 14–16% of the `<0.7` stratum and lifts overall recall by 2.8 points (0.777 → 0.805) at the same precision. A list that covers one alias in ten buys one alias in ten. There is no free lunch in the inference; the value is in the list. + +**4. A complete list is worth 19 F1 points.** canon/oracle at its best operating point: precision 0.925, recall 0.963, F1 0.944 against raw's 0.743, and the `<0.7` stratum goes from 0.000 to 0.944. That gap — 0.201 F1 — is the value of the curation work that turns a 10% list into a complete one. It is the data-flywheel argument as one measured number. + +**5. The cost is real and it is in the collision column.** Raw merges 125 of the 327 collision pairs at its best operating point; the independent list adds one to six; the complete list adds 34 (canon) or 139 (level). A list that says two `Tyla`s are one artist will merge two Tylas, and a complete list does that more often than a thin one. Report the gain without this column and the result is not worth reading. + +**6. Canonicalise, or let Splink weigh the list?** At independent scale it barely matters (F1 0.755 vs 0.759). At oracle scale canonicalisation wins clearly (0.944 vs 0.861) — and the reason is a modelling detail worth knowing: the `ArrayIntersect` level carries **no term-frequency adjustment**, so an alias hit on a common name is priced at the full +10.7 while an exact hit on the same common name is discounted. That makes the level arm more generous on exactly the pairs that collide (264 collision merges against 159). A TF-adjusted variant level would close that; canonicalising first gets it for free because the exact level already has one. + +## For the record: the arche arm + +Run once with `--arche`, shipped `artist` pack, default thresholds, its curated 38-group list and nothing else. 109 seconds. + +| arm | prec | recall | F1 | false | coll. | `<0.7` | spell | typo | review queue | +|---|---:|---:|---:|---:|---:|---:|---:|---:|---:| +| arche artist pack | 0.978 | 0.723 | 0.832 | 242 | 142 | 0.013 | 0.567 | 0.021 | **13,883** | + +Read it carefully, because the F1 is higher than any Splink arm short of the oracle and that is not the finding it looks like. + +- **The precision comes from refusal.** arche sends 13,883 pairs to `review` — 3.8 times the number of true pairs in the world. Counting those as found lifts recall to 0.822; counting them as a queue someone has to work is the honest reading. Its typo recall is 0.021: a misspelled name is not a match, it is a question. Splink has no queue and pays for that in the `false` column. +- **The Splink arms were configured for the ablation, not tuned to win.** Two fields, a hand-written prior, a Jaro-Winkler 0.7 level that EM priced at +7 bits and that produces most of the false merges at the operating points that matter. A Splink user tuning for this world would drop that level or raise the prior's `recall`, and the `false` column would move. And each Splink arm's best-F1 threshold was chosen *on the labels*; arche's is the shipped default. +- **On the pairs this experiment is about, arche has nothing either.** `<0.7` recall 0.013 -- the 38 curated groups reach about one alias pair in a hundred. A list is a list, whoever consumes it. +- **It is not a head-to-head.** The four benchmarks on `docs-site/docs/reference/benchmarks.md` are, and Splink wins all four on real labels. This is a thin two-field world where a Fellegi-Sunter model cannot separate well and a gate that refuses looks good by refusing. That says something about worlds, not engines. + +## What it does not say + +- **Nothing about arche beyond the paragraph above.** Every arm that matters is Splink. +- **Nothing about names in general.** These are musicians, whose aliases are the extreme case; the world's records carry two fields, and a two-field Fellegi-Sunter model is steep — the best operating points sit at 0.10–0.30, not 0.9, and an exact-name pair with no country on either side lands near p = 0.4. Comparisons *between arms at a matched threshold* are what this table supports; the absolute probabilities are a property of a thin world. +- **Nothing about collisions beyond the 28 this data contains.** They were found, not made. A catalogue with more homonyms pays more for a list. +- **The independent arm's ceiling is the list's, not Splink's.** For African artists, the two largest public alias sources between them know about one alternate name in ten. + +## Reproduce + +```sh +python -m arche_synthetic --world-pack artists_v0 --scale 10000 --out data/synthetic/worlds/artists_v0 +uv run python datasets/artists_dataops/pull_musicbrainz.py # ~15 min, cached +uv run python datasets/artists_dataops/coverage.py # the 10.5%, and the list +uv run python datasets/artists_dataops/bench_splink_variants.py # ~2 min +``` diff --git a/datasets/artists_dataops/bench_splink_variants.py b/datasets/artists_dataops/bench_splink_variants.py new file mode 100644 index 0000000..15b07f6 --- /dev/null +++ b/datasets/artists_dataops/bench_splink_variants.py @@ -0,0 +1,382 @@ +# Copyright 2026 unpatterned.org +# SPDX-License-Identifier: Apache-2.0 + +"""What is a name-variant list worth to Splink? One world, one variable, six arms. + + uv run python datasets/artists_dataops/bench_splink_variants.py + uv run python datasets/artists_dataops/bench_splink_variants.py --arche # + the arche arm, slow + +Every arm is Splink. What changes is whether it is given a list of name +variants, which list, and how: + + raw name and country, term frequency on. What a Splink user + runs today. + canon/indep each name replaced by its list group's canonical form + before Splink sees it. The obvious way to use a list. + level/indep raw name kept; a `name_variants` array column added and an + ArrayIntersect comparison level placed between exact and + Jaro-Winkler. Splink estimates m and u for that level + itself -- its own opinion of the list. + both/indep canonical name AND the variant level. + canon/oracle as canon, but the list is the truth's own alias groups. + level/oracle as level, with the truth's aliases. + +`indep` is the list you can actually get: MusicBrainz joined by Wikidata P434 +plus 38 curated groups, **10.5% coverage** of the truth's alias pairs +(`coverage.py`). `oracle` is 100% coverage by construction and is **leakage, +labelled**: it says what a complete list would be worth, and the gap between +the two is the value of building one. Presenting oracle as indep would be the +lie; presenting both, named, is the experiment. + +Blocking is part of the treatment. `Wizkid` and `Ayodeji Ibrahim Balogun` +share no prefix, so a name-blocked model never proposes the pair; the list +arms also block on the list key. That is not the harness helping the list -- +it is what a list is *for*, and the `blocking` column in the result says how +much of each arm's recall was reachable at all. + +Scoring is the world's own evaluator (`arche_synthetic.evaluate`): recall by +stratum, false merges, and -- new here -- false merges on **collision** pairs, +distinct artists who genuinely share a name. That is the price of a list, and +it is reported beside the gain or the gain is not worth reporting. +""" +from __future__ import annotations + +import argparse +import json +import math +import sys +import time +import warnings +from collections import defaultdict +from pathlib import Path +from typing import Any + +_REPO = Path(__file__).resolve().parents[2] +sys.path.insert(0, str(_REPO / "data" / "synthetic")) +from arche_synthetic.evaluate import Benchmark, Predictions, pair # noqa: E402 + +WORLD = _REPO / "data" / "synthetic" / "worlds" / "artists_v0" +VARIANTS = _REPO / "datasets" / "data" / "artist_variants.jsonl" +OUT = Path(__file__).with_name("bench_splink_variants_result.json") + +THRESHOLDS = (0.1, 0.2, 0.3, 0.5, 0.9) +ARMS = ("raw", "canon/indep", "level/indep", "both/indep", "canon/oracle", "level/oracle") + + +def norm(name: str) -> str: + return " ".join((name or "").casefold().split()) + + +# --- the lists --------------------------------------------------------------- + +def independent_list() -> dict[str, dict[str, Any]]: + """name -> {canonical, names} from the MusicBrainz + curated list.""" + by_name: dict[str, dict[str, Any]] = {} + for line in VARIANTS.read_text(encoding="utf-8").splitlines(): + if not line.strip(): + continue + g = json.loads(line) + names = sorted({norm(n) for n in g["names"]}) + for n in names: + # A name in two list groups (the same artist listed twice) gets + # the union, so nothing the list knows is thrown away. + if n in by_name: + merged = sorted(set(by_name[n]["names"]) | set(names)) + by_name[n] = {"canonical": min(merged), "names": merged} + for m in merged: + by_name[m] = by_name[n] + else: + by_name[n] = {"canonical": names[0], "names": names} + return by_name + + +def oracle_list(out: Path) -> dict[str, dict[str, Any]]: + """name -> group, from the truth. Leakage, and named as such.""" + import pyarrow.parquet as pq + + truth = pq.read_table(out / "truth.parquet").to_pylist() + obs = {r["record_id"]: r for r in + pq.read_table(out / "observations.parquet").to_pylist()} + names_of: dict[str, set[str]] = defaultdict(set) + for t in truth: + names_of[t["truth_entity_id"]].add(norm(obs[t["record_id"]]["name"])) + by_name: dict[str, dict[str, Any]] = {} + for names in names_of.values(): + names = sorted(names) + for n in names: + if n in by_name: + merged = sorted(set(by_name[n]["names"]) | set(names)) + by_name[n] = {"canonical": min(merged), "names": merged} + for m in merged: + by_name[m] = by_name[n] + else: + by_name[n] = {"canonical": names[0], "names": names} + return by_name + + +# --- the frame --------------------------------------------------------------- + +def frame(bench: Benchmark, lookup: dict[str, dict[str, Any]] | None): + import pandas as pd + + rows = [] + for o in bench.observations: + n = norm(o["name"]) + g = lookup.get(n) if lookup else None + rows.append({ + "unique_id": o["record_id"], + "name": n, + "canonical": g["canonical"] if g else n, + "name_variants": g["names"] if g else [n], + "country": o.get("country") or None, + }) + return pd.DataFrame(rows) + + +# --- the model --------------------------------------------------------------- + +def settings(arm: str): + import splink.comparison_level_library as cll + import splink.comparison_library as cl + from splink import SettingsCreator, block_on + + canon = arm.startswith(("canon", "both")) + level = arm.startswith(("level", "both")) + name_col = "canonical" if canon else "name" + + rules = [block_on(name_col), block_on(f"substr({name_col},1,4)")] + if level: + # Reach pairs that share a variant but no prefix. Splink has no + # array-overlap blocking rule; the canonical key is the cheap + # equivalent and it is exactly the key the list defines. + rules.append(block_on("canonical")) + + levels = [cll.NullLevel(name_col), + cll.ExactMatchLevel(name_col).configure(tf_adjustment_column=name_col)] + if level: + levels.append(cll.ArrayIntersectLevel("name_variants", min_intersection=1)) + levels += [cll.JaroWinklerLevel(name_col, 0.92), + cll.JaroWinklerLevel(name_col, 0.88), + cll.JaroWinklerLevel(name_col, 0.7), + cll.ElseLevel()] + return SettingsCreator( + link_type="dedupe_only", + blocking_rules_to_generate_predictions=rules, + comparisons=[cl.CustomComparison(levels, output_column_name="name"), + cl.ExactMatch("country")], + retain_intermediate_calculation_columns=False, + ), name_col + + +def run_splink(df, arm: str) -> tuple[list[tuple[tuple[str, str], float]], dict[str, Any]]: + from splink import DuckDBAPI, Linker, block_on + + s, name_col = settings(arm) + linker = Linker(df, s, db_api=DuckDBAPI()) + linker.training.estimate_probability_two_random_records_match( + [block_on(name_col)], recall=0.6) + # Seeded. Unseeded, the canonicalised oracle arm's false-merge count at + # p >= 0.3 landed at 4,258 on one run and 1,180 on the next -- recall by + # stratum was identical both times, precision was not. The seed makes a + # run reproducible; it does not make the number less sensitive, and the + # instability is reported with the result rather than hidden by it. + linker.training.estimate_u_using_random_sampling(max_pairs=5e6, seed=42) + # Two EM sessions so every comparison is trained on a rule that does not + # fix it: country is learned while blocking on the name; the name (and + # the variant level) while blocking on country. Not on a name prefix -- + # Splink treats any comparison whose column appears in the blocking rule + # as untrainable in that session, so `substr(name,1,2)` left every name + # level with m=None and the first run of this script scored a model that + # had never learned what a name is worth (measured, not assumed). + for rule in (block_on(name_col), block_on("country")): + try: + linker.training.estimate_parameters_using_expectation_maximisation(rule) + except Exception as exc: # noqa: BLE001 + print(f" EM on {rule} did not converge: {exc}", flush=True) + + model = linker.misc.save_model_to_json() + learned = {} + for c in model["comparisons"]: + if c["output_column_name"] != "name": + continue + for lv in c["comparison_levels"]: + m, u = lv.get("m_probability"), lv.get("u_probability") + if m and u: + learned[lv["label_for_charts"]] = round(math.log2(m / u), 2) + + out = linker.inference.predict(threshold_match_probability=0.001).as_pandas_dataframe() + got = [((str(a), str(b)), float(p)) for a, b, p in + zip(out["unique_id_l"], out["unique_id_r"], out["match_probability"], strict=False)] + return got, learned + + +# --- arche, for the record ---------------------------------------------------- + +def run_arche(bench: Benchmark) -> tuple[set, set]: + from arche.resolve import reconcile + + records = [{"id": o["record_id"], "name": o["name"], "country": o.get("country")} + for o in bench.observations] + res = reconcile(records, records, entity="artist", id_field="id") + match = {pair(e["a_id"], e["b_id"]) for e in res["matches"] + if e["a_id"] != e["b_id"] and e["decision"] == "match"} + review = {pair(e["a_id"], e["b_id"]) for e in res["matches"] + if e["a_id"] != e["b_id"] and e["decision"] == "review"} + return match, review + + +# --- collisions ---------------------------------------------------------------- + +def collision_pairs(bench: Benchmark, out: Path) -> set: + """Record pairs whose entities are a known collision (distinct, same name).""" + import pyarrow.parquet as pq + + rows = pq.read_table(out / "collisions.parquet").to_pylist() + colliding = {frozenset((r["entity_a"], r["entity_b"])) for r in rows} + pairs = set() + for a, b in ((a, b) for a in bench.by_entity for b in bench.by_entity if a < b): + if frozenset((a, b)) in colliding: + for ra in bench.by_entity[a]: + for rb in bench.by_entity[b]: + pairs.add(pair(ra, rb)) + return pairs + + +# --- main ---------------------------------------------------------------------- + +def main() -> int: + warnings.filterwarnings("ignore") + ap = argparse.ArgumentParser(description=__doc__.split("\n", 1)[0]) + ap.add_argument("--world", default=str(WORLD)) + ap.add_argument("--arche", action="store_true", help="also run the arche artist pack") + args = ap.parse_args() + out = Path(args.world) + + bench = Benchmark.load(out) + collisions = collision_pairs(bench, out) + indep = independent_list() + oracle = oracle_list(out) + print(f" {len(bench.observations):,} records, {len(bench.true_pairs):,} true pairs, " + f"{len(collisions):,} collision record pairs") + print(f" independent list: {len(set(id(v) for v in indep.values())):,} groups; " + f"oracle: {len(set(id(v) for v in oracle.values())):,}\n", flush=True) + + # The list's ceiling in the world's own currency: the share of alias + # *record* pairs whose two names sit in one list group. Higher than the + # name-pair coverage in coverage.py, because well-known artists -- the + # ones MusicBrainz knows -- also have more records. + by_id = {o["record_id"]: norm(o["name"]) for o in bench.observations} + alias_pairs = bench.by_cause.get("representation/alias", set()) + + def reachable(lookup: dict[str, dict[str, Any]]) -> float: + hit = sum(1 for a, b in alias_pairs + if by_id[a] in lookup and by_id[b] in lookup + and lookup[by_id[a]]["canonical"] == lookup[by_id[b]]["canonical"]) + return round(hit / len(alias_pairs), 4) if alias_pairs else 0.0 + + ceilings = {"indep": reachable(indep), "oracle": reachable(oracle)} + + # The alias stratum is bounded at Jaro-Winkler 0.88 on the *intended* + # names, so it still holds pairs a lenient string level can reach (a + # JW >= 0.7 level is in every arm and EM prices it at about +7 bits). + # The claim the article makes is about pairs no string method can see, so + # that sub-stratum is carved out here on the observed names: alias pairs + # whose two records are below 0.7. Nothing but a list reaches these. + from arche_synthetic.artists import jaro_winkler + hard_alias = {p for p in alias_pairs if jaro_winkler(by_id[p[0]], by_id[p[1]]) < 0.7} + print(f" alias pairs below JW 0.7 on observed names: {len(hard_alias):,} of " + f"{len(alias_pairs):,}", flush=True) + print(f" alias record pairs the list can reach: indep {ceilings['indep']:.1%}, " + f"oracle {ceilings['oracle']:.1%}\n", flush=True) + + report: dict[str, Any] = {"world": out.name, "records": len(bench.observations), + "true_pairs": len(bench.true_pairs), + "collision_pairs": len(collisions), + "alias_ceiling": ceilings, "arms": {}} + + def record(label: str, pairs: set, *, candidates: set | None = None, + abstentions: set | None = None, seconds: float = 0.0, + notes: dict | None = None) -> None: + r = bench.score(Predictions(arm=label, pairs=pairs, candidates=candidates or set(), + abstentions=abstentions or set(), seconds=seconds, + notes=notes or {})) + claimed = {p for p in pairs if p[0] in bench.truth and p[1] in bench.truth} + false_pairs = claimed - bench.true_pairs + r["false"] = len(false_pairs) + r["false_on_collisions"] = len(false_pairs & collisions) + r["recall_by_stratum"]["representation/alias<0.7"] = { + "true_pairs": len(hard_alias), + "recall": round(len(claimed & hard_alias) / len(hard_alias), 4) + if hard_alias else 0.0} + report["arms"][label] = r + + for arm in ARMS: + lookup = None if arm == "raw" else (oracle if arm.endswith("oracle") else indep) + df = frame(bench, lookup) + print(f" splink {arm} ...", flush=True) + t0 = time.time() + got, learned = run_splink(df, arm) + seconds = time.time() - t0 + candidates = {pair(a, b) for (a, b), _ in got} + for t in THRESHOLDS: + record(f"splink {arm} p>={t}", {pair(a, b) for (a, b), p in got if p >= t}, + candidates=candidates, seconds=seconds, notes={"learned_bits": learned}) + # The arm's own best operating point, so arms are also compared where + # each does best rather than only at thresholds chosen in advance. + best_t, best_f1 = None, -1.0 + for t in (i / 100 for i in range(5, 96, 5)): + claimed = {pair(a, b) for (a, b), p in got if p >= t} + tp = len(claimed & bench.true_pairs) + prec = tp / len(claimed) if claimed else 0.0 + rec = tp / len(bench.true_pairs) + f1 = 2 * prec * rec / (prec + rec) if prec + rec else 0.0 + if f1 > best_f1: + best_t, best_f1 = t, f1 + record(f"splink {arm} best-F1 (p>={best_t:.2f})", + {pair(a, b) for (a, b), p in got if p >= best_t}, + candidates=candidates, seconds=seconds, + notes={"learned_bits": learned, "best_threshold": best_t}) + if "Array intersection size >= 1" in learned or any("intersect" in k.lower() for k in learned): + key = next(k for k in learned if "intersect" in k.lower()) + print(f" variant level learned at {learned[key]:+.2f} bits", flush=True) + + if args.arche: + print(" arche artist pack ...", flush=True) + t0 = time.time() + match, review = run_arche(bench) + record("arche artist pack (curated list)", match, abstentions=review, + seconds=time.time() - t0) + + # --- print --------------------------------------------------------------- + strata = ("representation/alias", "representation/alias<0.7", + "representation/spelling", "error/typo") + width = max(len(k) for k in report["arms"]) + print(f"\n {'arm':<{width}}{'prec':>7}{'recall':>8}{'F1':>7}{'false':>7}" + f"{'on coll.':>9}{'alias':>7}{'<0.7':>7}{'spell':>7}{'typo':>7}{'block':>7}") + for label, r in report["arms"].items(): + s = r["recall_by_stratum"] + o = r["overall"] + b = r["blocking"].get("recall") if r["blocking"].get("measured") else None + print(f" {label:<{width}}{o['precision']:>7.3f}{o['recall']:>8.3f}{o['f1']:>7.3f}" + f"{r['false']:>7,}{r['false_on_collisions']:>9,}" + + "".join(f"{s.get(k, {}).get('recall', float('nan')):>7.3f}" for k in strata) + + (f"{b:>7.3f}" if b is not None else f"{'--':>7}")) + + print("\n what Splink learned the name levels are worth (bits), per arm:") + seen = set() + for label, r in report["arms"].items(): + arm = label.split(" p>=")[0] + if arm in seen or "learned_bits" not in r["notes"]: + continue + seen.add(arm) + print(f" {arm:<14} " + " ".join(f"{k[:22]}={v:+.1f}" + for k, v in r["notes"]["learned_bits"].items())) + + OUT.write_text(json.dumps(report, indent=2, default=str) + "\n", + encoding="utf-8", newline="\n") + print(f"\n wrote {OUT.relative_to(_REPO)}") + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/datasets/artists_dataops/bench_splink_variants_result.json b/datasets/artists_dataops/bench_splink_variants_result.json new file mode 100644 index 0000000..98bebd0 --- /dev/null +++ b/datasets/artists_dataops/bench_splink_variants_result.json @@ -0,0 +1,3250 @@ +{ + "world": "artists_v0", + "records": 9944, + "true_pairs": 15171, + "collision_pairs": 327, + "alias_ceiling": { + "indep": 0.1336, + "oracle": 1.0 + }, + "arms": { + "splink raw p>=0.1": { + "arm": "splink raw p>=0.1", + "seconds": 22.02, + "overall": { + "claimed_pairs": 20398, + "true_pairs": 15171, + "precision": 0.5905, + "recall": 0.7939, + "f1": 0.6773, + "abstentions": 0, + "coverage": 0.7939 + }, + "bcubed": { + "precision": 0.751, + "recall": 0.8627, + "f1": 0.803 + }, + "recall_by_stratum": { + "error": { + "true_pairs": 811, + "recall": 0.6067 + }, + "error/truncation": { + "true_pairs": 141, + "recall": 0.9007 + }, + "error/typo": { + "true_pairs": 677, + "recall": 0.5451 + }, + "representation": { + "true_pairs": 6096, + "recall": 0.5089 + }, + "representation/alias": { + "true_pairs": 3002, + "recall": 0.0623 + }, + "representation/case_upper": { + "true_pairs": 2847, + "recall": 0.7921 + }, + "representation/diacritic_loss": { + "true_pairs": 157, + "recall": 0.5478 + }, + "representation/spelling": { + "true_pairs": 832, + "recall": 0.8702 + }, + "representation/alias<0.7": { + "true_pairs": 2016, + "recall": 0.0 + } + }, + "entities": { + "clusters": 2902, + "true_entities": 2905, + "false_merge_clusters": 320, + "false_merge_rate": 0.1103, + "false_split_entities": 776, + "false_split_rate": 0.2671 + }, + "false_merges_by_what_was_shared": { + "surname_head": 6725, + "nothing_obvious": 1628, + "whole_name": 149 + }, + "blocking": { + "measured": true, + "source": "recomputed from the candidate pairs the arm reported", + "candidate_pairs": 35744, + "recall": 0.8071, + "reduction_ratio": 0.999277, + "pairs_per_record": 3.595 + }, + "notes": { + "learned_bits": { + "Exact match on name": 10.75, + "Jaro-Winkler distance of name >= 0.92": 10.29, + "Jaro-Winkler distance of name >= 0.88": 8.7, + "Jaro-Winkler distance of name >= 0.7": 7.07, + "All other comparisons": -6.66 + } + }, + "false": 8353, + "false_on_collisions": 165 + }, + "splink raw p>=0.2": { + "arm": "splink raw p>=0.2", + "seconds": 22.02, + "overall": { + "claimed_pairs": 15628, + "true_pairs": 15171, + "precision": 0.6964, + "recall": 0.7174, + "f1": 0.7067, + "abstentions": 0, + "coverage": 0.7174 + }, + "bcubed": { + "precision": 0.8325, + "recall": 0.8272, + "f1": 0.8299 + }, + "recall_by_stratum": { + "error": { + "true_pairs": 811, + "recall": 0.5709 + }, + "error/truncation": { + "true_pairs": 141, + "recall": 0.766 + }, + "error/typo": { + "true_pairs": 677, + "recall": 0.5303 + }, + "representation": { + "true_pairs": 6096, + "recall": 0.4408 + }, + "representation/alias": { + "true_pairs": 3002, + "recall": 0.0586 + }, + "representation/case_upper": { + "true_pairs": 2847, + "recall": 0.7004 + }, + "representation/diacritic_loss": { + "true_pairs": 157, + "recall": 0.5096 + }, + "representation/spelling": { + "true_pairs": 832, + "recall": 0.6575 + }, + "representation/alias<0.7": { + "true_pairs": 2016, + "recall": 0.0 + } + }, + "entities": { + "clusters": 3408, + "true_entities": 2905, + "false_merge_clusters": 312, + "false_merge_rate": 0.0915, + "false_split_entities": 918, + "false_split_rate": 0.316 + }, + "false_merges_by_what_was_shared": { + "surname_head": 3576, + "nothing_obvious": 1169, + "whole_name": 95 + }, + "blocking": { + "measured": true, + "source": "recomputed from the candidate pairs the arm reported", + "candidate_pairs": 35744, + "recall": 0.8071, + "reduction_ratio": 0.999277, + "pairs_per_record": 3.595 + }, + "notes": { + "learned_bits": { + "Exact match on name": 10.75, + "Jaro-Winkler distance of name >= 0.92": 10.29, + "Jaro-Winkler distance of name >= 0.88": 8.7, + "Jaro-Winkler distance of name >= 0.7": 7.07, + "All other comparisons": -6.66 + } + }, + "false": 4745, + "false_on_collisions": 111 + }, + "splink raw p>=0.3": { + "arm": "splink raw p>=0.3", + "seconds": 22.02, + "overall": { + "claimed_pairs": 9757, + "true_pairs": 15171, + "precision": 0.8246, + "recall": 0.5304, + "f1": 0.6455, + "abstentions": 0, + "coverage": 0.5304 + }, + "bcubed": { + "precision": 0.933, + "recall": 0.7136, + "f1": 0.8086 + }, + "recall_by_stratum": { + "error": { + "true_pairs": 811, + "recall": 0.5598 + }, + "error/truncation": { + "true_pairs": 141, + "recall": 0.7376 + }, + "error/typo": { + "true_pairs": 677, + "recall": 0.5229 + }, + "representation": { + "true_pairs": 6096, + "recall": 0.3141 + }, + "representation/alias": { + "true_pairs": 3002, + "recall": 0.005 + }, + "representation/case_upper": { + "true_pairs": 2847, + "recall": 0.4823 + }, + "representation/diacritic_loss": { + "true_pairs": 157, + "recall": 0.4968 + }, + "representation/spelling": { + "true_pairs": 832, + "recall": 0.6526 + }, + "representation/alias<0.7": { + "true_pairs": 2016, + "recall": 0.0 + } + }, + "entities": { + "clusters": 4624, + "true_entities": 2905, + "false_merge_clusters": 144, + "false_merge_rate": 0.0311, + "false_split_entities": 1361, + "false_split_rate": 0.4685 + }, + "false_merges_by_what_was_shared": { + "surname_head": 1450, + "nothing_obvious": 261, + "whole_name": 90 + }, + "blocking": { + "measured": true, + "source": "recomputed from the candidate pairs the arm reported", + "candidate_pairs": 35744, + "recall": 0.8071, + "reduction_ratio": 0.999277, + "pairs_per_record": 3.595 + }, + "notes": { + "learned_bits": { + "Exact match on name": 10.75, + "Jaro-Winkler distance of name >= 0.92": 10.29, + "Jaro-Winkler distance of name >= 0.88": 8.7, + "Jaro-Winkler distance of name >= 0.7": 7.07, + "All other comparisons": -6.66 + } + }, + "false": 1711, + "false_on_collisions": 102 + }, + "splink raw p>=0.5": { + "arm": "splink raw p>=0.5", + "seconds": 22.02, + "overall": { + "claimed_pairs": 7072, + "true_pairs": 15171, + "precision": 0.8347, + "recall": 0.3891, + "f1": 0.5308, + "abstentions": 0, + "coverage": 0.3891 + }, + "bcubed": { + "precision": 0.9591, + "recall": 0.5729, + "f1": 0.7173 + }, + "recall_by_stratum": { + "error": { + "true_pairs": 811, + "recall": 0.2602 + }, + "error/truncation": { + "true_pairs": 141, + "recall": 0.3121 + }, + "error/typo": { + "true_pairs": 677, + "recall": 0.2526 + }, + "representation": { + "true_pairs": 6096, + "recall": 0.1927 + }, + "representation/alias": { + "true_pairs": 3002, + "recall": 0.0043 + }, + "representation/case_upper": { + "true_pairs": 2847, + "recall": 0.2845 + }, + "representation/diacritic_loss": { + "true_pairs": 157, + "recall": 0.3057 + }, + "representation/spelling": { + "true_pairs": 832, + "recall": 0.4351 + }, + "representation/alias<0.7": { + "true_pairs": 2016, + "recall": 0.0 + } + }, + "entities": { + "clusters": 6104, + "true_entities": 2905, + "false_merge_clusters": 130, + "false_merge_rate": 0.0213, + "false_split_entities": 2037, + "false_split_rate": 0.7012 + }, + "false_merges_by_what_was_shared": { + "surname_head": 962, + "nothing_obvious": 207, + "whole_name": 84 + }, + "blocking": { + "measured": true, + "source": "recomputed from the candidate pairs the arm reported", + "candidate_pairs": 35744, + "recall": 0.8071, + "reduction_ratio": 0.999277, + "pairs_per_record": 3.595 + }, + "notes": { + "learned_bits": { + "Exact match on name": 10.75, + "Jaro-Winkler distance of name >= 0.92": 10.29, + "Jaro-Winkler distance of name >= 0.88": 8.7, + "Jaro-Winkler distance of name >= 0.7": 7.07, + "All other comparisons": -6.66 + } + }, + "false": 1169, + "false_on_collisions": 90 + }, + "splink raw p>=0.9": { + "arm": "splink raw p>=0.9", + "seconds": 22.02, + "overall": { + "claimed_pairs": 0, + "true_pairs": 15171, + "precision": 0.0, + "recall": 0.0, + "f1": 0.0, + "abstentions": 0, + "coverage": 0.0 + }, + "bcubed": { + "precision": 1.0, + "recall": 0.2921, + "f1": 0.4522 + }, + "recall_by_stratum": { + "error": { + "true_pairs": 811, + "recall": 0.0 + }, + "error/truncation": { + "true_pairs": 141, + "recall": 0.0 + }, + "error/typo": { + "true_pairs": 677, + "recall": 0.0 + }, + "representation": { + "true_pairs": 6096, + "recall": 0.0 + }, + "representation/alias": { + "true_pairs": 3002, + "recall": 0.0 + }, + "representation/case_upper": { + "true_pairs": 2847, + "recall": 0.0 + }, + "representation/diacritic_loss": { + "true_pairs": 157, + "recall": 0.0 + }, + "representation/spelling": { + "true_pairs": 832, + "recall": 0.0 + }, + "representation/alias<0.7": { + "true_pairs": 2016, + "recall": 0.0 + } + }, + "entities": { + "clusters": 9944, + "true_entities": 2905, + "false_merge_clusters": 0, + "false_merge_rate": 0.0, + "false_split_entities": 2649, + "false_split_rate": 0.9119 + }, + "false_merges_by_what_was_shared": {}, + "blocking": { + "measured": true, + "source": "recomputed from the candidate pairs the arm reported", + "candidate_pairs": 35744, + "recall": 0.8071, + "reduction_ratio": 0.999277, + "pairs_per_record": 3.595 + }, + "notes": { + "learned_bits": { + "Exact match on name": 10.75, + "Jaro-Winkler distance of name >= 0.92": 10.29, + "Jaro-Winkler distance of name >= 0.88": 8.7, + "Jaro-Winkler distance of name >= 0.7": 7.07, + "All other comparisons": -6.66 + } + }, + "false": 0, + "false_on_collisions": 0 + }, + "splink raw best-F1 (p>=0.15)": { + "arm": "splink raw best-F1 (p>=0.15)", + "seconds": 22.02, + "overall": { + "claimed_pairs": 16544, + "true_pairs": 15171, + "precision": 0.7123, + "recall": 0.7768, + "f1": 0.7432, + "abstentions": 0, + "coverage": 0.7768 + }, + "bcubed": { + "precision": 0.8282, + "recall": 0.8548, + "f1": 0.8413 + }, + "recall_by_stratum": { + "error": { + "true_pairs": 811, + "recall": 0.5709 + }, + "error/truncation": { + "true_pairs": 141, + "recall": 0.766 + }, + "error/typo": { + "true_pairs": 677, + "recall": 0.5303 + }, + "representation": { + "true_pairs": 6096, + "recall": 0.4724 + }, + "representation/alias": { + "true_pairs": 3002, + "recall": 0.0586 + }, + "representation/case_upper": { + "true_pairs": 2847, + "recall": 0.7682 + }, + "representation/diacritic_loss": { + "true_pairs": 157, + "recall": 0.5096 + }, + "representation/spelling": { + "true_pairs": 832, + "recall": 0.6575 + }, + "representation/alias<0.7": { + "true_pairs": 2016, + "recall": 0.0 + } + }, + "entities": { + "clusters": 3217, + "true_entities": 2905, + "false_merge_clusters": 312, + "false_merge_rate": 0.097, + "false_split_entities": 821, + "false_split_rate": 0.2826 + }, + "false_merges_by_what_was_shared": { + "surname_head": 3590, + "nothing_obvious": 1169, + "whole_name": 109 + }, + "blocking": { + "measured": true, + "source": "recomputed from the candidate pairs the arm reported", + "candidate_pairs": 35744, + "recall": 0.8071, + "reduction_ratio": 0.999277, + "pairs_per_record": 3.595 + }, + "notes": { + "learned_bits": { + "Exact match on name": 10.75, + "Jaro-Winkler distance of name >= 0.92": 10.29, + "Jaro-Winkler distance of name >= 0.88": 8.7, + "Jaro-Winkler distance of name >= 0.7": 7.07, + "All other comparisons": -6.66 + }, + "best_threshold": 0.15 + }, + "false": 4759, + "false_on_collisions": 125 + }, + "splink canon/indep p>=0.1": { + "arm": "splink canon/indep p>=0.1", + "seconds": 37.48, + "overall": { + "claimed_pairs": 21077, + "true_pairs": 15171, + "precision": 0.5903, + "recall": 0.8201, + "f1": 0.6865, + "abstentions": 0, + "coverage": 0.8201 + }, + "bcubed": { + "precision": 0.7475, + "recall": 0.8804, + "f1": 0.8085 + }, + "recall_by_stratum": { + "error": { + "true_pairs": 811, + "recall": 0.598 + }, + "error/truncation": { + "true_pairs": 141, + "recall": 0.8298 + }, + "error/typo": { + "true_pairs": 677, + "recall": 0.5495 + }, + "representation": { + "true_pairs": 6096, + "recall": 0.5741 + }, + "representation/alias": { + "true_pairs": 3002, + "recall": 0.2045 + }, + "representation/case_upper": { + "true_pairs": 2847, + "recall": 0.817 + }, + "representation/diacritic_loss": { + "true_pairs": 157, + "recall": 0.5478 + }, + "representation/spelling": { + "true_pairs": 832, + "recall": 0.851 + }, + "representation/alias<0.7": { + "true_pairs": 2016, + "recall": 0.1647 + } + }, + "entities": { + "clusters": 2805, + "true_entities": 2905, + "false_merge_clusters": 318, + "false_merge_rate": 0.1134, + "false_split_entities": 683, + "false_split_rate": 0.2351 + }, + "false_merges_by_what_was_shared": { + "surname_head": 6543, + "nothing_obvious": 2092, + "whole_name": 149 + }, + "blocking": { + "measured": true, + "source": "recomputed from the candidate pairs the arm reported", + "candidate_pairs": 36917, + "recall": 0.8324, + "reduction_ratio": 0.999253, + "pairs_per_record": 3.712 + }, + "notes": { + "learned_bits": { + "Exact match on canonical": 10.69, + "Jaro-Winkler distance of canonical >= 0.92": 10.22, + "Jaro-Winkler distance of canonical >= 0.88": 8.67, + "Jaro-Winkler distance of canonical >= 0.7": 7.06, + "All other comparisons": -6.66 + } + }, + "false": 8635, + "false_on_collisions": 167 + }, + "splink canon/indep p>=0.2": { + "arm": "splink canon/indep p>=0.2", + "seconds": 37.48, + "overall": { + "claimed_pairs": 16167, + "true_pairs": 15171, + "precision": 0.6928, + "recall": 0.7383, + "f1": 0.7148, + "abstentions": 0, + "coverage": 0.7383 + }, + "bcubed": { + "precision": 0.829, + "recall": 0.8425, + "f1": 0.8357 + }, + "recall_by_stratum": { + "error": { + "true_pairs": 811, + "recall": 0.5635 + }, + "error/truncation": { + "true_pairs": 141, + "recall": 0.7092 + }, + "error/typo": { + "true_pairs": 677, + "recall": 0.5332 + }, + "representation": { + "true_pairs": 6096, + "recall": 0.4998 + }, + "representation/alias": { + "true_pairs": 3002, + "recall": 0.1845 + }, + "representation/case_upper": { + "true_pairs": 2847, + "recall": 0.7201 + }, + "representation/diacritic_loss": { + "true_pairs": 157, + "recall": 0.5287 + }, + "representation/spelling": { + "true_pairs": 832, + "recall": 0.6659 + }, + "representation/alias<0.7": { + "true_pairs": 2016, + "recall": 0.1419 + } + }, + "entities": { + "clusters": 3318, + "true_entities": 2905, + "false_merge_clusters": 307, + "false_merge_rate": 0.0925, + "false_split_entities": 831, + "false_split_rate": 0.2861 + }, + "false_merges_by_what_was_shared": { + "surname_head": 3495, + "nothing_obvious": 1472, + "whole_name": 95 + }, + "blocking": { + "measured": true, + "source": "recomputed from the candidate pairs the arm reported", + "candidate_pairs": 36917, + "recall": 0.8324, + "reduction_ratio": 0.999253, + "pairs_per_record": 3.712 + }, + "notes": { + "learned_bits": { + "Exact match on canonical": 10.69, + "Jaro-Winkler distance of canonical >= 0.92": 10.22, + "Jaro-Winkler distance of canonical >= 0.88": 8.67, + "Jaro-Winkler distance of canonical >= 0.7": 7.06, + "All other comparisons": -6.66 + } + }, + "false": 4967, + "false_on_collisions": 112 + }, + "splink canon/indep p>=0.3": { + "arm": "splink canon/indep p>=0.3", + "seconds": 37.48, + "overall": { + "claimed_pairs": 9946, + "true_pairs": 15171, + "precision": 0.8202, + "recall": 0.5377, + "f1": 0.6496, + "abstentions": 0, + "coverage": 0.5377 + }, + "bcubed": { + "precision": 0.9301, + "recall": 0.7197, + "f1": 0.8115 + }, + "recall_by_stratum": { + "error": { + "true_pairs": 811, + "recall": 0.5512 + }, + "error/truncation": { + "true_pairs": 141, + "recall": 0.6738 + }, + "error/typo": { + "true_pairs": 677, + "recall": 0.5258 + }, + "representation": { + "true_pairs": 6096, + "recall": 0.3484 + }, + "representation/alias": { + "true_pairs": 3002, + "recall": 0.0963 + }, + "representation/case_upper": { + "true_pairs": 2847, + "recall": 0.4875 + }, + "representation/diacritic_loss": { + "true_pairs": 157, + "recall": 0.5032 + }, + "representation/spelling": { + "true_pairs": 832, + "recall": 0.6178 + }, + "representation/alias<0.7": { + "true_pairs": 2016, + "recall": 0.0942 + } + }, + "entities": { + "clusters": 4598, + "true_entities": 2905, + "false_merge_clusters": 147, + "false_merge_rate": 0.032, + "false_split_entities": 1318, + "false_split_rate": 0.4537 + }, + "false_merges_by_what_was_shared": { + "surname_head": 1447, + "nothing_obvious": 341, + "whole_name": 89 + }, + "blocking": { + "measured": true, + "source": "recomputed from the candidate pairs the arm reported", + "candidate_pairs": 36917, + "recall": 0.8324, + "reduction_ratio": 0.999253, + "pairs_per_record": 3.712 + }, + "notes": { + "learned_bits": { + "Exact match on canonical": 10.69, + "Jaro-Winkler distance of canonical >= 0.92": 10.22, + "Jaro-Winkler distance of canonical >= 0.88": 8.67, + "Jaro-Winkler distance of canonical >= 0.7": 7.06, + "All other comparisons": -6.66 + } + }, + "false": 1788, + "false_on_collisions": 105 + }, + "splink canon/indep p>=0.5": { + "arm": "splink canon/indep p>=0.5", + "seconds": 37.48, + "overall": { + "claimed_pairs": 7315, + "true_pairs": 15171, + "precision": 0.8349, + "recall": 0.4025, + "f1": 0.5432, + "abstentions": 0, + "coverage": 0.4025 + }, + "bcubed": { + "precision": 0.957, + "recall": 0.5824, + "f1": 0.7241 + }, + "recall_by_stratum": { + "error": { + "true_pairs": 811, + "recall": 0.2589 + }, + "error/truncation": { + "true_pairs": 141, + "recall": 0.2908 + }, + "error/typo": { + "true_pairs": 677, + "recall": 0.2555 + }, + "representation": { + "true_pairs": 6096, + "recall": 0.2265 + }, + "representation/alias": { + "true_pairs": 3002, + "recall": 0.0793 + }, + "representation/case_upper": { + "true_pairs": 2847, + "recall": 0.2947 + }, + "representation/diacritic_loss": { + "true_pairs": 157, + "recall": 0.3057 + }, + "representation/spelling": { + "true_pairs": 832, + "recall": 0.4147 + }, + "representation/alias<0.7": { + "true_pairs": 2016, + "recall": 0.0779 + } + }, + "entities": { + "clusters": 6008, + "true_entities": 2905, + "false_merge_clusters": 138, + "false_merge_rate": 0.023, + "false_split_entities": 2014, + "false_split_rate": 0.6933 + }, + "false_merges_by_what_was_shared": { + "surname_head": 945, + "nothing_obvious": 263, + "whole_name": 84 + }, + "blocking": { + "measured": true, + "source": "recomputed from the candidate pairs the arm reported", + "candidate_pairs": 36917, + "recall": 0.8324, + "reduction_ratio": 0.999253, + "pairs_per_record": 3.712 + }, + "notes": { + "learned_bits": { + "Exact match on canonical": 10.69, + "Jaro-Winkler distance of canonical >= 0.92": 10.22, + "Jaro-Winkler distance of canonical >= 0.88": 8.67, + "Jaro-Winkler distance of canonical >= 0.7": 7.06, + "All other comparisons": -6.66 + } + }, + "false": 1208, + "false_on_collisions": 95 + }, + "splink canon/indep p>=0.9": { + "arm": "splink canon/indep p>=0.9", + "seconds": 37.48, + "overall": { + "claimed_pairs": 0, + "true_pairs": 15171, + "precision": 0.0, + "recall": 0.0, + "f1": 0.0, + "abstentions": 0, + "coverage": 0.0 + }, + "bcubed": { + "precision": 1.0, + "recall": 0.2921, + "f1": 0.4522 + }, + "recall_by_stratum": { + "error": { + "true_pairs": 811, + "recall": 0.0 + }, + "error/truncation": { + "true_pairs": 141, + "recall": 0.0 + }, + "error/typo": { + "true_pairs": 677, + "recall": 0.0 + }, + "representation": { + "true_pairs": 6096, + "recall": 0.0 + }, + "representation/alias": { + "true_pairs": 3002, + "recall": 0.0 + }, + "representation/case_upper": { + "true_pairs": 2847, + "recall": 0.0 + }, + "representation/diacritic_loss": { + "true_pairs": 157, + "recall": 0.0 + }, + "representation/spelling": { + "true_pairs": 832, + "recall": 0.0 + }, + "representation/alias<0.7": { + "true_pairs": 2016, + "recall": 0.0 + } + }, + "entities": { + "clusters": 9944, + "true_entities": 2905, + "false_merge_clusters": 0, + "false_merge_rate": 0.0, + "false_split_entities": 2649, + "false_split_rate": 0.9119 + }, + "false_merges_by_what_was_shared": {}, + "blocking": { + "measured": true, + "source": "recomputed from the candidate pairs the arm reported", + "candidate_pairs": 36917, + "recall": 0.8324, + "reduction_ratio": 0.999253, + "pairs_per_record": 3.712 + }, + "notes": { + "learned_bits": { + "Exact match on canonical": 10.69, + "Jaro-Winkler distance of canonical >= 0.92": 10.22, + "Jaro-Winkler distance of canonical >= 0.88": 8.67, + "Jaro-Winkler distance of canonical >= 0.7": 7.06, + "All other comparisons": -6.66 + } + }, + "false": 0, + "false_on_collisions": 0 + }, + "splink canon/indep best-F1 (p>=0.15)": { + "arm": "splink canon/indep best-F1 (p>=0.15)", + "seconds": 37.48, + "overall": { + "claimed_pairs": 17196, + "true_pairs": 15171, + "precision": 0.7103, + "recall": 0.8052, + "f1": 0.7548, + "abstentions": 0, + "coverage": 0.8052 + }, + "bcubed": { + "precision": 0.8245, + "recall": 0.8733, + "f1": 0.8482 + }, + "recall_by_stratum": { + "error": { + "true_pairs": 811, + "recall": 0.5635 + }, + "error/truncation": { + "true_pairs": 141, + "recall": 0.7092 + }, + "error/typo": { + "true_pairs": 677, + "recall": 0.5332 + }, + "representation": { + "true_pairs": 6096, + "recall": 0.5433 + }, + "representation/alias": { + "true_pairs": 3002, + "recall": 0.2002 + }, + "representation/case_upper": { + "true_pairs": 2847, + "recall": 0.7977 + }, + "representation/diacritic_loss": { + "true_pairs": 157, + "recall": 0.5287 + }, + "representation/spelling": { + "true_pairs": 832, + "recall": 0.6767 + }, + "representation/alias<0.7": { + "true_pairs": 2016, + "recall": 0.1607 + } + }, + "entities": { + "clusters": 3104, + "true_entities": 2905, + "false_merge_clusters": 307, + "false_merge_rate": 0.0989, + "false_split_entities": 724, + "false_split_rate": 0.2492 + }, + "false_merges_by_what_was_shared": { + "surname_head": 3509, + "nothing_obvious": 1472, + "whole_name": 109 + }, + "blocking": { + "measured": true, + "source": "recomputed from the candidate pairs the arm reported", + "candidate_pairs": 36917, + "recall": 0.8324, + "reduction_ratio": 0.999253, + "pairs_per_record": 3.712 + }, + "notes": { + "learned_bits": { + "Exact match on canonical": 10.69, + "Jaro-Winkler distance of canonical >= 0.92": 10.22, + "Jaro-Winkler distance of canonical >= 0.88": 8.67, + "Jaro-Winkler distance of canonical >= 0.7": 7.06, + "All other comparisons": -6.66 + }, + "best_threshold": 0.15 + }, + "false": 4981, + "false_on_collisions": 126 + }, + "splink level/indep p>=0.1": { + "arm": "splink level/indep p>=0.1", + "seconds": 29.57, + "overall": { + "claimed_pairs": 20790, + "true_pairs": 15171, + "precision": 0.5977, + "recall": 0.8191, + "f1": 0.6911, + "abstentions": 0, + "coverage": 0.8191 + }, + "bcubed": { + "precision": 0.7429, + "recall": 0.8806, + "f1": 0.8059 + }, + "recall_by_stratum": { + "error": { + "true_pairs": 811, + "recall": 0.6067 + }, + "error/truncation": { + "true_pairs": 141, + "recall": 0.9007 + }, + "error/typo": { + "true_pairs": 677, + "recall": 0.5451 + }, + "representation": { + "true_pairs": 6096, + "recall": 0.5715 + }, + "representation/alias": { + "true_pairs": 3002, + "recall": 0.1855 + }, + "representation/case_upper": { + "true_pairs": 2847, + "recall": 0.8198 + }, + "representation/diacritic_loss": { + "true_pairs": 157, + "recall": 0.5478 + }, + "representation/spelling": { + "true_pairs": 832, + "recall": 0.8846 + }, + "representation/alias<0.7": { + "true_pairs": 2016, + "recall": 0.1414 + } + }, + "entities": { + "clusters": 2787, + "true_entities": 2905, + "false_merge_clusters": 315, + "false_merge_rate": 0.113, + "false_split_entities": 681, + "false_split_rate": 0.2344 + }, + "false_merges_by_what_was_shared": { + "surname_head": 6726, + "nothing_obvious": 1637, + "whole_name": 149 + }, + "blocking": { + "measured": true, + "source": "recomputed from the candidate pairs the arm reported", + "candidate_pairs": 36111, + "recall": 0.8307, + "reduction_ratio": 0.99927, + "pairs_per_record": 3.631 + }, + "notes": { + "learned_bits": { + "Exact match on name": 10.74, + "Array intersection size >= 1": 10.7, + "Jaro-Winkler distance of name >= 0.92": 10.26, + "Jaro-Winkler distance of name >= 0.88": 8.7, + "Jaro-Winkler distance of name >= 0.7": 7.04, + "All other comparisons": -7.0 + } + }, + "false": 8363, + "false_on_collisions": 171 + }, + "splink level/indep p>=0.2": { + "arm": "splink level/indep p>=0.2", + "seconds": 29.57, + "overall": { + "claimed_pairs": 16062, + "true_pairs": 15171, + "precision": 0.704, + "recall": 0.7453, + "f1": 0.724, + "abstentions": 0, + "coverage": 0.7453 + }, + "bcubed": { + "precision": 0.8263, + "recall": 0.8459, + "f1": 0.836 + }, + "recall_by_stratum": { + "error": { + "true_pairs": 811, + "recall": 0.5709 + }, + "error/truncation": { + "true_pairs": 141, + "recall": 0.766 + }, + "error/typo": { + "true_pairs": 677, + "recall": 0.5303 + }, + "representation": { + "true_pairs": 6096, + "recall": 0.5103 + }, + "representation/alias": { + "true_pairs": 3002, + "recall": 0.1842 + }, + "representation/case_upper": { + "true_pairs": 2847, + "recall": 0.732 + }, + "representation/diacritic_loss": { + "true_pairs": 157, + "recall": 0.5287 + }, + "representation/spelling": { + "true_pairs": 832, + "recall": 0.7103 + }, + "representation/alias<0.7": { + "true_pairs": 2016, + "recall": 0.1414 + } + }, + "entities": { + "clusters": 3286, + "true_entities": 2905, + "false_merge_clusters": 308, + "false_merge_rate": 0.0937, + "false_split_entities": 820, + "false_split_rate": 0.2823 + }, + "false_merges_by_what_was_shared": { + "surname_head": 3577, + "nothing_obvious": 1178, + "whole_name": 95 + }, + "blocking": { + "measured": true, + "source": "recomputed from the candidate pairs the arm reported", + "candidate_pairs": 36111, + "recall": 0.8307, + "reduction_ratio": 0.99927, + "pairs_per_record": 3.631 + }, + "notes": { + "learned_bits": { + "Exact match on name": 10.74, + "Array intersection size >= 1": 10.7, + "Jaro-Winkler distance of name >= 0.92": 10.26, + "Jaro-Winkler distance of name >= 0.88": 8.7, + "Jaro-Winkler distance of name >= 0.7": 7.04, + "All other comparisons": -7.0 + } + }, + "false": 4755, + "false_on_collisions": 117 + }, + "splink level/indep p>=0.3": { + "arm": "splink level/indep p>=0.3", + "seconds": 29.57, + "overall": { + "claimed_pairs": 10217, + "true_pairs": 15171, + "precision": 0.8312, + "recall": 0.5598, + "f1": 0.669, + "abstentions": 0, + "coverage": 0.5598 + }, + "bcubed": { + "precision": 0.9312, + "recall": 0.7364, + "f1": 0.8224 + }, + "recall_by_stratum": { + "error": { + "true_pairs": 811, + "recall": 0.5598 + }, + "error/truncation": { + "true_pairs": 141, + "recall": 0.7376 + }, + "error/typo": { + "true_pairs": 677, + "recall": 0.5229 + }, + "representation": { + "true_pairs": 6096, + "recall": 0.3873 + }, + "representation/alias": { + "true_pairs": 3002, + "recall": 0.1379 + }, + "representation/case_upper": { + "true_pairs": 2847, + "recall": 0.5146 + }, + "representation/diacritic_loss": { + "true_pairs": 157, + "recall": 0.5159 + }, + "representation/spelling": { + "true_pairs": 832, + "recall": 0.7055 + }, + "representation/alias<0.7": { + "true_pairs": 2016, + "recall": 0.1414 + } + }, + "entities": { + "clusters": 4468, + "true_entities": 2905, + "false_merge_clusters": 145, + "false_merge_rate": 0.0325, + "false_split_entities": 1252, + "false_split_rate": 0.431 + }, + "false_merges_by_what_was_shared": { + "surname_head": 1454, + "nothing_obvious": 271, + "whole_name": 90 + }, + "blocking": { + "measured": true, + "source": "recomputed from the candidate pairs the arm reported", + "candidate_pairs": 36111, + "recall": 0.8307, + "reduction_ratio": 0.99927, + "pairs_per_record": 3.631 + }, + "notes": { + "learned_bits": { + "Exact match on name": 10.74, + "Array intersection size >= 1": 10.7, + "Jaro-Winkler distance of name >= 0.92": 10.26, + "Jaro-Winkler distance of name >= 0.88": 8.7, + "Jaro-Winkler distance of name >= 0.7": 7.04, + "All other comparisons": -7.0 + } + }, + "false": 1725, + "false_on_collisions": 112 + }, + "splink level/indep p>=0.5": { + "arm": "splink level/indep p>=0.5", + "seconds": 29.57, + "overall": { + "claimed_pairs": 7246, + "true_pairs": 15171, + "precision": 0.8402, + "recall": 0.4013, + "f1": 0.5432, + "abstentions": 0, + "coverage": 0.4013 + }, + "bcubed": { + "precision": 0.9585, + "recall": 0.5828, + "f1": 0.7248 + }, + "recall_by_stratum": { + "error": { + "true_pairs": 811, + "recall": 0.2602 + }, + "error/truncation": { + "true_pairs": 141, + "recall": 0.3121 + }, + "error/typo": { + "true_pairs": 677, + "recall": 0.2526 + }, + "representation": { + "true_pairs": 6096, + "recall": 0.2241 + }, + "representation/alias": { + "true_pairs": 3002, + "recall": 0.0683 + }, + "representation/case_upper": { + "true_pairs": 2847, + "recall": 0.2922 + }, + "representation/diacritic_loss": { + "true_pairs": 157, + "recall": 0.3057 + }, + "representation/spelling": { + "true_pairs": 832, + "recall": 0.4411 + }, + "representation/alias<0.7": { + "true_pairs": 2016, + "recall": 0.0665 + } + }, + "entities": { + "clusters": 6012, + "true_entities": 2905, + "false_merge_clusters": 132, + "false_merge_rate": 0.022, + "false_split_entities": 2010, + "false_split_rate": 0.6919 + }, + "false_merges_by_what_was_shared": { + "surname_head": 949, + "nothing_obvious": 209, + "whole_name": 68 + }, + "blocking": { + "measured": true, + "source": "recomputed from the candidate pairs the arm reported", + "candidate_pairs": 36111, + "recall": 0.8307, + "reduction_ratio": 0.99927, + "pairs_per_record": 3.631 + }, + "notes": { + "learned_bits": { + "Exact match on name": 10.74, + "Array intersection size >= 1": 10.7, + "Jaro-Winkler distance of name >= 0.92": 10.26, + "Jaro-Winkler distance of name >= 0.88": 8.7, + "Jaro-Winkler distance of name >= 0.7": 7.04, + "All other comparisons": -7.0 + } + }, + "false": 1158, + "false_on_collisions": 79 + }, + "splink level/indep p>=0.9": { + "arm": "splink level/indep p>=0.9", + "seconds": 29.57, + "overall": { + "claimed_pairs": 0, + "true_pairs": 15171, + "precision": 0.0, + "recall": 0.0, + "f1": 0.0, + "abstentions": 0, + "coverage": 0.0 + }, + "bcubed": { + "precision": 1.0, + "recall": 0.2921, + "f1": 0.4522 + }, + "recall_by_stratum": { + "error": { + "true_pairs": 811, + "recall": 0.0 + }, + "error/truncation": { + "true_pairs": 141, + "recall": 0.0 + }, + "error/typo": { + "true_pairs": 677, + "recall": 0.0 + }, + "representation": { + "true_pairs": 6096, + "recall": 0.0 + }, + "representation/alias": { + "true_pairs": 3002, + "recall": 0.0 + }, + "representation/case_upper": { + "true_pairs": 2847, + "recall": 0.0 + }, + "representation/diacritic_loss": { + "true_pairs": 157, + "recall": 0.0 + }, + "representation/spelling": { + "true_pairs": 832, + "recall": 0.0 + }, + "representation/alias<0.7": { + "true_pairs": 2016, + "recall": 0.0 + } + }, + "entities": { + "clusters": 9944, + "true_entities": 2905, + "false_merge_clusters": 0, + "false_merge_rate": 0.0, + "false_split_entities": 2649, + "false_split_rate": 0.9119 + }, + "false_merges_by_what_was_shared": {}, + "blocking": { + "measured": true, + "source": "recomputed from the candidate pairs the arm reported", + "candidate_pairs": 36111, + "recall": 0.8307, + "reduction_ratio": 0.99927, + "pairs_per_record": 3.631 + }, + "notes": { + "learned_bits": { + "Exact match on name": 10.74, + "Array intersection size >= 1": 10.7, + "Jaro-Winkler distance of name >= 0.92": 10.26, + "Jaro-Winkler distance of name >= 0.88": 8.7, + "Jaro-Winkler distance of name >= 0.7": 7.04, + "All other comparisons": -7.0 + } + }, + "false": 0, + "false_on_collisions": 0 + }, + "splink level/indep best-F1 (p>=0.15)": { + "arm": "splink level/indep best-F1 (p>=0.15)", + "seconds": 29.57, + "overall": { + "claimed_pairs": 16978, + "true_pairs": 15171, + "precision": 0.7191, + "recall": 0.8048, + "f1": 0.7595, + "abstentions": 0, + "coverage": 0.8048 + }, + "bcubed": { + "precision": 0.822, + "recall": 0.8735, + "f1": 0.847 + }, + "recall_by_stratum": { + "error": { + "true_pairs": 811, + "recall": 0.5709 + }, + "error/truncation": { + "true_pairs": 141, + "recall": 0.766 + }, + "error/typo": { + "true_pairs": 677, + "recall": 0.5303 + }, + "representation": { + "true_pairs": 6096, + "recall": 0.542 + }, + "representation/alias": { + "true_pairs": 3002, + "recall": 0.1842 + }, + "representation/case_upper": { + "true_pairs": 2847, + "recall": 0.7998 + }, + "representation/diacritic_loss": { + "true_pairs": 157, + "recall": 0.5287 + }, + "representation/spelling": { + "true_pairs": 832, + "recall": 0.7103 + }, + "representation/alias<0.7": { + "true_pairs": 2016, + "recall": 0.1414 + } + }, + "entities": { + "clusters": 3095, + "true_entities": 2905, + "false_merge_clusters": 308, + "false_merge_rate": 0.0995, + "false_split_entities": 723, + "false_split_rate": 0.2489 + }, + "false_merges_by_what_was_shared": { + "surname_head": 3591, + "nothing_obvious": 1178, + "whole_name": 109 + }, + "blocking": { + "measured": true, + "source": "recomputed from the candidate pairs the arm reported", + "candidate_pairs": 36111, + "recall": 0.8307, + "reduction_ratio": 0.99927, + "pairs_per_record": 3.631 + }, + "notes": { + "learned_bits": { + "Exact match on name": 10.74, + "Array intersection size >= 1": 10.7, + "Jaro-Winkler distance of name >= 0.92": 10.26, + "Jaro-Winkler distance of name >= 0.88": 8.7, + "Jaro-Winkler distance of name >= 0.7": 7.04, + "All other comparisons": -7.0 + }, + "best_threshold": 0.15 + }, + "false": 4769, + "false_on_collisions": 131 + }, + "splink both/indep p>=0.1": { + "arm": "splink both/indep p>=0.1", + "seconds": 40.27, + "overall": { + "claimed_pairs": 21077, + "true_pairs": 15171, + "precision": 0.5903, + "recall": 0.8201, + "f1": 0.6865, + "abstentions": 0, + "coverage": 0.8201 + }, + "bcubed": { + "precision": 0.7475, + "recall": 0.8804, + "f1": 0.8085 + }, + "recall_by_stratum": { + "error": { + "true_pairs": 811, + "recall": 0.598 + }, + "error/truncation": { + "true_pairs": 141, + "recall": 0.8298 + }, + "error/typo": { + "true_pairs": 677, + "recall": 0.5495 + }, + "representation": { + "true_pairs": 6096, + "recall": 0.5741 + }, + "representation/alias": { + "true_pairs": 3002, + "recall": 0.2045 + }, + "representation/case_upper": { + "true_pairs": 2847, + "recall": 0.817 + }, + "representation/diacritic_loss": { + "true_pairs": 157, + "recall": 0.5478 + }, + "representation/spelling": { + "true_pairs": 832, + "recall": 0.851 + }, + "representation/alias<0.7": { + "true_pairs": 2016, + "recall": 0.1647 + } + }, + "entities": { + "clusters": 2805, + "true_entities": 2905, + "false_merge_clusters": 318, + "false_merge_rate": 0.1134, + "false_split_entities": 683, + "false_split_rate": 0.2351 + }, + "false_merges_by_what_was_shared": { + "surname_head": 6543, + "nothing_obvious": 2092, + "whole_name": 149 + }, + "blocking": { + "measured": true, + "source": "recomputed from the candidate pairs the arm reported", + "candidate_pairs": 36917, + "recall": 0.8324, + "reduction_ratio": 0.999253, + "pairs_per_record": 3.712 + }, + "notes": { + "learned_bits": { + "Exact match on canonical": 10.7, + "Jaro-Winkler distance of canonical >= 0.92": 10.22, + "Jaro-Winkler distance of canonical >= 0.88": 8.67, + "Jaro-Winkler distance of canonical >= 0.7": 7.07, + "All other comparisons": -6.98 + } + }, + "false": 8635, + "false_on_collisions": 167 + }, + "splink both/indep p>=0.2": { + "arm": "splink both/indep p>=0.2", + "seconds": 40.27, + "overall": { + "claimed_pairs": 16167, + "true_pairs": 15171, + "precision": 0.6928, + "recall": 0.7383, + "f1": 0.7148, + "abstentions": 0, + "coverage": 0.7383 + }, + "bcubed": { + "precision": 0.829, + "recall": 0.8425, + "f1": 0.8357 + }, + "recall_by_stratum": { + "error": { + "true_pairs": 811, + "recall": 0.5635 + }, + "error/truncation": { + "true_pairs": 141, + "recall": 0.7092 + }, + "error/typo": { + "true_pairs": 677, + "recall": 0.5332 + }, + "representation": { + "true_pairs": 6096, + "recall": 0.4998 + }, + "representation/alias": { + "true_pairs": 3002, + "recall": 0.1845 + }, + "representation/case_upper": { + "true_pairs": 2847, + "recall": 0.7201 + }, + "representation/diacritic_loss": { + "true_pairs": 157, + "recall": 0.5287 + }, + "representation/spelling": { + "true_pairs": 832, + "recall": 0.6659 + }, + "representation/alias<0.7": { + "true_pairs": 2016, + "recall": 0.1419 + } + }, + "entities": { + "clusters": 3318, + "true_entities": 2905, + "false_merge_clusters": 307, + "false_merge_rate": 0.0925, + "false_split_entities": 831, + "false_split_rate": 0.2861 + }, + "false_merges_by_what_was_shared": { + "surname_head": 3495, + "nothing_obvious": 1472, + "whole_name": 95 + }, + "blocking": { + "measured": true, + "source": "recomputed from the candidate pairs the arm reported", + "candidate_pairs": 36917, + "recall": 0.8324, + "reduction_ratio": 0.999253, + "pairs_per_record": 3.712 + }, + "notes": { + "learned_bits": { + "Exact match on canonical": 10.7, + "Jaro-Winkler distance of canonical >= 0.92": 10.22, + "Jaro-Winkler distance of canonical >= 0.88": 8.67, + "Jaro-Winkler distance of canonical >= 0.7": 7.07, + "All other comparisons": -6.98 + } + }, + "false": 4967, + "false_on_collisions": 112 + }, + "splink both/indep p>=0.3": { + "arm": "splink both/indep p>=0.3", + "seconds": 40.27, + "overall": { + "claimed_pairs": 9946, + "true_pairs": 15171, + "precision": 0.8202, + "recall": 0.5377, + "f1": 0.6496, + "abstentions": 0, + "coverage": 0.5377 + }, + "bcubed": { + "precision": 0.9301, + "recall": 0.7197, + "f1": 0.8115 + }, + "recall_by_stratum": { + "error": { + "true_pairs": 811, + "recall": 0.5512 + }, + "error/truncation": { + "true_pairs": 141, + "recall": 0.6738 + }, + "error/typo": { + "true_pairs": 677, + "recall": 0.5258 + }, + "representation": { + "true_pairs": 6096, + "recall": 0.3484 + }, + "representation/alias": { + "true_pairs": 3002, + "recall": 0.0963 + }, + "representation/case_upper": { + "true_pairs": 2847, + "recall": 0.4875 + }, + "representation/diacritic_loss": { + "true_pairs": 157, + "recall": 0.5032 + }, + "representation/spelling": { + "true_pairs": 832, + "recall": 0.6178 + }, + "representation/alias<0.7": { + "true_pairs": 2016, + "recall": 0.0942 + } + }, + "entities": { + "clusters": 4598, + "true_entities": 2905, + "false_merge_clusters": 147, + "false_merge_rate": 0.032, + "false_split_entities": 1318, + "false_split_rate": 0.4537 + }, + "false_merges_by_what_was_shared": { + "surname_head": 1447, + "nothing_obvious": 341, + "whole_name": 89 + }, + "blocking": { + "measured": true, + "source": "recomputed from the candidate pairs the arm reported", + "candidate_pairs": 36917, + "recall": 0.8324, + "reduction_ratio": 0.999253, + "pairs_per_record": 3.712 + }, + "notes": { + "learned_bits": { + "Exact match on canonical": 10.7, + "Jaro-Winkler distance of canonical >= 0.92": 10.22, + "Jaro-Winkler distance of canonical >= 0.88": 8.67, + "Jaro-Winkler distance of canonical >= 0.7": 7.07, + "All other comparisons": -6.98 + } + }, + "false": 1788, + "false_on_collisions": 105 + }, + "splink both/indep p>=0.5": { + "arm": "splink both/indep p>=0.5", + "seconds": 40.27, + "overall": { + "claimed_pairs": 7315, + "true_pairs": 15171, + "precision": 0.8349, + "recall": 0.4025, + "f1": 0.5432, + "abstentions": 0, + "coverage": 0.4025 + }, + "bcubed": { + "precision": 0.957, + "recall": 0.5824, + "f1": 0.7241 + }, + "recall_by_stratum": { + "error": { + "true_pairs": 811, + "recall": 0.2589 + }, + "error/truncation": { + "true_pairs": 141, + "recall": 0.2908 + }, + "error/typo": { + "true_pairs": 677, + "recall": 0.2555 + }, + "representation": { + "true_pairs": 6096, + "recall": 0.2265 + }, + "representation/alias": { + "true_pairs": 3002, + "recall": 0.0793 + }, + "representation/case_upper": { + "true_pairs": 2847, + "recall": 0.2947 + }, + "representation/diacritic_loss": { + "true_pairs": 157, + "recall": 0.3057 + }, + "representation/spelling": { + "true_pairs": 832, + "recall": 0.4147 + }, + "representation/alias<0.7": { + "true_pairs": 2016, + "recall": 0.0779 + } + }, + "entities": { + "clusters": 6008, + "true_entities": 2905, + "false_merge_clusters": 138, + "false_merge_rate": 0.023, + "false_split_entities": 2014, + "false_split_rate": 0.6933 + }, + "false_merges_by_what_was_shared": { + "surname_head": 945, + "nothing_obvious": 263, + "whole_name": 84 + }, + "blocking": { + "measured": true, + "source": "recomputed from the candidate pairs the arm reported", + "candidate_pairs": 36917, + "recall": 0.8324, + "reduction_ratio": 0.999253, + "pairs_per_record": 3.712 + }, + "notes": { + "learned_bits": { + "Exact match on canonical": 10.7, + "Jaro-Winkler distance of canonical >= 0.92": 10.22, + "Jaro-Winkler distance of canonical >= 0.88": 8.67, + "Jaro-Winkler distance of canonical >= 0.7": 7.07, + "All other comparisons": -6.98 + } + }, + "false": 1208, + "false_on_collisions": 95 + }, + "splink both/indep p>=0.9": { + "arm": "splink both/indep p>=0.9", + "seconds": 40.27, + "overall": { + "claimed_pairs": 0, + "true_pairs": 15171, + "precision": 0.0, + "recall": 0.0, + "f1": 0.0, + "abstentions": 0, + "coverage": 0.0 + }, + "bcubed": { + "precision": 1.0, + "recall": 0.2921, + "f1": 0.4522 + }, + "recall_by_stratum": { + "error": { + "true_pairs": 811, + "recall": 0.0 + }, + "error/truncation": { + "true_pairs": 141, + "recall": 0.0 + }, + "error/typo": { + "true_pairs": 677, + "recall": 0.0 + }, + "representation": { + "true_pairs": 6096, + "recall": 0.0 + }, + "representation/alias": { + "true_pairs": 3002, + "recall": 0.0 + }, + "representation/case_upper": { + "true_pairs": 2847, + "recall": 0.0 + }, + "representation/diacritic_loss": { + "true_pairs": 157, + "recall": 0.0 + }, + "representation/spelling": { + "true_pairs": 832, + "recall": 0.0 + }, + "representation/alias<0.7": { + "true_pairs": 2016, + "recall": 0.0 + } + }, + "entities": { + "clusters": 9944, + "true_entities": 2905, + "false_merge_clusters": 0, + "false_merge_rate": 0.0, + "false_split_entities": 2649, + "false_split_rate": 0.9119 + }, + "false_merges_by_what_was_shared": {}, + "blocking": { + "measured": true, + "source": "recomputed from the candidate pairs the arm reported", + "candidate_pairs": 36917, + "recall": 0.8324, + "reduction_ratio": 0.999253, + "pairs_per_record": 3.712 + }, + "notes": { + "learned_bits": { + "Exact match on canonical": 10.7, + "Jaro-Winkler distance of canonical >= 0.92": 10.22, + "Jaro-Winkler distance of canonical >= 0.88": 8.67, + "Jaro-Winkler distance of canonical >= 0.7": 7.07, + "All other comparisons": -6.98 + } + }, + "false": 0, + "false_on_collisions": 0 + }, + "splink both/indep best-F1 (p>=0.15)": { + "arm": "splink both/indep best-F1 (p>=0.15)", + "seconds": 40.27, + "overall": { + "claimed_pairs": 17196, + "true_pairs": 15171, + "precision": 0.7103, + "recall": 0.8052, + "f1": 0.7548, + "abstentions": 0, + "coverage": 0.8052 + }, + "bcubed": { + "precision": 0.8245, + "recall": 0.8733, + "f1": 0.8482 + }, + "recall_by_stratum": { + "error": { + "true_pairs": 811, + "recall": 0.5635 + }, + "error/truncation": { + "true_pairs": 141, + "recall": 0.7092 + }, + "error/typo": { + "true_pairs": 677, + "recall": 0.5332 + }, + "representation": { + "true_pairs": 6096, + "recall": 0.5433 + }, + "representation/alias": { + "true_pairs": 3002, + "recall": 0.2002 + }, + "representation/case_upper": { + "true_pairs": 2847, + "recall": 0.7977 + }, + "representation/diacritic_loss": { + "true_pairs": 157, + "recall": 0.5287 + }, + "representation/spelling": { + "true_pairs": 832, + "recall": 0.6767 + }, + "representation/alias<0.7": { + "true_pairs": 2016, + "recall": 0.1607 + } + }, + "entities": { + "clusters": 3104, + "true_entities": 2905, + "false_merge_clusters": 307, + "false_merge_rate": 0.0989, + "false_split_entities": 724, + "false_split_rate": 0.2492 + }, + "false_merges_by_what_was_shared": { + "surname_head": 3509, + "nothing_obvious": 1472, + "whole_name": 109 + }, + "blocking": { + "measured": true, + "source": "recomputed from the candidate pairs the arm reported", + "candidate_pairs": 36917, + "recall": 0.8324, + "reduction_ratio": 0.999253, + "pairs_per_record": 3.712 + }, + "notes": { + "learned_bits": { + "Exact match on canonical": 10.7, + "Jaro-Winkler distance of canonical >= 0.92": 10.22, + "Jaro-Winkler distance of canonical >= 0.88": 8.67, + "Jaro-Winkler distance of canonical >= 0.7": 7.07, + "All other comparisons": -6.98 + }, + "best_threshold": 0.15 + }, + "false": 4981, + "false_on_collisions": 126 + }, + "splink canon/oracle p>=0.1": { + "arm": "splink canon/oracle p>=0.1", + "seconds": 18.46, + "overall": { + "claimed_pairs": 23581, + "true_pairs": 15171, + "precision": 0.6434, + "recall": 1.0, + "f1": 0.783, + "abstentions": 0, + "coverage": 1.0 + }, + "bcubed": { + "precision": 0.7593, + "recall": 1.0, + "f1": 0.8632 + }, + "recall_by_stratum": { + "error": { + "true_pairs": 811, + "recall": 1.0 + }, + "error/truncation": { + "true_pairs": 141, + "recall": 1.0 + }, + "error/typo": { + "true_pairs": 677, + "recall": 1.0 + }, + "representation": { + "true_pairs": 6096, + "recall": 1.0 + }, + "representation/alias": { + "true_pairs": 3002, + "recall": 1.0 + }, + "representation/case_upper": { + "true_pairs": 2847, + "recall": 1.0 + }, + "representation/diacritic_loss": { + "true_pairs": 157, + "recall": 1.0 + }, + "representation/spelling": { + "true_pairs": 832, + "recall": 1.0 + }, + "representation/alias<0.7": { + "true_pairs": 2016, + "recall": 1.0 + } + }, + "entities": { + "clusters": 2186, + "true_entities": 2905, + "false_merge_clusters": 285, + "false_merge_rate": 0.1304, + "false_split_entities": 0, + "false_split_rate": 0.0 + }, + "false_merges_by_what_was_shared": { + "surname_head": 5910, + "nothing_obvious": 2500, + "whole_name": 149 + }, + "blocking": { + "measured": true, + "source": "recomputed from the candidate pairs the arm reported", + "candidate_pairs": 39054, + "recall": 1.0, + "reduction_ratio": 0.99921, + "pairs_per_record": 3.927 + }, + "notes": { + "learned_bits": { + "Exact match on canonical": 10.68, + "Jaro-Winkler distance of canonical >= 0.92": 8.9, + "Jaro-Winkler distance of canonical >= 0.88": 8.01, + "Jaro-Winkler distance of canonical >= 0.7": 6.67, + "All other comparisons": -6.26 + } + }, + "false": 8410, + "false_on_collisions": 270 + }, + "splink canon/oracle p>=0.2": { + "arm": "splink canon/oracle p>=0.2", + "seconds": 18.46, + "overall": { + "claimed_pairs": 19542, + "true_pairs": 15171, + "precision": 0.7763, + "recall": 1.0, + "f1": 0.8741, + "abstentions": 0, + "coverage": 1.0 + }, + "bcubed": { + "precision": 0.8461, + "recall": 1.0, + "f1": 0.9166 + }, + "recall_by_stratum": { + "error": { + "true_pairs": 811, + "recall": 1.0 + }, + "error/truncation": { + "true_pairs": 141, + "recall": 1.0 + }, + "error/typo": { + "true_pairs": 677, + "recall": 1.0 + }, + "representation": { + "true_pairs": 6096, + "recall": 1.0 + }, + "representation/alias": { + "true_pairs": 3002, + "recall": 1.0 + }, + "representation/case_upper": { + "true_pairs": 2847, + "recall": 1.0 + }, + "representation/diacritic_loss": { + "true_pairs": 157, + "recall": 1.0 + }, + "representation/spelling": { + "true_pairs": 832, + "recall": 1.0 + }, + "representation/alias<0.7": { + "true_pairs": 2016, + "recall": 1.0 + } + }, + "entities": { + "clusters": 2446, + "true_entities": 2905, + "false_merge_clusters": 292, + "false_merge_rate": 0.1194, + "false_split_entities": 0, + "false_split_rate": 0.0 + }, + "false_merges_by_what_was_shared": { + "surname_head": 2745, + "nothing_obvious": 1626, + "whole_name": 149 + }, + "blocking": { + "measured": true, + "source": "recomputed from the candidate pairs the arm reported", + "candidate_pairs": 39054, + "recall": 1.0, + "reduction_ratio": 0.99921, + "pairs_per_record": 3.927 + }, + "notes": { + "learned_bits": { + "Exact match on canonical": 10.68, + "Jaro-Winkler distance of canonical >= 0.92": 8.9, + "Jaro-Winkler distance of canonical >= 0.88": 8.01, + "Jaro-Winkler distance of canonical >= 0.7": 6.67, + "All other comparisons": -6.26 + } + }, + "false": 4371, + "false_on_collisions": 264 + }, + "splink canon/oracle p>=0.3": { + "arm": "splink canon/oracle p>=0.3", + "seconds": 18.46, + "overall": { + "claimed_pairs": 15790, + "true_pairs": 15171, + "precision": 0.9253, + "recall": 0.963, + "f1": 0.9438, + "abstentions": 0, + "coverage": 0.963 + }, + "bcubed": { + "precision": 0.9489, + "recall": 0.9827, + "f1": 0.9655 + }, + "recall_by_stratum": { + "error": { + "true_pairs": 811, + "recall": 0.9519 + }, + "error/truncation": { + "true_pairs": 141, + "recall": 0.9504 + }, + "error/typo": { + "true_pairs": 677, + "recall": 0.9527 + }, + "representation": { + "true_pairs": 6096, + "recall": 0.9528 + }, + "representation/alias": { + "true_pairs": 3002, + "recall": 0.9427 + }, + "representation/case_upper": { + "true_pairs": 2847, + "recall": 0.9501 + }, + "representation/diacritic_loss": { + "true_pairs": 157, + "recall": 0.9745 + }, + "representation/spelling": { + "true_pairs": 832, + "recall": 0.9627 + }, + "representation/alias<0.7": { + "true_pairs": 2016, + "recall": 0.9439 + } + }, + "entities": { + "clusters": 2864, + "true_entities": 2905, + "false_merge_clusters": 123, + "false_merge_rate": 0.0429, + "false_split_entities": 60, + "false_split_rate": 0.0207 + }, + "false_merges_by_what_was_shared": { + "surname_head": 889, + "nothing_obvious": 291, + "whole_name": 94 + }, + "blocking": { + "measured": true, + "source": "recomputed from the candidate pairs the arm reported", + "candidate_pairs": 39054, + "recall": 1.0, + "reduction_ratio": 0.99921, + "pairs_per_record": 3.927 + }, + "notes": { + "learned_bits": { + "Exact match on canonical": 10.68, + "Jaro-Winkler distance of canonical >= 0.92": 8.9, + "Jaro-Winkler distance of canonical >= 0.88": 8.01, + "Jaro-Winkler distance of canonical >= 0.7": 6.67, + "All other comparisons": -6.26 + } + }, + "false": 1180, + "false_on_collisions": 159 + }, + "splink canon/oracle p>=0.5": { + "arm": "splink canon/oracle p>=0.5", + "seconds": 18.46, + "overall": { + "claimed_pairs": 8899, + "true_pairs": 15171, + "precision": 0.8693, + "recall": 0.5099, + "f1": 0.6428, + "abstentions": 0, + "coverage": 0.5099 + }, + "bcubed": { + "precision": 0.9605, + "recall": 0.6719, + "f1": 0.7907 + }, + "recall_by_stratum": { + "error": { + "true_pairs": 811, + "recall": 0.4562 + }, + "error/truncation": { + "true_pairs": 141, + "recall": 0.3901 + }, + "error/typo": { + "true_pairs": 677, + "recall": 0.4727 + }, + "representation": { + "true_pairs": 6096, + "recall": 0.4588 + }, + "representation/alias": { + "true_pairs": 3002, + "recall": 0.4943 + }, + "representation/case_upper": { + "true_pairs": 2847, + "recall": 0.3871 + }, + "representation/diacritic_loss": { + "true_pairs": 157, + "recall": 0.5032 + }, + "representation/spelling": { + "true_pairs": 832, + "recall": 0.506 + }, + "representation/alias<0.7": { + "true_pairs": 2016, + "recall": 0.4807 + } + }, + "entities": { + "clusters": 5212, + "true_entities": 2905, + "false_merge_clusters": 123, + "false_merge_rate": 0.0236, + "false_split_entities": 1552, + "false_split_rate": 0.5343 + }, + "false_merges_by_what_was_shared": { + "surname_head": 879, + "nothing_obvious": 284, + "whole_name": 84 + }, + "blocking": { + "measured": true, + "source": "recomputed from the candidate pairs the arm reported", + "candidate_pairs": 39054, + "recall": 1.0, + "reduction_ratio": 0.99921, + "pairs_per_record": 3.927 + }, + "notes": { + "learned_bits": { + "Exact match on canonical": 10.68, + "Jaro-Winkler distance of canonical >= 0.92": 8.9, + "Jaro-Winkler distance of canonical >= 0.88": 8.01, + "Jaro-Winkler distance of canonical >= 0.7": 6.67, + "All other comparisons": -6.26 + } + }, + "false": 1163, + "false_on_collisions": 142 + }, + "splink canon/oracle p>=0.9": { + "arm": "splink canon/oracle p>=0.9", + "seconds": 18.46, + "overall": { + "claimed_pairs": 347, + "true_pairs": 15171, + "precision": 1.0, + "recall": 0.0229, + "f1": 0.0447, + "abstentions": 0, + "coverage": 0.0229 + }, + "bcubed": { + "precision": 1.0, + "recall": 0.327, + "f1": 0.4929 + }, + "recall_by_stratum": { + "error": { + "true_pairs": 811, + "recall": 0.021 + }, + "error/truncation": { + "true_pairs": 141, + "recall": 0.0071 + }, + "error/typo": { + "true_pairs": 677, + "recall": 0.0236 + }, + "representation": { + "true_pairs": 6096, + "recall": 0.0187 + }, + "representation/alias": { + "true_pairs": 3002, + "recall": 0.0187 + }, + "representation/case_upper": { + "true_pairs": 2847, + "recall": 0.0162 + }, + "representation/diacritic_loss": { + "true_pairs": 157, + "recall": 0.0255 + }, + "representation/spelling": { + "true_pairs": 832, + "recall": 0.024 + }, + "representation/alias<0.7": { + "true_pairs": 2016, + "recall": 0.0203 + } + }, + "entities": { + "clusters": 9597, + "true_entities": 2905, + "false_merge_clusters": 0, + "false_merge_rate": 0.0, + "false_split_entities": 2302, + "false_split_rate": 0.7924 + }, + "false_merges_by_what_was_shared": {}, + "blocking": { + "measured": true, + "source": "recomputed from the candidate pairs the arm reported", + "candidate_pairs": 39054, + "recall": 1.0, + "reduction_ratio": 0.99921, + "pairs_per_record": 3.927 + }, + "notes": { + "learned_bits": { + "Exact match on canonical": 10.68, + "Jaro-Winkler distance of canonical >= 0.92": 8.9, + "Jaro-Winkler distance of canonical >= 0.88": 8.01, + "Jaro-Winkler distance of canonical >= 0.7": 6.67, + "All other comparisons": -6.26 + } + }, + "false": 0, + "false_on_collisions": 0 + }, + "splink canon/oracle best-F1 (p>=0.30)": { + "arm": "splink canon/oracle best-F1 (p>=0.30)", + "seconds": 18.46, + "overall": { + "claimed_pairs": 15790, + "true_pairs": 15171, + "precision": 0.9253, + "recall": 0.963, + "f1": 0.9438, + "abstentions": 0, + "coverage": 0.963 + }, + "bcubed": { + "precision": 0.9489, + "recall": 0.9827, + "f1": 0.9655 + }, + "recall_by_stratum": { + "error": { + "true_pairs": 811, + "recall": 0.9519 + }, + "error/truncation": { + "true_pairs": 141, + "recall": 0.9504 + }, + "error/typo": { + "true_pairs": 677, + "recall": 0.9527 + }, + "representation": { + "true_pairs": 6096, + "recall": 0.9528 + }, + "representation/alias": { + "true_pairs": 3002, + "recall": 0.9427 + }, + "representation/case_upper": { + "true_pairs": 2847, + "recall": 0.9501 + }, + "representation/diacritic_loss": { + "true_pairs": 157, + "recall": 0.9745 + }, + "representation/spelling": { + "true_pairs": 832, + "recall": 0.9627 + }, + "representation/alias<0.7": { + "true_pairs": 2016, + "recall": 0.9439 + } + }, + "entities": { + "clusters": 2864, + "true_entities": 2905, + "false_merge_clusters": 123, + "false_merge_rate": 0.0429, + "false_split_entities": 60, + "false_split_rate": 0.0207 + }, + "false_merges_by_what_was_shared": { + "surname_head": 889, + "nothing_obvious": 291, + "whole_name": 94 + }, + "blocking": { + "measured": true, + "source": "recomputed from the candidate pairs the arm reported", + "candidate_pairs": 39054, + "recall": 1.0, + "reduction_ratio": 0.99921, + "pairs_per_record": 3.927 + }, + "notes": { + "learned_bits": { + "Exact match on canonical": 10.68, + "Jaro-Winkler distance of canonical >= 0.92": 8.9, + "Jaro-Winkler distance of canonical >= 0.88": 8.01, + "Jaro-Winkler distance of canonical >= 0.7": 6.67, + "All other comparisons": -6.26 + }, + "best_threshold": 0.3 + }, + "false": 1180, + "false_on_collisions": 159 + }, + "splink level/oracle p>=0.1": { + "arm": "splink level/oracle p>=0.1", + "seconds": 39.3, + "overall": { + "claimed_pairs": 20073, + "true_pairs": 15171, + "precision": 0.7558, + "recall": 1.0, + "f1": 0.8609, + "abstentions": 0, + "coverage": 1.0 + }, + "bcubed": { + "precision": 0.7934, + "recall": 1.0, + "f1": 0.8848 + }, + "recall_by_stratum": { + "error": { + "true_pairs": 811, + "recall": 1.0 + }, + "error/truncation": { + "true_pairs": 141, + "recall": 1.0 + }, + "error/typo": { + "true_pairs": 677, + "recall": 1.0 + }, + "representation": { + "true_pairs": 6096, + "recall": 1.0 + }, + "representation/alias": { + "true_pairs": 3002, + "recall": 1.0 + }, + "representation/case_upper": { + "true_pairs": 2847, + "recall": 1.0 + }, + "representation/diacritic_loss": { + "true_pairs": 157, + "recall": 1.0 + }, + "representation/spelling": { + "true_pairs": 832, + "recall": 1.0 + }, + "representation/alias<0.7": { + "true_pairs": 2016, + "recall": 1.0 + } + }, + "entities": { + "clusters": 2308, + "true_entities": 2905, + "false_merge_clusters": 293, + "false_merge_rate": 0.1269, + "false_split_entities": 0, + "false_split_rate": 0.0 + }, + "false_merges_by_what_was_shared": { + "surname_head": 3634, + "nothing_obvious": 1268, + "whole_name": 149 + }, + "blocking": { + "measured": true, + "source": "recomputed from the candidate pairs the arm reported", + "candidate_pairs": 38770, + "recall": 1.0, + "reduction_ratio": 0.999216, + "pairs_per_record": 3.899 + }, + "notes": { + "learned_bits": { + "Exact match on name": 10.63, + "Array intersection size >= 1": 10.7, + "Jaro-Winkler distance of name >= 0.92": 9.27, + "Jaro-Winkler distance of name >= 0.88": 8.25, + "Jaro-Winkler distance of name >= 0.7": 6.86, + "All other comparisons": -7.1 + } + }, + "false": 4902, + "false_on_collisions": 264 + }, + "splink level/oracle p>=0.2": { + "arm": "splink level/oracle p>=0.2", + "seconds": 39.3, + "overall": { + "claimed_pairs": 17177, + "true_pairs": 15171, + "precision": 0.7483, + "recall": 0.8473, + "f1": 0.7947, + "abstentions": 0, + "coverage": 0.8473 + }, + "bcubed": { + "precision": 0.8259, + "recall": 0.925, + "f1": 0.8727 + }, + "recall_by_stratum": { + "error": { + "true_pairs": 811, + "recall": 1.0 + }, + "error/truncation": { + "true_pairs": 141, + "recall": 1.0 + }, + "error/typo": { + "true_pairs": 677, + "recall": 1.0 + }, + "representation": { + "true_pairs": 6096, + "recall": 0.9183 + }, + "representation/alias": { + "true_pairs": 3002, + "recall": 1.0 + }, + "representation/case_upper": { + "true_pairs": 2847, + "recall": 0.8251 + }, + "representation/diacritic_loss": { + "true_pairs": 157, + "recall": 1.0 + }, + "representation/spelling": { + "true_pairs": 832, + "recall": 1.0 + }, + "representation/alias<0.7": { + "true_pairs": 2016, + "recall": 1.0 + } + }, + "entities": { + "clusters": 2902, + "true_entities": 2905, + "false_merge_clusters": 303, + "false_merge_rate": 0.1044, + "false_split_entities": 285, + "false_split_rate": 0.0981 + }, + "false_merges_by_what_was_shared": { + "surname_head": 3109, + "nothing_obvious": 1214, + "whole_name": 95 + }, + "blocking": { + "measured": true, + "source": "recomputed from the candidate pairs the arm reported", + "candidate_pairs": 38770, + "recall": 1.0, + "reduction_ratio": 0.999216, + "pairs_per_record": 3.899 + }, + "notes": { + "learned_bits": { + "Exact match on name": 10.63, + "Array intersection size >= 1": 10.7, + "Jaro-Winkler distance of name >= 0.92": 9.27, + "Jaro-Winkler distance of name >= 0.88": 8.25, + "Jaro-Winkler distance of name >= 0.7": 6.86, + "All other comparisons": -7.1 + } + }, + "false": 4323, + "false_on_collisions": 209 + }, + "splink level/oracle p>=0.3": { + "arm": "splink level/oracle p>=0.3", + "seconds": 39.3, + "overall": { + "claimed_pairs": 11670, + "true_pairs": 15171, + "precision": 0.8896, + "recall": 0.6843, + "f1": 0.7736, + "abstentions": 0, + "coverage": 0.6843 + }, + "bcubed": { + "precision": 0.9469, + "recall": 0.8413, + "f1": 0.891 + }, + "recall_by_stratum": { + "error": { + "true_pairs": 811, + "recall": 1.0 + }, + "error/truncation": { + "true_pairs": 141, + "recall": 1.0 + }, + "error/typo": { + "true_pairs": 677, + "recall": 1.0 + }, + "representation": { + "true_pairs": 6096, + "recall": 0.8161 + }, + "representation/alias": { + "true_pairs": 3002, + "recall": 1.0 + }, + "representation/case_upper": { + "true_pairs": 2847, + "recall": 0.6063 + }, + "representation/diacritic_loss": { + "true_pairs": 157, + "recall": 1.0 + }, + "representation/spelling": { + "true_pairs": 832, + "recall": 1.0 + }, + "representation/alias<0.7": { + "true_pairs": 2016, + "recall": 1.0 + } + }, + "entities": { + "clusters": 3918, + "true_entities": 2905, + "false_merge_clusters": 133, + "false_merge_rate": 0.0339, + "false_split_entities": 777, + "false_split_rate": 0.2675 + }, + "false_merges_by_what_was_shared": { + "surname_head": 982, + "nothing_obvious": 306, + "whole_name": 86 + }, + "blocking": { + "measured": true, + "source": "recomputed from the candidate pairs the arm reported", + "candidate_pairs": 38770, + "recall": 1.0, + "reduction_ratio": 0.999216, + "pairs_per_record": 3.899 + }, + "notes": { + "learned_bits": { + "Exact match on name": 10.63, + "Array intersection size >= 1": 10.7, + "Jaro-Winkler distance of name >= 0.92": 9.27, + "Jaro-Winkler distance of name >= 0.88": 8.25, + "Jaro-Winkler distance of name >= 0.7": 6.86, + "All other comparisons": -7.1 + } + }, + "false": 1288, + "false_on_collisions": 199 + }, + "splink level/oracle p>=0.5": { + "arm": "splink level/oracle p>=0.5", + "seconds": 39.3, + "overall": { + "claimed_pairs": 7803, + "true_pairs": 15171, + "precision": 0.9567, + "recall": 0.4921, + "f1": 0.6499, + "abstentions": 0, + "coverage": 0.4921 + }, + "bcubed": { + "precision": 0.987, + "recall": 0.6454, + "f1": 0.7805 + }, + "recall_by_stratum": { + "error": { + "true_pairs": 811, + "recall": 0.4439 + }, + "error/truncation": { + "true_pairs": 141, + "recall": 0.3617 + }, + "error/typo": { + "true_pairs": 677, + "recall": 0.4638 + }, + "representation": { + "true_pairs": 6096, + "recall": 0.4382 + }, + "representation/alias": { + "true_pairs": 3002, + "recall": 0.4807 + }, + "representation/case_upper": { + "true_pairs": 2847, + "recall": 0.3565 + }, + "representation/diacritic_loss": { + "true_pairs": 157, + "recall": 0.4841 + }, + "representation/spelling": { + "true_pairs": 832, + "recall": 0.4916 + }, + "representation/alias<0.7": { + "true_pairs": 2016, + "recall": 0.4648 + } + }, + "entities": { + "clusters": 5584, + "true_entities": 2905, + "false_merge_clusters": 44, + "false_merge_rate": 0.0079, + "false_split_entities": 1811, + "false_split_rate": 0.6234 + }, + "false_merges_by_what_was_shared": { + "surname_head": 248, + "nothing_obvious": 90, + "whole_name": 68 + }, + "blocking": { + "measured": true, + "source": "recomputed from the candidate pairs the arm reported", + "candidate_pairs": 38770, + "recall": 1.0, + "reduction_ratio": 0.999216, + "pairs_per_record": 3.899 + }, + "notes": { + "learned_bits": { + "Exact match on name": 10.63, + "Array intersection size >= 1": 10.7, + "Jaro-Winkler distance of name >= 0.92": 9.27, + "Jaro-Winkler distance of name >= 0.88": 8.25, + "Jaro-Winkler distance of name >= 0.7": 6.86, + "All other comparisons": -7.1 + } + }, + "false": 338, + "false_on_collisions": 126 + }, + "splink level/oracle p>=0.9": { + "arm": "splink level/oracle p>=0.9", + "seconds": 39.3, + "overall": { + "claimed_pairs": 0, + "true_pairs": 15171, + "precision": 0.0, + "recall": 0.0, + "f1": 0.0, + "abstentions": 0, + "coverage": 0.0 + }, + "bcubed": { + "precision": 1.0, + "recall": 0.2921, + "f1": 0.4522 + }, + "recall_by_stratum": { + "error": { + "true_pairs": 811, + "recall": 0.0 + }, + "error/truncation": { + "true_pairs": 141, + "recall": 0.0 + }, + "error/typo": { + "true_pairs": 677, + "recall": 0.0 + }, + "representation": { + "true_pairs": 6096, + "recall": 0.0 + }, + "representation/alias": { + "true_pairs": 3002, + "recall": 0.0 + }, + "representation/case_upper": { + "true_pairs": 2847, + "recall": 0.0 + }, + "representation/diacritic_loss": { + "true_pairs": 157, + "recall": 0.0 + }, + "representation/spelling": { + "true_pairs": 832, + "recall": 0.0 + }, + "representation/alias<0.7": { + "true_pairs": 2016, + "recall": 0.0 + } + }, + "entities": { + "clusters": 9944, + "true_entities": 2905, + "false_merge_clusters": 0, + "false_merge_rate": 0.0, + "false_split_entities": 2649, + "false_split_rate": 0.9119 + }, + "false_merges_by_what_was_shared": {}, + "blocking": { + "measured": true, + "source": "recomputed from the candidate pairs the arm reported", + "candidate_pairs": 38770, + "recall": 1.0, + "reduction_ratio": 0.999216, + "pairs_per_record": 3.899 + }, + "notes": { + "learned_bits": { + "Exact match on name": 10.63, + "Array intersection size >= 1": 10.7, + "Jaro-Winkler distance of name >= 0.92": 9.27, + "Jaro-Winkler distance of name >= 0.88": 8.25, + "Jaro-Winkler distance of name >= 0.7": 6.86, + "All other comparisons": -7.1 + } + }, + "false": 0, + "false_on_collisions": 0 + }, + "splink level/oracle best-F1 (p>=0.10)": { + "arm": "splink level/oracle best-F1 (p>=0.10)", + "seconds": 39.3, + "overall": { + "claimed_pairs": 20073, + "true_pairs": 15171, + "precision": 0.7558, + "recall": 1.0, + "f1": 0.8609, + "abstentions": 0, + "coverage": 1.0 + }, + "bcubed": { + "precision": 0.7934, + "recall": 1.0, + "f1": 0.8848 + }, + "recall_by_stratum": { + "error": { + "true_pairs": 811, + "recall": 1.0 + }, + "error/truncation": { + "true_pairs": 141, + "recall": 1.0 + }, + "error/typo": { + "true_pairs": 677, + "recall": 1.0 + }, + "representation": { + "true_pairs": 6096, + "recall": 1.0 + }, + "representation/alias": { + "true_pairs": 3002, + "recall": 1.0 + }, + "representation/case_upper": { + "true_pairs": 2847, + "recall": 1.0 + }, + "representation/diacritic_loss": { + "true_pairs": 157, + "recall": 1.0 + }, + "representation/spelling": { + "true_pairs": 832, + "recall": 1.0 + }, + "representation/alias<0.7": { + "true_pairs": 2016, + "recall": 1.0 + } + }, + "entities": { + "clusters": 2308, + "true_entities": 2905, + "false_merge_clusters": 293, + "false_merge_rate": 0.1269, + "false_split_entities": 0, + "false_split_rate": 0.0 + }, + "false_merges_by_what_was_shared": { + "surname_head": 3634, + "nothing_obvious": 1268, + "whole_name": 149 + }, + "blocking": { + "measured": true, + "source": "recomputed from the candidate pairs the arm reported", + "candidate_pairs": 38770, + "recall": 1.0, + "reduction_ratio": 0.999216, + "pairs_per_record": 3.899 + }, + "notes": { + "learned_bits": { + "Exact match on name": 10.63, + "Array intersection size >= 1": 10.7, + "Jaro-Winkler distance of name >= 0.92": 9.27, + "Jaro-Winkler distance of name >= 0.88": 8.25, + "Jaro-Winkler distance of name >= 0.7": 6.86, + "All other comparisons": -7.1 + }, + "best_threshold": 0.1 + }, + "false": 4902, + "false_on_collisions": 264 + }, + "arche artist pack (curated list)": { + "arm": "arche artist pack (curated list)", + "seconds": 108.9, + "overall": { + "claimed_pairs": 11214, + "true_pairs": 15171, + "precision": 0.9784, + "recall": 0.7232, + "f1": 0.8317, + "abstentions": 13883, + "coverage": 0.8216 + }, + "bcubed": { + "precision": 0.9919, + "recall": 0.8094, + "f1": 0.8914 + }, + "recall_by_stratum": { + "error": { + "true_pairs": 811, + "recall": 0.037 + }, + "error/truncation": { + "true_pairs": 141, + "recall": 0.1135 + }, + "error/typo": { + "true_pairs": 677, + "recall": 0.0207 + }, + "representation": { + "true_pairs": 6096, + "recall": 0.4455 + }, + "representation/alias": { + "true_pairs": 3002, + "recall": 0.065 + }, + "representation/case_upper": { + "true_pairs": 2847, + "recall": 0.7215 + }, + "representation/diacritic_loss": { + "true_pairs": 157, + "recall": 0.7325 + }, + "representation/spelling": { + "true_pairs": 832, + "recall": 0.5673 + }, + "representation/alias<0.7": { + "true_pairs": 2016, + "recall": 0.0134 + } + }, + "entities": { + "clusters": 4175, + "true_entities": 2905, + "false_merge_clusters": 30, + "false_merge_rate": 0.0072, + "false_split_entities": 1016, + "false_split_rate": 0.3497 + }, + "false_merges_by_what_was_shared": { + "surname_head": 219, + "whole_name": 138, + "nothing_obvious": 23 + }, + "blocking": { + "measured": false, + "why": "the arm does not enumerate its candidate pairs" + }, + "notes": {}, + "false": 242, + "false_on_collisions": 142 + } + } +} diff --git a/datasets/artists_dataops/coverage.py b/datasets/artists_dataops/coverage.py new file mode 100644 index 0000000..6782a3b --- /dev/null +++ b/datasets/artists_dataops/coverage.py @@ -0,0 +1,179 @@ +# Copyright 2026 unpatterned.org +# SPDX-License-Identifier: Apache-2.0 + +"""How much of the truth does the variant list know? Measured before any matcher runs. + + uv run python datasets/artists_dataops/coverage.py + +The ablation in plan §7d hands Splink a list of name variants and asks what it +buys. The list (MusicBrainz + the curated YAMLs) and the truth (Wikidata alias +groups) are deliberately different sources, so the list cannot know every +alias the truth contains. **Coverage** is the share it does know, and it bounds +the gain before a single pair is scored: a list that covers 40% of alias pairs +cannot recover more than 40% of them, whatever the matcher does. + +Two more numbers come out of the same join and both matter to the article: + +- **Extra** -- pairs the list asserts that the truth does not. Where the list + is right and Wikidata is incomplete, these are free recall on real data. + Where the list is wrong, they are false merges waiting to happen. +- **List collisions** -- a name that appears in two different list groups. + Giving a matcher that name as a variant of *both* is how a variant list + costs precision (the wrong-Tyla case). + +Writes ``datasets/data/artist_variants.jsonl``: the list, one group per row, +in the shape the Splink arms consume. It is built here and nowhere else so +the coverage number and the list a matcher is given cannot drift apart. +""" +from __future__ import annotations + +import json +import sys +from collections import defaultdict +from itertools import combinations +from pathlib import Path + +import yaml + +_REPO = Path(__file__).resolve().parents[2] +sys.path.insert(0, str(_REPO / "data" / "synthetic")) +from arche_synthetic.artists import SPELLING_BOUNDARY, jaro_winkler, load_truth # noqa: E402 + +MB = _REPO / "datasets" / "data" / "musicbrainz_artist_aliases.jsonl" +CURATED = sorted((_REPO / "datasets" / "artist_equivalences").glob("*.yaml")) +OUT = _REPO / "datasets" / "data" / "artist_variants.jsonl" +REPORT = _REPO / "datasets" / "artists_dataops" / "coverage_result.json" + + +def norm(name: str) -> str: + return " ".join(name.casefold().split()) + + +def list_groups() -> list[dict]: + """The variant list: every MusicBrainz artist with 2+ names, plus curated.""" + groups = [] + for line in MB.read_text(encoding="utf-8").splitlines(): + if not line.strip(): + continue + r = json.loads(line) + names = [r["mb_name"], *(a["name"] for a in r["aliases"])] + distinct = {norm(n): n for n in names if n and norm(n)} + if len(distinct) >= 2: + groups.append({"group_id": f"mb:{r['mbid']}", "source": "musicbrainz", + "names": list(distinct.values())}) + for path in CURATED: + doc = yaml.safe_load(path.read_text(encoding="utf-8")) + for i, g in enumerate(doc.get("groups", [])): + names = [g["canonical"], *g.get("variants", [])] + distinct = {norm(n): n for n in names if n} + if len(distinct) >= 2: + groups.append({"group_id": f"curated:{path.stem}:{i}", + "source": f"curated/{path.stem}", + "names": list(distinct.values())}) + return groups + + +def main() -> int: + if not MB.exists(): + print(f" missing {MB.relative_to(_REPO)}; run pull_musicbrainz.py first") + return 1 + truth = load_truth() + groups = list_groups() + + # name -> list group ids + index: dict[str, set[str]] = defaultdict(set) + for g in groups: + for n in g["names"]: + index[norm(n)].add(g["group_id"]) + + mb_known = {json.loads(l)["entity_id"] + for l in MB.read_text(encoding="utf-8").splitlines() if l.strip()} + + # --- coverage of truth pairs ------------------------------------------ + total = covered = 0 + by_stratum = {"alias": [0, 0], "spelling": [0, 0]} + by_known = {"artist in MusicBrainz": [0, 0], "artist not in MusicBrainz": [0, 0]} + uncovered_examples = [] + for g in truth: + known = "artist in MusicBrainz" if g["wikidata"] in mb_known else "artist not in MusicBrainz" + for a, b in combinations(g["names"], 2): + total += 1 + stratum = ("spelling" if jaro_winkler(a, b) >= SPELLING_BOUNDARY else "alias") + hit = bool(index.get(norm(a), set()) & index.get(norm(b), set())) + covered += hit + by_stratum[stratum][0] += hit + by_stratum[stratum][1] += 1 + by_known[known][0] += hit + by_known[known][1] += 1 + if not hit and stratum == "alias" and len(uncovered_examples) < 8: + uncovered_examples.append((g["canonical"], a, b)) + + # --- what the list asserts beyond the truth -------------------------- + truth_pairs = set() + for g in truth: + for a, b in combinations(g["names"], 2): + truth_pairs.add(frozenset((norm(a), norm(b)))) + list_pairs = set() + for g in groups: + for a, b in combinations(g["names"], 2): + list_pairs.add(frozenset((norm(a), norm(b)))) + extra = list_pairs - truth_pairs + + # --- names the list puts in more than one group ------------------------ + # Two groups that share *several* names are one artist listed twice (the + # curated Ayra Starr and MusicBrainz's). Two groups that share exactly + # one name and nothing else are the ambiguity a matcher will pay for. + names_of = {g["group_id"]: {norm(n) for n in g["names"]} for g in groups} + collisions = {} + duplicates = 0 + for n, ids in index.items(): + if len(ids) < 2: + continue + ids = sorted(ids) + if any(len(names_of[a] & names_of[b]) >= 2 + for i, a in enumerate(ids) for b in ids[i + 1:]): + duplicates += 1 + else: + collisions[n] = ids + + pct = lambda h, t: f"{100 * h / t:5.1f}%" if t else " --" # noqa: E731 + print(f" truth: {len(truth):,} alias groups, {total:,} name pairs") + print(f" list : {len(groups):,} groups " + f"({sum(1 for g in groups if g['source'] == 'musicbrainz'):,} MusicBrainz, " + f"{sum(1 for g in groups if g['source'] != 'musicbrainz')} curated), " + f"{len(list_pairs):,} name pairs\n") + print(f" coverage of truth pairs {pct(covered, total)} ({covered:,} / {total:,})") + for k, (h, t) in by_stratum.items(): + print(f" {k:<30} {pct(h, t)} ({h:,} / {t:,})") + for k, (h, t) in by_known.items(): + print(f" {k:<30} {pct(h, t)} ({h:,} / {t:,})") + print(f"\n list pairs not in truth (extra) {len(extra):,} of {len(list_pairs):,}") + print(f" same artist listed twice {duplicates:,} names (curated and MusicBrainz)") + print(f" genuine list collisions {len(collisions):,} names (one shared name, otherwise different)") + if collisions: + for n, ids in list(collisions.items())[:6]: + print(f" {n!r}: {ids}") + if uncovered_examples: + print("\n alias pairs the list does not know (sample):") + for canon, a, b in uncovered_examples: + print(f" [{canon}] {a} <> {b}") + + with OUT.open("w", encoding="utf-8", newline="\n") as fh: + for g in groups: + fh.write(json.dumps(g, ensure_ascii=False) + "\n") + report = { + "truth_groups": len(truth), "truth_pairs": total, + "list_groups": len(groups), "list_pairs": len(list_pairs), + "covered": covered, "coverage": round(covered / total, 4) if total else None, + "by_stratum": {k: {"covered": h, "total": t} for k, (h, t) in by_stratum.items()}, + "by_known": {k: {"covered": h, "total": t} for k, (h, t) in by_known.items()}, + "extra_pairs": len(extra), "list_collisions": len(collisions), + "list_duplicates": duplicates, + } + REPORT.write_text(json.dumps(report, indent=2) + "\n", encoding="utf-8", newline="\n") + print(f"\n wrote {OUT.relative_to(_REPO)} and {REPORT.relative_to(_REPO)}") + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/datasets/artists_dataops/coverage_result.json b/datasets/artists_dataops/coverage_result.json new file mode 100644 index 0000000..08da289 --- /dev/null +++ b/datasets/artists_dataops/coverage_result.json @@ -0,0 +1,31 @@ +{ + "truth_groups": 1464, + "truth_pairs": 3503, + "list_groups": 449, + "list_pairs": 1755, + "covered": 367, + "coverage": 0.1048, + "by_stratum": { + "alias": { + "covered": 297, + "total": 2806 + }, + "spelling": { + "covered": 70, + "total": 697 + } + }, + "by_known": { + "artist in MusicBrainz": { + "covered": 364, + "total": 2002 + }, + "artist not in MusicBrainz": { + "covered": 3, + "total": 1501 + } + }, + "extra_pairs": 1388, + "list_collisions": 1, + "list_duplicates": 44 +} diff --git a/datasets/artists_dataops/example_splink_with_variants.py b/datasets/artists_dataops/example_splink_with_variants.py new file mode 100644 index 0000000..849f4ac --- /dev/null +++ b/datasets/artists_dataops/example_splink_with_variants.py @@ -0,0 +1,109 @@ +# Copyright 2026 unpatterned.org +# SPDX-License-Identifier: Apache-2.0 + +"""Splink over the artist world, with and without the variant list. Nothing else. + + uv run python datasets/artists_dataops/example_splink_with_variants.py + +This is the whole experiment in one file, for a Splink user who wants to see it +without reading arche's harness. It reads the world's Parquet files and the +variant list directly, runs Splink twice, and scores both against +`truth.parquet`. It imports nothing from arche. + +`bench_splink_variants.py` is the full version: six arms, strata, collisions, +threshold sweeps, the oracle. This one is the shape of it. +""" +from __future__ import annotations + +import json +import warnings +from pathlib import Path + +import pandas as pd +import pyarrow.parquet as pq +import splink.comparison_level_library as cll +import splink.comparison_library as cl +from splink import DuckDBAPI, Linker, SettingsCreator, block_on + +warnings.filterwarnings("ignore") +REPO = Path(__file__).resolve().parents[2] +WORLD = REPO / "data" / "synthetic" / "worlds" / "artists_v0" +VARIANTS = REPO / "datasets" / "data" / "artist_variants.jsonl" + + +def norm(s: str) -> str: + return " ".join((s or "").casefold().split()) + + +# --- 1. the records a matcher is given (no truth column in this file) -------- +obs = pq.read_table(WORLD / "observations.parquet").to_pandas() +obs["name"] = obs["name"].map(norm) + +# --- 2. the variant list: name -> its group ---------------------------------- +group_of: dict[str, list[str]] = {} +for line in VARIANTS.read_text(encoding="utf-8").splitlines(): + if line.strip(): + names = sorted({norm(n) for n in json.loads(line)["names"]}) + for n in names: + group_of[n] = names + +obs["name_variants"] = obs["name"].map(lambda n: group_of.get(n, [n])) +obs["canonical"] = obs["name_variants"].map(lambda v: v[0]) +obs = obs.rename(columns={"record_id": "unique_id"})[ + ["unique_id", "name", "canonical", "name_variants", "country"]] + + +# --- 3. two models: without the list, and with it as a comparison level ----- +def settings(with_list: bool) -> SettingsCreator: + levels = [cll.NullLevel("name"), + cll.ExactMatchLevel("name").configure(tf_adjustment_column="name")] + if with_list: + levels.append(cll.ArrayIntersectLevel("name_variants", min_intersection=1)) + levels += [cll.JaroWinklerLevel("name", 0.92), cll.JaroWinklerLevel("name", 0.88), + cll.JaroWinklerLevel("name", 0.7), cll.ElseLevel()] + rules = [block_on("name"), block_on("substr(name,1,4)")] + if with_list: + rules.append(block_on("canonical")) # reach pairs that share no prefix + return SettingsCreator( + link_type="dedupe_only", + comparisons=[cl.CustomComparison(levels, output_column_name="name"), + cl.ExactMatch("country")], + blocking_rules_to_generate_predictions=rules, + ) + + +def run(with_list: bool) -> set[frozenset]: + linker = Linker(obs, settings(with_list), db_api=DuckDBAPI()) + linker.training.estimate_probability_two_random_records_match([block_on("name")], recall=0.6) + linker.training.estimate_u_using_random_sampling(max_pairs=5e6, seed=42) + # Country is learned while blocking on the name; the name (and the list + # level) while blocking on country. Not on a name prefix: Splink treats a + # comparison whose column appears in the blocking rule as untrainable in + # that session, and a name-prefix rule leaves every name level at its + # default -- a model that never learned what a name is worth. + for rule in (block_on("name"), block_on("country")): + linker.training.estimate_parameters_using_expectation_maximisation(rule) + out = linker.inference.predict(threshold_match_probability=0.5).as_pandas_dataframe() + return {frozenset((a, b)) for a, b in zip(out.unique_id_l, out.unique_id_r, strict=False)} + + +# --- 4. the truth, read only to score -------------------------------------------- +truth_df = pq.read_table(WORLD / "truth.parquet").to_pandas() +truth: set[frozenset] = set() +for _, ids in truth_df.groupby("truth_entity_id")["record_id"]: + ids = sorted(ids) + for i, a in enumerate(ids): + for b in ids[i + 1:]: + truth.add(frozenset((a, b))) + +# The stratum the list exists for: pairs whose names are not string-similar. +diffs = pq.read_table(WORLD / "differences.parquet").to_pandas() +alias = {frozenset((a, b)) for a, b, c in + zip(diffs.observation_a, diffs.observation_b, diffs.cause, strict=False) if c == "alias"} + +print(f"{'arm':<22}{'precision':>10}{'recall':>8}{'alias recall':>14}{'false':>7}") +for label, with_list in (("splink, raw", False), ("splink + variants", True)): + got = run(with_list) + tp, fp = len(got & truth), len(got - truth) + print(f"{label:<22}{tp / (tp + fp):>10.3f}{tp / len(truth):>8.3f}" + f"{len(got & alias) / len(alias):>14.3f}{fp:>7,}") diff --git a/datasets/artists_dataops/pull_musicbrainz.py b/datasets/artists_dataops/pull_musicbrainz.py new file mode 100644 index 0000000..c22069d --- /dev/null +++ b/datasets/artists_dataops/pull_musicbrainz.py @@ -0,0 +1,208 @@ +# Copyright 2026 unpatterned.org +# SPDX-License-Identifier: Apache-2.0 + +"""Pull MusicBrainz alias sets for the artists in the Wikidata alias pull. + + uv run python datasets/artists_dataops/pull_musicbrainz.py + +Why a second source +------------------- +The variant-list ablation (plan §7d) gives Splink a list of name variants and +asks what it is worth. If the list and the truth labels come from the same +source, "with list" wins by construction and the number means nothing. So the +**truth** is Wikidata's alias groups (`datasets/data/wikidata_artist_aliases.jsonl`) +and the **list** is MusicBrainz's -- two editorial communities, two sets of +opinions about what an artist is called. Where they disagree is where the +experiment lives. + +How the two are joined +---------------------- +Not by name. A name-only MusicBrainz search for `Tyla` returns a UK artist of +the same name (the wrong-Tyla lesson, recorded in +`datasets/artist_equivalences/afrobeats.yaml`). Wikidata carries the +MusicBrainz artist id as property **P434**, so the join is by identifier: QID +-> MBID via WDQS, then MBID -> alias set via the MusicBrainz web service. +Artists without a P434 are reported and skipped, never guessed. + +Rate and courtesy +----------------- +MusicBrainz asks for at most one request per second and a User-Agent that +says who is calling. Both are honoured. Every response is cached under +`datasets/data/_cache/musicbrainz/.json`, so a rerun costs nothing and +an interrupted run resumes where it stopped. + +Licence +------- +MusicBrainz core data (artist names, aliases, relationships) is CC0. Wikidata +is CC0. Nothing here needs permission to publish. +""" +from __future__ import annotations + +import argparse +import http.client +import json +import re +import sys +import time +import urllib.error +import urllib.parse +import urllib.request +from pathlib import Path +from typing import Any + +_REPO = Path(__file__).resolve().parents[2] +WIKIDATA_ALIASES = _REPO / "datasets" / "data" / "wikidata_artist_aliases.jsonl" +OUT = _REPO / "datasets" / "data" / "musicbrainz_artist_aliases.jsonl" +CACHE = _REPO / "datasets" / "data" / "_cache" / "musicbrainz" + +WDQS = "https://query.wikidata.org/sparql" +MB = "https://musicbrainz.org/ws/2/artist/" +USER_AGENT = "arche-datasets/0.1 (https://github.com/unpatterned-labs/arche)" + +#: MusicBrainz's published limit is one request per second. A little over, +#: because the clock that matters is theirs. +MB_PAUSE = 1.1 + +_UUID = re.compile(r"[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}") + +_MBID_QUERY = """ +SELECT ?artist ?mbid WHERE {{ + VALUES ?artist {{ {qids} }} + ?artist wdt:P434 ?mbid . +}} +""" + + +def _get(url: str, *, accept: str, timeout: int = 60, attempts: int = 8, + throttle_wait: float = 5.0) -> Any: + """One GET with retries. + + ``throttle_wait`` is the pause after a 503. MusicBrainz answers a request + that lands a shade inside its one-per-second window with a 503 and + nothing else is wrong; the first version of this script backed off + 5/10/20 s on each one and averaged fourteen seconds per artist. Two + seconds is enough there. WDQS keeps the longer, doubling wait. + """ + request = urllib.request.Request(url, headers={ + "User-Agent": USER_AGENT, "Accept": accept}) + for attempt in range(attempts): + try: + with urllib.request.urlopen(request, timeout=timeout) as fh: + return json.load(fh) + except urllib.error.HTTPError as exc: + if exc.code in (400, 404): + # 404: MusicBrainz has no such artist (a merged or deleted + # MBID that Wikidata still carries). 400: the value Wikidata + # holds as a P434 is not an MBID at all. Both are reported + # by the caller and skipped, never guessed around. + print(f" {exc.code} for {url}", file=sys.stderr) + return None + if exc.code in (429, 500, 502, 503, 504) and attempt < attempts - 1: + wait = throttle_wait if exc.code == 503 else 5 * (2 ** attempt) + time.sleep(wait) + continue + raise + except (TimeoutError, urllib.error.URLError, ConnectionError, + http.client.HTTPException) as exc: + if attempt < attempts - 1: + print(f" {type(exc).__name__}; retrying", file=sys.stderr) + time.sleep(5 * (2 ** attempt)) + continue + raise + return None + + +def mbids_for(qids: list[str], *, chunk: int = 150) -> dict[str, str]: + """QID -> MBID via P434. Chunked VALUES keeps each query cheap.""" + found: dict[str, str] = {} + for i in range(0, len(qids), chunk): + block = " ".join(f"wd:{q}" for q in qids[i:i + chunk]) + query = _MBID_QUERY.format(qids=block) + url = WDQS + "?" + urllib.parse.urlencode({"query": query, "format": "json"}) + rows = _get(url, accept="application/sparql-results+json") + for row in (rows or {}).get("results", {}).get("bindings", []): + qid = row["artist"]["value"].rsplit("/", 1)[-1] + # P434 is meant to hold a bare MBID. In this pull it also holds + # full MusicBrainz URLs, and strings like `Hondread` and `Gia Rồi` + # that are not identifiers at all. Take the UUID if there is one + # and report the rest; a value that is not an MBID is not made + # into one. + m = _UUID.search(row["mbid"]["value"]) + if m: + found[qid] = m.group(0).lower() + else: + print(f" {qid}: P434 is not an MBID: {row['mbid']['value']!r}", + file=sys.stderr) + print(f" P434: {min(i + chunk, len(qids))}/{len(qids)} asked, " + f"{len(found)} found", flush=True) + time.sleep(1.0) + return found + + +def artist(mbid: str) -> dict[str, Any] | None: + """One MusicBrainz artist with aliases, from cache or the service.""" + CACHE.mkdir(parents=True, exist_ok=True) + path = CACHE / f"{mbid}.json" + if path.exists(): + return json.loads(path.read_text(encoding="utf-8")) + url = MB + mbid + "?" + urllib.parse.urlencode({"inc": "aliases", "fmt": "json"}) + data = _get(url, accept="application/json", throttle_wait=2.0) + time.sleep(MB_PAUSE) + if data is None: + return None + path.write_text(json.dumps(data), encoding="utf-8", newline="\n") + return data + + +def main() -> int: + ap = argparse.ArgumentParser(description=__doc__.split("\n\n", 1)[0]) + ap.add_argument("--limit", type=int, default=0, + help="stop after this many artists (0 = all)") + args = ap.parse_args() + + groups = [json.loads(line) for line in + WIKIDATA_ALIASES.read_text(encoding="utf-8").splitlines() if line] + qids = [g["entity_id"] for g in groups] + if args.limit: + qids = qids[:args.limit] + print(f" {len(qids)} Wikidata artists", flush=True) + + mbids = mbids_for(qids) + missing = [q for q in qids if q not in mbids] + print(f" {len(mbids)} carry a MusicBrainz id (P434); " + f"{len(missing)} do not and are skipped\n", flush=True) + + by_qid = {g["entity_id"]: g for g in groups} + written = 0 + with OUT.open("w", encoding="utf-8", newline="\n") as fh: + for n, (qid, mbid) in enumerate(mbids.items(), 1): + data = artist(mbid) + if data is None: + print(f" {mbid}: not found", file=sys.stderr) + continue + aliases = [{"name": a.get("name"), "sort_name": a.get("sort-name"), + "type": a.get("type"), "locale": a.get("locale"), + "primary": bool(a.get("primary"))} + for a in data.get("aliases", []) if a.get("name")] + row = { + "entity_id": qid, + "mbid": mbid, + "wikidata_canonical": by_qid[qid]["canonical"], + "mb_name": data.get("name"), + "mb_sort_name": data.get("sort-name"), + "mb_disambiguation": data.get("disambiguation") or None, + "mb_country": data.get("country"), + "mb_type": data.get("type"), + "aliases": aliases, + } + fh.write(json.dumps(row, ensure_ascii=False) + "\n") + written += 1 + if n % 50 == 0: + print(f" {n}/{len(mbids)} fetched", flush=True) + + print(f"\n wrote {written} rows to {OUT.relative_to(_REPO)}") + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/datasets/data/WIKIDATA_DATACARD.md b/datasets/data/WIKIDATA_DATACARD.md new file mode 100644 index 0000000..2c7a937 --- /dev/null +++ b/datasets/data/WIKIDATA_DATACARD.md @@ -0,0 +1,52 @@ +# Wikidata pulls — real names the generator cannot invent + +Pulled 2026-09-11 by `datasets/pull_wikidata.py`. Source: **Wikidata, CC0** — no permission needed, which is the whole reason this lane moved while `ai4privacy` (academic-only), i2b2 (DUA) and OpenSanctions (purchase) stayed blocked. Attribution is not required by CC0 and is given anyway. + +## `wikidata_name_pairs.jsonl` — 8,156 real given+family pairs + +```json +{"country": "NG", "family": "Igwe", "given": "Amaechi"} +``` + +| country | pairs | | country | pairs | +|---|---:|---|---|---:| +| ZA | 942 | | SN | 827 | +| NG | 931 | | TZ | 846 | +| GH | 925 | | UG | 780 | +| KE | 888 | | ZW | 629 | +| CI | 872 | | ZM | 291 | +| | | | ET | 225 | + +**The pair is the point.** A list of given names and a list of family names is what the generator already has — 12,369 of them. What it cannot invent is which ones go *together*, and that is exactly what `P735` (given name) and `P734` (family name) record on one person. + +**The signal, measured on the pull itself: 18% of given names appearing five or more times are concentrated in a single country (≥80% of their occurrences).** That is the regional structure the notebook measured at **0.0%** in generated names against **90.4%** in real facility names. It is the input to plan N1. + +**What it is not.** Wikidata's coverage is of *notable* people — athletes, politicians, musicians — so this is not a census. Common names will be under-represented relative to a population register and notable-person naming may skew colonial-era or urban. It is enough to condition a generator on and not enough to claim a population distribution. Ethiopia (225) and Zambia (291) are thin; Cameroon failed its query entirely and is absent. + +## `wikidata_artist_aliases.jsonl` — 1,468 artists, 2,218 variants + +```json +{"canonical": "Tamy Moyo", "country": "Zimbabwe", "entity_id": "Q30093332", + "variants": ["Thamsanqa 'Tamy' Moyo", "Thamsanqa Moyo"]} +``` + +Ground truth comes free: the entity is a QID, so every variant of one artist is a known true pair and any two artists are a known true negative. No adjudication, no labelling budget. + +Three kinds of variant appear, and they test different things: + +- **Stage name against legal name** — `Jua Cali` / `Paul Julius Nunda`, `Jacob Radebe` / `Mpharanyana`. **Zero string overlap.** No edit distance and no frequency table solves these; an equivalence list is the only thing that can. +- **Fuller form** — `Stella Mwangi` / `Stella Nyambura Mwangi`. A middle name appears or does not. +- **Orthographic** — `Achieng Abura` / `Achien'g Abura` / `Achieng' Abura`. Punctuation and tone marking. + +This is the variant list for the ablation (plan N4): supply it, withhold it, report **recall and false merges together**. + +**What it is not.** 1,468 groups is thinner than the 10,000 hoped for, and the ceiling is real: Wikidata holds only so many African musicians carrying an English `skos:altLabel`. Widening means more countries, more occupations, or MusicBrainz — which has far more artists but needs either its rate-limited API (1 request/second) or a full database dump. **1.5 variants per artist is also thin**; the interesting cases are the artists with four or five. + +## Reproducing + +```bash +python datasets/pull_wikidata.py names --out datasets/data/wikidata_name_pairs.jsonl +python datasets/pull_wikidata.py aliases --out datasets/data/wikidata_artist_aliases.jsonl +``` + +Two things the puller learned the hard way and now encodes. WDQS answers a query it considers too expensive by **closing the connection**, which arrives as `http.client.RemoteDisconnected` — a `ConnectionError`, not a `URLError`, so it escaped the first retry handler and ended the run. And `ORDER BY` over the whole result set is what made the name query too expensive at every page size; querying one country at a time returns 5,000 rows in about three seconds. An unlabelled entity comes back as its bare QID (`Faith Q16870958`), on either half of the name. diff --git a/datasets/data/artist_variants.jsonl b/datasets/data/artist_variants.jsonl new file mode 100644 index 0000000..6b6c7c7 --- /dev/null +++ b/datasets/data/artist_variants.jsonl @@ -0,0 +1,449 @@ +{"group_id": "mb:a966b097-7981-40c5-82b4-79c6fe28932c", "source": "musicbrainz", "names": ["Lebo M", "Lebo Morake", "Lebohang Morake", "レボ・M"]} +{"group_id": "mb:8ae29b58-4f10-46d3-81d9-655197ed1ab1", "source": "musicbrainz", "names": ["Ace Leen", "Aceleen", "Ashley Themba Matselela", "Ashley ZA", "Yung ZA"]} +{"group_id": "mb:3d7caeaa-5500-4a54-9513-334ff84fbdf4", "source": "musicbrainz", "names": ["Julie Mutesasira", "Julie Birungi", "Julie Naluggya"]} +{"group_id": "mb:7de9971f-3e29-48b9-9647-f47841eb99db", "source": "musicbrainz", "names": ["Tobe Nwigwe", "Tobechukwu Dubem \"Tobe\" Nwigwe", "Tobechukwu Dubem Nwigwe"]} +{"group_id": "mb:e26bcbdf-8509-4a5d-9c0d-8accf921e474", "source": "musicbrainz", "names": ["Bella Shmurda", "Akinbiyi Ahmed Abiola"]} +{"group_id": "mb:eb774f57-a9be-409f-ad54-d73ad8e26958", "source": "musicbrainz", "names": ["Kel-P", "Kel P Vibes", "Udoma Peter Kelvin Amba"]} +{"group_id": "mb:bd918fa6-0655-45cb-aca4-4c04db161cbc", "source": "musicbrainz", "names": ["Peter Okoye", "Mr. P"]} +{"group_id": "mb:11273437-f4ee-4414-bb3b-4ea51b0570b1", "source": "musicbrainz", "names": ["Yaw Tog", "thorsten owusu gyimah"]} +{"group_id": "mb:db4e4120-a612-479b-8c54-c4e3cb9fa1f9", "source": "musicbrainz", "names": ["Ara", "Aralola Olamuyiwa"]} +{"group_id": "mb:c4ac4b97-2eac-46f6-85ae-f916c93847e4", "source": "musicbrainz", "names": ["Ayra Starr", "Oyinkansola Sarah Aderibigbe"]} +{"group_id": "mb:b63bd4fd-2050-4c92-a237-576f6f6c97cb", "source": "musicbrainz", "names": ["Omah Lay", "Prince", "Stanley Omah Didia"]} +{"group_id": "mb:110a1437-1173-4ab8-8867-66e04e9af23f", "source": "musicbrainz", "names": ["Rexxie", "Chisom Ezeh", "Chisom Faith Ezeh"]} +{"group_id": "mb:a6b8c838-fef4-4700-9b31-8481da58cace", "source": "musicbrainz", "names": ["Liya", "Abdulsalam Suliyat Modasola"]} +{"group_id": "mb:2d53a431-e1c7-4739-a61b-28f465918722", "source": "musicbrainz", "names": ["Phineas Mkhize", "Phineas McHize"]} +{"group_id": "mb:adae0821-04a7-4e24-bc24-bcff5530e204", "source": "musicbrainz", "names": ["Mara Louw", "Mara"]} +{"group_id": "mb:bf6a133c-0939-4a47-938a-8285a96a5f60", "source": "musicbrainz", "names": ["Zinoleesky", "Azeez Shina Oniyide"]} +{"group_id": "mb:e23d3016-5206-4354-bb19-16b54c6ef51f", "source": "musicbrainz", "names": ["Crayon", "Charles Chibueze Chukwu"]} +{"group_id": "mb:6de225d7-2abd-473f-b6f8-72b43b4f9f63", "source": "musicbrainz", "names": ["Made Kuti", "Made Anikulapo Kuti", "Omorinmade Anikulapo-Kuti"]} +{"group_id": "mb:b011bf5c-eeda-41ae-9130-2203e8f938fc", "source": "musicbrainz", "names": ["Dremo", "Aboriomoh Femi Raymond"]} +{"group_id": "mb:4248f952-8091-4a8b-a68e-93a5a7e6fb96", "source": "musicbrainz", "names": ["Cruel Santino", "Osayaba Andrew Ize‐Iyamu", "Ozzy B", "Santi"]} +{"group_id": "mb:830741cb-744a-4b1e-9dfb-1e3ab3b76c05", "source": "musicbrainz", "names": ["Uwade", "Uwade Akhere"]} +{"group_id": "mb:d7eed624-354d-4fb1-8b34-473c96a0cfa9", "source": "musicbrainz", "names": ["Focalistic", "Lethabo Sebetso"]} +{"group_id": "mb:468561d7-ace1-40e2-b267-4f22242f1482", "source": "musicbrainz", "names": ["Mvzzle", "Gift Selaelo Morukhuladi", "Mvzzle Beatz"]} +{"group_id": "mb:ad2f22bc-9676-41b4-af51-6ab3a5e3f883", "source": "musicbrainz", "names": ["JAE5", "JB Made It", "Jonathan Kweku Awote-Mensah", "Jonathan Mensah"]} +{"group_id": "mb:fc49a977-2f78-423e-8b98-8207bf86e5d1", "source": "musicbrainz", "names": ["Nana Adjoa", "Nana Effah-Bekoe"]} +{"group_id": "mb:bd41b3c8-cbc4-4a94-a9c4-4e9b1ce6cc7a", "source": "musicbrainz", "names": ["Neo Motlatla", "Baby Neo", "Bxby Neo"]} +{"group_id": "mb:020ec616-3a71-4ac1-855d-7ce53488a8e8", "source": "musicbrainz", "names": ["Reason", "Size Alakine", "Sizwe Moeketsi"]} +{"group_id": "mb:24e1eea7-ad9a-4bf8-9c59-f6db2a1f5809", "source": "musicbrainz", "names": ["B Major", "B Major CPT", "B Major SA", "B Major Scale", "B. Major", "Bjorn Martin"]} +{"group_id": "mb:1b791a0b-151e-40df-9be9-deddf6163bf6", "source": "musicbrainz", "names": ["Blxckie", "Sihle Sithole"]} +{"group_id": "mb:0707594a-f793-4255-9708-4d73484581e9", "source": "musicbrainz", "names": ["BNXN", "BNXN fka Buju", "Buju", "Buju TYE", "Daniel Benson", "Daniel Etiese Benson"]} +{"group_id": "mb:68b8199b-eff2-45fb-be86-da8138d97067", "source": "musicbrainz", "names": ["Jonathan Butler", "Jonathan Kenneth Butler"]} +{"group_id": "mb:45708051-5edf-4826-983f-63b1572e9812", "source": "musicbrainz", "names": ["Ray G", "Reagan Muhairwe"]} +{"group_id": "mb:cd96060d-6f88-47e7-a3d5-085eab37e80f", "source": "musicbrainz", "names": ["Ruger", "Michael Adebayo Olayinka"]} +{"group_id": "mb:2e0dfb79-7258-4785-9b56-2ae87298697f", "source": "musicbrainz", "names": ["Mugeni Elijah", "Awelani Mugeni"]} +{"group_id": "mb:1c77174f-11eb-425a-8962-1f79c0793bd1", "source": "musicbrainz", "names": ["Winnie Nwagi", "Winnifred Nakanwagi"]} +{"group_id": "mb:e0602ce5-eb58-491b-84c9-d639eb79fadc", "source": "musicbrainz", "names": ["Azawi", "Priscilla Zawedde"]} +{"group_id": "mb:c0da5f02-4b8b-412d-a5d2-8e2481403287", "source": "musicbrainz", "names": ["Karole Kasita", "Namulindwa Caro"]} +{"group_id": "mb:c8287f71-f695-42b1-8a53-b47994e5d2ab", "source": "musicbrainz", "names": ["Tay Iwar", "Austin Iornongu Iwar", "Austin Iornongu Iwar Jnr"]} +{"group_id": "mb:7013c772-2236-42f3-8590-2e2292d2ca5e", "source": "musicbrainz", "names": ["Victony", "Anthony Ebuka Victor"]} +{"group_id": "mb:b48d0360-5992-46c8-af0f-05bff846d9f4", "source": "musicbrainz", "names": ["Bylez", "Finest Boy", "Papa Kofi Akyen Kwegyir", "YB"]} +{"group_id": "mb:2b37ba5e-2162-46ca-bbad-f076f6a333bd", "source": "musicbrainz", "names": ["Asake", "Ahmed Ololade"]} +{"group_id": "mb:b1fd5585-56f4-4b4a-83e4-c86df80ca5c7", "source": "musicbrainz", "names": ["Magixx", "Alexander Adewunmi Adelabu"]} +{"group_id": "mb:ea38d754-266c-4f4d-a8e9-7031dcd45b32", "source": "musicbrainz", "names": ["Cheesy Vibes", "Cheezy-Vibes", "Chidera Ogbuo"]} +{"group_id": "mb:8d1ad13b-a388-477d-b6a8-6b7d77904685", "source": "musicbrainz", "names": ["Johnel", "Nnamani Chimaobi John"]} +{"group_id": "mb:330054ae-c442-489e-8901-10cff96b819b", "source": "musicbrainz", "names": ["ODUMODUBLVCK", "Tochukwu Gbubemi Ojogwu"]} +{"group_id": "mb:a74a159f-de9e-4132-a280-a6800e4b4549", "source": "musicbrainz", "names": ["Sol Amarfio", "Solomon Amarfio"]} +{"group_id": "mb:6f73cf76-8550-459d-935a-d9b932b4266b", "source": "musicbrainz", "names": ["Libianca", "Libianca Kenzonkinboum Fonji"]} +{"group_id": "mb:8acc17e2-10d4-42e4-8d3c-9e03aabef8d4", "source": "musicbrainz", "names": ["Didi B", "Didi B bayo"]} +{"group_id": "mb:99fb295e-997e-46bc-a5d3-b853ddcab530", "source": "musicbrainz", "names": ["Abigail Chams", "A Chams", "Abby Chams", "Abigail Chamungwana"]} +{"group_id": "mb:af2abbff-608e-4c7a-a1af-6fc3bb0c0164", "source": "musicbrainz", "names": ["Maglera Doe Boy", "Tokelo Moyakhe"]} +{"group_id": "mb:025d1f65-856f-4cc0-a0df-92f136bf4c16", "source": "musicbrainz", "names": ["Costa Titch", "Costantinos Tsobanoglou"]} +{"group_id": "mb:97dbc25b-2de1-4afa-b3ef-5a34ddcf5766", "source": "musicbrainz", "names": ["Nkosazana Daughter", "Nolwazi Nzama"]} +{"group_id": "mb:8f15b84d-4f67-443a-a5f5-2f9a37e9a255", "source": "musicbrainz", "names": ["Douk Saga", "Stéphane Hamidou Doukouré"]} +{"group_id": "mb:71cb2a81-76bf-4147-a084-f33ab74a6938", "source": "musicbrainz", "names": ["Dudu Pukwana", "Mthutuzeli Dudu Pukwana"]} +{"group_id": "mb:9a4d5b32-a34a-4aec-b781-865b4fb56026", "source": "musicbrainz", "names": ["Dumisani Maraire", "Dumi Maraire", "Dumisani Abraham Maraire"]} +{"group_id": "mb:19437b07-34ee-4f0d-8891-3a7d63fcfa16", "source": "musicbrainz", "names": ["Eboa Lotin", "Emmanuel Eboa Lottin"]} +{"group_id": "mb:02cf1c62-42ab-4d3b-a13a-2bc8a81cd1dd", "source": "musicbrainz", "names": ["Jannie Du Toit", "Janie Du Toit"]} +{"group_id": "mb:4aeca61c-f834-41f7-bc03-fe0e364590a9", "source": "musicbrainz", "names": ["Joe Niemand", "Johannes Jordaan Niemand"]} +{"group_id": "mb:a51547eb-cf25-4ac3-a2d5-c8581f1eaa17", "source": "musicbrainz", "names": ["እዮብ መኮንን", "Eyob Mekonnen"]} +{"group_id": "mb:633ba024-2aa5-499c-ac7d-9c6c3b7d4de4", "source": "musicbrainz", "names": ["Peter Miles", "Peter Kanyike"]} +{"group_id": "mb:7be6f550-439d-47ec-ae03-7ee2b116b9d5", "source": "musicbrainz", "names": ["Mohbad", "Ilerioluwa Oladimeji Aloba"]} +{"group_id": "mb:e23806e9-853c-4cb6-937d-a2d7257ad046", "source": "musicbrainz", "names": ["Qing Madi", "Chimamanda Pearl Chukwuma"]} +{"group_id": "mb:faea091e-7b38-471f-b5a2-68ba6929cdaa", "source": "musicbrainz", "names": ["Shallipopi", "Crown Uzama"]} +{"group_id": "mb:d2bbca0d-e266-4af9-9904-0e81c6b2f5ca", "source": "musicbrainz", "names": ["Andre Vibez", "Alexander Uwaifo"]} +{"group_id": "mb:efedd130-9e54-43df-88ed-44b408a260e7", "source": "musicbrainz", "names": ["Lanie Banks", "Micheal Osingilio", "Micheal Osings", "Osingilio Micheal", "Osings Micheal", "Rap Lord"]} +{"group_id": "mb:9746cc74-449a-433a-90cd-d85a96bd799a", "source": "musicbrainz", "names": ["Yamê", "Emmanuel Sow"]} +{"group_id": "mb:8c1653de-cd16-4798-b3e3-364b3a23b22d", "source": "musicbrainz", "names": ["Socket", "Chidalu Fortune Tony"]} +{"group_id": "mb:11c7b6b1-7712-47b0-ab62-e0f68db9d8a2", "source": "musicbrainz", "names": ["Saba", "Anna Saba Lykke Oehlenschlæger"]} +{"group_id": "mb:1ae115ac-b58c-4ff4-9785-65047ad65297", "source": "musicbrainz", "names": ["Yallunder", "Yolanda Nyembezi"]} +{"group_id": "mb:8df58cfe-d433-43a2-bf51-73caa1901d4f", "source": "musicbrainz", "names": ["D Voice", "Abdul Hamisi Mtambo"]} +{"group_id": "mb:90c66549-a0a4-4227-ace1-587f7615774c", "source": "musicbrainz", "names": ["Morravey", "Daniella Ibinabo Daniel"]} +{"group_id": "mb:acb9bccd-b1d1-43b8-95f0-d205a8bfab01", "source": "musicbrainz", "names": ["King Flekky", "Only Boy, sadxx, ewafemi"]} +{"group_id": "mb:c7a03750-3bcf-46f3-9553-7b53cbde1fe7", "source": "musicbrainz", "names": ["King Paluta", "Thomas Adjei Wireko"]} +{"group_id": "mb:69cf654c-fcce-4901-9767-c928f9abc525", "source": "musicbrainz", "names": ["Black T Igwe", "Black T Togo", "Eric Yaw Otu", "black-t", "blackt Chronos’one", "blackt-igwe", "eric Otu"]} +{"group_id": "mb:e140e82b-8898-4a14-a719-d4c5345842f8", "source": "musicbrainz", "names": ["King Tri-Zi", "Kayode Felix Abifarin"]} +{"group_id": "mb:244c930c-ac4a-4992-8d6c-0381da9390ce", "source": "musicbrainz", "names": ["Krexx Nv", "Black Proud Mofo", "Honest Ornan Okoawo", "Krexx"]} +{"group_id": "mb:19d99b5c-3231-4f6c-b03e-68e390b62e97", "source": "musicbrainz", "names": ["አሊ ቢራ", "Ali Birraa", "Ali Mohamed Birra", "Ali Mohammed Birra", "አሊ መሃመድ"]} +{"group_id": "mb:bc5c2918-4aba-4ef6-a245-100563a4487f", "source": "musicbrainz", "names": ["Miriam Makeba", "M. Makeba", "Makeba, Myriam", "Miriam Makebo", "Myriam Makeba", "Zenzile Miriam Makeba"]} +{"group_id": "mb:ec109929-d7ed-4806-94df-e99ca7e35173", "source": "musicbrainz", "names": ["Fela Sowande", "Olufela Obafunmilayo Sowande"]} +{"group_id": "mb:7594c121-fa3d-4270-9111-cfec34c85919", "source": "musicbrainz", "names": ["Ernesto Djédjé", "Ernest Djédjé Blé Loué"]} +{"group_id": "mb:e5712ceb-c37a-4c49-a11c-ccf4e21852d4", "source": "musicbrainz", "names": ["Troye Sivan", "Troye Sivan Mellet", "トロイ・シヴァン", "트로이", "트로이 시반"]} +{"group_id": "mb:ea524cc6-191a-4c05-ab88-3bb5c0880ca5", "source": "musicbrainz", "names": ["Tony Allen", "Tony Oladipo Allen"]} +{"group_id": "mb:954973dc-97db-4dc0-b812-3cc917f02adf", "source": "musicbrainz", "names": ["Viviane N'Dour", "Viviane Chidid"]} +{"group_id": "mb:0093cf21-ed2e-446d-921c-e716e05bdfe5", "source": "musicbrainz", "names": ["John Kongos", "John Theodore Kongos"]} +{"group_id": "mb:5d62fdac-a8f1-431f-81ff-1584fc05274b", "source": "musicbrainz", "names": ["Takura", "Tamuka Takura Tendayi"]} +{"group_id": "mb:9ae48763-3254-4aa8-b475-78156da01bc8", "source": "musicbrainz", "names": ["Kelly Dénis", "Kelly Denis", "Kimuli Dennis"]} +{"group_id": "mb:a4dd4cc7-576d-4126-9780-75a48741234e", "source": "musicbrainz", "names": ["Diamond Platnumz", "Naseeb Abdul Juma Issack"]} +{"group_id": "mb:4da2a1d8-e6d6-4ac3-b845-d624f9e3fce8", "source": "musicbrainz", "names": ["Brequette", "Brequette Shane Cassie"]} +{"group_id": "mb:4de10576-56c0-428f-842e-fe3cb9ca44fa", "source": "musicbrainz", "names": ["Jan Blohm", "George Harry"]} +{"group_id": "mb:91354fa3-f822-44d5-aa75-68bdc107472c", "source": "musicbrainz", "names": ["Olaf Andresen", "Hans Olaf Waldemar Rüdiger Emmerich Felix Januarius Andresen"]} +{"group_id": "mb:52486a37-7ebf-4eb4-b067-ba17417fe9d3", "source": "musicbrainz", "names": ["AKA", "Kiernan Jarryd Forbes"]} +{"group_id": "mb:2b6e27aa-d8f2-4227-aa3b-2c29088482d4", "source": "musicbrainz", "names": ["De Catamon", "Kenneth Chukwuemeka Asogwa"]} +{"group_id": "mb:cd0e9f37-1a2e-4e0c-9173-00ce9ccd1927", "source": "musicbrainz", "names": ["Rowlene", "Rowlene Bosman"]} +{"group_id": "mb:ea64afe0-9ef1-4b9d-b60e-f10c39552055", "source": "musicbrainz", "names": ["Lommy nine", "Daniel Peter Martinus"]} +{"group_id": "mb:259acb99-160d-4949-870d-1ec7fe96b89f", "source": "musicbrainz", "names": ["Luster Love", "Lehlogonolo Lekala"]} +{"group_id": "mb:82f1248a-1c41-40d0-95bd-116d96683912", "source": "musicbrainz", "names": ["Confidence Survival Eyong", "Ciel Music"]} +{"group_id": "mb:cc50dfc3-60ba-49a0-b796-8238f1357d12", "source": "musicbrainz", "names": ["Jarxd Anthony", "Bandile Matsena"]} +{"group_id": "mb:dff4a07d-e686-46bc-bd85-1ec017158f89", "source": "musicbrainz", "names": ["BigElli", "Dbadbllud", "Elli", "Elli Esh", "Ellidgunnelboss", "Elliot Oghenevwede Agbomi", "ThugBaby Elli"]} +{"group_id": "mb:38474d18-9204-4f60-a137-1fcc6750b869", "source": "musicbrainz", "names": ["Skepta", "Joseph Adanuga", "Joseph Adenuga, Jr."]} +{"group_id": "mb:ea3e7df3-463a-46ec-9af7-8fd71f8e3ab5", "source": "musicbrainz", "names": ["Akosua Busia", "Akosua Cyamama Busia", "Akosua Gyamama Busia"]} +{"group_id": "mb:b3168af2-179b-45c8-b3e4-ab8c04216acc", "source": "musicbrainz", "names": ["Anne‐Marie Nzié", "Anne-Marie Zié"]} +{"group_id": "mb:0c81881c-9fa6-4f08-8fd7-26b92e959bb1", "source": "musicbrainz", "names": ["Henri Dikongué", "Henri Dikongue", "Henry Dikongué"]} +{"group_id": "mb:4b59362f-fb23-4296-aaf9-d12da3a6768e", "source": "musicbrainz", "names": ["JJC", "Abdul Rasheed Bello", "JJC Skillz", "Skillz"]} +{"group_id": "mb:cce86049-37c7-4c8e-8921-9a410bc7ea82", "source": "musicbrainz", "names": ["Bi Kidude", "Fatma binti Baraka"]} +{"group_id": "mb:d3751278-462c-4bce-afa7-0ac9d36577ba", "source": "musicbrainz", "names": ["Laba Sosseh", "Laba Badara Sosseh", "Labah Sosseh"]} +{"group_id": "mb:bd18aaf7-97dd-4bdf-84f5-916111f1b0db", "source": "musicbrainz", "names": ["Teddy Afro", "Tewodros Kassahun", "Theodros Kassahun", "ቴዎድሮስ ካሳሁን", "ቴዲ አፍሮ"]} +{"group_id": "mb:d974e295-e3d8-4848-aeeb-e2ec9b553cf0", "source": "musicbrainz", "names": ["Tutu Puoane", "Tutu"]} +{"group_id": "mb:2d12a36d-3913-49bc-a738-7a055e980d45", "source": "musicbrainz", "names": ["Prince Nico Mbarga", "Prince Nico Mbarga & Rocafil Jazz"]} +{"group_id": "mb:64fc99a0-b887-4d44-9d48-2007afe0b0db", "source": "musicbrainz", "names": ["Mzilikazi Khumalo", "James Steven Mzilikazi Khumalo"]} +{"group_id": "mb:bfd6415f-5cba-4b84-9134-ee39ea7cf08c", "source": "musicbrainz", "names": ["Chris Evans Kaweesi", "Christopher Evans Kaweesi"]} +{"group_id": "mb:03a04986-d743-4d32-ac98-19bd61dd96d3", "source": "musicbrainz", "names": ["Efya", "Jane Fara Fauzziea Yahaya Afia Awindor"]} +{"group_id": "mb:ba800215-62c3-4fbf-93e9-8008186af81d", "source": "musicbrainz", "names": ["Olamide", "Olamide Gbenga Adedeji"]} +{"group_id": "mb:2fd8b4f2-af00-4235-9a8e-1fa3205fb643", "source": "musicbrainz", "names": ["Spoek Mathambo", "Spoek"]} +{"group_id": "mb:16ae2b79-5381-49ea-b5f2-ce827da8e869", "source": "musicbrainz", "names": ["Wiyaala", "Noella Wiyaala Nwadei"]} +{"group_id": "mb:a348b7e7-1e11-467f-ab2c-cc7e216470ce", "source": "musicbrainz", "names": ["WurlD", "Sadiq Onifade"]} +{"group_id": "mb:a9ae7d4b-10f0-4da8-8b8c-21722a074a54", "source": "musicbrainz", "names": ["Davido", "David Adedeji Adeleke"]} +{"group_id": "mb:7b24231e-faa5-4838-b6a8-6a2eb2727b37", "source": "musicbrainz", "names": ["KSI", "JJ Olatunji", "Olajide Olayinka Williams Olatunji"]} +{"group_id": "mb:73ecd380-11ca-4ccd-930a-0d1ed8de1050", "source": "musicbrainz", "names": ["Nathaniel Willemse", "Nathaniel"]} +{"group_id": "mb:3609ac9c-e5cd-446d-ac3f-b12a5c42c794", "source": "musicbrainz", "names": ["Ifi Ude", "Diana Ifeoma Ude"]} +{"group_id": "mb:f1f8a8c5-edc9-4fc6-bb91-4942fe44f15c", "source": "musicbrainz", "names": ["Пьер Нарцисс", "Mudio Mukutu Pierre Narcisse De Napoli De Suza", "Narciss P'er", "Nartsiss Pier", "Pierre Narcisse"]} +{"group_id": "mb:d2326d49-1ad2-41e1-9672-afe8143edbc9", "source": "musicbrainz", "names": ["Filipa", "Filipa Alexandra Carmo da Silva"]} +{"group_id": "mb:9dbcc131-1092-4ced-95d6-eeb8b300dca5", "source": "musicbrainz", "names": ["Eddy Kenzo", "Edrisah Kenzo Musuuzah"]} +{"group_id": "mb:d02f9327-7c31-487a-a287-51c85dc08481", "source": "musicbrainz", "names": ["GNL Zamba", "Ernest Nsimbitulye Lupiiyazitta Zamba"]} +{"group_id": "mb:3c0fc4de-2b6b-4664-a0e6-468e585eb4ec", "source": "musicbrainz", "names": ["Nomfusi", "Nomfusi Gotyana"]} +{"group_id": "mb:2ce60396-e167-4c91-803a-aca86671775b", "source": "musicbrainz", "names": ["Dapo Torimiro", "Oladapo Torimiro"]} +{"group_id": "mb:23a67359-d57c-4704-b722-c3032dd7f5de", "source": "musicbrainz", "names": ["Seyi Shay", "Deborah Oluwaseyi Joshua", "Oluwaseyi Odedere"]} +{"group_id": "mb:33bfd427-2786-4d66-ab25-7f0523c444b4", "source": "musicbrainz", "names": ["Aziz Azion", "Aziz Mukisa"]} +{"group_id": "mb:12689a6e-d527-4024-84c3-26dc2f9a2cee", "source": "musicbrainz", "names": ["Reminisce", "Remilekun Abdulkalid Safaru"]} +{"group_id": "mb:cee01a83-a440-4b22-b5f6-76838a3d687b", "source": "musicbrainz", "names": ["Euphonik", "DJ Euphonik", "Themba Mbongeni Nkosi"]} +{"group_id": "mb:98fd0571-0ddb-4ee8-9e1b-19a9a7294554", "source": "musicbrainz", "names": ["Emahoy Tsegué-Maryam Guèbrou", "Emahoy Tsege Mariam Gebru", "The Honky Tonk Nun", "Tsege Mariam Gebru", "Tsegué-Maryam Guebrou", "Tsegué-Maryam Guèbrou", "Yewubdar Gebru"]} +{"group_id": "mb:387def2a-4309-4007-a51c-dfb1bc2c2962", "source": "musicbrainz", "names": ["Shatta Wale", "Charles Nii Armah Mensah Jnr."]} +{"group_id": "mb:1f07455b-1785-4b96-8edf-fdac5eef9cc0", "source": "musicbrainz", "names": ["Rema Namakula", "Rehema Namakula", "Rema"]} +{"group_id": "mb:405da592-9b1d-41e1-8847-2a6568268f5b", "source": "musicbrainz", "names": ["Jovi", "Le Monstre"]} +{"group_id": "mb:cae7634f-8104-4eb7-9371-6097ad078bb5", "source": "musicbrainz", "names": ["Cassper Nyovest", "Refiloe Maele Phoolo", "Refilwe Maele Phoolo"]} +{"group_id": "mb:c907dd00-0819-4ce3-8d52-39223f0d0c88", "source": "musicbrainz", "names": ["Patoranking", "Patrick Nnaemeka Okorie"]} +{"group_id": "mb:78a19169-ac75-4868-b504-7e2e073118e0", "source": "musicbrainz", "names": ["Burna Boy", "Damini Ebunoluwa Ogulu", "Damini Ogulu"]} +{"group_id": "mb:48ea2dab-6ee9-406a-ac60-21014375c09f", "source": "musicbrainz", "names": ["Becca", "Rebecca Akosua Acheampomaa Acheampong"]} +{"group_id": "mb:afe249a1-7576-4d4e-87b6-c83cbc422fe1", "source": "musicbrainz", "names": ["Niyola", "Eniola Akinbo"]} +{"group_id": "mb:60bd7ad1-8174-4f3e-934b-4a12fc2452fb", "source": "musicbrainz", "names": ["Pape Diouf", "Pape Cheikh Diouf"]} +{"group_id": "mb:413e09db-5c88-4585-a5ed-39aba33baca0", "source": "musicbrainz", "names": ["Phyno", "Chibuzo Nelson Azubuike"]} +{"group_id": "mb:14ed2fab-d941-4b56-a06f-fa1cc93c23d6", "source": "musicbrainz", "names": ["Yemi Alade", "Yemi Eberechi Alade"]} +{"group_id": "mb:b72bf1b5-42e4-408e-9625-739f8ba66ffe", "source": "musicbrainz", "names": ["Shizzi", "Oluwaseyi Akerele", "Oluwasheyi Christian Akerele"]} +{"group_id": "mb:9335fbe8-fab3-4e3e-94b6-f3c306869f8a", "source": "musicbrainz", "names": ["Khuli Chana", "Khulane Morule"]} +{"group_id": "mb:f4620c82-8043-4c08-bfcc-a7354d34e55e", "source": "musicbrainz", "names": ["Oritse Femi", "Oritsefemi"]} +{"group_id": "mb:a85c9412-ba00-4be9-9d0a-ddce32936a3e", "source": "musicbrainz", "names": ["Elly Wamala", "Eli Wamala", "Eli Wamala & Band", "Elishama Lukwata Wamala"]} +{"group_id": "mb:90e98512-78ae-4afe-bda6-1d15b2e00f99", "source": "musicbrainz", "names": ["Angella Katatumba", "Angella Franklin Keihongani Katatumba"]} +{"group_id": "mb:0d42fdf3-886a-42c4-bd90-eeef600c81fa", "source": "musicbrainz", "names": ["Fille", "Fille Mutoni"]} +{"group_id": "mb:7a1502cd-c60b-47a0-ab50-0b1ffe7a4355", "source": "musicbrainz", "names": ["Cindy Sanyu", "Cindy"]} +{"group_id": "mb:fe485453-3c5e-4f54-b998-8332332fe312", "source": "musicbrainz", "names": ["Riky Rick", "Rikhado Muziwendlovu Chifaro Makhado"]} +{"group_id": "mb:2a5f6fc6-1c1c-4f51-812c-00067fdc4e13", "source": "musicbrainz", "names": ["Levixone", "Sam Lucas Lubyogo"]} +{"group_id": "mb:41d7fa7b-aa7e-425c-997a-0739befbea09", "source": "musicbrainz", "names": ["Vampino", "Elvis Kirya", "Vamposs"]} +{"group_id": "mb:06cfade6-03d4-47e7-808e-d012f7f64ca7", "source": "musicbrainz", "names": ["Chicco", "Chicco Twala", "Sello Twala"]} +{"group_id": "mb:57f9751d-70b9-48a0-98f9-826c4ec8c521", "source": "musicbrainz", "names": ["S.O.", "Seun Otukpe"]} +{"group_id": "mb:72adb13a-800e-44b5-9aef-5c7d8cb6a2d7", "source": "musicbrainz", "names": ["Mr Eazi", "Oluwatosin Oluwole Ajibade", "mrEazi"]} +{"group_id": "mb:4f249a17-19f1-4931-8a49-16b5e270bd69", "source": "musicbrainz", "names": ["Bello Figo", "Paul Yeboah"]} +{"group_id": "mb:b8a7bfd1-8ad4-4b6c-832e-c7f0fc420fd9", "source": "musicbrainz", "names": ["Haacaaluu Hundessaa", "Hachalu Hundessa"]} +{"group_id": "mb:94dd8d27-5d42-4fa6-8851-84b470ed4b9f", "source": "musicbrainz", "names": ["DJ Maphorisa", "Madumane", "THEMBA SONNY BOY SEKOWE", "Themba Sekowe"]} +{"group_id": "mb:77ad92b8-4756-4470-a6d4-8f691860550c", "source": "musicbrainz", "names": ["Phil Ramone", "Philip Rabinowitz", "Philip Ramone"]} +{"group_id": "mb:af081ea2-7a2c-4fbd-8200-92d62056b5f5", "source": "musicbrainz", "names": ["Youssou N’Dour", "Y. N'Dour", "Yassou Ndour", "Youssou N' Dour", "Youssou Ndour"]} +{"group_id": "mb:83a2e0fb-3d9b-46ff-b383-3dde54c15297", "source": "musicbrainz", "names": ["Hugh Masekela", "Hugh Masakela", "Hugh Maskela", "Hugh Ramapolo Masekela"]} +{"group_id": "mb:edef3cfa-4e5e-4d64-8bd8-20f9dc1d8cad", "source": "musicbrainz", "names": ["Tiken Jah Fakoly", "Doumbia Moussa Fakoly", "Tiken Jah Fakoli"]} +{"group_id": "mb:bf9e33a8-1bda-48fe-9fbe-71e3052c7eec", "source": "musicbrainz", "names": ["André Letoit", "André le Roux du Toit"]} +{"group_id": "mb:6cf028d2-0366-4cb8-9198-c86569f5b0d4", "source": "musicbrainz", "names": ["Shaun Morgan", "Shaun Morgan Welgemoed"]} +{"group_id": "mb:7b542973-8103-43f9-b39c-63963d886bc5", "source": "musicbrainz", "names": ["Robbie Jansen", "Robert Edward Jansen"]} +{"group_id": "mb:55e236f3-79a1-4d32-9ce8-f89801b7f851", "source": "musicbrainz", "names": ["Yandé Codou Sène", "Yande Codou Sene"]} +{"group_id": "mb:8c034b3f-a5c7-448e-939f-e7afcb630a85", "source": "musicbrainz", "names": ["Nádine", "Nádine Hoffeldt"]} +{"group_id": "mb:e4f3ce29-cb49-42de-931e-5b48ddebaa16", "source": "musicbrainz", "names": ["Dilana Smith", "Dilana", "Dilana Jansen VanVüren", "Dilana Jansen van Vuuren", "Dilana Robichaux", "Dilana Trudy Smith"]} +{"group_id": "mb:19a46f49-f8e1-4d8b-926d-6a26bc6c41c6", "source": "musicbrainz", "names": ["Toya Delazy", "Latoya Nontokozo Buthelezi"]} +{"group_id": "mb:6eaec861-c183-45ec-93c8-c5c5d84d024d", "source": "musicbrainz", "names": ["Minyeshu", "Minyeshu Kifle", "Minyeshu Kifle Tedla", "ምንይሹ ክፍሌ ተድላ"]} +{"group_id": "mb:9b3b1be2-154a-409b-91eb-7ff14c40c0b2", "source": "musicbrainz", "names": ["Victor Ntoni", "Victor Mhleli Ntoni"]} +{"group_id": "mb:ec1f1304-328f-4ed3-98ae-74a73c6ada7d", "source": "musicbrainz", "names": ["A Pass", "Alexander Bagonza"]} +{"group_id": "mb:d221571f-966a-41ac-83b2-261b6fda2253", "source": "musicbrainz", "names": ["Orlando Julius", "Julius Aremu Olusanya Ekemode", "Orlando Julius Ekemode"]} +{"group_id": "mb:c9c6bc20-2ddf-4844-830c-a3e6b85ad253", "source": "musicbrainz", "names": ["AKay47", "AK 47", "AK Fortyseven", "AKayFortyseven", "Emmanuel Mayanja"]} +{"group_id": "mb:0e49c76c-8686-4c34-a8e3-09716470b966", "source": "musicbrainz", "names": ["Joey B", "Darryl Paa Kwesi Bannerman-Martin"]} +{"group_id": "mb:b772d0a5-c6db-4d9c-a716-881e09579f07", "source": "musicbrainz", "names": ["Alune Wade", "Alioune Wade", "Alune"]} +{"group_id": "mb:e343f9b6-df77-4d79-9fe6-e8ed90d76de6", "source": "musicbrainz", "names": ["Flex D’Paper", "Alex Julius Kwesigabo"]} +{"group_id": "mb:9937bdc8-e282-4f8a-b9f9-f66264c43cdf", "source": "musicbrainz", "names": ["B'Flow", "Brian Mumba Kasoka Bwembya"]} +{"group_id": "mb:261fa8cd-d4d8-4885-9409-47cf12dfae5d", "source": "musicbrainz", "names": ["DJ Cuppy", "Florence Ifeoluwa Otedola"]} +{"group_id": "mb:02a3b5c9-5173-44b4-a87b-116398bede6f", "source": "musicbrainz", "names": ["Cynthia Morgan", "Cynthia Ikponmwenosa Morgan"]} +{"group_id": "mb:b0712f0b-0df1-420c-bba9-166cecfd3fa6", "source": "musicbrainz", "names": ["Hal Shaper", "Harold David Shaper", "Shaper", "Г. Шапер"]} +{"group_id": "mb:8659a81e-3f22-4035-bdc6-8cf89ada7d50", "source": "musicbrainz", "names": ["Runtown", "Douglas Jack Agu", "Douglas Jack Agu Listen"]} +{"group_id": "mb:feba5625-96f5-4333-9831-4461cbc57adb", "source": "musicbrainz", "names": ["Lemma Gebre Hiwot", "ለማ ገብረ ሕይወት"]} +{"group_id": "mb:58019c23-d7f3-4932-b87f-5351df1ccc79", "source": "musicbrainz", "names": ["Kingsley Chinweike Okonkwo", "Kcee"]} +{"group_id": "mb:c203e6dc-3f1e-4783-afc3-d0274b0e23ee", "source": "musicbrainz", "names": ["Kizz Daniel", "Daniel Anidugbe", "Kiss Daniel", "Oluwatobiloba Daniel Anidugbe"]} +{"group_id": "mb:4396961c-d5bb-4301-8fee-07b218ddf67e", "source": "musicbrainz", "names": ["Sarz", "Osabuohien Osaretin"]} +{"group_id": "mb:b1d75ab2-8bed-4e1a-a197-44dd3e36b320", "source": "musicbrainz", "names": ["Peter Klatzow", "Peter James Leonard Klatzow"]} +{"group_id": "mb:e1f0fd13-5328-4b34-b54f-f27091b9ad82", "source": "musicbrainz", "names": ["D’Prince", "Charles Enebeli", "Omoba"]} +{"group_id": "mb:cbbd8643-19cf-4a01-b258-d21f2d1b2461", "source": "musicbrainz", "names": ["Spinall", "DJ Spinall", "Sodamola Oluseye Desmond"]} +{"group_id": "mb:3a351781-cad2-43b3-9fb9-cb44a9960719", "source": "musicbrainz", "names": ["Senyaka", "Senyaka Kekana", "Thula Kekana"]} +{"group_id": "mb:56ca6fdf-2ed0-405b-b797-5adb82699e8c", "source": "musicbrainz", "names": ["Harrysong", "Harrison Tare Okiri"]} +{"group_id": "mb:419bc801-028f-4e12-9444-891eec318cb2", "source": "musicbrainz", "names": ["Da L.E.S.", "Leslie Jonathan Mampe Jr."]} +{"group_id": "mb:a3cadfbd-d2ac-430f-8e53-3964e3d5d46a", "source": "musicbrainz", "names": ["Adekunle Gold", "Adekunle Almoruf Kosoko", "Adekunle Kosoko", "Adenkule Gold", "Adkunle Gold"]} +{"group_id": "mb:b68e051f-2a02-40c5-a99f-da78cc65a5d5", "source": "musicbrainz", "names": ["Alikiba", "Ali Salehe kiba", "ali kiba"]} +{"group_id": "mb:61fa6777-1fdc-4392-938c-029d79cd8667", "source": "musicbrainz", "names": ["Del B", "Ayodele Basil", "Ayodele Joseph Basil"]} +{"group_id": "mb:41e6febf-2ce1-4f8c-b4e6-7b6c9d5fcd32", "source": "musicbrainz", "names": ["Pheelz", "Philip Kayode Moses"]} +{"group_id": "mb:f9b9f6d9-3ef6-4bc3-b81d-d504a97e70d7", "source": "musicbrainz", "names": ["Falz", "FALZ THE BAHDGUY", "Folarin Falana"]} +{"group_id": "mb:a10c8d0c-30c0-48f3-bd29-0f8080aae522", "source": "musicbrainz", "names": ["Young Jonn", "John Saviours Udomboso", "Young John"]} +{"group_id": "mb:03b33dce-6a0b-4ce6-a084-89771743ff8d", "source": "musicbrainz", "names": ["Nasty C", "Nsikayesizwe David Junior Ngcobo", "Nsikayesizwe David Ngcobo"]} +{"group_id": "mb:638f1437-be52-4be8-aa55-7a8bba826296", "source": "musicbrainz", "names": ["iFani", "Mzayifani Mzondeleli Boltina"]} +{"group_id": "mb:ff7a88fa-ac5f-4781-84f8-fd1cf13328d6", "source": "musicbrainz", "names": ["Anatii", "Anathi Bhongo Mnyango"]} +{"group_id": "mb:69589622-f38a-442f-bd97-57d733b2b201", "source": "musicbrainz", "names": ["Tekno", "Augustine Miles Kelechi Okechukwu"]} +{"group_id": "mb:517a2c5e-87df-454b-b355-0c927cbb1a7e", "source": "musicbrainz", "names": ["OC Osilliation", "OC"]} +{"group_id": "mb:54fefc16-9c4f-4c79-8995-4d1d9e1f0998", "source": "musicbrainz", "names": ["Simi", "Simisola Bolatito Ogunleye"]} +{"group_id": "mb:44d2c069-7641-49ed-bb35-4e7c41f40c2a", "source": "musicbrainz", "names": ["Kiddominant", "Ayoola Oladapo Agboola", "KDDO"]} +{"group_id": "mb:c4e1de29-2e62-4924-b351-6a1981415ed7", "source": "musicbrainz", "names": ["Sandra Nankoma", "Sandy Soul"]} +{"group_id": "mb:ff12b493-cfcb-4e18-b966-8fea341ed5f9", "source": "musicbrainz", "names": ["Kofi Kinaata", "Martin King Arthur"]} +{"group_id": "mb:c638bf27-a1ac-4c1a-80a3-3d7de8ed606a", "source": "musicbrainz", "names": ["Niniola", "Níníọlá Àpáta"]} +{"group_id": "mb:637d7628-b079-4663-97c1-fd46aaa5458c", "source": "musicbrainz", "names": ["K1 De Ultimate", "Olasunkanmi Wasiu Ishola"]} +{"group_id": "mb:5c72c55a-11e5-44ae-8cb8-e3a45dd3fea0", "source": "musicbrainz", "names": ["Shaydee", "Shadrach Adeboye Folarin"]} +{"group_id": "mb:40b0b187-1bb2-410b-a555-ed6cdda2b67d", "source": "musicbrainz", "names": ["Zonke", "Zonke Dikana"]} +{"group_id": "mb:e4f9b302-18f7-41e7-860e-9b0e7f8e0f7a", "source": "musicbrainz", "names": ["Sheebah", "Queen Karma", "Sheebah Karungi"]} +{"group_id": "mb:961f31f2-31bf-4469-bc66-f6a2fda12db5", "source": "musicbrainz", "names": ["Trevor Jones", "Alfred Jones", "Charles Jones", "Jones", "Tremor Jones", "Trevon Jones", "Trevor A.C. Jones", "Trevor AC Jones", "Trevor Alfred Charles Jones", "Trevor Jhones", "Trevor Johnes", "Trevor Jonas", "Trevor Jonez", "Trevor Jons", "Trevor Jonz", "Trewor Jones"]} +{"group_id": "mb:d1d9cfa4-43b2-4acf-8971-4b429a0b4473", "source": "musicbrainz", "names": ["Stella Chiweshe", "Stella Chiswese", "Stella Chiweche", "Stella Nekati Chiweshe", "Stella Rambisai Chiweshe", "Stella Rambisai Chiweshe Nekati"]} +{"group_id": "mb:d64a8727-d962-4092-9d40-32ec9c39fbb4", "source": "musicbrainz", "names": ["Dale Stewart", "Dale William Stewart"]} +{"group_id": "mb:271973a1-7177-4bcf-9a01-ac75d3691035", "source": "musicbrainz", "names": ["Nneka", "Nineka", "Nneka Lucia Egbuna"]} +{"group_id": "mb:85a3072a-08eb-43a4-a57d-f7084503ee4c", "source": "musicbrainz", "names": ["Dr. Alban", "Alban Nwapa", "Alban Uzoma Nwapa", "Doctor Alban", "Dr Alban"]} +{"group_id": "mb:6514cffa-fbe0-4965-ad88-e998ead8a82a", "source": "musicbrainz", "names": ["Fela Kuti", "Fela", "Fela & Egypt 80", "Fela Anikulapo Kuti", "Fela Anikulapo Kuti & Africa '70", "Fela Anikulapo-kuti", "Fela Ransome Kuti", "Fela and Africa 70", "Olufela Olusegun Oludotun Ransome-Kuti", "フェラ・クティ"]} +{"group_id": "mb:fd64e185-9973-44d5-ad09-5d5562804292", "source": "musicbrainz", "names": ["Abdullah Ibrahim", "Abdullah Abrahim", "Abdullah Ibrahim (Dollar Brand)", "Adolph Johannes Brand", "Dollar Brand", "Dollar Brand / Abdullah Ibrahim", "Dollar Brand; Abdullah Ibrahim", "ダラー・ブランド"]} +{"group_id": "mb:d45aeffc-ab0d-4534-94c7-6c9ce31d4838", "source": "musicbrainz", "names": ["Kippie Moeketsi", "Jeremiah Morolong Moeketsi"]} +{"group_id": "mb:a18dc02f-8000-4eb5-8e2a-9b884873f009", "source": "musicbrainz", "names": ["Mahlathini", "Simon Mahlathini Nkabinde", "Simon Nkabinde"]} +{"group_id": "mb:26dc1641-9e83-46bb-ba77-bf331ca41bfb", "source": "musicbrainz", "names": ["Wes", "Patrice Éric Delacour", "Wes Madiko"]} +{"group_id": "mb:d4938195-6548-479f-9f11-a4e22d915770", "source": "musicbrainz", "names": ["ጌታቸው፡መኩሪያ", "Getachew Mekuria", "Getatchew Mekurya", "Gétatchèw Mèkurya", "ጌታቸው፡መኩሪያ፡ወልደተክሌ"]} +{"group_id": "mb:864e1fb8-c35c-40ee-9882-0dd5da1ea4ec", "source": "musicbrainz", "names": ["አለማየሁ እሸቴ", "Alemayehu", "Alemayehu Eshete", "Alèmayèhu Eshèté", "Eshèté, Alèmayèhu", "Ethiopiques", "ዓለማየሁ እሸቴ"]} +{"group_id": "mb:c860bed7-9756-4bf8-bd31-190d405170ef", "source": "musicbrainz", "names": ["አስናቀች ወርቁ", "Asnakech Worku", "Asnaketch Worku", "Asnatqètch Wèrqu", "Аснакеч Верку", "אסנקץ' וורקו", "اسناكيتش وركو"]} +{"group_id": "mb:2e9c624b-f2d6-456d-9778-8d0b004b8ffa", "source": "musicbrainz", "names": ["Ayub Ogada", "Job Seda"]} +{"group_id": "mb:3ddb510b-04f8-4c22-8408-2831b1616ec7", "source": "musicbrainz", "names": ["A’salfo", "A' Salfo", "A'salfo", "Assalfo", "Assalfo Traoré", "S. Traore", "Salif A'Salfo", "Salif Traore", "Salif Traoré", "Salif Traoré A'Salfo", "Traore Salif A'Salfo", "Traoré Salif", "Traoré Salif \"A'Salfo\"", "Traoré Salif \"A-Salfo\""]} +{"group_id": "mb:c40f4457-5a6f-4e6b-9257-6dafaf8e0007", "source": "musicbrainz", "names": ["Candice", "Candice Hillebrand"]} +{"group_id": "mb:e8e3cf54-3dde-40c6-8a5e-c80d43a5c6d3", "source": "musicbrainz", "names": ["Coumba Gawlo", "Comba Gawlo", "Coumba Gwalo"]} +{"group_id": "mb:1d69ce47-7ec6-4fac-a82e-40e66dfd34f6", "source": "musicbrainz", "names": ["Dosseh", "Dohsey", "Dorian Dosseh N’Goumou"]} +{"group_id": "mb:6db0aa2f-7d59-4c9e-a3cb-730f3a127a9a", "source": "musicbrainz", "names": ["Doudou N’diaye Rose", "Doudou N'Diaye Rose Percussion Orchestra"]} +{"group_id": "mb:b3c89b39-4564-4dc4-a071-24b649bf3dfe", "source": "musicbrainz", "names": ["Faada Freddy", "Abdoul Fatah Seck", "Faada Fredy", "Faada Freedy", "Fadda Freddy"]} +{"group_id": "mb:9b982925-f0b3-440f-b2a1-fedb544ce983", "source": "musicbrainz", "names": ["Fadhili William", "William Fedhile"]} +{"group_id": "mb:20f0c423-497a-4b57-b6fb-7b6e65d69b75", "source": "musicbrainz", "names": ["Félix Sabal Lecco", "Felix Sabal Lecco", "Félix Sabal-Lecco", "Félix Yves Silvère Sabal-Lecco"]} +{"group_id": "mb:d43190ca-1919-40ec-be56-4cd7657c2008", "source": "musicbrainz", "names": ["Gino Sitson", "Pierre-Eugène Sitchet"]} +{"group_id": "mb:cb8dad1a-a721-4e7d-a598-217848d9ad7e", "source": "musicbrainz", "names": ["ግርማ በየነ", "Girma Beyene"]} +{"group_id": "mb:23cac0c4-a2ad-43b2-9256-5aa404c8c431", "source": "musicbrainz", "names": ["Seun Kuti & Egypt 80", "Seun Anikulapo Kuti & Egypt 80"]} +{"group_id": "mb:ce1e63df-5d87-4618-8ad0-61aff87290e6", "source": "musicbrainz", "names": ["Majek Fashek", "Majekodumni Fasheke"]} +{"group_id": "mb:92fec04d-18fe-4a2e-9831-fc64c6da429d", "source": "musicbrainz", "names": ["I.K. Dairo", "I.K. Dairo M.B.E.", "Isaiah Kehinde Dairo"]} +{"group_id": "mb:a4b33cdb-8bc0-4ad0-a356-b110962e64ba", "source": "musicbrainz", "names": ["Nayanka Bell", "Nayanka Bel"]} +{"group_id": "mb:324cf6ef-2a29-483b-b7d8-8a1a534079a5", "source": "musicbrainz", "names": ["Pit Baccardi", "Guillaume N’Goumou", "Pit", "Pit Bacardi", "Pitt Baccardi"]} +{"group_id": "mb:7cc8b119-b2c4-4917-bf78-c5c66d6f4304", "source": "musicbrainz", "names": ["Sandra Nkaké", "Sandra N' Kake"]} +{"group_id": "mb:84a30ec1-2f38-49ba-86f9-dfe0da16e0a0", "source": "musicbrainz", "names": ["Suzanna Owiyo", "Suzzana Owiyo", "Suzzana Owíyo"]} +{"group_id": "mb:9c14317c-87b9-4f7c-a5a5-80add17a1709", "source": "musicbrainz", "names": ["Alice Phoebe Lou", "Alice Matthew"]} +{"group_id": "mb:716325ce-2df7-4af1-ada2-d6a96be340a0", "source": "musicbrainz", "names": ["May D", "Akinmayokun Awodumila"]} +{"group_id": "mb:a5cdc812-f93e-47ff-8f6d-e53c5c8469e1", "source": "musicbrainz", "names": ["Chike", "Chike Ezekpeazu Osebuka"]} +{"group_id": "mb:f02be024-8599-403b-acf4-2dfde734f1c3", "source": "musicbrainz", "names": ["A-Reece", "Lehlogonolo Ronald Mataboge"]} +{"group_id": "mb:1de38950-9199-40e7-bcef-645c83aa9c94", "source": "musicbrainz", "names": ["Aleah", "Aleah Liane Stanbridge", "Aleah Stanbridge", "Aleah Starbridge", "Julia Liane Stanbridge"]} +{"group_id": "mb:0e68006a-7644-403e-874e-3d378f8551a8", "source": "musicbrainz", "names": ["Winning Jah", "Kingsley Eno Osagie"]} +{"group_id": "mb:43696104-c1ee-4508-b49c-3338eb9c11a2", "source": "musicbrainz", "names": ["RAY BLK", "Ray Blizzy", "Rita Ekwere", "Rita Ifiok Abasi Ekwere"]} +{"group_id": "mb:246ca6e2-2608-4bd6-8425-746b82dfcb52", "source": "musicbrainz", "names": ["DeepTouchSA", "Simbarashe Musingarimi"]} +{"group_id": "mb:f455dca4-394e-4d2e-92a8-bc46652c193d", "source": "musicbrainz", "names": ["Nakhane", "Nakhane Toure", "Nakhane Touré"]} +{"group_id": "mb:4fa729c9-babb-4f11-828b-ecad8a2bcfec", "source": "musicbrainz", "names": ["Dizzy Dee", "Desire Sibanda"]} +{"group_id": "mb:160d74f7-cc90-4b9b-9150-3440a7a2918e", "source": "musicbrainz", "names": ["Shekhinah", "Shekhinah Thandi Donnell"]} +{"group_id": "mb:86a5c686-f1c5-4e4e-87c0-0a1cd64cc012", "source": "musicbrainz", "names": ["Hope Masike", "Ruvimbo Hope Masike"]} +{"group_id": "mb:b5402cac-a7b1-484f-bfd8-b8e97c6488f3", "source": "musicbrainz", "names": ["Medikal", "Samuel Adu Frimpong"]} +{"group_id": "mb:593bee5f-36b9-401d-bbfe-996339961285", "source": "musicbrainz", "names": ["Nadia Nakai", "Nadia Nakai Kandava"]} +{"group_id": "mb:44d8a9c5-f641-4c00-a925-a0a8d5ba058f", "source": "musicbrainz", "names": ["Dice Ailes", "Shasha Damilola Alesh"]} +{"group_id": "mb:59eb2f70-b694-4003-bcfc-cb6fe44999bd", "source": "musicbrainz", "names": ["Amanda Black", "Amanda Benedicta Antony"]} +{"group_id": "mb:4b50ec9e-ea83-4824-8dae-2e520d45e6f9", "source": "musicbrainz", "names": ["Vagabon", "Laetitia Tamko"]} +{"group_id": "mb:bc84981d-64e5-4749-bc98-4f1c02acdee3", "source": "musicbrainz", "names": ["thndo", "Thando", "Thando Sikwila", "Thandolwethu Emily Nomvula Sikwila"]} +{"group_id": "mb:f06368b7-c8b0-4578-8c64-7a3ed517f745", "source": "musicbrainz", "names": ["Sho Madjozi", "Maya Christinah Xichavo Wegerif"]} +{"group_id": "mb:de224d2f-13e2-48a2-beb3-538a596cd502", "source": "musicbrainz", "names": ["Eko", "Eko Louis Roosevelt", "Eko Roosevelt Louis"]} +{"group_id": "mb:71b1bda9-d0e8-468a-8964-62c8d62d8c00", "source": "musicbrainz", "names": ["DarkoVibes", "Paul Nii Amu Andrew Darko"]} +{"group_id": "mb:9d79c790-9897-464e-aef0-db5bd3290f00", "source": "musicbrainz", "names": ["Sampa the Great", "Sampa Tembo"]} +{"group_id": "mb:997e218b-28b7-4691-9edf-5e7fb5983f89", "source": "musicbrainz", "names": ["Mlex Songz", "Alex Obeheremen Usiabulu"]} +{"group_id": "mb:884ee438-f185-4b2c-b23b-f96886bdc91f", "source": "musicbrainz", "names": ["Trevor Rabin", "Charles Rabin", "Rabin", "Trevon Rabin", "Trevor Charles", "Trevor Charles Rabin", "Trevor Rabinn", "Trevor Rabyn", "Trevor Raebin", "Trevor Robin", "Trevor Rubin"]} +{"group_id": "mb:97aeedc1-f252-4cfa-a8d8-c895c490532f", "source": "musicbrainz", "names": ["Lucky Dube", "Lucky Philip Dube"]} +{"group_id": "mb:2fa95b32-3c11-42d7-b495-12fc6be0a024", "source": "musicbrainz", "names": ["Dave Matthews", "Dave J. Matthews", "David J. Matthews", "David John Matthews", "David Matthews"]} +{"group_id": "mb:9f7483cf-d8aa-45ce-b90c-da2e359a7815", "source": "musicbrainz", "names": ["Letta Mbulu", "Letta"]} +{"group_id": "mb:756335e3-00c1-4094-b878-b28d70477fd2", "source": "musicbrainz", "names": ["Blondie Chaplin", "Terence William Chaplin"]} +{"group_id": "mb:6253d563-08a8-404e-9336-d3312825827e", "source": "musicbrainz", "names": ["Robert Calvert", "Bob Calvert", "Robert Newton Calvert"]} +{"group_id": "mb:889693ef-6f88-4f87-8e42-1efa2c673b79", "source": "musicbrainz", "names": ["Irma", "Irma Carine Pany"]} +{"group_id": "mb:054171e2-d157-48ce-9e04-d6b1f075ed5b", "source": "musicbrainz", "names": ["Mira Calix", "Chantal Francesca Passamonte", "Chantal Passamonte"]} +{"group_id": "mb:826b488f-5164-45ca-abc4-ab11b3c321eb", "source": "musicbrainz", "names": ["Manu Dibango", "Dibango, Manu", "Emmanuel N'Djoké Dibango", "Manu Dibangu"]} +{"group_id": "mb:7241c957-ae3d-48a2-897d-2e4f11f25cdb", "source": "musicbrainz", "names": ["Tsidi Ibrahim", "Tsidi A. Ibrahim"]} +{"group_id": "mb:424b6f2c-9cb8-40f6-9ee0-d03685659a2a", "source": "musicbrainz", "names": ["Sally Nyolo", "Solange Nyolo"]} +{"group_id": "mb:d9ac16b0-f873-4454-9e4c-e93e404b696b", "source": "musicbrainz", "names": ["¥O-LANDI VI$$ER", "Anica the Snufling", "Anri du Toit", "Neon Demon", "Yolandi Visser"]} +{"group_id": "mb:cc48bc25-869e-4cfa-b817-09838976ef36", "source": "musicbrainz", "names": ["Ejigayehu “Gigi” Shibabaw", "Ejigayehu Shibabaw", "Gigi"]} +{"group_id": "mb:fd1069ae-f5f5-4ae7-8416-c0d081c6db36", "source": "musicbrainz", "names": ["Meiway", "Frederic Desire Ehui"]} +{"group_id": "mb:3a4de95b-22f9-4325-afd6-c4d648befcba", "source": "musicbrainz", "names": ["Ismaël Lô", "Isma l Lo", "Ismael Lo", "Ismaël Lo", "Iso"]} +{"group_id": "mb:dc37528a-4dad-40c9-9cf2-e36ba326606d", "source": "musicbrainz", "names": ["Busi Mhlongo", "Vickie", "Vicky Mhlongo", "Victoria Busisiwe Mhlongo"]} +{"group_id": "mb:fab6adab-b46f-45f8-8700-bc44408ba583", "source": "musicbrainz", "names": ["Francis Bebey", "Francis Etonde Bebey"]} +{"group_id": "mb:f2e3abb3-6b9c-4aaa-a08e-b1fde9528f09", "source": "musicbrainz", "names": ["Yvonne Chaka Chaka", "Yvonne Chanka Chanka"]} +{"group_id": "mb:f4298cb3-d6c4-4904-a76d-fa21e2ce0f34", "source": "musicbrainz", "names": ["Thione Seck", "Thione Ballago Seck"]} +{"group_id": "mb:dea3360c-501c-4d10-9710-8729f6a50d90", "source": "musicbrainz", "names": ["Teshome Mitiku", "Teshome Meteku", "Tèshomè Meteku", "ተሾመ ምትኩ"]} +{"group_id": "mb:15233f5e-1763-4418-b8b8-3b5b31595beb", "source": "musicbrainz", "names": ["Zekuhl", "Atna Jean Emmanuel Njock", "Manu Njock"]} +{"group_id": "mb:25b0d755-16e6-4ff8-ab4f-7226279019c2", "source": "musicbrainz", "names": ["Élage Diouf", "Alhadji Fall Diouf", "El Hadj Diouf", "El Hadji Fall Diouf"]} +{"group_id": "mb:26f887f1-a9e4-46c3-89e6-1e22aa931654", "source": "musicbrainz", "names": ["Bebe Cool", "Bebe Bunton", "Moses Ssali", "Ssali Moses Bebe Cool"]} +{"group_id": "mb:d7878ca7-b760-47c0-a8c3-f6eb0a0223ad", "source": "musicbrainz", "names": ["Thandiswa Mazwai", "Thandiswa", "Thandiswa Nyameka Mazwai"]} +{"group_id": "mb:eaaae1cd-1307-4e79-8b3f-ba27bf3b9aee", "source": "musicbrainz", "names": ["9ice", "Abolore Adegbola Akande"]} +{"group_id": "mb:c783dbc7-c1a7-4548-8fb9-195efc79bd85", "source": "musicbrainz", "names": ["A.B. Crentsil", "Alfred Benjamin Crentsil Jr."]} +{"group_id": "mb:14ee0a96-0321-4689-b64a-291a972808e7", "source": "musicbrainz", "names": ["Achieng Abura", "Lydia Achieng Abura"]} +{"group_id": "mb:bc46365a-e217-44cf-8c04-0926971895ab", "source": "musicbrainz", "names": ["Albert Mazibuko", "Mdletshe Albert Mazibuko"]} +{"group_id": "mb:e761a240-d962-4fd2-985e-c0d3bef94ab6", "source": "musicbrainz", "names": ["Anton Goosen", "Anton Goosen en Dozi", "Anton Lodewyk Goosen"]} +{"group_id": "mb:08f5f4c9-4ac0-4d44-bbe1-8ccfb56dc97b", "source": "musicbrainz", "names": ["Arnold van Wyk", "Arnoldus Christiaan Vlok van Wyk"]} +{"group_id": "mb:2f5d9fdb-c7ea-4b8e-8bce-d37ab4752a26", "source": "musicbrainz", "names": ["Batile Alake", "Batili Alake"]} +{"group_id": "mb:132f6722-f2c2-4fe6-86a0-5ad21d6a0c7a", "source": "musicbrainz", "names": ["BeBe Zahara Benet", "Nea Marshall Kudi Ngwa"]} +{"group_id": "mb:25bf053c-609f-4523-8a7c-1fedc2ff74e6", "source": "musicbrainz", "names": ["Ben Sharpa", "Kgotso Semela"]} +{"group_id": "mb:290dc7b2-a2f6-4b5b-92c7-f8cf875d057b", "source": "musicbrainz", "names": ["Blitz the Ambassador", "Blitz", "Samuel Bazawule"]} +{"group_id": "mb:5391dd5e-12ee-4be4-8246-98e37a8a6335", "source": "musicbrainz", "names": ["Jose Chameleone", "Joseph Mayanja"]} +{"group_id": "mb:17ebba35-783a-43fc-b5b7-b2559816e0fa", "source": "musicbrainz", "names": ["Chief Stephen Osita Osadebe", "Chief Stephen Osita Osadeb", "Stephen Osita Osadebe"]} +{"group_id": "mb:cbd2fc31-e1ee-492c-a36e-659ff4ccf42e", "source": "musicbrainz", "names": ["Christy Essien Igbokwe", "Christy Essien", "Christy Essien-Igbokwe"]} +{"group_id": "mb:2d0271a5-0d90-400b-932a-7fcd14eb3f27", "source": "musicbrainz", "names": ["Da Grin", "Oladapo Olaitan Olaonipekun"]} +{"group_id": "mb:0b824c3e-2d48-4c8a-9054-e664463a24e9", "source": "musicbrainz", "names": ["Daddy Owen", "Owen Mwatia"]} +{"group_id": "mb:e759d6f4-b3cd-4202-9a66-37fe9b344dcb", "source": "musicbrainz", "names": ["Dr Sid", "Sidney Esiri", "Sidney Onoriode Esiri"]} +{"group_id": "mb:44103f6a-f5db-4a69-92f3-4b6fa51e4f87", "source": "musicbrainz", "names": ["Dr. Sir Warrior", "Christogonus Ezebuiro Obinna", "Dr Sir Warrior"]} +{"group_id": "mb:d70a35a5-9883-4694-9ba0-b78c9f98a905", "source": "musicbrainz", "names": ["elDee", "Eldee the Don", "Lanre Dabiri"]} +{"group_id": "mb:37349096-c325-42f9-a6fe-7c67e33f2958", "source": "musicbrainz", "names": ["Efua", "Efua Ruth Baker"]} +{"group_id": "mb:9ef4c1d2-0b1c-41a7-b0bc-87b658d71001", "source": "musicbrainz", "names": ["EL", "E.L", "Elom Adablah"]} +{"group_id": "mb:3b3a3431-a010-4327-a2f3-278e51f49f2f", "source": "musicbrainz", "names": ["Eva Alordiah", "Elohor Eva Alordiah"]} +{"group_id": "mb:bbe412f3-9dde-49be-abf4-b233f957a992", "source": "musicbrainz", "names": ["Harmonize", "Hamonize", "Rajab Abdul Kahali", "Rajabu Abdulkahali Ibrahim"]} +{"group_id": "mb:028949b5-29f4-4da1-b39a-eb1ab81b8139", "source": "musicbrainz", "names": ["Ebere Chi", "Mercy Eberechi Uwaka"]} +{"group_id": "mb:1e8ae15c-2bdb-4542-a9a2-cc91de0b80b0", "source": "musicbrainz", "names": ["Rayvanny", "Raymond Shaban Mwakyusa"]} +{"group_id": "mb:ee601600-ceec-4b41-872d-4ac921f5c6f1", "source": "musicbrainz", "names": ["ጽሃይቱ፡በራኺ", "ጽሃይቱ በራኺ"]} +{"group_id": "mb:2d27c6b3-b904-40e5-84df-c060348c65f0", "source": "musicbrainz", "names": ["Renaida", "Renaida Kebyera Braun"]} +{"group_id": "mb:ae3b1984-8dc5-4d1e-9087-2c2575192983", "source": "musicbrainz", "names": ["Tryt", "StyleBoy", "Terrence Tichapondwa"]} +{"group_id": "mb:ece0d907-4872-4404-a5b6-502067f23076", "source": "musicbrainz", "names": ["King Promise", "Gregory Bortey Newman"]} +{"group_id": "mb:c34ea418-15cf-4219-b621-f1851ee6a27e", "source": "musicbrainz", "names": ["Dqueen", "Adesuwa Omoyeme Obatta"]} +{"group_id": "mb:c78acdee-916c-4ad4-a3e3-b382340d7918", "source": "musicbrainz", "names": ["Daphne", "Daphne Njie Efundem"]} +{"group_id": "mb:61f2ae93-ab59-4c59-aef6-43f5f9afceae", "source": "musicbrainz", "names": ["Robert John “Mutt” Lange", "\"Mutt\" Lange", "John \"Mutt\" Lange", "John Mutt Lange", "John R. Lange", "Mutt", "Mutt Lange", "R. Lange", "R.J. Lange", "Robert John Lange"]} +{"group_id": "mb:961498e7-b097-4341-891d-781235a8aebd", "source": "musicbrainz", "names": ["Johnny Clegg", "Jonathan Paul Clegg"]} +{"group_id": "mb:0b1e097a-4afa-4e82-b5ef-b49cfcb54927", "source": "musicbrainz", "names": ["Cheikh Lô", "Cheikh Lo", "Cheikh NDigel Lo"]} +{"group_id": "mb:2b63ea57-8619-4fba-9dff-9a20a1af6cb8", "source": "musicbrainz", "names": ["Watkin Tudor Jones", "Waddy Jones", "Watkin Tudor Jones Jnr", "Watkin Tudor Jones, Jr."]} +{"group_id": "mb:7147eef1-7c2f-4259-89e5-572c76dc16e5", "source": "musicbrainz", "names": ["Jonathan “J.R.” Rotem", "J. R. Rotem", "J. Rotem", "J.R. Rotem", "Jonathan JR Rotem", "Jonathan Reuven Rotem", "Jonathan Rotem"]} +{"group_id": "mb:66ccfea3-a7da-4d70-8a79-e490efa28798", "source": "musicbrainz", "names": ["Louis Moholo", "Loius Moholo-Moholo", "Louis Moholo-Moholo"]} +{"group_id": "mb:9dcca4a2-2e05-4f94-9a02-cb97b1beed56", "source": "musicbrainz", "names": ["Kenna", "KNA", "Kenna Zemedkun"]} +{"group_id": "mb:25a7bad5-dc39-446f-ad04-ea9b6dc5fe32", "source": "musicbrainz", "names": ["Flavour N'abania", "Chinedu Okoli", "Flavour"]} +{"group_id": "mb:0e940ca2-82f1-438f-9fc0-21639e960065", "source": "musicbrainz", "names": ["Geneviève Waïte", "Geneviève Waile"]} +{"group_id": "mb:36b47aca-c378-4f7f-b4a8-9cb2ccb81dc1", "source": "musicbrainz", "names": ["Hip Hop Pantsula", "HHP"]} +{"group_id": "mb:bc4b3d3a-bfdb-4400-8616-cf2d5692f6eb", "source": "musicbrainz", "names": ["Steve Kekana", "Tebogo Stephen Kekana"]} +{"group_id": "mb:83468752-0a35-4d9b-91d3-5e2544a816b0", "source": "musicbrainz", "names": ["Ice Prince", "Panshak Henry Zamani"]} +{"group_id": "mb:7b674b02-fabe-481c-8d87-22ccdcf74e45", "source": "musicbrainz", "names": ["JR", "JR (SA)", "JR Bogopa", "JRafrika", "Tabure Thabo Bogopa", "Thabo Bogopa"]} +{"group_id": "mb:adff8fcd-3659-40f2-91e9-41b8bd3aee2b", "source": "musicbrainz", "names": ["Josef Marais", "Joseph Pessach"]} +{"group_id": "mb:d2c1559a-29d2-4698-960a-72e7115f126f", "source": "musicbrainz", "names": ["Kaïssa", "Kaïssa Doumbé"]} +{"group_id": "mb:cfda6cc2-7eb3-42be-bb01-d2ff9f50d43c", "source": "musicbrainz", "names": ["Wyre", "Kevin Waire", "Lovechild"]} +{"group_id": "mb:51a5e85c-85b7-4cfd-82b0-2d8f815f2efc", "source": "musicbrainz", "names": ["Koo Nimo", "Daniel Amponsah", "Kwabena Boa-Amponsem"]} +{"group_id": "mb:c1897096-0202-4dc2-a3db-e3976166b880", "source": "musicbrainz", "names": ["Lágbájá", "'Bisade Ologunde", "ASCAP", "Bisade Ologunde", "Langbaja"]} +{"group_id": "mb:dba1acd5-baa3-40f7-90a2-2a20ce3ca4d0", "source": "musicbrainz", "names": ["K'Millian", "K'Million"]} +{"group_id": "mb:bfe2ae79-d0fe-463f-87b2-bbc4a3ab0cc2", "source": "musicbrainz", "names": ["M.I. Abaga", "M.I", "M.I Abaga", "M.I.", "Mr Incredible"]} +{"group_id": "mb:c68b0d91-26ad-4945-bfea-b16ce3bbfbc0", "source": "musicbrainz", "names": ["M.anifest", "Kwame Ametepee Tsikata", "Kwame Tsikata"]} +{"group_id": "mb:4d9ad9a7-0737-4ff3-81c0-eb12117daf76", "source": "musicbrainz", "names": ["Mbongeni Ngema", "Israel Mbongeni Ngema", "Mbogeni Ngema"]} +{"group_id": "mb:ae544086-5024-40fa-a882-aedd01c03397", "source": "musicbrainz", "names": ["Muna", "Munachi Abii"]} +{"group_id": "mb:57364cbc-d56e-4b67-a34d-d718a757d127", "source": "musicbrainz", "names": ["Naeto C", "Naetochukwu Chikwe", "Neato C"]} +{"group_id": "mb:389d05a1-3b64-4d67-bfa8-622b5948558b", "source": "musicbrainz", "names": ["Nashil Pitchen Kazembe", "Nashil Pichen", "Nashil Pichenb Kazembe", "Nashill Pitchen Kazembe"]} +{"group_id": "mb:2762d714-f4a5-4a8c-be49-8b93a9b8587c", "source": "musicbrainz", "names": ["Nataniël", "Nataniël le Roux"]} +{"group_id": "mb:41af9d3a-8ae8-4b73-8e7b-cba95483cfc1", "source": "musicbrainz", "names": ["Nico Carstens", "Nicolaas Cornelius Carstens"]} +{"group_id": "mb:5219f88b-9360-4c6a-8b56-fd6feea8a1cc", "source": "musicbrainz", "names": ["Nonini", "Nonini Mgenge2Tru"]} +{"group_id": "mb:b303cdda-6d6e-4041-9569-8274197a62fb", "source": "musicbrainz", "names": ["Obiwon", "Obiora Nwokolobia-Agu"]} +{"group_id": "mb:e6ada169-71ae-4fec-bfd0-e0b9aaa8603b", "source": "musicbrainz", "names": ["Gbenga Adelekan", "Olugbenga Adelekan"]} +{"group_id": "mb:b5e5e81e-6a8e-4b26-a59e-4c5fe6d3e49b", "source": "musicbrainz", "names": ["Robin Auld", "Robin Morton Auld"]} +{"group_id": "mb:a384ca56-b618-40de-8e2c-bba254eef29e", "source": "musicbrainz", "names": ["Peruzzi", "Tobechukwu Victor Okoh"]} +{"group_id": "mb:0efcd9c5-4c89-4a74-bbce-173d96402c6a", "source": "musicbrainz", "names": ["Mr Real", "Okafor Uchenna Victor"]} +{"group_id": "mb:33e65895-20b4-4bb4-b7dd-338ffcb1cb8a", "source": "musicbrainz", "names": ["Johnny Drille", "John Ighodaro"]} +{"group_id": "mb:07ab04d4-bdbc-4c93-bfb2-457693a4ff94", "source": "musicbrainz", "names": ["Sheck Wes", "Khadimou Fall", "Khadimoul Rassoul Cheikh Fall"]} +{"group_id": "mb:b738ddfc-6f9d-4c46-8bee-92ba871f421e", "source": "musicbrainz", "names": ["Teni", "Teniola Apata", "Teniola ‘Teni’ Apata"]} +{"group_id": "mb:0a1c9fb8-7c3a-458d-ab0e-749f8e079de5", "source": "musicbrainz", "names": ["Kwesi Arthur", "Emmanuel Kwesi Danso Arthur"]} +{"group_id": "mb:d21cd4a3-279b-45ed-98ee-588c1f37a470", "source": "musicbrainz", "names": ["Mayorkun", "Adewale Mayowa Emmanuel"]} +{"group_id": "mb:249f3780-1a08-4d31-bbde-f524d1cf9ce3", "source": "musicbrainz", "names": ["Muthoni Drummer Queen", "MDQ", "Muthoni", "Muthoni Ndonga", "Muthoni the Drummer Queen"]} +{"group_id": "mb:2f75ab54-9326-4e4b-835c-db38fe0de988", "source": "musicbrainz", "names": ["Moonchild Sanelly", "Sanelisiwe Twisha"]} +{"group_id": "mb:233f6da8-ad25-42e1-ad6a-81a3a4bfc194", "source": "musicbrainz", "names": ["Mereba", "Marian Mereba"]} +{"group_id": "mb:bbaab51a-fac2-4995-8119-8f2b45bc3b4a", "source": "musicbrainz", "names": ["Zlatan", "Omoniyi Temidayo Raphael"]} +{"group_id": "mb:cc81ed60-b0d9-4348-a8cc-eb2d0ca98447", "source": "musicbrainz", "names": ["Dizasta Vina", "Edger Vicent Mwaipeta"]} +{"group_id": "mb:96338645-d3db-4a59-a238-16f4ea43f4f3", "source": "musicbrainz", "names": ["LADIPOE", "Ladipo Eso"]} +{"group_id": "mb:d2981120-8ac4-48c4-a979-18f2d48a96f9", "source": "musicbrainz", "names": ["Rema", "Divine Ikubor", "Divine Joshua Ikubor"]} +{"group_id": "mb:54c73832-5780-4b98-9e5d-3c210d123fd9", "source": "musicbrainz", "names": ["Lamisi", "Regina Lamisi Awiniman Anabilla Akuka"]} +{"group_id": "mb:4414ea57-08c2-49d9-bd19-d4e81868d555", "source": "musicbrainz", "names": ["Monelle", "Floëme", "Khumo Mminele", "Khutsang Khumo Mminele"]} +{"group_id": "mb:a89582b4-a0af-4820-b25a-5150042c172a", "source": "musicbrainz", "names": ["Maurixxin", "A God", "E.M.S", "Eloka", "God", "Lil Maurice", "MAG", "Maurice", "Maurice A God", "Maurice E.S. Okeoma", "Maurice ES Okeoma", "Maurice Eloka Okeoma", "Maurice Eloka Soye Okeoma", "Maurice Okeoma", "Maurice Soye Okeoma", "Soye"]} +{"group_id": "mb:0dc49473-5a5a-4def-aba7-e02b0ded3bae", "source": "musicbrainz", "names": ["Eugy Official", "Eugene Entsir"]} +{"group_id": "mb:42ecbc24-420b-4c38-aea2-5650ee37921c", "source": "musicbrainz", "names": ["Nkodo Si-Tony", "Nkodo Si Tobi François"]} +{"group_id": "mb:f5cc1ab7-a1fc-4ef2-beae-5c5507699b17", "source": "musicbrainz", "names": ["Blaqbonez", "Emeka Akumefule"]} +{"group_id": "mb:5b2a8faa-ffee-4706-a1a8-58f109bc8ca2", "source": "musicbrainz", "names": ["Tems", "Temilade Openiyi"]} +{"group_id": "mb:1138a764-2212-4d0a-b02d-0dc14df91e08", "source": "musicbrainz", "names": ["Akon", "Aliaume Damala Badara Akon Thiam", "Aliaune Thiam", "Aliaune “Akon” Thiam"]} +{"group_id": "mb:506aa5b0-c6fb-4a69-8dd3-f06a369d5abc", "source": "musicbrainz", "names": ["Howard Carpendale", "Howard Capendale", "Howard Carppendale", "Springbock"]} +{"group_id": "mb:536e001d-e78f-4026-ba46-34d028e0e6ff", "source": "musicbrainz", "names": ["Benedict Elide Odiase", "B. E. Odiase", "Ben E. Odiase"]} +{"group_id": "mb:1c1c5264-ab73-4af4-84a0-ceb18b928f30", "source": "musicbrainz", "names": ["Bheki Mseleku", "Bhekumuzi Hyacinth Mseleku"]} +{"group_id": "mb:caee69a4-7f3d-40f4-9857-b5cdad222f7e", "source": "musicbrainz", "names": ["DJ Arafat", "Ange Didier Houon", "Arafat Muana", "Commandant Zabra", "Le Roi du Coupé-décalé", "Sao Tao le Dictateur", "Yôrôbô"]} +{"group_id": "mb:6e1d2796-ab2b-4ed4-8cfa-1b7214a9adf9", "source": "musicbrainz", "names": ["D’banj", "Oladapo Daniel Oyebanjo"]} +{"group_id": "mb:702d2b90-eef0-4354-b2c4-6366eba92b7f", "source": "musicbrainz", "names": ["Femi Kuti", "Femi Anikulap Kuti", "Femi Anikulapo-Kuti", "Olufela Olufemi Anikulapo Kuti"]} +{"group_id": "mb:41ae80e2-3e5f-4a1b-bc45-373fb8a1927f", "source": "musicbrainz", "names": ["Saba Saba", "Alex Kirya"]} +{"group_id": "mb:36a6d6af-58c2-4dc0-9c62-beb4241f7d40", "source": "musicbrainz", "names": ["Samini", "Batman", "Batman Samini"]} +{"group_id": "mb:6f937dd2-1aa8-49ce-9052-8127714db3d2", "source": "musicbrainz", "names": ["Sarkodie", "Michael Owusu Addo"]} +{"group_id": "mb:ac5ddc32-2a45-4c63-bf6c-ba53fce6fa61", "source": "musicbrainz", "names": ["Sound Sultan", "Olanrewaju Abdul-Ganiu Fasasi"]} +{"group_id": "mb:78a32141-e325-49e7-ac65-ee030db5bff8", "source": "musicbrainz", "names": ["Syd Kitchen", "Sydney Stanley Kitchen"]} +{"group_id": "mb:c8e592b1-cf7b-42a2-bbff-1e966cb4e56b", "source": "musicbrainz", "names": ["Thomas Rajna", "T. Rajna"]} +{"group_id": "mb:f483e8a0-baca-427a-b1c3-b06752ab88cf", "source": "musicbrainz", "names": ["Timaya", "Inetimi Alfred Odon"]} +{"group_id": "mb:83f2dbd7-e0cd-4664-8b8c-4a32e5df3936", "source": "musicbrainz", "names": ["Tinny", "Nii Addo Quaynor"]} +{"group_id": "mb:9d9f7ce8-e1cf-4413-b2c9-b90b69bc17f6", "source": "musicbrainz", "names": ["Tiwa Savage", "Tiwatope Omolara Savage"]} +{"group_id": "mb:d6cd6ee7-9fd7-4a49-abe7-0ea8f51ab20b", "source": "musicbrainz", "names": ["Stogie T", "Tumi Molekane"]} +{"group_id": "mb:70522781-f802-4f4a-a24a-d02460d569fc", "source": "musicbrainz", "names": ["Vector", "Olanrewaju Ogunmefun", "Vector Tha Viper"]} +{"group_id": "mb:a77f26ec-ec08-40dc-bc22-aeec8ce7c610", "source": "musicbrainz", "names": ["Victor Uwaifo", "Sir Victor Uwaifo", "Victor Efosa Uwaifo"]} +{"group_id": "mb:fd32fe8c-2592-44de-84c8-daf40a4e017a", "source": "musicbrainz", "names": ["Wande Coal", "Oluwatobi Wande Ojosipe"]} +{"group_id": "mb:1f9bda46-50d5-43ba-aa06-d2ba467a60ee", "source": "musicbrainz", "names": ["Patrice Wilson", "Patrice Iteke Wilson"]} +{"group_id": "mb:bf82380b-efc2-473a-a9d3-4d087ce0feb0", "source": "musicbrainz", "names": ["Naira Marley", "Azeez Adeshina Fashola"]} +{"group_id": "mb:4d09a017-4e09-47a7-b274-a7e0767ac4e0", "source": "musicbrainz", "names": ["Fireboy DML", "Adedamola Adefolahan", "Adedamola Oyinlola Adefolahan"]} +{"group_id": "mb:2eabb579-9ade-48e3-b263-b2aa9d9ba271", "source": "musicbrainz", "names": ["Vonenzo Baschello", "Vaughn Wesley Cunningham"]} +{"group_id": "mb:719feeff-47ab-482b-8101-859cac49776b", "source": "musicbrainz", "names": ["Joeboy", "Joseph Akinwale Akinfenwa-Donus"]} +{"group_id": "mb:13332404-48bd-4175-a956-9a54f77ee10a", "source": "musicbrainz", "names": ["Lyta", "Lawal Opeyemi Raimi", "Lyta skuri", "Lyta ybnl", "Opeyemi Babatunde Rahim"]} +{"group_id": "mb:b2a3cd7c-19dd-419e-b2e8-c1e2f8b3dff4", "source": "musicbrainz", "names": ["Master KG", "Kgaogelo Moagi", "Khaogelo Moagi"]} +{"group_id": "mb:2a5337f0-d89c-4756-a7a4-bc477cdd1e2f", "source": "musicbrainz", "names": ["Herbie Tsoaeli", "Herbert Motlatsi Tsoaeli"]} +{"group_id": "mb:f77224dd-14d5-4f8f-8075-a4d3c76013e4", "source": "musicbrainz", "names": ["Ami Faku", "Amanda Phumeza Faku"]} +{"group_id": "mb:e5db2f43-39e1-4315-a2ae-17106f637258", "source": "musicbrainz", "names": ["YoungstaCPT", "Youngsta CPT"]} +{"group_id": "mb:b74bbe56-8171-44d3-a13f-08b924be9b20", "source": "musicbrainz", "names": ["John Blaq", "John Kasadha"]} +{"group_id": "mb:120bddbe-ea0a-4664-812a-c20e64667569", "source": "musicbrainz", "names": ["Wally Seck", "Wally Ballago Seck", "Waly Seck"]} +{"group_id": "mb:bddb655c-4ab6-4dd3-8ddb-c96604ab7467", "source": "musicbrainz", "names": ["Sha Sha", "Charmaine Shamiso Mapimbiro"]} +{"group_id": "mb:f51d2982-29dd-43cd-8fa1-bc38dd6c1467", "source": "musicbrainz", "names": ["Broda Shaggi", "Samuel Animashaun Perry"]} +{"group_id": "mb:209cfbf5-6fcb-4bee-a3b6-a65e33e12ab2", "source": "musicbrainz", "names": ["Marioo", "Omary Ally Mwanga"]} +{"group_id": "mb:81952b92-1c43-4a7f-be54-be0217702de2", "source": "musicbrainz", "names": ["Zayn Africa", "Abdulmajid Aliyu"]} +{"group_id": "mb:9b928538-a2c4-4c48-be86-366b4c7cc8a5", "source": "musicbrainz", "names": ["Richard “P2J” Isong", "Richard Olowaranti Mbu Isong"]} +{"group_id": "mb:eb1febcf-9902-4962-9dc4-8fe4d7fc25b4", "source": "musicbrainz", "names": ["CKay", "Chukwuka Chukwuma Ekweani"]} +{"group_id": "mb:4e39c7cd-a631-4399-bbd8-13107be50938", "source": "musicbrainz", "names": ["Nomcebo Zikode", "Nomcebo", "Nomcebo Nothule Nkwanyana"]} +{"group_id": "mb:a0b85283-b193-4558-8ff0-dab1655b55f3", "source": "musicbrainz", "names": ["Simmy", "Simphiwe Majobe Nhlangulela"]} +{"group_id": "curated:afrobeats:0", "source": "curated/afrobeats", "names": ["Wizkid", "Ayodeji Ibrahim Balogun", "Ayodeji Balogun", "DJ WizKid", "StarBoy", "Wiz Kid", "Wizzy"]} +{"group_id": "curated:afrobeats:1", "source": "curated/afrobeats", "names": ["Burna Boy", "Damini Ebunoluwa Ogulu", "Damini Ogulu"]} +{"group_id": "curated:afrobeats:2", "source": "curated/afrobeats", "names": ["Rema", "Divine Ikubor", "Divine Joshua Ikubor"]} +{"group_id": "curated:afrobeats:3", "source": "curated/afrobeats", "names": ["Tems", "Temilade Openiyi"]} +{"group_id": "curated:afrobeats:4", "source": "curated/afrobeats", "names": ["Davido", "David Adedeji Adeleke", "David Adeleke"]} +{"group_id": "curated:afrobeats:5", "source": "curated/afrobeats", "names": ["Ayra Starr", "Oyinkansola Sarah Aderibigbe"]} +{"group_id": "curated:afrobeats:6", "source": "curated/afrobeats", "names": ["Asake", "Ahmed Ololade"]} +{"group_id": "curated:afrobeats:7", "source": "curated/afrobeats", "names": ["CKay", "Chukwuka Chukwuma Ekweani"]} +{"group_id": "curated:afrobeats:8", "source": "curated/afrobeats", "names": ["Amaarae", "Ama Serwah Genfi"]} +{"group_id": "curated:afrobeats:9", "source": "curated/afrobeats", "names": ["Tyla", "Tyla Laura Seethal", "Tyla Seethal"]} +{"group_id": "curated:afrobeats:10", "source": "curated/afrobeats", "names": ["Fireboy DML", "Adedamola Adefolahan"]} +{"group_id": "curated:afrobeats:11", "source": "curated/afrobeats", "names": ["Omah Lay", "Stanley Omah Didia"]} +{"group_id": "curated:afrobeats:12", "source": "curated/afrobeats", "names": ["Joeboy", "Joseph Akinwale Akinfenwa-Donus"]} +{"group_id": "curated:afrobeats:13", "source": "curated/afrobeats", "names": ["Kizz Daniel", "Kiss Daniel", "Oluwatobiloba Daniel Anidugbe"]} +{"group_id": "curated:afrobeats:14", "source": "curated/afrobeats", "names": ["Olamide", "Olamide Gbenga Adedeji", "Baddo"]} +{"group_id": "curated:afrobeats:15", "source": "curated/afrobeats", "names": ["Yemi Alade", "Yemi Eberechi Alade"]} +{"group_id": "curated:afrobeats:16", "source": "curated/afrobeats", "names": ["Tiwa Savage", "Tiwatope Savage"]} +{"group_id": "curated:afrobeats:17", "source": "curated/afrobeats", "names": ["Mr Eazi", "Oluwatosin Oluwole Ajibade"]} +{"group_id": "curated:afrobeats:18", "source": "curated/afrobeats", "names": ["2Baba", "2face Idibia", "2Face", "Innocent Ujah Idibia"]} +{"group_id": "curated:afrobeats:19", "source": "curated/afrobeats", "names": ["Fela Kuti", "Fela Anikulapo Kuti", "Olufela Olusegun Oludotun Ransome-Kuti"]} +{"group_id": "curated:afrobeats:20", "source": "curated/afrobeats", "names": ["Stonebwoy", "Livingstone Etse Satekla"]} +{"group_id": "curated:afrobeats:21", "source": "curated/afrobeats", "names": ["Sarkodie", "Michael Owusu Addo"]} +{"group_id": "curated:afrobeats:22", "source": "curated/afrobeats", "names": ["Black Sherif", "Mohammed Ismail Sherif"]} +{"group_id": "curated:afrobeats:23", "source": "curated/afrobeats", "names": ["Diamond Platnumz", "Naseeb Abdul Juma Issack"]} +{"group_id": "curated:afrobeats:24", "source": "curated/afrobeats", "names": ["Master KG", "Kgaogelo Moagi"]} +{"group_id": "curated:afrobeats:25", "source": "curated/afrobeats", "names": ["Nasty C", "Nsikayesizwe David Junior Ngcobo"]} +{"group_id": "curated:afrobeats:26", "source": "curated/afrobeats", "names": ["Focalistic", "Lethabo Sebetso"]} +{"group_id": "curated:afrobeats:27", "source": "curated/afrobeats", "names": ["Angelique Kidjo", "Angélique Kidjo"]} +{"group_id": "curated:hiphop:0", "source": "curated/hiphop", "names": ["Drake", "Aubrey Drake Graham", "Aubrey Graham", "Champagne Papi", "C. Papi"]} +{"group_id": "curated:hiphop:1", "source": "curated/hiphop", "names": ["Future", "Nayvadius Cash", "Nayvadius D. Wilburn", "Nayvadius DeMun Cash", "Nayvadius Wilburn"]} +{"group_id": "curated:hiphop:2", "source": "curated/hiphop", "names": ["Chris Brown", "Breezy", "C Breezy", "Christopher Maurice Brown"]} +{"group_id": "curated:hiphop:3", "source": "curated/hiphop", "names": ["Travis Scott", "Jacques Berman Webster II", "Jacques Webster", "Travi$ Scott", "Travis $cott"]} +{"group_id": "curated:hiphop:4", "source": "curated/hiphop", "names": ["Nicki Minaj", "Nicki Maraj", "Nikki Minaj", "Onika Maraj", "Onika Tanya Maraj", "Onika Tanya Maraj-Petty"]} +{"group_id": "curated:pop:0", "source": "curated/pop", "names": ["Ed Sheeran", "Edward Christopher Sheeran"]} +{"group_id": "curated:pop:1", "source": "curated/pop", "names": ["Selena Gomez", "Selena Marie Gomez"]} +{"group_id": "curated:pop:2", "source": "curated/pop", "names": ["Justin Bieber", "Justin Drew Bieber", "Justin Beiber"]} +{"group_id": "curated:pop:3", "source": "curated/pop", "names": ["Beyoncé", "Beyonce", "Beyoncé Giselle Knowles", "Beyoncé Giselle Knowles-Carter", "Beyoncé Knowles", "Beyoncé Knowles-Carter", "Queen Bey"]} +{"group_id": "curated:pop:4", "source": "curated/pop", "names": ["Coldplay", "Cold Play", "The Coldplay"]} diff --git a/datasets/data/musicbrainz_artist_aliases.jsonl b/datasets/data/musicbrainz_artist_aliases.jsonl new file mode 100644 index 0000000..9ee61fd --- /dev/null +++ b/datasets/data/musicbrainz_artist_aliases.jsonl @@ -0,0 +1,727 @@ +{"entity_id": "Q109045", "mbid": "a966b097-7981-40c5-82b4-79c6fe28932c", "wikidata_canonical": "Lebo M.", "mb_name": "Lebo M", "mb_sort_name": "M, Lebo", "mb_disambiguation": "producer/composer Lebohang Morake", "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "Lebo M", "sort_name": "Lebo M", "type": "Artist name", "locale": "en", "primary": true}, {"name": "Lebo Morake", "sort_name": "Lebo Morake", "type": null, "locale": null, "primary": false}, {"name": "Lebohang Morake", "sort_name": "Lebohang Morake", "type": "Search hint", "locale": null, "primary": false}, {"name": "レボ・M", "sort_name": "レボエム", "type": "Artist name", "locale": "ja", "primary": true}]} +{"entity_id": "Q1073062", "mbid": "50bb4489-b134-45bf-8cc5-7163abc3639f", "wikidata_canonical": "Chima", "mb_name": "Chima", "mb_sort_name": "Chima", "mb_disambiguation": "German rapper/singer", "mb_country": "DE", "mb_type": "Person", "aliases": []} +{"entity_id": "Q100146369", "mbid": "fd5a6e5f-d598-4a57-b4aa-c3b066023677", "wikidata_canonical": "Joe El", "mb_name": "Joe El", "mb_sort_name": "Joe El", "mb_disambiguation": "Nigerian singer Joel Amadi", "mb_country": null, "mb_type": "Person", "aliases": []} +{"entity_id": "Q100253451", "mbid": "8ae29b58-4f10-46d3-81d9-655197ed1ab1", "wikidata_canonical": "Ace Leen", "mb_name": "Ace Leen", "mb_sort_name": "Ace Leen", "mb_disambiguation": "South African Musician & Record Producer", "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "Aceleen", "sort_name": "Aceleen", "type": "Search hint", "locale": null, "primary": false}, {"name": "Ashley Themba Matselela", "sort_name": "Ashley Themba Matselela", "type": "Legal name", "locale": null, "primary": false}, {"name": "Ashley ZA", "sort_name": "Ashley ZA", "type": "Artist name", "locale": null, "primary": false}, {"name": "Yung ZA", "sort_name": "Yung ZA", "type": null, "locale": null, "primary": false}]} +{"entity_id": "Q100801324", "mbid": "3d7caeaa-5500-4a54-9513-334ff84fbdf4", "wikidata_canonical": "Julie Mutesasira", "mb_name": "Julie Mutesasira", "mb_sort_name": "Mutesasira Julie", "mb_disambiguation": "Ugandan singer", "mb_country": "UG", "mb_type": "Person", "aliases": [{"name": "Julie Birungi", "sort_name": "Julie Birungi", "type": "Artist name", "locale": null, "primary": false}, {"name": "Julie Mutesasira", "sort_name": "Julie Mutesasira", "type": "Artist name", "locale": null, "primary": false}, {"name": "Julie Naluggya", "sort_name": "Julie Naluggya", "type": "Artist name", "locale": null, "primary": false}]} +{"entity_id": "Q104603190", "mbid": "660a7b8b-4df0-4c6e-b94d-3fa9625f9311", "wikidata_canonical": "Mayestron", "mb_name": "Mayestron", "mb_sort_name": "Mayestron", "mb_disambiguation": "Congolese - Tanzanian born an Irish Musician", "mb_country": "IE", "mb_type": "Person", "aliases": []} +{"entity_id": "Q104774788", "mbid": "3a4cbb95-a18b-4ab2-9f8e-66b2aa0e64c5", "wikidata_canonical": "Rich Mavoko", "mb_name": "Rich Mavoko", "mb_sort_name": "Rich Mavoko", "mb_disambiguation": null, "mb_country": "TZ", "mb_type": "Person", "aliases": []} +{"entity_id": "Q104775888", "mbid": "73fc5556-c99b-414e-8c42-359e13b7bd95", "wikidata_canonical": "S2Kizzy", "mb_name": "S2Kizzy", "mb_sort_name": "S2Kizzy", "mb_disambiguation": null, "mb_country": null, "mb_type": "Person", "aliases": []} +{"entity_id": "Q104835395", "mbid": "7de9971f-3e29-48b9-9647-f47841eb99db", "wikidata_canonical": "Tobe Nwigwe", "mb_name": "Tobe Nwigwe", "mb_sort_name": "Nwigwe, Tobe", "mb_disambiguation": null, "mb_country": "US", "mb_type": "Person", "aliases": [{"name": "Tobe Nwigwe", "sort_name": "Tobe Nwigwe", "type": null, "locale": null, "primary": false}, {"name": "Tobechukwu Dubem \"Tobe\" Nwigwe", "sort_name": "Tobechukwu Dubem \"Tobe\" Nwigwe", "type": "Search hint", "locale": null, "primary": false}, {"name": "Tobechukwu Dubem Nwigwe", "sort_name": "Tobechukwu Dubem Nwigwe", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q104842940", "mbid": "01b09715-ca82-459a-9ed5-7eacc4fb153b", "wikidata_canonical": "Makhadzi", "mb_name": "Makhadzi", "mb_sort_name": "Makhadzi", "mb_disambiguation": "South African singer", "mb_country": "ZA", "mb_type": "Person", "aliases": []} +{"entity_id": "Q105565282", "mbid": "e26bcbdf-8509-4a5d-9c0d-8accf921e474", "wikidata_canonical": "Bella Shmurda", "mb_name": "Bella Shmurda", "mb_sort_name": "Shmurda, Bella", "mb_disambiguation": null, "mb_country": null, "mb_type": "Person", "aliases": [{"name": "Akinbiyi Ahmed Abiola", "sort_name": "Akinbiyi Ahmed Abiola", "type": "Legal name", "locale": null, "primary": false}, {"name": "Bella Shmurda", "sort_name": "Bella Shmurda", "type": "Artist name", "locale": null, "primary": false}]} +{"entity_id": "Q106238467", "mbid": "eb774f57-a9be-409f-ad54-d73ad8e26958", "wikidata_canonical": "Kel-P", "mb_name": "Kel-P", "mb_sort_name": "Kel-P", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Kel P Vibes", "sort_name": "Kel P Vibes", "type": "Artist name", "locale": null, "primary": false}, {"name": "Kel-P", "sort_name": "Kel-P", "type": "Artist name", "locale": null, "primary": false}, {"name": "Udoma Peter Kelvin Amba", "sort_name": "Udoma Peter Kelvin Amba", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q106308191", "mbid": "bd918fa6-0655-45cb-aca4-4c04db161cbc", "wikidata_canonical": "Peter Okoye", "mb_name": "Peter Okoye", "mb_sort_name": "Peter Okoye", "mb_disambiguation": "Nigerian singer", "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Mr. P", "sort_name": "Mr. P", "type": "Artist name", "locale": null, "primary": false}]} +{"entity_id": "Q106363150", "mbid": "11273437-f4ee-4414-bb3b-4ea51b0570b1", "wikidata_canonical": "Yaw Tog", "mb_name": "Yaw Tog", "mb_sort_name": "Yaw Tog", "mb_disambiguation": null, "mb_country": "GH", "mb_type": null, "aliases": [{"name": "Yaw Tog", "sort_name": "Yaw Tog", "type": "Artist name", "locale": null, "primary": false}, {"name": "thorsten owusu gyimah", "sort_name": "thorsten owusu gyimah", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q106367501", "mbid": "db4e4120-a612-479b-8c54-c4e3cb9fa1f9", "wikidata_canonical": "Aralola Olamuyiwa", "mb_name": "Ara", "mb_sort_name": "Ara", "mb_disambiguation": "Nigerian drummer", "mb_country": null, "mb_type": "Person", "aliases": [{"name": "Aralola Olamuyiwa", "sort_name": "Olamuyiwa, Aralola", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q106462586", "mbid": "c4ac4b97-2eac-46f6-85ae-f916c93847e4", "wikidata_canonical": "Ayra Starr", "mb_name": "Ayra Starr", "mb_sort_name": "Starr, Ayra", "mb_disambiguation": "Nigerian singer/songwriter", "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Ayra Starr", "sort_name": "Ayra Starr", "type": "Artist name", "locale": null, "primary": false}, {"name": "Oyinkansola Sarah Aderibigbe", "sort_name": "Aderibigbe, Oyinkansola Sarah", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q106518302", "mbid": "9e19b0fb-83bc-432c-97a9-791ecd11f221", "wikidata_canonical": "Berita", "mb_name": "Berita", "mb_sort_name": "Berita", "mb_disambiguation": null, "mb_country": "ZA", "mb_type": "Person", "aliases": []} +{"entity_id": "Q106558182", "mbid": "b63bd4fd-2050-4c92-a237-576f6f6c97cb", "wikidata_canonical": "Omah Lay", "mb_name": "Omah Lay", "mb_sort_name": "Lay, Omah", "mb_disambiguation": "Nigerian Afro-fusion", "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Omah Lay", "sort_name": "Omah Lay", "type": "Artist name", "locale": null, "primary": false}, {"name": "Prince", "sort_name": "Prince", "type": null, "locale": null, "primary": false}, {"name": "Stanley Omah Didia", "sort_name": "Stanley Omah Didia", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q106568097", "mbid": "f5c0b2e9-3cb9-4670-bb9d-85ac76e94370", "wikidata_canonical": "Dexellency", "mb_name": "Gospel Maro", "mb_sort_name": "Gospel Maro", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q106808963", "mbid": "13cef67b-2b52-434c-a48a-91d65645f2fb", "wikidata_canonical": "Mbosso", "mb_name": "Mbosso", "mb_sort_name": "Mbosso", "mb_disambiguation": null, "mb_country": "TZ", "mb_type": "Person", "aliases": []} +{"entity_id": "Q106812063", "mbid": "110a1437-1173-4ab8-8867-66e04e9af23f", "wikidata_canonical": "Rexxie", "mb_name": "Rexxie", "mb_sort_name": "Rexxie", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Chisom Ezeh", "sort_name": "Chisom Ezeh", "type": "Artist name", "locale": null, "primary": false}, {"name": "Chisom Faith Ezeh", "sort_name": "Chisom Faith Ezeh", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q107087806", "mbid": "f4100837-c0e8-4afa-8691-e8a38e437601", "wikidata_canonical": "Efemena Mukoro", "mb_name": "Blackmagic", "mb_sort_name": "Blackmagic", "mb_disambiguation": "Nigerian rapper/vocalist/songwriter", "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q107315471", "mbid": "a6b8c838-fef4-4700-9b31-8481da58cace", "wikidata_canonical": "Liya", "mb_name": "Liya", "mb_sort_name": "Liya", "mb_disambiguation": "NG", "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Abdulsalam Suliyat Modasola", "sort_name": "Modasola, Abdulsalam Suliyat", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q107338619", "mbid": "2d53a431-e1c7-4739-a61b-28f465918722", "wikidata_canonical": "Phineas Mkhize", "mb_name": "Phineas Mkhize", "mb_sort_name": "Mkhize, Phineas", "mb_disambiguation": null, "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "Phineas McHize", "sort_name": "McHize, Phineas", "type": null, "locale": null, "primary": false}]} +{"entity_id": "Q107451358", "mbid": "7205f85b-bdb6-4763-8c45-b6663e8ba1a2", "wikidata_canonical": "Duprie", "mb_name": "Duprie", "mb_sort_name": "Duprie", "mb_disambiguation": null, "mb_country": "JM", "mb_type": "Person", "aliases": []} +{"entity_id": "Q107510693", "mbid": "21d637d1-7357-45f7-92eb-9ece4c0b07d6", "wikidata_canonical": "Jamopyper", "mb_name": "Jamopyper", "mb_sort_name": "Jamopyper", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q107557416", "mbid": "edfbf1b4-233d-47e6-bc97-1e946b5ebbb9", "wikidata_canonical": "Temi Dee", "mb_name": "Temi Dee", "mb_sort_name": "Temi Dee", "mb_disambiguation": null, "mb_country": "GB", "mb_type": "Person", "aliases": []} +{"entity_id": "Q107740983", "mbid": "d9fcecbd-49f7-4467-b70b-3e3267fca7ce", "wikidata_canonical": "Black Sherif", "mb_name": "Black Sherif", "mb_sort_name": "Sherif, Black", "mb_disambiguation": null, "mb_country": "GH", "mb_type": "Person", "aliases": []} +{"entity_id": "Q108127747", "mbid": "adae0821-04a7-4e24-bc24-bcff5530e204", "wikidata_canonical": "Marah Louw", "mb_name": "Mara Louw", "mb_sort_name": "Louw, Mara", "mb_disambiguation": "South African singer", "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "Mara", "sort_name": "Mara", "type": "Artist name", "locale": null, "primary": false}]} +{"entity_id": "Q108171933", "mbid": "f2883e58-fa81-4594-88fc-09ea175b368a", "wikidata_canonical": "Bob Pinodo", "mb_name": "Robert Kweku Idan", "mb_sort_name": "Idan, Robert Kweku", "mb_disambiguation": null, "mb_country": "GH", "mb_type": "Person", "aliases": []} +{"entity_id": "Q108181101", "mbid": "bf6a133c-0939-4a47-938a-8285a96a5f60", "wikidata_canonical": "Zinoleesky", "mb_name": "Zinoleesky", "mb_sort_name": "Zinoleesky", "mb_disambiguation": "Nigerian songwriter, singer and rapper", "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Azeez Shina Oniyide", "sort_name": "Oniyide, Azeez Shina", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q108223419", "mbid": "5a007e93-767c-4f1d-ba47-97b3408478a5", "wikidata_canonical": "Qudus Fakoya Oluwadamilare", "mb_name": "Qdot", "mb_sort_name": "Qdot", "mb_disambiguation": null, "mb_country": null, "mb_type": null, "aliases": []} +{"entity_id": "Q108223660", "mbid": "e23d3016-5206-4354-bb19-16b54c6ef51f", "wikidata_canonical": "Charles Chibueze Chukwu", "mb_name": "Crayon", "mb_sort_name": "Crayon", "mb_disambiguation": "Nigerian singer", "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Charles Chibueze Chukwu", "sort_name": "Charles Chibueze Chukwu", "type": "Legal name", "locale": null, "primary": false}, {"name": "Crayon", "sort_name": "Crayon", "type": "Artist name", "locale": null, "primary": false}]} +{"entity_id": "Q108273396", "mbid": "994f41f2-6d70-4b8f-b4a0-04d2a4465d86", "wikidata_canonical": "Spyro", "mb_name": "Spyro", "mb_sort_name": "Spyro", "mb_disambiguation": "Nigerian", "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q108318919", "mbid": "6de225d7-2abd-473f-b6f8-72b43b4f9f63", "wikidata_canonical": "Made Kuti", "mb_name": "Made Kuti", "mb_sort_name": "Kuti, Made", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Made Anikulapo Kuti", "sort_name": "Made Anikulapo Kuti", "type": "Artist name", "locale": null, "primary": false}, {"name": "Omorinmade Anikulapo-Kuti", "sort_name": "Anikulapo-Kuti, Omorinmade", "type": null, "locale": null, "primary": false}]} +{"entity_id": "Q108333151", "mbid": "b011bf5c-eeda-41ae-9130-2203e8f938fc", "wikidata_canonical": "Dremo", "mb_name": "Dremo", "mb_sort_name": "Dremo", "mb_disambiguation": "Nigerian songwriter, singer, record producer, recording artist, and stage performer.", "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Aboriomoh Femi Raymond", "sort_name": "Aboriomoh Femi Raymond", "type": "Legal name", "locale": null, "primary": false}, {"name": "Dremo", "sort_name": "Dremo", "type": "Artist name", "locale": null, "primary": false}]} +{"entity_id": "Q108824597", "mbid": "4248f952-8091-4a8b-a68e-93a5a7e6fb96", "wikidata_canonical": "Cruel Santino", "mb_name": "Cruel Santino", "mb_sort_name": "Cruel Santino", "mb_disambiguation": "Nigerian alté artist", "mb_country": null, "mb_type": "Person", "aliases": [{"name": "Osayaba Andrew Ize‐Iyamu", "sort_name": "Ize‐Iyamu, Osayaba Andrew", "type": "Legal name", "locale": null, "primary": false}, {"name": "Ozzy B", "sort_name": "Ozzy B", "type": "Artist name", "locale": null, "primary": false}, {"name": "Santi", "sort_name": "Santi", "type": "Artist name", "locale": null, "primary": false}]} +{"entity_id": "Q108933361", "mbid": "830741cb-744a-4b1e-9dfb-1e3ab3b76c05", "wikidata_canonical": "Uwade", "mb_name": "Uwade", "mb_sort_name": "Uwade", "mb_disambiguation": null, "mb_country": "US", "mb_type": "Person", "aliases": [{"name": "Uwade Akhere", "sort_name": "Akhere, Uwade", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q109106572", "mbid": "d7eed624-354d-4fb1-8b34-473c96a0cfa9", "wikidata_canonical": "Focalistic", "mb_name": "Focalistic", "mb_sort_name": "Focalistic", "mb_disambiguation": null, "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "Focalistic", "sort_name": "Focalistic", "type": "Artist name", "locale": null, "primary": false}, {"name": "Lethabo Sebetso", "sort_name": "Lethabo Sebetso", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q109313236", "mbid": "468561d7-ace1-40e2-b267-4f22242f1482", "wikidata_canonical": "Mvzzle", "mb_name": "Mvzzle", "mb_sort_name": "Gift Morukhuladi", "mb_disambiguation": "South African DJ and record producer", "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "Gift Selaelo Morukhuladi", "sort_name": "Morukhuladi, Gift Selaelo", "type": "Legal name", "locale": "en_ZA", "primary": true}, {"name": "Mvzzle Beatz", "sort_name": "Beatz, Mvzzle", "type": "Artist name", "locale": "en_ZA", "primary": false}]} +{"entity_id": "Q109333506", "mbid": "ad2f22bc-9676-41b4-af51-6ab3a5e3f883", "wikidata_canonical": "JAE5", "mb_name": "JAE5", "mb_sort_name": "JAE5", "mb_disambiguation": null, "mb_country": "GB", "mb_type": "Person", "aliases": [{"name": "JAE5", "sort_name": "JAE5", "type": "Artist name", "locale": null, "primary": false}, {"name": "JB Made It", "sort_name": "JB Made It", "type": null, "locale": null, "primary": false}, {"name": "Jonathan Kweku Awote-Mensah", "sort_name": "Jonathan Kweku Awote-Mensah", "type": "Legal name", "locale": null, "primary": false}, {"name": "Jonathan Mensah", "sort_name": "Jonathan Mensah", "type": "Search hint", "locale": null, "primary": false}]} +{"entity_id": "Q109446437", "mbid": "534206ae-2a9f-4d30-9e55-e7caf3291e6a", "wikidata_canonical": "Sarki Vibez", "mb_name": "Sarki Vibez", "mb_sort_name": "Sarki Vibez", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Sarki Vibez", "sort_name": "Sarki Vibez", "type": "Artist name", "locale": null, "primary": false}]} +{"entity_id": "Q109632215", "mbid": "10909f59-699e-4376-93a0-4a844e0771f8", "wikidata_canonical": "Rethabile Khumalo", "mb_name": "Rethabile Khumalo", "mb_sort_name": "Khumalo, Rethabile", "mb_disambiguation": "South African singer-songwriter", "mb_country": "ZA", "mb_type": "Person", "aliases": []} +{"entity_id": "Q109646788", "mbid": "6e47fee6-4c84-4694-9868-ab9cdb2a06a3", "wikidata_canonical": "Ehiz Lenz", "mb_name": "Ehiz Lenz", "mb_sort_name": "Ehiz Lenz", "mb_disambiguation": null, "mb_country": null, "mb_type": "Person", "aliases": []} +{"entity_id": "Q109647208", "mbid": "612919e7-9898-4f4e-a3e3-8510e06e1fb7", "wikidata_canonical": "Presh Milli", "mb_name": "Presh Milli", "mb_sort_name": "Precious Patrick", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q109684363", "mbid": "fc49a977-2f78-423e-8b98-8207bf86e5d1", "wikidata_canonical": "Nana Adjoa", "mb_name": "Nana Adjoa", "mb_sort_name": "Adjoa, Nana", "mb_disambiguation": "Dutch bassist", "mb_country": "NL", "mb_type": "Person", "aliases": [{"name": "Nana Effah-Bekoe", "sort_name": "Effah-Bekoe, Nana", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q109816323", "mbid": "36bdf5c2-e20d-4589-82cd-642b78be3623", "wikidata_canonical": "Darina Victry", "mb_name": "Darina Victry", "mb_sort_name": "Darina Victry", "mb_disambiguation": null, "mb_country": null, "mb_type": "Person", "aliases": []} +{"entity_id": "Q110075061", "mbid": "bd41b3c8-cbc4-4a94-a9c4-4e9b1ce6cc7a", "wikidata_canonical": "shelovesneo", "mb_name": "Neo Motlatla", "mb_sort_name": "Motlatla, Neo", "mb_disambiguation": "South African visual artist", "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "Baby Neo", "sort_name": "Baby Neo", "type": "Search hint", "locale": null, "primary": false}, {"name": "Baby Neo", "sort_name": "Baby Neo", "type": "Search hint", "locale": null, "primary": false}, {"name": "Bxby Neo", "sort_name": "Baby Neo", "type": null, "locale": "en_ZA", "primary": false}, {"name": "Neo Motlatla", "sort_name": "Neo Motlatla", "type": "Search hint", "locale": null, "primary": false}, {"name": "Neo Motlatla", "sort_name": "Neo Motlatla", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q110110574", "mbid": "020ec616-3a71-4ac1-855d-7ce53488a8e8", "wikidata_canonical": "Reason SA", "mb_name": "Reason", "mb_sort_name": "Reason", "mb_disambiguation": "Sizwe Alakine", "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "Reason", "sort_name": "Reason", "type": "Artist name", "locale": null, "primary": false}, {"name": "Size Alakine", "sort_name": "Alakine, Size", "type": "Artist name", "locale": "en_ZA", "primary": true}, {"name": "Sizwe Moeketsi", "sort_name": "Sizwe Moeketsi", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q110154480", "mbid": "1cab162d-bbad-4935-8b78-d94315556528", "wikidata_canonical": "Civilize", "mb_name": "Civilize", "mb_sort_name": "Samson Monday", "mb_disambiguation": null, "mb_country": null, "mb_type": "Person", "aliases": []} +{"entity_id": "Q110265034", "mbid": "cbc34cc2-bcf4-4bf3-b12c-41b1e6f054ec", "wikidata_canonical": "Xtacy", "mb_name": "Xtacy", "mb_sort_name": "Nwaoha Happiness Nneoma", "mb_disambiguation": "Africa Dancehall Queen", "mb_country": null, "mb_type": "Person", "aliases": []} +{"entity_id": "Q110281105", "mbid": "24e1eea7-ad9a-4bf8-9c59-f6db2a1f5809", "wikidata_canonical": "B Major SA", "mb_name": "B Major", "mb_sort_name": "Major, B", "mb_disambiguation": "producer", "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "B Major CPT", "sort_name": "B Major CPT", "type": null, "locale": null, "primary": false}, {"name": "B Major SA", "sort_name": "B Major SA", "type": null, "locale": null, "primary": false}, {"name": "B Major Scale", "sort_name": "B Major Scale", "type": "Search hint", "locale": null, "primary": false}, {"name": "B. Major", "sort_name": "B. Major", "type": "Artist name", "locale": "en", "primary": false}, {"name": "Bjorn Martin", "sort_name": "Martin, Bjorn", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q110377447", "mbid": "1b791a0b-151e-40df-9be9-deddf6163bf6", "wikidata_canonical": "Blxckie", "mb_name": "Blxckie", "mb_sort_name": "Blxckie", "mb_disambiguation": "South African rapper", "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "Sihle Sithole", "sort_name": "Sithole, Sihle", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q110442584", "mbid": "0707594a-f793-4255-9708-4d73484581e9", "wikidata_canonical": "Buju", "mb_name": "BNXN", "mb_sort_name": "BNXN", "mb_disambiguation": "Nigerian afro‐fusion artist Daniel Benson", "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "BNXN", "sort_name": "BNXN", "type": "Artist name", "locale": null, "primary": false}, {"name": "BNXN fka Buju", "sort_name": "BNXN fka Buju", "type": "Artist name", "locale": null, "primary": false}, {"name": "Buju", "sort_name": "Buju", "type": "Artist name", "locale": null, "primary": false}, {"name": "Buju TYE", "sort_name": "Buju TYE", "type": "Artist name", "locale": null, "primary": false}, {"name": "Daniel Benson", "sort_name": "Benson, Daniel", "type": "Legal name", "locale": null, "primary": false}, {"name": "Daniel Etiese Benson", "sort_name": "Daniel Etiese Benson", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q1168056", "mbid": "68b8199b-eff2-45fb-be86-da8138d97067", "wikidata_canonical": "Jonathan Butler", "mb_name": "Jonathan Butler", "mb_sort_name": "Butler, Jonathan", "mb_disambiguation": "South African singer-songwriter and guitarist", "mb_country": "US", "mb_type": "Person", "aliases": [{"name": "Jonathan Kenneth Butler", "sort_name": "Butler, Jonathan Kenneth", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q110498357", "mbid": "677aeda8-f876-4036-adee-057d655deb78", "wikidata_canonical": "Roseline Layo", "mb_name": "Roseline Layo", "mb_sort_name": "Roseline Layo", "mb_disambiguation": null, "mb_country": null, "mb_type": "Person", "aliases": []} +{"entity_id": "Q110608385", "mbid": "45708051-5edf-4826-983f-63b1572e9812", "wikidata_canonical": "Ray G", "mb_name": "Ray G", "mb_sort_name": "Ray G", "mb_disambiguation": null, "mb_country": "UG", "mb_type": "Person", "aliases": [{"name": "Ray G", "sort_name": "Ray G", "type": "Artist name", "locale": null, "primary": false}, {"name": "Reagan Muhairwe", "sort_name": "Reagan Muhairwe", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q110661297", "mbid": "cd96060d-6f88-47e7-a3d5-085eab37e80f", "wikidata_canonical": "Ruger", "mb_name": "Ruger", "mb_sort_name": "Ruger", "mb_disambiguation": "Nigerian musician", "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Michael Adebayo Olayinka", "sort_name": "Michael Adebayo Olayinka", "type": "Legal name", "locale": null, "primary": false}, {"name": "Ruger", "sort_name": "Ruger", "type": "Artist name", "locale": null, "primary": false}]} +{"entity_id": "Q110689559", "mbid": "1dee3ae3-4fda-4b28-a0b6-2cf3bbda05ba", "wikidata_canonical": "Glory Ohams", "mb_name": "Glory Ohams", "mb_sort_name": "Ohams, Glory", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q110932339", "mbid": "b958b7fe-a72d-4849-a42e-9d8cf095d599", "wikidata_canonical": "Excel Falope", "mb_name": "Excel Falope", "mb_sort_name": "Excel", "mb_disambiguation": "Nigerian singer-songwriter", "mb_country": "ZA", "mb_type": "Person", "aliases": []} +{"entity_id": "Q110966777", "mbid": "2fa4f1b2-4743-4fa2-aa0b-bba5927bceea", "wikidata_canonical": "Kamo Mphela", "mb_name": "Kamo Mphela", "mb_sort_name": "Mphela, Kamo", "mb_disambiguation": null, "mb_country": null, "mb_type": null, "aliases": []} +{"entity_id": "Q111136127", "mbid": "5c21f270-b41c-4485-9814-9f3c71aa3b94", "wikidata_canonical": "Tshego", "mb_name": "Tshego", "mb_sort_name": "Tshego", "mb_disambiguation": "American–South African rapper", "mb_country": "ZA", "mb_type": "Person", "aliases": []} +{"entity_id": "Q111212975", "mbid": "2e0dfb79-7258-4785-9b56-2ae87298697f", "wikidata_canonical": "Mugeni Elijah", "mb_name": "Mugeni Elijah", "mb_sort_name": "Elijah, Mugeni", "mb_disambiguation": "South African Musician", "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "Awelani Mugeni", "sort_name": "Mugeni, Awelani", "type": "Legal name", "locale": "en_ZA", "primary": false}, {"name": "Mugeni Elijah", "sort_name": "Mugeni Elijah", "type": "Search hint", "locale": null, "primary": false}]} +{"entity_id": "Q111383421", "mbid": "57df9bbc-52cd-483c-ae1e-daf43dd312eb", "wikidata_canonical": "Azana", "mb_name": "Azana", "mb_sort_name": "Azana", "mb_disambiguation": "South African Singer-Songwriter", "mb_country": null, "mb_type": "Person", "aliases": []} +{"entity_id": "Q111530450", "mbid": "1c77174f-11eb-425a-8962-1f79c0793bd1", "wikidata_canonical": "Winnie Nwagi", "mb_name": "Winnie Nwagi", "mb_sort_name": "Nwagi, Winnie", "mb_disambiguation": null, "mb_country": "UG", "mb_type": "Person", "aliases": [{"name": "Winnie Nwagi", "sort_name": "Winnie Nwagi", "type": "Artist name", "locale": null, "primary": false}, {"name": "Winnifred Nakanwagi", "sort_name": "Winnifred Nakanwagi", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q111530519", "mbid": "e0602ce5-eb58-491b-84c9-d639eb79fadc", "wikidata_canonical": "Priscilla Zawedde (Azawi)", "mb_name": "Azawi", "mb_sort_name": "Azawi", "mb_disambiguation": "Ugandan singer, real name Priscilla Zawedde", "mb_country": "UG", "mb_type": "Person", "aliases": [{"name": "Azawi", "sort_name": "Azawi", "type": "Artist name", "locale": null, "primary": false}, {"name": "Priscilla Zawedde", "sort_name": "Priscilla Zawedde", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q111534595", "mbid": "c0da5f02-4b8b-412d-a5d2-8e2481403287", "wikidata_canonical": "Karol Kasita", "mb_name": "Karole Kasita", "mb_sort_name": "Kasita, Karole", "mb_disambiguation": null, "mb_country": "UG", "mb_type": "Person", "aliases": [{"name": "Karole Kasita", "sort_name": "Karole Kasita", "type": "Artist name", "locale": null, "primary": false}, {"name": "Namulindwa Caro", "sort_name": "Caro Namulindwa", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q112041187", "mbid": "c8287f71-f695-42b1-8a53-b47994e5d2ab", "wikidata_canonical": "Tay Iwar", "mb_name": "Tay Iwar", "mb_sort_name": "Iwar, Tay", "mb_disambiguation": "Nigerian singer-songwriter, composer, sound engineer", "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Austin Iornongu Iwar", "sort_name": "Austin Iornongu Iwar", "type": "Search hint", "locale": null, "primary": false}, {"name": "Austin Iornongu Iwar Jnr", "sort_name": "Austin Iornongu Iwar Jnr", "type": "Legal name", "locale": null, "primary": false}, {"name": "Tay Iwar", "sort_name": "Tay Iwar", "type": "Artist name", "locale": null, "primary": false}]} +{"entity_id": "Q112120810", "mbid": "7013c772-2236-42f3-8590-2e2292d2ca5e", "wikidata_canonical": "Victony", "mb_name": "Victony", "mb_sort_name": "Victony", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Anthony Ebuka Victor", "sort_name": "Anthony Ebuka Victor", "type": "Legal name", "locale": null, "primary": false}, {"name": "Victony", "sort_name": "Victony", "type": "Artist name", "locale": null, "primary": false}]} +{"entity_id": "Q112162702", "mbid": "feb456c7-79e6-47b2-8090-fa79e0186769", "wikidata_canonical": "Asuquomo", "mb_name": "Asuquomo", "mb_sort_name": "Asuquomo", "mb_disambiguation": null, "mb_country": null, "mb_type": null, "aliases": []} +{"entity_id": "Q112237028", "mbid": "6356deca-0118-4bdd-9db4-9ab3616495b7", "wikidata_canonical": "Muroki Mbote Wa Githinji", "mb_name": "Muroki", "mb_sort_name": "Muroki", "mb_disambiguation": null, "mb_country": null, "mb_type": null, "aliases": []} +{"entity_id": "Q112571237", "mbid": "73d75b2f-8849-40ca-8399-123476d4cc00", "wikidata_canonical": "Aramide", "mb_name": "Aramide", "mb_sort_name": "Aramide", "mb_disambiguation": null, "mb_country": null, "mb_type": null, "aliases": []} +{"entity_id": "Q112663060", "mbid": "b48d0360-5992-46c8-af0f-05bff846d9f4", "wikidata_canonical": "Yung Bylez", "mb_name": "Bylez", "mb_sort_name": "Bylez", "mb_disambiguation": null, "mb_country": "GH", "mb_type": "Person", "aliases": [{"name": "Finest Boy", "sort_name": "Finest Boy", "type": "Search hint", "locale": null, "primary": false}, {"name": "Papa Kofi Akyen Kwegyir", "sort_name": "Papa Kofi Akyen Kwegyir", "type": "Legal name", "locale": "ak_GH", "primary": true}, {"name": "YB", "sort_name": "YB", "type": "Search hint", "locale": null, "primary": false}]} +{"entity_id": "Q112861798", "mbid": "2b37ba5e-2162-46ca-bbad-f076f6a333bd", "wikidata_canonical": "Asake", "mb_name": "Asake", "mb_sort_name": "Asake", "mb_disambiguation": "Nigerian singer–songwriter", "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Ahmed Ololade", "sort_name": "Ololade Ahmed", "type": "Legal name", "locale": null, "primary": false}, {"name": "Asake", "sort_name": "Asake", "type": "Artist name", "locale": null, "primary": false}]} +{"entity_id": "Q113662051", "mbid": "b1fd5585-56f4-4b4a-83e4-c86df80ca5c7", "wikidata_canonical": "Magixx", "mb_name": "Magixx", "mb_sort_name": "Magixx", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Alexander Adewunmi Adelabu", "sort_name": "Alexander Adewunmi Adelabu", "type": "Legal name", "locale": null, "primary": false}, {"name": "Magixx", "sort_name": "Magixx", "type": "Artist name", "locale": null, "primary": false}]} +{"entity_id": "Q113866068", "mbid": "ea38d754-266c-4f4d-a8e9-7031dcd45b32", "wikidata_canonical": "Cheesy Vibes", "mb_name": "Cheesy Vibes", "mb_sort_name": "Cheesy Vibes", "mb_disambiguation": "Nigerian afro singer", "mb_country": null, "mb_type": "Person", "aliases": [{"name": "Cheesy Vibes", "sort_name": "Cheesy Vibes", "type": "Artist name", "locale": null, "primary": false}, {"name": "Cheezy-Vibes", "sort_name": "Cheezy-Vibes", "type": "Search hint", "locale": null, "primary": false}, {"name": "Chidera Ogbuo", "sort_name": "Chidera Ogbuo", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q114742280", "mbid": "8d1ad13b-a388-477d-b6a8-6b7d77904685", "wikidata_canonical": "Johnel Nnamani", "mb_name": "Johnel", "mb_sort_name": "Johnel", "mb_disambiguation": "Nigerian singer-songwriter", "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Nnamani Chimaobi John", "sort_name": "Nnamani Chimaobi John", "type": "Legal name", "locale": "ig", "primary": false}]} +{"entity_id": "Q115280566", "mbid": "2549d9a8-cd7a-4320-87d9-10c15abe9e97", "wikidata_canonical": "Yo Maps", "mb_name": "Yo Maps", "mb_sort_name": "Maps, Yo", "mb_disambiguation": null, "mb_country": "ZM", "mb_type": "Person", "aliases": []} +{"entity_id": "Q115492435", "mbid": "5186ac3d-1466-4905-8853-9dca6c90ad82", "wikidata_canonical": "PsychoYP", "mb_name": "PsychoYP", "mb_sort_name": "PsychoYP", "mb_disambiguation": null, "mb_country": null, "mb_type": "Person", "aliases": []} +{"entity_id": "Q115688374", "mbid": "330054ae-c442-489e-8901-10cff96b819b", "wikidata_canonical": "Odumodublvck", "mb_name": "ODUMODUBLVCK", "mb_sort_name": "ODUMODUBLVCK", "mb_disambiguation": "Nigerian rapper Tochukwu Gbubemi Ojogwu", "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "ODUMODUBLVCK", "sort_name": "ODUMODUBLVCK", "type": "Artist name", "locale": null, "primary": false}, {"name": "Tochukwu Gbubemi Ojogwu", "sort_name": "Tochukwu Gbubemi Ojogwu", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q115723694", "mbid": "a74a159f-de9e-4132-a280-a6800e4b4549", "wikidata_canonical": "Sol Amarfio", "mb_name": "Sol Amarfio", "mb_sort_name": "Amarfio, Sol", "mb_disambiguation": null, "mb_country": "GH", "mb_type": "Person", "aliases": [{"name": "Solomon Amarfio", "sort_name": "Amarfio, Solomon", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q115790718", "mbid": "6f73cf76-8550-459d-935a-d9b932b4266b", "wikidata_canonical": "Libianca", "mb_name": "Libianca", "mb_sort_name": "Libianca", "mb_disambiguation": null, "mb_country": "US", "mb_type": "Person", "aliases": [{"name": "Libianca Kenzonkinboum Fonji", "sort_name": "Fonji, Libianca Kenzonkinboum", "type": "Legal name", "locale": "en", "primary": false}]} +{"entity_id": "Q115791127", "mbid": "8acc17e2-10d4-42e4-8d3c-9e03aabef8d4", "wikidata_canonical": "Didi B", "mb_name": "Didi B", "mb_sort_name": "Didi B", "mb_disambiguation": "Bassa Zérehoué Diyilem", "mb_country": "CI", "mb_type": "Person", "aliases": [{"name": "Didi B bayo", "sort_name": "Didi B bayo", "type": null, "locale": null, "primary": false}]} +{"entity_id": "Q115915562", "mbid": "99fb295e-997e-46bc-a5d3-b853ddcab530", "wikidata_canonical": "Abby Chams", "mb_name": "Abigail Chams", "mb_sort_name": "Chams, Abigail", "mb_disambiguation": null, "mb_country": "TZ", "mb_type": "Person", "aliases": [{"name": "A Chams", "sort_name": "A Chams", "type": null, "locale": null, "primary": false}, {"name": "Abby Chams", "sort_name": "Chams, Abby", "type": null, "locale": null, "primary": false}, {"name": "Abigail Chamungwana", "sort_name": "Chamungwana, Abigail", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q116767429", "mbid": "043fa76b-4a78-4ac2-a7bd-0cade88b4c06", "wikidata_canonical": "Bloody Civilian", "mb_name": "Bloody Civilian", "mb_sort_name": "Civilian, Bloody", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q116856286", "mbid": "af2abbff-608e-4c7a-a1af-6fc3bb0c0164", "wikidata_canonical": "Maglera Doe Boy", "mb_name": "Maglera Doe Boy", "mb_sort_name": "Maglera Doe Boy", "mb_disambiguation": "South African rapper", "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "Maglera Doe Boy", "sort_name": "Maglera Doe Boy", "type": "Artist name", "locale": null, "primary": false}, {"name": "Tokelo Moyakhe", "sort_name": "Moyakhe Tokelo", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q116896873", "mbid": "422a3093-4b53-4706-a2d9-cc5414cc657e", "wikidata_canonical": "Khaid", "mb_name": "KHAID", "mb_sort_name": "KHAID", "mb_disambiguation": null, "mb_country": null, "mb_type": null, "aliases": []} +{"entity_id": "Q117074600", "mbid": "025d1f65-856f-4cc0-a0df-92f136bf4c16", "wikidata_canonical": "Costa Titch", "mb_name": "Costa Titch", "mb_sort_name": "Costa Titch", "mb_disambiguation": null, "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "Costantinos Tsobanoglou", "sort_name": "Tsobanoglou, Costantinos", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q117455373", "mbid": "b140dadc-6d54-4172-83ef-7cfebc02fbb2", "wikidata_canonical": "Jeriq", "mb_name": "Jeriq", "mb_sort_name": "Jeriq", "mb_disambiguation": "Nigeria", "mb_country": null, "mb_type": null, "aliases": []} +{"entity_id": "Q117640054", "mbid": "685b5d2a-8696-47af-85ae-96ce33bb9626", "wikidata_canonical": "Sunmisola Agbebi", "mb_name": "Sunmisola Agbebi", "mb_sort_name": "Agbebi, Sunmisola", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q118719877", "mbid": "97dbc25b-2de1-4afa-b3ef-5a34ddcf5766", "wikidata_canonical": "Nkosazana Daughter", "mb_name": "Nkosazana Daughter", "mb_sort_name": "Nkosazana Daughter", "mb_disambiguation": null, "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "Nkosazana Daughter", "sort_name": "Nkosazana Daughter", "type": "Artist name", "locale": null, "primary": false}, {"name": "Nolwazi Nzama", "sort_name": "Nolwazi Nzama", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q119154144", "mbid": "c6d44bb3-73d3-4d84-8eea-4a4ff91e0bd1", "wikidata_canonical": "Bisk", "mb_name": "Bisk", "mb_sort_name": "Bisik", "mb_disambiguation": "Musical Artist", "mb_country": null, "mb_type": "Person", "aliases": []} +{"entity_id": "Q122823", "mbid": "0f2e5bd9-cb3a-4f37-bbcf-36e31db7378d", "wikidata_canonical": "Stella Mwangi", "mb_name": "Stella Mwangi", "mb_sort_name": "Mwangi, Stella", "mb_disambiguation": null, "mb_country": "KE", "mb_type": "Person", "aliases": []} +{"entity_id": "Q1252624", "mbid": "8f15b84d-4f67-443a-a5f5-2f9a37e9a255", "wikidata_canonical": "Douk Saga", "mb_name": "Douk Saga", "mb_sort_name": "Saga, Douk", "mb_disambiguation": "coupé-décalé", "mb_country": "CI", "mb_type": "Person", "aliases": [{"name": "Stéphane Hamidou Doukouré", "sort_name": "Doukouré, Stéphane Hamidou", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q1263803", "mbid": "71cb2a81-76bf-4147-a084-f33ab74a6938", "wikidata_canonical": "Dudu Pukwana", "mb_name": "Dudu Pukwana", "mb_sort_name": "Pukwana, Dudu", "mb_disambiguation": null, "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "Mthutuzeli Dudu Pukwana", "sort_name": "Pukwana, Mthutuzeli Dudu", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q1264998", "mbid": "9a4d5b32-a34a-4aec-b781-865b4fb56026", "wikidata_canonical": "Dumisani Maraire", "mb_name": "Dumisani Maraire", "mb_sort_name": "Maraire, Dumisani", "mb_disambiguation": null, "mb_country": "ZW", "mb_type": "Person", "aliases": [{"name": "Dumi Maraire", "sort_name": "Dumi Maraire", "type": "Search hint", "locale": null, "primary": false}, {"name": "Dumisani Abraham Maraire", "sort_name": "Dumisani Abraham Maraire", "type": null, "locale": null, "primary": false}]} +{"entity_id": "Q1279965", "mbid": "19437b07-34ee-4f0d-8891-3a7d63fcfa16", "wikidata_canonical": "Eboa Lotin", "mb_name": "Eboa Lotin", "mb_sort_name": "Lotin, Eboa", "mb_disambiguation": null, "mb_country": "CM", "mb_type": "Person", "aliases": [{"name": "Emmanuel Eboa Lottin", "sort_name": "Lottin, Emmanuel Eboa", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q1282985", "mbid": "271075d2-7aff-4fc1-8424-db1e30d2bd08", "wikidata_canonical": "William Plomer", "mb_name": "William Plomer", "mb_sort_name": "Plomer, William", "mb_disambiguation": null, "mb_country": "GB", "mb_type": "Person", "aliases": []} +{"entity_id": "Q13034376", "mbid": "0abc8aa6-b403-4dac-806e-6ee9bac4a689", "wikidata_canonical": "Bobby van Jaarsveld", "mb_name": "Bobby van Jaarsveld", "mb_sort_name": "Van Jaarsveld, Bobby", "mb_disambiguation": null, "mb_country": "ZA", "mb_type": "Person", "aliases": []} +{"entity_id": "Q13034645", "mbid": "764b6edd-5189-4452-9726-eb26b26c0e02", "wikidata_canonical": "Dozi", "mb_name": "Dozi", "mb_sort_name": "Dozi", "mb_disambiguation": null, "mb_country": "ZA", "mb_type": "Person", "aliases": []} +{"entity_id": "Q13034762", "mbid": "6f3a8379-3a62-4b28-aa34-ceba23488321", "wikidata_canonical": "Gawie Cillié", "mb_name": "Gawie Cillié", "mb_sort_name": "Cillié, Gawie", "mb_disambiguation": "South African composer, choir director, astrophysicist, 20th c.", "mb_country": "ZA", "mb_type": "Person", "aliases": []} +{"entity_id": "Q13035046", "mbid": "02cf1c62-42ab-4d3b-a13a-2bc8a81cd1dd", "wikidata_canonical": "Jannie du Toit", "mb_name": "Jannie du Toit", "mb_sort_name": "Jannie du Toit", "mb_disambiguation": null, "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "Janie Du Toit", "sort_name": "Janie Du Toit", "type": null, "locale": null, "primary": false}, {"name": "Jannie Du Toit", "sort_name": "Jannie Du Toit", "type": null, "locale": null, "primary": false}]} +{"entity_id": "Q13035064", "mbid": "4aeca61c-f834-41f7-bc03-fe0e364590a9", "wikidata_canonical": "Joe Niemand", "mb_name": "Joe Niemand", "mb_sort_name": "Niemand, Joe", "mb_disambiguation": "South African Singer-Songwriter", "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "Johannes Jordaan Niemand", "sort_name": "Niemand, Johannes Jordaan", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q13036057", "mbid": "71c356e9-b45f-41e5-8030-620f70529d00", "wikidata_canonical": "Snotkop", "mb_name": "Snotkop", "mb_sort_name": "Snotkop", "mb_disambiguation": null, "mb_country": "ZA", "mb_type": "Person", "aliases": []} +{"entity_id": "Q13140891", "mbid": "b2d22340-61e9-4f5f-9c3e-b9617ce43a45", "wikidata_canonical": "Waje", "mb_name": "Waje", "mb_sort_name": "Waje", "mb_disambiguation": "Nigerian singer Aituaje Iruobe", "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q13144969", "mbid": "a51547eb-cf25-4ac3-a2d5-c8581f1eaa17", "wikidata_canonical": "Eyob Mekonnen", "mb_name": "እዮብ መኮንን", "mb_sort_name": "Mekonnen, Eyob", "mb_disambiguation": null, "mb_country": "ET", "mb_type": "Person", "aliases": [{"name": "Eyob Mekonnen", "sort_name": "Mekonnen, Eyob", "type": "Artist name", "locale": "en", "primary": true}]} +{"entity_id": "Q13188765", "mbid": "633ba024-2aa5-499c-ac7d-9c6c3b7d4de4", "wikidata_canonical": "Peter Miles", "mb_name": "Peter Miles", "mb_sort_name": "Miles Peter", "mb_disambiguation": "Ugandan musician", "mb_country": "UG", "mb_type": "Person", "aliases": [{"name": "Peter Kanyike", "sort_name": "Kanyike Peter", "type": "Legal name", "locale": null, "primary": false}, {"name": "Peter Miles", "sort_name": "Peter Miles", "type": "Artist name", "locale": null, "primary": false}]} +{"entity_id": "Q119700248", "mbid": "7be6f550-439d-47ec-ae03-7ee2b116b9d5", "wikidata_canonical": "MohBad", "mb_name": "Mohbad", "mb_sort_name": "Mohbad", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Ilerioluwa Oladimeji Aloba", "sort_name": "Oladimeji Aloba, Ilerioluwa", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q119858544", "mbid": "4b7bfccd-abbb-4493-8cc5-8fc3fe3a7f78", "wikidata_canonical": "Grantedboy", "mb_name": "Grantedboy", "mb_sort_name": "Grantedboy", "mb_disambiguation": "Nigerian singer", "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q120001835", "mbid": "e23806e9-853c-4cb6-937d-a2d7257ad046", "wikidata_canonical": "Qing Madi", "mb_name": "Qing Madi", "mb_sort_name": "Madi, Qing", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Chimamanda Pearl Chukwuma", "sort_name": "Chukwuma, Chimamanda Pearl", "type": "Legal name", "locale": null, "primary": false}, {"name": "Qing Madi", "sort_name": "Qing Madi", "type": "Artist name", "locale": null, "primary": false}]} +{"entity_id": "Q120373278", "mbid": "a567e689-2a18-4d80-bc41-42d95de77201", "wikidata_canonical": "Feli Nandi", "mb_name": "Feli Nandi", "mb_sort_name": "Feli Nandi", "mb_disambiguation": null, "mb_country": null, "mb_type": null, "aliases": []} +{"entity_id": "Q120798316", "mbid": "52e3f663-157a-49f9-b483-533d7d792dfd", "wikidata_canonical": "Teezee", "mb_name": "Teezee", "mb_sort_name": "Teezee", "mb_disambiguation": null, "mb_country": null, "mb_type": null, "aliases": []} +{"entity_id": "Q120834948", "mbid": "066cf02b-2b57-44d5-8b83-ea49de8eaf40", "wikidata_canonical": "Gavin Cracck", "mb_name": "Gavin Cracck", "mb_sort_name": "Gavin Cracck", "mb_disambiguation": "Musical Artist", "mb_country": null, "mb_type": "Person", "aliases": []} +{"entity_id": "Q120943157", "mbid": "faea091e-7b38-471f-b5a2-68ba6929cdaa", "wikidata_canonical": "Shallipopi", "mb_name": "Shallipopi", "mb_sort_name": "Shallipopi", "mb_disambiguation": "Afrobeat Artist from Nigeria", "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Crown Uzama", "sort_name": "Crown Uzama", "type": "Legal name", "locale": null, "primary": false}, {"name": "Shallipopi", "sort_name": "Shallipopi", "type": "Artist name", "locale": null, "primary": false}]} +{"entity_id": "Q121769985", "mbid": "d2bbca0d-e266-4af9-9904-0e81c6b2f5ca", "wikidata_canonical": "Andre Vibez", "mb_name": "Andre Vibez", "mb_sort_name": "Vibez Andre", "mb_disambiguation": "Music producer signed to Mavin Records.", "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Alexander Uwaifo", "sort_name": "Uwaifo Alexander", "type": "Legal name", "locale": null, "primary": false}, {"name": "Andre Vibez", "sort_name": "Andre Vibez", "type": "Artist name", "locale": null, "primary": false}]} +{"entity_id": "Q123060975", "mbid": "424dab33-5ca1-4393-81b3-759db8837a1d", "wikidata_canonical": "Decoo Jay", "mb_name": "Decoo Jay", "mb_sort_name": "Decoo Jay", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q123191860", "mbid": "efedd130-9e54-43df-88ed-44b408a260e7", "wikidata_canonical": "Lanie Banks", "mb_name": "Lanie Banks", "mb_sort_name": "Banks, Lanie", "mb_disambiguation": null, "mb_country": "CA", "mb_type": "Person", "aliases": [{"name": "Lanie Banks", "sort_name": "Banks, Lanie", "type": "Artist name", "locale": "en_US", "primary": false}, {"name": "Micheal Osingilio", "sort_name": "Osingilio, Micheal", "type": "Legal name", "locale": "en_UG", "primary": false}, {"name": "Micheal Osings", "sort_name": "Osings, Micheal", "type": "Legal name", "locale": "en_US", "primary": false}, {"name": "Osingilio Micheal", "sort_name": "Micheal, Osingilio", "type": "Legal name", "locale": "en_UG", "primary": false}, {"name": "Osings Micheal", "sort_name": "Micheal, Osings", "type": "Legal name", "locale": "en_US", "primary": false}, {"name": "Rap Lord", "sort_name": "Rap Lord", "type": "Search hint", "locale": null, "primary": false}]} +{"entity_id": "Q123279566", "mbid": "152ac1f0-b337-4995-b305-e94a92711a4a", "wikidata_canonical": "Snazzy the Optimist", "mb_name": "Snazzy the Optimist", "mb_sort_name": "Michael Chimeruche Alozie", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q123574342", "mbid": "9746cc74-449a-433a-90cd-d85a96bd799a", "wikidata_canonical": "Yamê", "mb_name": "Yamê", "mb_sort_name": "Yamê", "mb_disambiguation": null, "mb_country": "FR", "mb_type": "Person", "aliases": [{"name": "Emmanuel Sow", "sort_name": "Sow, Emmanuel", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q124024092", "mbid": "8c1653de-cd16-4798-b3e3-364b3a23b22d", "wikidata_canonical": "Socket", "mb_name": "Socket", "mb_sort_name": "Socket", "mb_disambiguation": "Nigeria hip hop / R&B", "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Chidalu Fortune Tony", "sort_name": "Tony, Chidalu Fortune", "type": "Legal name", "locale": "ig_NG", "primary": false}]} +{"entity_id": "Q124248942", "mbid": "a0a6a7c8-f3f7-44b5-ba70-aee23011afb5", "wikidata_canonical": "Khid Ceejay", "mb_name": "Khid Ceejay", "mb_sort_name": "Khid Ceejay", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q124606307", "mbid": "11c7b6b1-7712-47b0-ab62-e0f68db9d8a2", "wikidata_canonical": "Saba", "mb_name": "Saba", "mb_sort_name": "Saba", "mb_disambiguation": "Danish singer Saba Oehlenschlæger", "mb_country": "DK", "mb_type": "Person", "aliases": [{"name": "Anna Saba Lykke Oehlenschlæger", "sort_name": "Oehlenschlæger, Anna Saba Lykke", "type": "Legal name", "locale": "da_DK", "primary": false}]} +{"entity_id": "Q124658615", "mbid": "ca523e77-3eb8-4306-b5eb-e2010f789441", "wikidata_canonical": "Ecko Miles", "mb_name": "ECko Miles", "mb_sort_name": "ECko Miles", "mb_disambiguation": null, "mb_country": null, "mb_type": null, "aliases": []} +{"entity_id": "Q124728857", "mbid": "1ae115ac-b58c-4ff4-9785-65047ad65297", "wikidata_canonical": "Yallunder", "mb_name": "Yallunder", "mb_sort_name": "Yallunder", "mb_disambiguation": null, "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "Yolanda Nyembezi", "sort_name": "Nyembezi, Yolanda", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q125118085", "mbid": "562d136d-8e3f-41ac-bf56-e0d07fa8868d", "wikidata_canonical": "Sofiya Nzau", "mb_name": "Sofiya Nzau", "mb_sort_name": "Nzau, Sofiya", "mb_disambiguation": null, "mb_country": "KE", "mb_type": "Person", "aliases": []} +{"entity_id": "Q125689741", "mbid": "d2072887-4750-408f-8c62-d82a67f1fd0c", "wikidata_canonical": "Zerrydl", "mb_name": "Zerrydl", "mb_sort_name": "Zerrydl", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q126165407", "mbid": "38d55490-2bec-4d7f-bde4-b26c3012d299", "wikidata_canonical": "Joshua Baraka", "mb_name": "Joshua Baraka", "mb_sort_name": "Joshua Baraka", "mb_disambiguation": null, "mb_country": "UG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q126641075", "mbid": "4dca2560-f773-41b6-a651-14ffa10b2bf5", "wikidata_canonical": "Johnny Junior", "mb_name": "Johnny Junior", "mb_sort_name": "Johnny Junior", "mb_disambiguation": "artist from Kenya", "mb_country": "KE", "mb_type": "Person", "aliases": []} +{"entity_id": "Q128601752", "mbid": "6ec2f527-c853-414c-b9f8-4acf4be4b235", "wikidata_canonical": "Tiggs Da Author", "mb_name": "Tiggs da Author", "mb_sort_name": "Tiggs da Author", "mb_disambiguation": null, "mb_country": "GB", "mb_type": "Person", "aliases": []} +{"entity_id": "Q128694020", "mbid": "6564c5fb-80cd-42a6-834a-ee4588ebccdc", "wikidata_canonical": "Zee Nxumalo", "mb_name": "Zee Nxumalo", "mb_sort_name": "Nxumalo, Zee", "mb_disambiguation": null, "mb_country": "ZA", "mb_type": "Person", "aliases": []} +{"entity_id": "Q128759149", "mbid": "40ce3f33-f9fe-4306-996c-5cd158732bfa", "wikidata_canonical": "Mthandeni SK", "mb_name": "Igcokama Elisha", "mb_sort_name": "Igcokama Elisha", "mb_disambiguation": null, "mb_country": "ZA", "mb_type": "Person", "aliases": []} +{"entity_id": "Q129033469", "mbid": "8df58cfe-d433-43a2-bf51-73caa1901d4f", "wikidata_canonical": "D Voice", "mb_name": "D Voice", "mb_sort_name": "D Voice", "mb_disambiguation": null, "mb_country": "TZ", "mb_type": "Person", "aliases": [{"name": "Abdul Hamisi Mtambo", "sort_name": "Mtambo, Abdul Hamisi", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q130231738", "mbid": "2b47c1fc-92ad-40f7-99ad-78f88715fc5c", "wikidata_canonical": "Jack Maradona", "mb_name": "Jack Maradona", "mb_sort_name": "Jack Maradona", "mb_disambiguation": null, "mb_country": null, "mb_type": "Person", "aliases": []} +{"entity_id": "Q130396077", "mbid": "90c66549-a0a4-4227-ace1-587f7615774c", "wikidata_canonical": "Morravey", "mb_name": "Morravey", "mb_sort_name": "Morravey", "mb_disambiguation": "Nigerian singer and songwriter", "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Daniella Ibinabo Daniel", "sort_name": "Daniella Ibinabo Daniel", "type": "Legal name", "locale": null, "primary": false}, {"name": "Morravey", "sort_name": "Morravey", "type": "Artist name", "locale": null, "primary": false}]} +{"entity_id": "Q130710351", "mbid": "acb9bccd-b1d1-43b8-95f0-d205a8bfab01", "wikidata_canonical": "King Flekky", "mb_name": "King Flekky", "mb_sort_name": "King flekky", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Only Boy, sadxx, ewafemi", "sort_name": "Only Boy, sadxx, ewafemi", "type": "Search hint", "locale": null, "primary": false}]} +{"entity_id": "Q131303439", "mbid": "c7a03750-3bcf-46f3-9553-7b53cbde1fe7", "wikidata_canonical": "King Paluta", "mb_name": "King Paluta", "mb_sort_name": "Paluta, King", "mb_disambiguation": "Ghanaian rapper, singer, and producer.", "mb_country": "GH", "mb_type": "Person", "aliases": [{"name": "Thomas Adjei Wireko", "sort_name": "Wireko, Thomas Adjei", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q131527357", "mbid": "9880688c-3b16-444c-bf3d-c11a8756064b", "wikidata_canonical": "Julia Church", "mb_name": "Julia Church", "mb_sort_name": "Church, Julia", "mb_disambiguation": "London-based singer and songwriter", "mb_country": "GB", "mb_type": "Person", "aliases": []} +{"entity_id": "Q131579712", "mbid": "69cf654c-fcce-4901-9767-c928f9abc525", "wikidata_canonical": "Black T Igwe", "mb_name": "Black T Igwe", "mb_sort_name": "Black T Igwe", "mb_disambiguation": "music artist / arranger / composer", "mb_country": "TG", "mb_type": null, "aliases": [{"name": "Black T Igwe", "sort_name": "Black T", "type": "Artist name", "locale": "en_GH", "primary": false}, {"name": "Black T Igwe", "sort_name": "Blackt", "type": "Artist name", "locale": null, "primary": false}, {"name": "Black T Togo", "sort_name": "Black T Togo", "type": "Artist name", "locale": "en_GH", "primary": false}, {"name": "Eric Yaw Otu", "sort_name": "Eric Yaw Otu", "type": "Legal name", "locale": null, "primary": false}, {"name": "black-t", "sort_name": "black-t", "type": "Artist name", "locale": null, "primary": false}, {"name": "blackt Chronos’one", "sort_name": "blackt Chronos’one", "type": "Artist name", "locale": null, "primary": false}, {"name": "blackt-igwe", "sort_name": "blackt-igwe", "type": "Artist name", "locale": null, "primary": false}, {"name": "eric Otu", "sort_name": "eric Otu", "type": "Artist name", "locale": "gaa_GH", "primary": false}]} +{"entity_id": "Q132741597", "mbid": "e140e82b-8898-4a14-a719-d4c5345842f8", "wikidata_canonical": "King Tri-Zi", "mb_name": "King Tri-Zi", "mb_sort_name": "King Tri-Zi", "mb_disambiguation": "Nigerian singer-songwriter", "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Kayode Felix Abifarin", "sort_name": "Kayode Felix Abifarin", "type": "Legal name", "locale": null, "primary": false}, {"name": "King Tri-Zi", "sort_name": "King Tri-Zi", "type": "Artist name", "locale": "en", "primary": true}]} +{"entity_id": "Q132889082", "mbid": "244c930c-ac4a-4992-8d6c-0381da9390ce", "wikidata_canonical": "Krexx Nv", "mb_name": "Krexx Nv", "mb_sort_name": "Krexx Nv", "mb_disambiguation": "Nigerian singer and songwriter", "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Black Proud Mofo", "sort_name": "Black Proud Mofo", "type": "Artist name", "locale": null, "primary": false}, {"name": "Honest Ornan Okoawo", "sort_name": "Okoawo, Honest Ornan", "type": "Legal name", "locale": null, "primary": false}, {"name": "Krexx", "sort_name": "Krexx Nv", "type": null, "locale": null, "primary": false}, {"name": "Krexx Nv", "sort_name": "Lamarian", "type": "Artist name", "locale": null, "primary": false}, {"name": "Krexx Nv", "sort_name": "Lamarian", "type": "Artist name", "locale": null, "primary": false}, {"name": "Krexx Nv", "sort_name": "Krexx Nv", "type": "Search hint", "locale": null, "primary": false}]} +{"entity_id": "Q143095", "mbid": "19d99b5c-3231-4f6c-b03e-68e390b62e97", "wikidata_canonical": "Ali Birra", "mb_name": "አሊ ቢራ", "mb_sort_name": "Ali Birra", "mb_disambiguation": null, "mb_country": "ET", "mb_type": "Person", "aliases": [{"name": "Ali Birraa", "sort_name": "Ali Birraa", "type": null, "locale": "om", "primary": false}, {"name": "Ali Mohamed Birra", "sort_name": "Birra, Ali Mohamed", "type": null, "locale": null, "primary": false}, {"name": "Ali Mohammed Birra", "sort_name": "Ali Mohammed Birra", "type": null, "locale": null, "primary": false}, {"name": "አሊ መሃመድ", "sort_name": "አሊ መሃመድ", "type": "Legal name", "locale": "am", "primary": false}, {"name": "አሊ ቢራ", "sort_name": "አሊ ቢራ", "type": null, "locale": "am", "primary": false}]} +{"entity_id": "Q146256", "mbid": "bc5c2918-4aba-4ef6-a245-100563a4487f", "wikidata_canonical": "Miriam Makeba", "mb_name": "Miriam Makeba", "mb_sort_name": "Makeba, Miriam", "mb_disambiguation": "South African singer-songwriter", "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "M. Makeba", "sort_name": "M. Makeba", "type": null, "locale": null, "primary": false}, {"name": "Makeba, Myriam", "sort_name": "Makeba, Myriam", "type": null, "locale": null, "primary": false}, {"name": "Miriam Makebo", "sort_name": "Miriam Makebo", "type": null, "locale": null, "primary": false}, {"name": "Myriam Makeba", "sort_name": "Myriam Makeba", "type": null, "locale": null, "primary": false}, {"name": "Zenzile Miriam Makeba", "sort_name": "Makeba, Zenzile Miriam", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q1352462", "mbid": "ec109929-d7ed-4806-94df-e99ca7e35173", "wikidata_canonical": "Fela Sowande", "mb_name": "Fela Sowande", "mb_sort_name": "Sowande, Fela", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Fela Sowande", "sort_name": "Fela Sowande", "type": null, "locale": null, "primary": false}, {"name": "Olufela Obafunmilayo Sowande", "sort_name": "Olufela Obafunmilayo Sowande", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q1356737", "mbid": "7594c121-fa3d-4270-9111-cfec34c85919", "wikidata_canonical": "Ernesto Djédjé", "mb_name": "Ernesto Djédjé", "mb_sort_name": "Djédjé, Ernesto", "mb_disambiguation": null, "mb_country": "CI", "mb_type": "Person", "aliases": [{"name": "Ernest Djédjé Blé Loué", "sort_name": "Loué, Ernest Djédjé Blé", "type": "Legal name", "locale": null, "primary": false}, {"name": "Ernesto Djédjé", "sort_name": "Djédjé, Ernesto", "type": null, "locale": null, "primary": false}]} +{"entity_id": "Q1362028", "mbid": "e5712ceb-c37a-4c49-a11c-ccf4e21852d4", "wikidata_canonical": "Troye Sivan", "mb_name": "Troye Sivan", "mb_sort_name": "Sivan, Troye", "mb_disambiguation": null, "mb_country": "AU", "mb_type": "Person", "aliases": [{"name": "Troye Sivan", "sort_name": "Troye Sivan", "type": "Artist name", "locale": "en", "primary": true}, {"name": "Troye Sivan Mellet", "sort_name": "Mellet, Troye Sivan", "type": "Legal name", "locale": "en", "primary": false}, {"name": "トロイ・シヴァン", "sort_name": "トロイ・シヴァン", "type": "Artist name", "locale": "ja", "primary": true}, {"name": "트로이", "sort_name": "트로이", "type": "Search hint", "locale": null, "primary": false}, {"name": "트로이 시반", "sort_name": "트로이 시반", "type": "Artist name", "locale": "ko", "primary": true}]} +{"entity_id": "Q1371393", "mbid": "ea524cc6-191a-4c05-ab88-3bb5c0880ca5", "wikidata_canonical": "Tony Allen", "mb_name": "Tony Allen", "mb_sort_name": "Allen, Tony", "mb_disambiguation": "Nigerian-born drummer and composer", "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Tony Oladipo Allen", "sort_name": "Tony Oladipo Allen", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q1396717", "mbid": "954973dc-97db-4dc0-b812-3cc917f02adf", "wikidata_canonical": "Viviane Chidid", "mb_name": "Viviane N'Dour", "mb_sort_name": "N'Dour, Viviane", "mb_disambiguation": null, "mb_country": "SN", "mb_type": "Person", "aliases": [{"name": "Viviane Chidid", "sort_name": "Viviane Chidid", "type": "Artist name", "locale": null, "primary": false}]} +{"entity_id": "Q1438869", "mbid": "0093cf21-ed2e-446d-921c-e716e05bdfe5", "wikidata_canonical": "John Kongos", "mb_name": "John Kongos", "mb_sort_name": "Kongos, John", "mb_disambiguation": null, "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "John Theodore Kongos", "sort_name": "Kongos, John Theodore", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q1527319", "mbid": "3a6b171c-331a-4f93-a2b3-c1a2eab80822", "wikidata_canonical": "Winston Mankunku Ngozi", "mb_name": "Winston Mankunku Ngozi", "mb_sort_name": "Ngozi, Winston Mankunku", "mb_disambiguation": null, "mb_country": "ZA", "mb_type": "Person", "aliases": []} +{"entity_id": "Q1550516", "mbid": "f516a60b-29e4-45ca-b4ce-9dc28fe0a515", "wikidata_canonical": "Jennifer Ferguson", "mb_name": "Jennifer Ferguson", "mb_sort_name": "Ferguson, Jennifer", "mb_disambiguation": null, "mb_country": null, "mb_type": "Person", "aliases": []} +{"entity_id": "Q1586663", "mbid": "27c55af5-0d9b-4a59-94d9-460f78dd8130", "wikidata_canonical": "Harry Miller", "mb_name": "Harry Miller", "mb_sort_name": "Miller, Harry", "mb_disambiguation": null, "mb_country": "ZA", "mb_type": "Person", "aliases": []} +{"entity_id": "Q14900355", "mbid": "e438cdd1-c3ed-49ee-9b68-477464b38063", "wikidata_canonical": "Slim Burna", "mb_name": "Slim Burna", "mb_sort_name": "Burna, Slim", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q14920149", "mbid": "5d62fdac-a8f1-431f-81ff-1584fc05274b", "wikidata_canonical": "Takura", "mb_name": "Takura", "mb_sort_name": "Takura", "mb_disambiguation": "Takura Tendayi", "mb_country": "GB", "mb_type": "Person", "aliases": [{"name": "Tamuka Takura Tendayi", "sort_name": "Tendayi, Tamuka Takura", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q15078245", "mbid": "9ae48763-3254-4aa8-b475-78156da01bc8", "wikidata_canonical": "Kelly Dénis", "mb_name": "Kelly Dénis", "mb_sort_name": "Dénis, Kelly", "mb_disambiguation": "Kimuli Kelly Dénis", "mb_country": "UG", "mb_type": "Person", "aliases": [{"name": "Kelly Denis", "sort_name": "Denis, Kelly", "type": "Artist name", "locale": "en_GB", "primary": false}, {"name": "Kimuli Dennis", "sort_name": "Dennis, Kimuli", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q15429574", "mbid": "a4dd4cc7-576d-4126-9780-75a48741234e", "wikidata_canonical": "Diamond Platnumz", "mb_name": "Diamond Platnumz", "mb_sort_name": "Diamond Platnumz", "mb_disambiguation": null, "mb_country": "TZ", "mb_type": "Person", "aliases": [{"name": "Diamond Platnumz", "sort_name": "Diamond Platnumz", "type": "Artist name", "locale": null, "primary": false}, {"name": "Naseeb Abdul Juma Issack", "sort_name": "Naseeb Abdul Juma Issack", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q15710750", "mbid": "4da2a1d8-e6d6-4ac3-b845-d624f9e3fce8", "wikidata_canonical": "Brequette Cassie", "mb_name": "Brequette", "mb_sort_name": "Brequette", "mb_disambiguation": null, "mb_country": "ES", "mb_type": "Person", "aliases": [{"name": "Brequette Shane Cassie", "sort_name": "Cassie, Brequette Shane", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q15812305", "mbid": "d87282f8-ce40-4b25-ab55-831d51cd5f76", "wikidata_canonical": "Ginger Johnson", "mb_name": "Ginger Folorunso Johnson", "mb_sort_name": "Johnson, Ginger Folorunso", "mb_disambiguation": null, "mb_country": null, "mb_type": "Person", "aliases": []} +{"entity_id": "Q15875346", "mbid": "903cc4c9-1078-4af6-9da1-b612ca4b4074", "wikidata_canonical": "Francois Van Coke", "mb_name": "Francois van Coke", "mb_sort_name": "van Coke, Francois", "mb_disambiguation": "South African", "mb_country": "ZA", "mb_type": "Person", "aliases": []} +{"entity_id": "Q15983182", "mbid": "4de10576-56c0-428f-842e-fe3cb9ca44fa", "wikidata_canonical": "Jan Blohm", "mb_name": "Jan Blohm", "mb_sort_name": "Blohm, Jan", "mb_disambiguation": null, "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "George Harry", "sort_name": "Harry, George", "type": "Artist name", "locale": "af", "primary": false}]} +{"entity_id": "Q15983685", "mbid": "b2cf9503-d19f-47ff-b0ef-fe98322d7aab", "wikidata_canonical": "Jeremy Loops", "mb_name": "Jeremy Loops", "mb_sort_name": "Loops, Jeremy", "mb_disambiguation": "South African One Man Folk Band", "mb_country": "ZA", "mb_type": "Person", "aliases": []} +{"entity_id": "Q15983700", "mbid": "91354fa3-f822-44d5-aa75-68bdc107472c", "wikidata_canonical": "Olaf Andresen", "mb_name": "Olaf Andresen", "mb_sort_name": "Andresen, Olaf", "mb_disambiguation": null, "mb_country": "DE", "mb_type": "Person", "aliases": [{"name": "Hans Olaf Waldemar Rüdiger Emmerich Felix Januarius Andresen", "sort_name": "Andresen, Hans Olaf Waldemar Rüdiger Emmerich Felix Januarius", "type": "Legal name", "locale": "de", "primary": false}]} +{"entity_id": "Q15983702", "mbid": "df404d76-52f2-4b59-934f-ba78f9020ecc", "wikidata_canonical": "Joe Foster", "mb_name": "Joe Foster", "mb_sort_name": "Joe Foster", "mb_disambiguation": "South African, prev. of group ADAM", "mb_country": "ZA", "mb_type": "Person", "aliases": []} +{"entity_id": "Q15987642", "mbid": "52486a37-7ebf-4eb4-b067-ba17417fe9d3", "wikidata_canonical": "AKA", "mb_name": "AKA", "mb_sort_name": "AKA", "mb_disambiguation": "South African rapper", "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "Kiernan Jarryd Forbes", "sort_name": "Forbes, Kiernan Jarryd", "type": "Legal name", "locale": "en", "primary": false}]} +{"entity_id": "Q135336042", "mbid": "60c66b91-6f7f-42f0-88f4-348c5ad8e866", "wikidata_canonical": "Youngboi OG", "mb_name": "Youngboi OG", "mb_sort_name": "Youngboi OG", "mb_disambiguation": "South African rapper, singer and songwriter", "mb_country": "ZA", "mb_type": "Person", "aliases": []} +{"entity_id": "Q135420205", "mbid": "4afd2baa-56b4-4b3c-bda0-5c32daa997b3", "wikidata_canonical": "Harry Cushy", "mb_name": "Harry Cushy", "mb_sort_name": "Cushy, Harry", "mb_disambiguation": "Nigeria Afrobeat artist and songwriter", "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q136349597", "mbid": "dc33cead-2a2a-4b4c-a52a-bd7632fab072", "wikidata_canonical": "Five O’ Clock", "mb_name": "Five O’ Clock", "mb_sort_name": "Clock, Five O’", "mb_disambiguation": "Nigerian hip hop artist", "mb_country": null, "mb_type": "Person", "aliases": []} +{"entity_id": "Q136416359", "mbid": "9a4faebc-dc9b-491f-a0e6-a70798fa0cd4", "wikidata_canonical": "Rozevn", "mb_name": "Rozevn", "mb_sort_name": "Rozevn", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q136536130", "mbid": "2b6e27aa-d8f2-4227-aa3b-2c29088482d4", "wikidata_canonical": "De Catamon", "mb_name": "De Catamon", "mb_sort_name": "De Catamon", "mb_disambiguation": "alias for Kenneth Chukwuemeka Asogwa. Nigerian singer and songwriter.", "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Kenneth Chukwuemeka Asogwa", "sort_name": "Asogwa Kenneth Chukwuemeka", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q138152985", "mbid": "93d0e28a-afa8-4afd-9176-507941773499", "wikidata_canonical": "Harrison Dyver", "mb_name": "Harrison Dyver", "mb_sort_name": "Dyver, Harrison", "mb_disambiguation": null, "mb_country": "UG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q138350910", "mbid": "efb4a28a-f88b-449c-90d4-cbbec733a6bf", "wikidata_canonical": "AceMob OG", "mb_name": "AceMob OG", "mb_sort_name": "AceMob OG", "mb_disambiguation": null, "mb_country": "ZM", "mb_type": "Person", "aliases": []} +{"entity_id": "Q138413708", "mbid": "64c83288-d0ec-43b6-8446-f0f4d818eb6c", "wikidata_canonical": "RemmiQue", "mb_name": "RemmiQue", "mb_sort_name": "RemmiQue", "mb_disambiguation": "Nigerian Afrobeats singer", "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q138460877", "mbid": "cd0e9f37-1a2e-4e0c-9173-00ce9ccd1927", "wikidata_canonical": "Rowlene", "mb_name": "Rowlene", "mb_sort_name": "Rowlene", "mb_disambiguation": "South African singer", "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "Rowlene Bosman", "sort_name": "Bosman, Rowlene", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q138603502", "mbid": "047aa4b1-eee9-4e8a-baae-658c5be63d50", "wikidata_canonical": "Vadisco", "mb_name": "Vadisco", "mb_sort_name": "VADISCO", "mb_disambiguation": "Cameroonian Afrobeats singer", "mb_country": null, "mb_type": "Person", "aliases": []} +{"entity_id": "Q138666060", "mbid": "ea64afe0-9ef1-4b9d-b60e-f10c39552055", "wikidata_canonical": "Lommy nine", "mb_name": "Lommy nine", "mb_sort_name": "nine, Lommy", "mb_disambiguation": "Tanzanian Bongo Flava singer‐songwriter", "mb_country": "TZ", "mb_type": "Person", "aliases": [{"name": "Daniel Peter Martinus", "sort_name": "Martinus, Daniel Peter", "type": "Legal name", "locale": "en", "primary": false}]} +{"entity_id": "Q138756114", "mbid": "259acb99-160d-4949-870d-1ec7fe96b89f", "wikidata_canonical": "Luster Love", "mb_name": "Luster Love", "mb_sort_name": "Luster Love", "mb_disambiguation": "South African rapper, Singer-songwriter and record producer", "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "Lehlogonolo Lekala", "sort_name": "Lehlogonolo Lekala", "type": "Legal name", "locale": "nso_ZA", "primary": false}, {"name": "Lehlogonolo Lekala", "sort_name": "Lehlogonolo Lekala", "type": "Legal name", "locale": "nso_ZA", "primary": false}]} +{"entity_id": "Q140085977", "mbid": "82f1248a-1c41-40d0-95bd-116d96683912", "wikidata_canonical": "Confidence Survival Eyong", "mb_name": "Confidence Survival Eyong", "mb_sort_name": "Eyong, Confidence Survival", "mb_disambiguation": "Nigerian gospel singer-songwriter", "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Ciel Music", "sort_name": "Ciel Music", "type": "Artist name", "locale": "en", "primary": true}]} +{"entity_id": "Q140159484", "mbid": "03a90d93-5c89-4648-a830-5e5db690af9d", "wikidata_canonical": "Boyonset", "mb_name": "Boyonset", "mb_sort_name": "Onset", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q140248519", "mbid": "1b7da7fc-aa62-481e-9047-1f11751094e1", "wikidata_canonical": "Swanky Olo", "mb_name": "Swanky Olo", "mb_sort_name": "Victor Isikpoje", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q140373357", "mbid": "622fab04-4d78-4aff-ab71-542b55548f92", "wikidata_canonical": "Jxt CJay", "mb_name": "Jxt CJay", "mb_sort_name": "Jxt CJay", "mb_disambiguation": "Nigerian Musical Artist, CEO of CJAY NATIONS ENT", "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q140385786", "mbid": "cc50dfc3-60ba-49a0-b796-8238f1357d12", "wikidata_canonical": "Jarxd Anthony", "mb_name": "Jarxd Anthony", "mb_sort_name": "Anthony, Jarxd", "mb_disambiguation": "Zimbabwean Rapper and Songwriter", "mb_country": "ZW", "mb_type": "Person", "aliases": [{"name": "Bandile Matsena", "sort_name": "Matsena, Bandile", "type": "Legal name", "locale": "en_ZW", "primary": true}]} +{"entity_id": "Q140411706", "mbid": "7a92ea9a-96ce-4dad-808a-b236c8a183f6", "wikidata_canonical": "KHAL", "mb_name": "KHAL", "mb_sort_name": "KHAL", "mb_disambiguation": "Nigerian Singer-Songwriter", "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q140841663", "mbid": "3cc02f08-77fb-41de-91fd-dfad6664a07c", "wikidata_canonical": "Joe Lington", "mb_name": "Joe Lington", "mb_sort_name": "Joe Lington", "mb_disambiguation": null, "mb_country": "CM", "mb_type": "Person", "aliases": []} +{"entity_id": "Q140923106", "mbid": "9233cd31-7e99-4122-8b62-15751a6f3591", "wikidata_canonical": "Iceking", "mb_name": "Iceking", "mb_sort_name": "Iceking", "mb_disambiguation": "Nigerian musical artist", "mb_country": null, "mb_type": "Person", "aliases": []} +{"entity_id": "Q141068876", "mbid": "1004abb6-a728-4432-a7a7-2725160086ab", "wikidata_canonical": "Adebola Akinola", "mb_name": "Adebola Akinola", "mb_sort_name": "Akinola, Adebola", "mb_disambiguation": "Nigerian gospel music artist, songwriter & music director", "mb_country": "GB", "mb_type": "Person", "aliases": []} +{"entity_id": "Q141205132", "mbid": "dff4a07d-e686-46bc-bd85-1ec017158f89", "wikidata_canonical": "BigElli", "mb_name": "BigElli", "mb_sort_name": "BigElli", "mb_disambiguation": "Rapper", "mb_country": null, "mb_type": "Person", "aliases": [{"name": "Dbadbllud", "sort_name": "Dbadbllud", "type": null, "locale": null, "primary": false}, {"name": "Elli", "sort_name": "Elli", "type": null, "locale": null, "primary": false}, {"name": "Elli Esh", "sort_name": "Elli Esh", "type": null, "locale": null, "primary": false}, {"name": "Ellidgunnelboss", "sort_name": "Ellidgunnelboss", "type": null, "locale": null, "primary": false}, {"name": "Elliot Oghenevwede Agbomi", "sort_name": "Elliot Oghenevwede Agbomi", "type": "Legal name", "locale": null, "primary": false}, {"name": "ThugBaby Elli", "sort_name": "ThugBaby Elli", "type": null, "locale": null, "primary": false}]} +{"entity_id": "Q141223181", "mbid": "5f78fc5a-ba54-4425-8ae2-c38ea2810089", "wikidata_canonical": "Kerry Nadia", "mb_name": "Kerry Nadia", "mb_sort_name": "Kerry Nadia", "mb_disambiguation": "Ugandan singer", "mb_country": "UG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q164446", "mbid": "38474d18-9204-4f60-a137-1fcc6750b869", "wikidata_canonical": "Skepta", "mb_name": "Skepta", "mb_sort_name": "Skepta", "mb_disambiguation": null, "mb_country": "GB", "mb_type": "Person", "aliases": [{"name": "Joseph Adanuga", "sort_name": "Joseph Adanuga", "type": "Search hint", "locale": null, "primary": false}, {"name": "Joseph Adenuga, Jr.", "sort_name": "Adenuga, Joseph, Jr.", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q167757", "mbid": "9eb21700-baf3-4ef7-8e47-1397ffa5f356", "wikidata_canonical": "ZP Theart", "mb_name": "ZP Theart", "mb_sort_name": "Theart, ZP", "mb_disambiguation": null, "mb_country": null, "mb_type": "Person", "aliases": []} +{"entity_id": "Q175392", "mbid": "ea3e7df3-463a-46ec-9af7-8fd71f8e3ab5", "wikidata_canonical": "Akosua Busia", "mb_name": "Akosua Busia", "mb_sort_name": "Busia, Akosua", "mb_disambiguation": "Ghanaian actress and songwriter", "mb_country": null, "mb_type": "Person", "aliases": [{"name": "Akosua Cyamama Busia", "sort_name": "Busia, Akosua Cyamama", "type": "Legal name", "locale": null, "primary": false}, {"name": "Akosua Gyamama Busia", "sort_name": "Akosua Gyamama Busia", "type": "Search hint", "locale": null, "primary": false}]} +{"entity_id": "Q175509", "mbid": "b3168af2-179b-45c8-b3e4-ab8c04216acc", "wikidata_canonical": "Anne Marie Nzié", "mb_name": "Anne‐Marie Nzié", "mb_sort_name": "Nzié, Anne‐Marie", "mb_disambiguation": null, "mb_country": "CM", "mb_type": "Person", "aliases": [{"name": "Anne-Marie Zié", "sort_name": "Anne-Marie Zié", "type": "Search hint", "locale": null, "primary": false}]} +{"entity_id": "Q1605812", "mbid": "0c81881c-9fa6-4f08-8fd7-26b92e959bb1", "wikidata_canonical": "Henri Dikongué", "mb_name": "Henri Dikongué", "mb_sort_name": "Dikongué, Henri", "mb_disambiguation": null, "mb_country": "CM", "mb_type": "Person", "aliases": [{"name": "Henri Dikongue", "sort_name": "Henri Dikongue", "type": null, "locale": null, "primary": false}, {"name": "Henry Dikongué", "sort_name": "Henry Dikongué", "type": null, "locale": null, "primary": false}]} +{"entity_id": "Q1676609", "mbid": "4b59362f-fb23-4296-aaf9-d12da3a6768e", "wikidata_canonical": "JJC", "mb_name": "JJC", "mb_sort_name": "JJC", "mb_disambiguation": "UK-based Nigerian rapper/producer Abdul Rasheed Bello", "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Abdul Rasheed Bello", "sort_name": "Abdul Rasheed Bello", "type": "Legal name", "locale": null, "primary": false}, {"name": "JJC Skillz", "sort_name": "JJC Skillz", "type": null, "locale": null, "primary": false}, {"name": "Skillz", "sort_name": "Skillz", "type": null, "locale": null, "primary": false}]} +{"entity_id": "Q1702317", "mbid": "3bef4088-cd6d-46c6-8600-a46b9dd000c0", "wikidata_canonical": "Johnny Dyani", "mb_name": "Johnny Dyani", "mb_sort_name": "Dyani, Johnny", "mb_disambiguation": null, "mb_country": "ZA", "mb_type": "Person", "aliases": []} +{"entity_id": "Q1775216", "mbid": "f962d805-8383-4ed2-af9e-ca4a739e00a1", "wikidata_canonical": "Siti binti Saad", "mb_name": "Siti binti Saad", "mb_sort_name": "Siti binti Saad", "mb_disambiguation": null, "mb_country": "TZ", "mb_type": "Person", "aliases": []} +{"entity_id": "Q1775226", "mbid": "cce86049-37c7-4c8e-8921-9a410bc7ea82", "wikidata_canonical": "Bi Kidude", "mb_name": "Bi Kidude", "mb_sort_name": "Bi Kidude", "mb_disambiguation": null, "mb_country": "TZ", "mb_type": "Person", "aliases": [{"name": "Fatma binti Baraka", "sort_name": "Baraka, Fatma binti", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q1790048", "mbid": "95b7e1a0-0311-4ff5-b7bb-b00283fa7f43", "wikidata_canonical": "Etoundi Onambélé", "mb_name": "Krotal", "mb_sort_name": "Krotal", "mb_disambiguation": null, "mb_country": "CM", "mb_type": "Person", "aliases": []} +{"entity_id": "Q1799363", "mbid": "d3751278-462c-4bce-afa7-0ac9d36577ba", "wikidata_canonical": "Laba Sosseh", "mb_name": "Laba Sosseh", "mb_sort_name": "Sosseh, Laba", "mb_disambiguation": null, "mb_country": "GM", "mb_type": "Person", "aliases": [{"name": "Laba Badara Sosseh", "sort_name": "Laba Badara Sosseh", "type": "Legal name", "locale": null, "primary": false}, {"name": "Labah Sosseh", "sort_name": "Labah Sosseh", "type": null, "locale": null, "primary": false}]} +{"entity_id": "Q1826243", "mbid": "f452d399-8db3-4aca-8df6-2780fbaa42c6", "wikidata_canonical": "Lindley Evans", "mb_name": "Lindley Evans", "mb_sort_name": "Evans, Lindley", "mb_disambiguation": "Australian composer / pianist", "mb_country": "AU", "mb_type": "Person", "aliases": []} +{"entity_id": "Q1853381", "mbid": "bd18aaf7-97dd-4bdf-84f5-916111f1b0db", "wikidata_canonical": "Teddy Afro", "mb_name": "Teddy Afro", "mb_sort_name": "Afro, Teddy", "mb_disambiguation": "Tewodros Kassahun", "mb_country": "ET", "mb_type": "Person", "aliases": [{"name": "Tewodros Kassahun", "sort_name": "Kassahun, Tewodros", "type": "Legal name", "locale": "en", "primary": false}, {"name": "Theodros Kassahun", "sort_name": "Theodros Kassahun", "type": null, "locale": "en", "primary": false}, {"name": "ቴዎድሮስ ካሳሁን", "sort_name": "ቴዎድሮስ ካሳሁን", "type": "Legal name", "locale": "am", "primary": false}, {"name": "ቴዲ አፍሮ", "sort_name": "ቴዲ አፍሮ", "type": "Artist name", "locale": "am", "primary": false}]} +{"entity_id": "Q1869111", "mbid": "d974e295-e3d8-4848-aeeb-e2ec9b553cf0", "wikidata_canonical": "Tutu Puoane", "mb_name": "Tutu Puoane", "mb_sort_name": "Puoane, Tutu", "mb_disambiguation": "Belgium-based jazz vocalist", "mb_country": "BE", "mb_type": "Person", "aliases": [{"name": "Tutu", "sort_name": "Tutu", "type": null, "locale": null, "primary": false}]} +{"entity_id": "Q1872141", "mbid": "6c8f7a3d-0a24-40a3-9514-b6e92b0be3a4", "wikidata_canonical": "Louise Carver", "mb_name": "Louise Carver", "mb_sort_name": "Carver, Louise", "mb_disambiguation": null, "mb_country": "ZA", "mb_type": "Person", "aliases": []} +{"entity_id": "Q1893336", "mbid": "2d12a36d-3913-49bc-a738-7a055e980d45", "wikidata_canonical": "Prince Nico Mbarga", "mb_name": "Prince Nico Mbarga", "mb_sort_name": "Mbarga, Prince Nico", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Prince Nico Mbarga & Rocafil Jazz", "sort_name": "Prince Nico Mbarga & Rocafil Jazz", "type": null, "locale": null, "primary": false}]} +{"entity_id": "Q1956997", "mbid": "64fc99a0-b887-4d44-9d48-2007afe0b0db", "wikidata_canonical": "Mzilikazi Khumalo", "mb_name": "Mzilikazi Khumalo", "mb_sort_name": "Khumalo, Mzilikazi", "mb_disambiguation": "co-contributor of the post-apartheid South African national anthem", "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "James Steven Mzilikazi Khumalo", "sort_name": "Khumalo, James Steven Mzilikazi", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q16149133", "mbid": "4b9d35a7-da2e-4f26-88cd-caefdf2dc41a", "wikidata_canonical": "Kenneth Kafui", "mb_name": "Kenneth Kafui", "mb_sort_name": "Kafui, Kenneth", "mb_disambiguation": null, "mb_country": "GH", "mb_type": "Person", "aliases": []} +{"entity_id": "Q16202024", "mbid": "6e0672f4-0feb-4617-ae96-7fad7d2e848f", "wikidata_canonical": "Chidinma Ekile", "mb_name": "Chidinma", "mb_sort_name": "Chidinma", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q16202910", "mbid": "bfd6415f-5cba-4b84-9134-ee39ea7cf08c", "wikidata_canonical": "Christopher Evans", "mb_name": "Chris Evans Kaweesi", "mb_sort_name": "Kaweesi Chris Evans", "mb_disambiguation": "Ugandan songwriter, recording and performing artist", "mb_country": "UG", "mb_type": "Person", "aliases": [{"name": "Chris Evans Kaweesi", "sort_name": "Chris Evans Kaweesi", "type": "Artist name", "locale": null, "primary": false}, {"name": "Christopher Evans Kaweesi", "sort_name": "Christopher Evans Kaweesi", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q16203843", "mbid": "6af31188-b6fb-4054-ae61-3be9260a837f", "wikidata_canonical": "Iyanya", "mb_name": "Iyanya", "mb_sort_name": "Iyanya", "mb_disambiguation": "Nigerian Afropop and R&B singer", "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q16204625", "mbid": "be3adb06-2899-424a-9a1e-b6ccf22a9072", "wikidata_canonical": "Duncan Mighty", "mb_name": "Duncan Mighty", "mb_sort_name": "Duncan Mighty", "mb_disambiguation": "Nigerian musician", "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q16208867", "mbid": "03a04986-d743-4d32-ac98-19bd61dd96d3", "wikidata_canonical": "Efya", "mb_name": "Efya", "mb_sort_name": "Efya", "mb_disambiguation": "Ghanaian singer, songwriter & actress Jane Awindor", "mb_country": "GH", "mb_type": "Person", "aliases": [{"name": "Efya", "sort_name": "Efya", "type": "Artist name", "locale": null, "primary": false}, {"name": "Jane Fara Fauzziea Yahaya Afia Awindor", "sort_name": "Jane Awindor", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q16209979", "mbid": "3959e8d9-e731-42b6-8796-c6ceada419fe", "wikidata_canonical": "Omawumi", "mb_name": "Omawumi", "mb_sort_name": "Omawumi", "mb_disambiguation": "Nigerian singer Omawumi Megbele", "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q16221097", "mbid": "ba800215-62c3-4fbf-93e9-8008186af81d", "wikidata_canonical": "Olamide", "mb_name": "Olamide", "mb_sort_name": "Olamide", "mb_disambiguation": "Nigerian Hip Hop artist", "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Olamide Gbenga Adedeji", "sort_name": "Adedeji, Olamide Gbenga", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q16223782", "mbid": "2fd8b4f2-af00-4235-9a8e-1fa3205fb643", "wikidata_canonical": "Spoek Mathambo", "mb_name": "Spoek Mathambo", "mb_sort_name": "Mathambo, Spoek", "mb_disambiguation": null, "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "Spoek", "sort_name": "Spoek", "type": null, "locale": null, "primary": false}]} +{"entity_id": "Q16231624", "mbid": "16ae2b79-5381-49ea-b5f2-ce827da8e869", "wikidata_canonical": "Wiyaala", "mb_name": "Wiyaala", "mb_sort_name": "Wiyaala", "mb_disambiguation": null, "mb_country": "GH", "mb_type": "Person", "aliases": [{"name": "Noella Wiyaala Nwadei", "sort_name": "Nwadei, Noella Wiyaala", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q16232036", "mbid": "a348b7e7-1e11-467f-ab2c-cc7e216470ce", "wikidata_canonical": "Wurld", "mb_name": "WurlD", "mb_sort_name": "WurlD", "mb_disambiguation": "Nigerian singer-songwriter Sadiq Onifade", "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Sadiq Onifade", "sort_name": "Onifade, Sadiq", "type": "Legal name", "locale": null, "primary": false}, {"name": "WurlD", "sort_name": "WurlD", "type": "Artist name", "locale": null, "primary": false}]} +{"entity_id": "Q16234484", "mbid": "a9ae7d4b-10f0-4da8-8b8c-21722a074a54", "wikidata_canonical": "Davido", "mb_name": "Davido", "mb_sort_name": "Davido", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "David Adedeji Adeleke", "sort_name": "Adeleke, David Adedeji", "type": "Legal name", "locale": null, "primary": false}, {"name": "Davido", "sort_name": "Davido", "type": "Artist name", "locale": null, "primary": false}]} +{"entity_id": "Q16235544", "mbid": "7b24231e-faa5-4838-b6a8-6a2eb2727b37", "wikidata_canonical": "KSI", "mb_name": "KSI", "mb_sort_name": "KSI", "mb_disambiguation": "UK comedian & rapper Olajide Olatunji (KSIOlajideBT)", "mb_country": "GB", "mb_type": "Person", "aliases": [{"name": "JJ Olatunji", "sort_name": "Olatunji, JJ", "type": null, "locale": null, "primary": false}, {"name": "Olajide Olayinka Williams Olatunji", "sort_name": "Williams Olatunji, Olajide Olayinka", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q16258599", "mbid": "73ecd380-11ca-4ccd-930a-0d1ed8de1050", "wikidata_canonical": "Nathaniel Willemse", "mb_name": "Nathaniel Willemse", "mb_sort_name": "Willemse, Nathaniel", "mb_disambiguation": "Australian singer-songwriter aka Nathaniel", "mb_country": "AU", "mb_type": "Person", "aliases": [{"name": "Nathaniel", "sort_name": "Nathaniel", "type": null, "locale": null, "primary": false}]} +{"entity_id": "Q16559392", "mbid": "3609ac9c-e5cd-446d-ac3f-b12a5c42c794", "wikidata_canonical": "Ifi Ude", "mb_name": "Ifi Ude", "mb_sort_name": "Ude, Ifi", "mb_disambiguation": null, "mb_country": "PL", "mb_type": "Person", "aliases": [{"name": "Diana Ifeoma Ude", "sort_name": "Ude, Diana Ifeoma", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q16679640", "mbid": "f1f8a8c5-edc9-4fc6-bb91-4942fe44f15c", "wikidata_canonical": "Pierre Nartsiss", "mb_name": "Пьер Нарцисс", "mb_sort_name": "Narciss, P'er", "mb_disambiguation": null, "mb_country": null, "mb_type": "Person", "aliases": [{"name": "Mudio Mukutu Pierre Narcisse De Napoli De Suza", "sort_name": "Narcisse De Napoli De Suza, Mudio Mukutu Pierre", "type": "Legal name", "locale": "fr", "primary": false}, {"name": "Narciss P'er", "sort_name": "Narciss P'er", "type": null, "locale": null, "primary": false}, {"name": "Nartsiss Pier", "sort_name": "Nartsiss Pier", "type": null, "locale": null, "primary": false}, {"name": "Pierre Narcisse", "sort_name": "Narcisse, Pierre", "type": "Artist name", "locale": "en", "primary": true}, {"name": "Pierre Narcisse", "sort_name": "Narcisse, Pierre", "type": "Artist name", "locale": "fr", "primary": true}, {"name": "Пьер Нарцисс", "sort_name": "Нарцисс, Пьер", "type": "Artist name", "locale": "ru", "primary": true}]} +{"entity_id": "Q16728324", "mbid": "d2326d49-1ad2-41e1-9672-afe8143edbc9", "wikidata_canonical": "Filipa Carmo da Silva", "mb_name": "Filipa", "mb_sort_name": "Filipa", "mb_disambiguation": "Carmo da Silva; South African & Portuguese singer-songwriter", "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "Filipa Alexandra Carmo da Silva", "sort_name": "Carmo da Silva, Filipa Alexandra", "type": "Legal name", "locale": "pt", "primary": false}]} +{"entity_id": "Q16728568", "mbid": "83f9a2a2-9348-4200-bf2f-ec13ebd0d7ea", "wikidata_canonical": "Khadijah Blell", "mb_name": "Di’ja", "mb_sort_name": "Di’ja", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q16728749", "mbid": "9dbcc131-1092-4ced-95d6-eeb8b300dca5", "wikidata_canonical": "Eddy Kenzo", "mb_name": "Eddy Kenzo", "mb_sort_name": "Kenzo, Eddy", "mb_disambiguation": null, "mb_country": null, "mb_type": "Person", "aliases": [{"name": "Eddy Kenzo", "sort_name": "Eddy Kenzo", "type": "Artist name", "locale": null, "primary": false}, {"name": "Edrisah Kenzo Musuuzah", "sort_name": "Edrisah Kenzo Musuuzah", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q16729327", "mbid": "d02f9327-7c31-487a-a287-51c85dc08481", "wikidata_canonical": "GNL Zamba", "mb_name": "GNL Zamba", "mb_sort_name": "GNL Zamba", "mb_disambiguation": "Ugandan rapper", "mb_country": "UG", "mb_type": "Person", "aliases": [{"name": "Ernest Nsimbitulye Lupiiyazitta Zamba", "sort_name": "Ernest Nsimbitulye Lupiiyazitta Zamba", "type": "Legal name", "locale": null, "primary": false}, {"name": "GNL Zamba", "sort_name": "GNL Zamba", "type": "Artist name", "locale": null, "primary": false}]} +{"entity_id": "Q16733441", "mbid": "3c0fc4de-2b6b-4664-a0e6-468e585eb4ec", "wikidata_canonical": "Nomfusi", "mb_name": "Nomfusi", "mb_sort_name": "Nomfusi", "mb_disambiguation": null, "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "Nomfusi Gotyana", "sort_name": "Gotyana, Nomfusi", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q16734181", "mbid": "2ce60396-e167-4c91-803a-aca86671775b", "wikidata_canonical": "Dapo Torimiro", "mb_name": "Dapo Torimiro", "mb_sort_name": "Torimiro, Dapo", "mb_disambiguation": null, "mb_country": "US", "mb_type": "Person", "aliases": [{"name": "Oladapo Torimiro", "sort_name": "Torimiro, Oladapo", "type": "Artist name", "locale": null, "primary": false}]} +{"entity_id": "Q16738959", "mbid": "aac7551a-d320-439a-94ad-0e9036d9bd81", "wikidata_canonical": "Muma Gee", "mb_name": "Muma Gee", "mb_sort_name": "Muma Gee", "mb_disambiguation": "Nigerian singer Gift Iyumame Eke", "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q16752042", "mbid": "23a67359-d57c-4704-b722-c3032dd7f5de", "wikidata_canonical": "Seyi", "mb_name": "Seyi Shay", "mb_sort_name": "Shay, Seyi", "mb_disambiguation": "Nigerian-based singer, songwriter and actress", "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Deborah Oluwaseyi Joshua", "sort_name": "Deborah Oluwaseyi Joshua", "type": "Legal name", "locale": null, "primary": false}, {"name": "Oluwaseyi Odedere", "sort_name": "Oluwaseyi Odedere", "type": "Search hint", "locale": null, "primary": false}]} +{"entity_id": "Q16832114", "mbid": "62f3de56-0b50-4792-8e73-afda63f52f82", "wikidata_canonical": "Tamara Eteimo", "mb_name": "Tamara Jones", "mb_sort_name": "Jones, Tamara", "mb_disambiguation": null, "mb_country": null, "mb_type": "Person", "aliases": []} +{"entity_id": "Q16841163", "mbid": "33bfd427-2786-4d66-ab25-7f0523c444b4", "wikidata_canonical": "Aziz Azion", "mb_name": "Aziz Azion", "mb_sort_name": "Aziz Azion", "mb_disambiguation": null, "mb_country": "UG", "mb_type": "Person", "aliases": [{"name": "Aziz Azion", "sort_name": "Aziz Azion", "type": "Artist name", "locale": null, "primary": false}, {"name": "Aziz Mukisa", "sort_name": "Mukisa Aziz", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q16845424", "mbid": "c1f8158a-afe7-4af3-ae85-a1c279569ef1", "wikidata_canonical": "Dammy Krane", "mb_name": "Dammy Krane", "mb_sort_name": "Dammy Krane", "mb_disambiguation": null, "mb_country": "US", "mb_type": "Person", "aliases": []} +{"entity_id": "Q16848112", "mbid": "12689a6e-d527-4024-84c3-26dc2f9a2cee", "wikidata_canonical": "Reminisce", "mb_name": "Reminisce", "mb_sort_name": "Reminisce", "mb_disambiguation": "artist from Nigeria", "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Remilekun Abdulkalid Safaru", "sort_name": "Remilekun Abdulkalid Safaru", "type": "Legal name", "locale": null, "primary": false}, {"name": "Reminisce", "sort_name": "Reminisce", "type": "Artist name", "locale": null, "primary": false}]} +{"entity_id": "Q16864067", "mbid": "cee01a83-a440-4b22-b5f6-76838a3d687b", "wikidata_canonical": "Euphonik", "mb_name": "Euphonik", "mb_sort_name": "Euphonik", "mb_disambiguation": "South African DJ Themba Nkosi", "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "DJ Euphonik", "sort_name": "Euphonik, DJ", "type": "Artist name", "locale": null, "primary": false}, {"name": "Themba Mbongeni Nkosi", "sort_name": "Nkosi, Themba Mbongeni", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q16866345", "mbid": "98fd0571-0ddb-4ee8-9e1b-19a9a7294554", "wikidata_canonical": "Emahoy Tsegué-Maryam Guèbrou", "mb_name": "Emahoy Tsegué-Maryam Guèbrou", "mb_sort_name": "Guèbrou, Emahoy Tsegué-Maryam", "mb_disambiguation": null, "mb_country": "ET", "mb_type": "Person", "aliases": [{"name": "Emahoy Tsege Mariam Gebru", "sort_name": "Emahoy Tsege Mariam Gebru", "type": "Artist name", "locale": null, "primary": false}, {"name": "Emahoy Tsege Mariam Gebru", "sort_name": "Gebru, Tsege Mariam, Emahoy", "type": null, "locale": null, "primary": false}, {"name": "The Honky Tonk Nun", "sort_name": "The Honky Tonk Nun", "type": null, "locale": null, "primary": false}, {"name": "Tsege Mariam Gebru", "sort_name": "Tsege Mariam Gebru", "type": null, "locale": null, "primary": false}, {"name": "Tsegué-Maryam Guebrou", "sort_name": "Tsegué-Maryam Guebrou", "type": null, "locale": null, "primary": false}, {"name": "Tsegué-Maryam Guèbrou", "sort_name": "Tsegué-Maryam Guèbrou", "type": null, "locale": null, "primary": false}, {"name": "Yewubdar Gebru", "sort_name": "Gebru, Yewubdar", "type": null, "locale": null, "primary": false}]} +{"entity_id": "Q16885617", "mbid": "387def2a-4309-4007-a51c-dfb1bc2c2962", "wikidata_canonical": "Shatta Wale", "mb_name": "Shatta Wale", "mb_sort_name": "Shatta Wale", "mb_disambiguation": null, "mb_country": "GH", "mb_type": "Person", "aliases": [{"name": "Charles Nii Armah Mensah Jnr.", "sort_name": "Mensah Jnr., Charles Nii Armah", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q16935180", "mbid": "1f07455b-1785-4b96-8edf-fdac5eef9cc0", "wikidata_canonical": "Rema Namakula", "mb_name": "Rema Namakula", "mb_sort_name": "Namakula Rema", "mb_disambiguation": "Ugandan singer", "mb_country": "UG", "mb_type": "Person", "aliases": [{"name": "Rehema Namakula", "sort_name": "Namakula Rehema", "type": "Legal name", "locale": null, "primary": false}, {"name": "Rema", "sort_name": "Rema", "type": "Artist name", "locale": null, "primary": false}, {"name": "Rema Namakula", "sort_name": "Rema Namakula", "type": "Artist name", "locale": null, "primary": false}]} +{"entity_id": "Q16980116", "mbid": "405da592-9b1d-41e1-8847-2a6568268f5b", "wikidata_canonical": "Jovi", "mb_name": "Jovi", "mb_sort_name": "Jovi", "mb_disambiguation": "Cameroonian rapper Ndukong Godlove Nfor", "mb_country": "CM", "mb_type": "Person", "aliases": [{"name": "Le Monstre", "sort_name": "Le Monstre", "type": "Artist name", "locale": null, "primary": false}]} +{"entity_id": "Q17151212", "mbid": "495b5c7e-5dd1-4ed3-8b60-d5f3ad1ebeaa", "wikidata_canonical": "Sinach", "mb_name": "Sinach", "mb_sort_name": "Sinach", "mb_disambiguation": "Gospel", "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q17198411", "mbid": "cae7634f-8104-4eb7-9371-6097ad078bb5", "wikidata_canonical": "Cassper Nyovest", "mb_name": "Cassper Nyovest", "mb_sort_name": "Cassper Nyovest", "mb_disambiguation": null, "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "Refiloe Maele Phoolo", "sort_name": "Phoolo, Refiloe Maele", "type": "Legal name", "locale": null, "primary": false}, {"name": "Refilwe Maele Phoolo", "sort_name": "Phoolo, Refilwe Maele", "type": null, "locale": null, "primary": false}]} +{"entity_id": "Q17198434", "mbid": "c907dd00-0819-4ce3-8d52-39223f0d0c88", "wikidata_canonical": "Patoranking", "mb_name": "Patoranking", "mb_sort_name": "Patoranking", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Patrick Nnaemeka Okorie", "sort_name": "Okorie, Patrick Nnaemeka", "type": "Legal name", "locale": "en", "primary": false}]} +{"entity_id": "Q17202612", "mbid": "788fae63-9209-4bca-be48-c1a5c029310c", "wikidata_canonical": "Kefee", "mb_name": "Kefee", "mb_sort_name": "Kefee", "mb_disambiguation": "Nigerian female gospel singer and composer", "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q17305712", "mbid": "78a19169-ac75-4868-b504-7e2e073118e0", "wikidata_canonical": "Burna Boy", "mb_name": "Burna Boy", "mb_sort_name": "Burna Boy", "mb_disambiguation": "Nigerian rapper, singer-songwriter, and record producer", "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Damini Ebunoluwa Ogulu", "sort_name": "Ogulu, Damini Ebunoluwa", "type": "Legal name", "locale": null, "primary": false}, {"name": "Damini Ogulu", "sort_name": "Ogulu, Damini", "type": null, "locale": null, "primary": false}]} +{"entity_id": "Q17350562", "mbid": "472ed8f9-dc0f-4768-8670-872164f6903a", "wikidata_canonical": "Ekambi Brillant", "mb_name": "Ekambi Brillant", "mb_sort_name": "Brillant, Ekambi", "mb_disambiguation": null, "mb_country": "CM", "mb_type": "Person", "aliases": []} +{"entity_id": "Q17385631", "mbid": "48ea2dab-6ee9-406a-ac60-21014375c09f", "wikidata_canonical": "Becca", "mb_name": "Becca", "mb_sort_name": "Becca", "mb_disambiguation": "Ghanaian singer", "mb_country": "GH", "mb_type": "Person", "aliases": [{"name": "Rebecca Akosua Acheampomaa Acheampong", "sort_name": "Rebecca Akosua Acheampomaa Acheampong", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q17466567", "mbid": "60422967-9796-45ec-b36a-427c74e3a2fa", "wikidata_canonical": "Skales", "mb_name": "Raoul John Njeng-Njeng", "mb_sort_name": "Njeng-Njeng, Raoul John", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q17492512", "mbid": "afe249a1-7576-4d4e-87b6-c83cbc422fe1", "wikidata_canonical": "Niyola", "mb_name": "Niyola", "mb_sort_name": "Niyola", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Eniola Akinbo", "sort_name": "Akinbo Eniola", "type": "Legal name", "locale": null, "primary": false}, {"name": "Niyola", "sort_name": "Niyola", "type": "Artist name", "locale": null, "primary": false}]} +{"entity_id": "Q17580304", "mbid": "4f323aeb-fd16-4fe6-966d-58b27e710532", "wikidata_canonical": "Mo'Cheddah", "mb_name": "Mo'Cheddah", "mb_sort_name": "Mo'Cheddah", "mb_disambiguation": "Nigerian rapper and singer", "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q17636313", "mbid": "60bd7ad1-8174-4f3e-934b-4a12fc2452fb", "wikidata_canonical": "Pape Diouf", "mb_name": "Pape Diouf", "mb_sort_name": "Pape Diouf", "mb_disambiguation": "Singer from Senegal", "mb_country": "SN", "mb_type": "Person", "aliases": [{"name": "Pape Cheikh Diouf", "sort_name": "Diouf, Pape Cheikh", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q17712898", "mbid": "2f616058-53a6-4a48-95a7-f2164d3df303", "wikidata_canonical": "Kesse", "mb_name": "Kesse", "mb_sort_name": "Kesse", "mb_disambiguation": "West Africa", "mb_country": null, "mb_type": null, "aliases": []} +{"entity_id": "Q18001561", "mbid": "413e09db-5c88-4585-a5ed-39aba33baca0", "wikidata_canonical": "Phyno", "mb_name": "Phyno", "mb_sort_name": "Phyno", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Chibuzo Nelson Azubuike", "sort_name": "Chibuzo Nelson Azubuike", "type": "Legal name", "locale": null, "primary": false}, {"name": "Phyno", "sort_name": "Phyno", "type": "Artist name", "locale": null, "primary": false}]} +{"entity_id": "Q18016138", "mbid": "14ed2fab-d941-4b56-a06f-fa1cc93c23d6", "wikidata_canonical": "Yemi Alade", "mb_name": "Yemi Alade", "mb_sort_name": "Alade, Yemi", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Yemi Alade", "sort_name": "Yemi Alade", "type": "Artist name", "locale": null, "primary": false}, {"name": "Yemi Eberechi Alade", "sort_name": "Yemi Eberechi Alade", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q18044325", "mbid": "522f8d85-c1b1-42f2-9b4b-522ded9af1df", "wikidata_canonical": "K.O", "mb_name": "K.O.", "mb_sort_name": "K.O.", "mb_disambiguation": "South African rapper Ntokozo Mdluli", "mb_country": "ZA", "mb_type": "Person", "aliases": []} +{"entity_id": "Q18163774", "mbid": "b72bf1b5-42e4-408e-9625-739f8ba66ffe", "wikidata_canonical": "Shizzi", "mb_name": "Shizzi", "mb_sort_name": "Shizzi", "mb_disambiguation": "alias for Oluwasheyi Akerele. Nigerian producer.", "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Oluwaseyi Akerele", "sort_name": "Oluwaseyi Akerele", "type": "Search hint", "locale": null, "primary": false}, {"name": "Oluwasheyi Christian Akerele", "sort_name": "Oluwasheyi Christian Akerele", "type": "Legal name", "locale": null, "primary": false}, {"name": "Shizzi", "sort_name": "Shizzi", "type": "Artist name", "locale": null, "primary": false}]} +{"entity_id": "Q18205896", "mbid": "9335fbe8-fab3-4e3e-94b6-f3c306869f8a", "wikidata_canonical": "Khuli Chana", "mb_name": "Khuli Chana", "mb_sort_name": "Khuli Chana", "mb_disambiguation": "South African motswako rapper", "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "Khulane Morule", "sort_name": "Morule, Khulane", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q18206071", "mbid": "e82be512-ca20-4083-86f8-a305913d3813", "wikidata_canonical": "Gabriel Afolayan", "mb_name": "Gabriel Afolayan", "mb_sort_name": "Afolayan, Gabriel", "mb_disambiguation": null, "mb_country": null, "mb_type": "Person", "aliases": []} +{"entity_id": "Q18211800", "mbid": "9dd18a2b-dc74-4d65-a6fa-07b097457a04", "wikidata_canonical": "Willy Paul", "mb_name": "Willy Paul", "mb_sort_name": "Paul, Willy", "mb_disambiguation": null, "mb_country": null, "mb_type": null, "aliases": []} +{"entity_id": "Q18217816", "mbid": "df3b2387-7b79-4eb0-8a00-6ef1b9a27b86", "wikidata_canonical": "Okyeame Kwame", "mb_name": "Okyeame Kwame", "mb_sort_name": "Kwame, Okyeame", "mb_disambiguation": "Featured with Kofi B", "mb_country": null, "mb_type": null, "aliases": []} +{"entity_id": "Q18351472", "mbid": "f7804dea-830c-4d5d-832c-d874e984ce9d", "wikidata_canonical": "Magasco", "mb_name": "Magasco", "mb_sort_name": "Magasco", "mb_disambiguation": null, "mb_country": null, "mb_type": "Person", "aliases": []} +{"entity_id": "Q18358182", "mbid": "f4620c82-8043-4c08-bfcc-a7354d34e55e", "wikidata_canonical": "Oritse Femi", "mb_name": "Oritse Femi", "mb_sort_name": "Oritse Femi", "mb_disambiguation": "Nigerian singer-songwriter", "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Oritsefemi", "sort_name": "Oritsefemi", "type": null, "locale": null, "primary": false}]} +{"entity_id": "Q18637375", "mbid": "3f56ca45-6a6b-4ca9-93ff-3b80f52d1172", "wikidata_canonical": "Terry G", "mb_name": "Terry G", "mb_sort_name": "Terry G", "mb_disambiguation": "Nigerian musician and producer Gabriel Oche Amanyi", "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q18645729", "mbid": "a85c9412-ba00-4be9-9d0a-ddce32936a3e", "wikidata_canonical": "Elly Wamala", "mb_name": "Elly Wamala", "mb_sort_name": "Wamala, Elly", "mb_disambiguation": "Ugandan singer", "mb_country": "UG", "mb_type": "Person", "aliases": [{"name": "Eli Wamala", "sort_name": "Eli Wamala", "type": "Search hint", "locale": null, "primary": false}, {"name": "Eli Wamala & Band", "sort_name": "Wamala, Eli & Band", "type": null, "locale": null, "primary": false}, {"name": "Elishama Lukwata Wamala", "sort_name": "Elishama Lukwata Wamala", "type": "Legal name", "locale": null, "primary": false}, {"name": "Elly Wamala", "sort_name": "Elly Wamala", "type": "Artist name", "locale": null, "primary": false}]} +{"entity_id": "Q18684119", "mbid": "90e98512-78ae-4afe-bda6-1d15b2e00f99", "wikidata_canonical": "Angella Katatumba", "mb_name": "Angella Katatumba", "mb_sort_name": "Katatumba Angella", "mb_disambiguation": null, "mb_country": "UG", "mb_type": "Person", "aliases": [{"name": "Angella Franklin Keihongani Katatumba", "sort_name": "Angella Franklin Keihongani Katatumba", "type": "Legal name", "locale": null, "primary": false}, {"name": "Angella Katatumba", "sort_name": "Angella Katatumba", "type": "Artist name", "locale": null, "primary": false}]} +{"entity_id": "Q18686131", "mbid": "0d42fdf3-886a-42c4-bd90-eeef600c81fa", "wikidata_canonical": "Fille Mutoni", "mb_name": "Fille", "mb_sort_name": "Fille", "mb_disambiguation": "Ugandan recording artist", "mb_country": "UG", "mb_type": "Person", "aliases": [{"name": "Fille", "sort_name": "Fille", "type": "Artist name", "locale": null, "primary": false}, {"name": "Fille", "sort_name": "Fille", "type": "Artist name", "locale": null, "primary": false}, {"name": "Fille Mutoni", "sort_name": "Mutoni Fille", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q18719341", "mbid": "7a1502cd-c60b-47a0-ab50-0b1ffe7a4355", "wikidata_canonical": "Cindy Sanyu", "mb_name": "Cindy Sanyu", "mb_sort_name": "Sanyu, Cindy", "mb_disambiguation": null, "mb_country": "UG", "mb_type": "Person", "aliases": [{"name": "Cindy", "sort_name": "Cindy", "type": null, "locale": null, "primary": false}]} +{"entity_id": "Q18764146", "mbid": "87ea7377-d5d2-4ea0-93aa-46524cdaa577", "wikidata_canonical": "Jackie Chandiru", "mb_name": "Jackie Chandiru", "mb_sort_name": "Chandiru Jackie", "mb_disambiguation": "Ugandan musician", "mb_country": "UG", "mb_type": "Person", "aliases": [{"name": "Jackie Chandiru", "sort_name": "Jackie Chandiru", "type": "Artist name", "locale": null, "primary": false}]} +{"entity_id": "Q18922679", "mbid": "e300784f-e313-4185-a272-938bb5d759fb", "wikidata_canonical": "Wasiu Alabi Pasuma", "mb_name": "Alh Pasuma Wonder", "mb_sort_name": "Alh Pasuma Wonder", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q19321864", "mbid": "58c79d81-f4be-45a0-a1df-1103d6926d6a", "wikidata_canonical": "Sean Tizzle", "mb_name": "Sean Tizzle", "mb_sort_name": "Sean Tizzle", "mb_disambiguation": "Nigerian singer Morihanfen Oluwaseun Oluwabamidele", "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q19629991", "mbid": "aa547ca5-acdc-4c1a-9326-d6c2e8119060", "wikidata_canonical": "Serge Beynaud", "mb_name": "Serge Beynaud", "mb_sort_name": "Beynaud, Serge", "mb_disambiguation": null, "mb_country": "CI", "mb_type": "Person", "aliases": []} +{"entity_id": "Q19662092", "mbid": "fe485453-3c5e-4f54-b998-8332332fe312", "wikidata_canonical": "Riky Rick", "mb_name": "Riky Rick", "mb_sort_name": "Riky Rick", "mb_disambiguation": "South African rapper", "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "Rikhado Muziwendlovu Chifaro Makhado", "sort_name": "Makhado, Rikhado Muziwendlovu Chifaro", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q19664772", "mbid": "2a5f6fc6-1c1c-4f51-812c-00067fdc4e13", "wikidata_canonical": "Levixone", "mb_name": "Levixone", "mb_sort_name": "Levixone", "mb_disambiguation": "Ugandan gospel artist", "mb_country": "UG", "mb_type": "Person", "aliases": [{"name": "Levixone", "sort_name": "Levixone", "type": "Artist name", "locale": null, "primary": false}, {"name": "Sam Lucas Lubyogo", "sort_name": "Lucas Sam Lubyogo", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q19665800", "mbid": "41d7fa7b-aa7e-425c-997a-0739befbea09", "wikidata_canonical": "Vampino", "mb_name": "Vampino", "mb_sort_name": "Vampino", "mb_disambiguation": null, "mb_country": "UG", "mb_type": "Person", "aliases": [{"name": "Elvis Kirya", "sort_name": "Kirya Elvis", "type": "Legal name", "locale": null, "primary": false}, {"name": "Vampino", "sort_name": "Vampino", "type": "Artist name", "locale": null, "primary": false}, {"name": "Vamposs", "sort_name": "Vamposs", "type": "Search hint", "locale": null, "primary": false}]} +{"entity_id": "Q19665909", "mbid": "64ebbe24-580a-4103-b509-5aeb66522972", "wikidata_canonical": "Mampi", "mb_name": "Mampi", "mb_sort_name": "Mampi", "mb_disambiguation": "Zambian singer Mirriam Mukape", "mb_country": "ZM", "mb_type": "Person", "aliases": []} +{"entity_id": "Q19666615", "mbid": "e50b3671-ab46-4614-9e3d-11c6a150a0a9", "wikidata_canonical": "Lilian Mbabazi", "mb_name": "Lilian Mbabazi", "mb_sort_name": "Mbabazi, Lilian", "mb_disambiguation": "pop/neo-soul/r&b singer; moderator/entertainer", "mb_country": "UG", "mb_type": "Person", "aliases": [{"name": "Lilian Mbabazi", "sort_name": "Lilian Mbabazi", "type": "Legal name", "locale": null, "primary": false}, {"name": "Lilian Mbabazi", "sort_name": "Lilian Mbabazi", "type": "Artist name", "locale": null, "primary": false}]} +{"entity_id": "Q19666853", "mbid": "06cfade6-03d4-47e7-808e-d012f7f64ca7", "wikidata_canonical": "Sello Chicco Twala", "mb_name": "Chicco", "mb_sort_name": "Chicco", "mb_disambiguation": "South African singer", "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "Chicco Twala", "sort_name": "Twala, Chicco", "type": null, "locale": null, "primary": false}, {"name": "Sello Twala", "sort_name": "Twala, Sello", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q19667489", "mbid": "57f9751d-70b9-48a0-98f9-826c4ec8c521", "wikidata_canonical": "S.O.", "mb_name": "S.O.", "mb_sort_name": "S.O.", "mb_disambiguation": "Christian rapper", "mb_country": "GB", "mb_type": "Person", "aliases": [{"name": "Seun Otukpe", "sort_name": "Otukpe, Seun", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q19667560", "mbid": "38b53e74-b662-4a59-be8d-084aba84a080", "wikidata_canonical": "Macky 2", "mb_name": "Macky 2", "mb_sort_name": "Macky 2", "mb_disambiguation": "Zambian rapper", "mb_country": "ZM", "mb_type": "Person", "aliases": []} +{"entity_id": "Q19667624", "mbid": "20e59c0b-27b7-4ffc-9285-35bf17805cb3", "wikidata_canonical": "Maurice Kirya", "mb_name": "Maurice Kirya", "mb_sort_name": "Kirya, Maurice", "mb_disambiguation": null, "mb_country": "UG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q25283775", "mbid": "16388cb2-e0ca-44b1-8669-f4622789e273", "wikidata_canonical": "Jahdiel", "mb_name": "Jahdiel", "mb_sort_name": "Jahdiel", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q25345201", "mbid": "72adb13a-800e-44b5-9aef-5c7d8cb6a2d7", "wikidata_canonical": "Mr Eazi", "mb_name": "Mr Eazi", "mb_sort_name": "Mr Eazi", "mb_disambiguation": "Ghanaian vocalist", "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Mr Eazi", "sort_name": "Eazi, Mr", "type": "Artist name", "locale": null, "primary": false}, {"name": "Oluwatosin Oluwole Ajibade", "sort_name": "Ajibade, Oluwatosin Oluwole", "type": "Legal name", "locale": null, "primary": false}, {"name": "mrEazi", "sort_name": "mrEazi", "type": "Search hint", "locale": null, "primary": false}]} +{"entity_id": "Q25560176", "mbid": "4f249a17-19f1-4931-8a49-16b5e270bd69", "wikidata_canonical": "Bello Figo", "mb_name": "Bello Figo", "mb_sort_name": "Bello Figo", "mb_disambiguation": null, "mb_country": "IT", "mb_type": "Person", "aliases": [{"name": "Paul Yeboah", "sort_name": "Yeboah, Paul", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q25704167", "mbid": "b8a7bfd1-8ad4-4b6c-832e-c7f0fc420fd9", "wikidata_canonical": "Hachalu Hundessa", "mb_name": "Haacaaluu Hundessaa", "mb_sort_name": "Hundessaa, Haacaaluu", "mb_disambiguation": "Ethiopian singer, songwriter, and protestor", "mb_country": "ET", "mb_type": "Person", "aliases": [{"name": "Hachalu Hundessa", "sort_name": "Hundessa, Hachalu", "type": "Artist name", "locale": null, "primary": false}]} +{"entity_id": "Q25706797", "mbid": "94dd8d27-5d42-4fa6-8851-84b470ed4b9f", "wikidata_canonical": "DJ Maphorisa", "mb_name": "DJ Maphorisa", "mb_sort_name": "Maphorisa, DJ", "mb_disambiguation": null, "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "DJ Maphorisa", "sort_name": "DJ Maphorisa", "type": "Artist name", "locale": null, "primary": false}, {"name": "Madumane", "sort_name": "Madumane", "type": "Artist name", "locale": null, "primary": false}, {"name": "THEMBA SONNY BOY SEKOWE", "sort_name": "THEMBA SONNY BOY SEKOWE", "type": "Search hint", "locale": null, "primary": false}, {"name": "Themba Sekowe", "sort_name": "Themba Sekowe", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q25750440", "mbid": "715ca35d-1bcb-4102-ba86-1ccb3a1ee876", "wikidata_canonical": "Gurunkz", "mb_name": "Guru NKZ", "mb_sort_name": "Guru NKZ", "mb_disambiguation": "AKA Maradona Yeboah Adjei: Ghanaian Hiplife artist", "mb_country": "GH", "mb_type": "Person", "aliases": []} +{"entity_id": "Q26036678", "mbid": "4daf243f-d6f2-4881-b7c5-e74101a5cce1", "wikidata_canonical": "Humblesmith", "mb_name": "Humblesmith", "mb_sort_name": "Humblesmith", "mb_disambiguation": null, "mb_country": null, "mb_type": "Person", "aliases": []} +{"entity_id": "Q26211023", "mbid": "61d5768e-e169-47f9-88f2-57e2302c4eaa", "wikidata_canonical": "Mc Norman", "mb_name": "Mc Norman", "mb_sort_name": "ganja", "mb_disambiguation": "Ugandan international recording artist", "mb_country": "ZA", "mb_type": "Person", "aliases": []} +{"entity_id": "Q26703032", "mbid": "a21960ef-eb76-427f-9adf-3405fa6ac054", "wikidata_canonical": "Jaywon", "mb_name": "Jaywon", "mb_sort_name": "Jaywon", "mb_disambiguation": "Nigerian singer Iledare Oluwajuwonlo", "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q204323", "mbid": "77ad92b8-4756-4470-a6d4-8f691860550c", "wikidata_canonical": "Phil Ramone", "mb_name": "Phil Ramone", "mb_sort_name": "Ramone, Phil", "mb_disambiguation": null, "mb_country": "US", "mb_type": "Person", "aliases": [{"name": "Philip Rabinowitz", "sort_name": "Rabinowitz, Philip", "type": null, "locale": null, "primary": false}, {"name": "Philip Ramone", "sort_name": "Philip Ramone", "type": null, "locale": null, "primary": false}]} +{"entity_id": "Q210734", "mbid": "af081ea2-7a2c-4fbd-8200-92d62056b5f5", "wikidata_canonical": "Youssou N’Dour", "mb_name": "Youssou N’Dour", "mb_sort_name": "N’Dour, Youssou", "mb_disambiguation": null, "mb_country": "SN", "mb_type": "Person", "aliases": [{"name": "Y. N'Dour", "sort_name": "N'Dour, Y.", "type": null, "locale": null, "primary": false}, {"name": "Yassou Ndour", "sort_name": "Yassou Ndour", "type": "Search hint", "locale": null, "primary": false}, {"name": "Youssou N' Dour", "sort_name": "Youssou N' Dour", "type": "Search hint", "locale": null, "primary": false}, {"name": "Youssou Ndour", "sort_name": "Youssou Ndour", "type": "Search hint", "locale": null, "primary": false}]} +{"entity_id": "Q241496", "mbid": "7e05654f-0c4d-4110-9926-759748f16eb7", "wikidata_canonical": "Chris McGregor", "mb_name": "Chris McGregor", "mb_sort_name": "McGregor, Chris", "mb_disambiguation": null, "mb_country": "ZA", "mb_type": "Person", "aliases": []} +{"entity_id": "Q246594", "mbid": "83a2e0fb-3d9b-46ff-b383-3dde54c15297", "wikidata_canonical": "Hugh Masekela", "mb_name": "Hugh Masekela", "mb_sort_name": "Masekela, Hugh", "mb_disambiguation": null, "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "Hugh Masakela", "sort_name": "Hugh Masakela", "type": null, "locale": null, "primary": false}, {"name": "Hugh Maskela", "sort_name": "Hugh Maskela", "type": null, "locale": null, "primary": false}, {"name": "Hugh Ramapolo Masekela", "sort_name": "Masekela, Hugh Ramapolo", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q263170", "mbid": "edef3cfa-4e5e-4d64-8bd8-20f9dc1d8cad", "wikidata_canonical": "Tiken Jah Fakoly", "mb_name": "Tiken Jah Fakoly", "mb_sort_name": "Tiken Jah Fakoly", "mb_disambiguation": null, "mb_country": "CI", "mb_type": "Person", "aliases": [{"name": "Doumbia Moussa Fakoly", "sort_name": "Fakoly, Doumbia Moussa", "type": "Legal name", "locale": null, "primary": false}, {"name": "Tiken Jah Fakoli", "sort_name": "Tiken Jah Fakoli", "type": null, "locale": null, "primary": false}]} +{"entity_id": "Q264520", "mbid": "bf9e33a8-1bda-48fe-9fbe-71e3052c7eec", "wikidata_canonical": "Koos Kombuis", "mb_name": "André Letoit", "mb_sort_name": "Letoit, André", "mb_disambiguation": "aka Koos A Kombuis", "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "André le Roux du Toit", "sort_name": "Toit, André le Roux du", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q2014395", "mbid": "6cf028d2-0366-4cb8-9198-c86569f5b0d4", "wikidata_canonical": "Shaun Morgan", "mb_name": "Shaun Morgan", "mb_sort_name": "Morgan, Shaun", "mb_disambiguation": null, "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "Shaun Morgan Welgemoed", "sort_name": "Welgemoed, Shaun Morgan", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q2027370", "mbid": "7b542973-8103-43f9-b39c-63963d886bc5", "wikidata_canonical": "Robbie Jansen", "mb_name": "Robbie Jansen", "mb_sort_name": "Jansen, Robbie", "mb_disambiguation": null, "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "Robert Edward Jansen", "sort_name": "Jansen, Robert Edward", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q2041827", "mbid": "14069565-68ad-4214-ada7-74a3ec1fd4c3", "wikidata_canonical": "Min Shaw", "mb_name": "Min Shaw", "mb_sort_name": "Shaw, Min", "mb_disambiguation": null, "mb_country": null, "mb_type": null, "aliases": []} +{"entity_id": "Q2174556", "mbid": "55e236f3-79a1-4d32-9ce8-f89801b7f851", "wikidata_canonical": "Yandé Codou Sène", "mb_name": "Yandé Codou Sène", "mb_sort_name": "Sène, Yandé Codou", "mb_disambiguation": null, "mb_country": "SN", "mb_type": "Person", "aliases": [{"name": "Yande Codou Sene", "sort_name": "Yande Codou Sene", "type": null, "locale": null, "primary": false}]} +{"entity_id": "Q2218183", "mbid": "661ed5b2-d5f7-4af9-a174-1794600efcb6", "wikidata_canonical": "Samuel Ekpe Akpabot", "mb_name": "Samuel Akpabot", "mb_sort_name": "Akpabot, Samuel", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q2270225", "mbid": "c17caac7-7667-4c8c-b54e-0aac360b37b6", "wikidata_canonical": "Thomas Mapfumo", "mb_name": "Thomas Mapfumo", "mb_sort_name": "Mapfumo, Thomas", "mb_disambiguation": null, "mb_country": "US", "mb_type": "Person", "aliases": []} +{"entity_id": "Q2328329", "mbid": "8c034b3f-a5c7-448e-939f-e7afcb630a85", "wikidata_canonical": "Nádine", "mb_name": "Nádine", "mb_sort_name": "Nádine", "mb_disambiguation": "South African singer Nádine Hoffeldt", "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "Nádine Hoffeldt", "sort_name": "Hoffeldt, Nádine", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q2380003", "mbid": "e4f3ce29-cb49-42de-931e-5b48ddebaa16", "wikidata_canonical": "Dilana", "mb_name": "Dilana Smith", "mb_sort_name": "Smith, Dilana", "mb_disambiguation": "aka Dilana Robichaux", "mb_country": "US", "mb_type": "Person", "aliases": [{"name": "Dilana", "sort_name": "Dilana", "type": "Artist name", "locale": null, "primary": false}, {"name": "Dilana Jansen VanVüren", "sort_name": "Dilana Jansen VanVüren", "type": null, "locale": null, "primary": false}, {"name": "Dilana Jansen van Vuuren", "sort_name": "Vuuren, Dilana Jansen van", "type": "Legal name", "locale": null, "primary": false}, {"name": "Dilana Robichaux", "sort_name": "Dilana Robichaux", "type": "Artist name", "locale": "en", "primary": true}, {"name": "Dilana Trudy Smith", "sort_name": "Smith, Dilana Trudy", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q2438475", "mbid": "1b450414-99e1-4d1d-a258-c0b3d8776280", "wikidata_canonical": "Todd Matshikiza", "mb_name": "Todd Matshikiza", "mb_sort_name": "Matshikiza, Todd", "mb_disambiguation": null, "mb_country": "ZA", "mb_type": "Person", "aliases": []} +{"entity_id": "Q2447004", "mbid": "19a46f49-f8e1-4d8b-926d-6a26bc6c41c6", "wikidata_canonical": "Toya Delazy", "mb_name": "Toya Delazy", "mb_sort_name": "Delazy, Toya", "mb_disambiguation": "British-South African singer/songwriter and producer", "mb_country": "GB", "mb_type": "Person", "aliases": [{"name": "Latoya Nontokozo Buthelezi", "sort_name": "Buthelezi, Latoya Nontokozo", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q2460986", "mbid": "6eaec861-c183-45ec-93c8-c5c5d84d024d", "wikidata_canonical": "Minyeshu", "mb_name": "Minyeshu", "mb_sort_name": "Minyeshu", "mb_disambiguation": "NL‐based Ethiopian singer and dancer", "mb_country": "NL", "mb_type": "Person", "aliases": [{"name": "Minyeshu Kifle", "sort_name": "Kifle, Minyeshu", "type": null, "locale": null, "primary": false}, {"name": "Minyeshu Kifle Tedla", "sort_name": "Minyeshu Kifle Tedla", "type": "Legal name", "locale": null, "primary": false}, {"name": "ምንይሹ ክፍሌ ተድላ", "sort_name": "ምንይሹ ክፍሌ ተድላ", "type": "Legal name", "locale": "am", "primary": false}]} +{"entity_id": "Q2522493", "mbid": "9b3b1be2-154a-409b-91eb-7ff14c40c0b2", "wikidata_canonical": "Victor Ntoni", "mb_name": "Victor Ntoni", "mb_sort_name": "Ntoni, Victor", "mb_disambiguation": "bassist, guitarist, vocalist, composer", "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "Victor Mhleli Ntoni", "sort_name": "Victor Mhleli Ntoni", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q19757734", "mbid": "ec1f1304-328f-4ed3-98ae-74a73c6ada7d", "wikidata_canonical": "A Pass", "mb_name": "A Pass", "mb_sort_name": "A Pass", "mb_disambiguation": null, "mb_country": "UG", "mb_type": "Person", "aliases": [{"name": "A Pass", "sort_name": "A Pass", "type": "Artist name", "locale": null, "primary": false}, {"name": "Alexander Bagonza", "sort_name": "Bagonza Alexander", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q19886334", "mbid": "d221571f-966a-41ac-83b2-261b6fda2253", "wikidata_canonical": "Orlando Julius", "mb_name": "Orlando Julius", "mb_sort_name": "Orlando Julius", "mb_disambiguation": "Nigerian saxophonist, singer, bandleader, and songwriter", "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Julius Aremu Olusanya Ekemode", "sort_name": "Olusanya Ekemode, Julius Aremu", "type": "Legal name", "locale": null, "primary": false}, {"name": "Orlando Julius Ekemode", "sort_name": "Ekemode, Orlando Julius", "type": null, "locale": null, "primary": false}]} +{"entity_id": "Q19938163", "mbid": "c9c6bc20-2ddf-4844-830c-a3e6b85ad253", "wikidata_canonical": "AK 47 Mayanja", "mb_name": "AKay47", "mb_sort_name": "AKay 47", "mb_disambiguation": "Ugandan musician", "mb_country": "UG", "mb_type": "Person", "aliases": [{"name": "AK 47", "sort_name": "AK 47", "type": "Artist name", "locale": null, "primary": false}, {"name": "AK Fortyseven", "sort_name": "AK Fortyseven", "type": "Search hint", "locale": null, "primary": false}, {"name": "AKay47", "sort_name": "AKay47", "type": "Search hint", "locale": null, "primary": false}, {"name": "AKayFortyseven", "sort_name": "AKayFortyseven", "type": "Search hint", "locale": null, "primary": false}, {"name": "Emmanuel Mayanja", "sort_name": "Mayanja Emmanuel", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q19955851", "mbid": "7fbc76d0-8753-4b84-b02c-135856d7e152", "wikidata_canonical": "Reekado Banks", "mb_name": "Reekado Banks", "mb_sort_name": "Banks, Reekado", "mb_disambiguation": "Nigerian musician signed by Mavin Records", "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q19958293", "mbid": "0e49c76c-8686-4c34-a8e3-09716470b966", "wikidata_canonical": "Joey B", "mb_name": "Joey B", "mb_sort_name": "Joey B", "mb_disambiguation": "Ghanaian Rapper", "mb_country": "GH", "mb_type": "Person", "aliases": [{"name": "Darryl Paa Kwesi Bannerman-Martin", "sort_name": "Bannerman-Martin, Darryl Paa Kwesi", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q19958624", "mbid": "b772d0a5-c6db-4d9c-a716-881e09579f07", "wikidata_canonical": "Alune Wade", "mb_name": "Alune Wade", "mb_sort_name": "Wade, Alune", "mb_disambiguation": "Senegalese singer and bass player", "mb_country": "SN", "mb_type": "Person", "aliases": [{"name": "Alioune Wade", "sort_name": "Wade, Alioune", "type": "Legal name", "locale": null, "primary": false}, {"name": "Alune", "sort_name": "Alune", "type": null, "locale": null, "primary": false}, {"name": "Alune Wade", "sort_name": "Wade, Alune", "type": null, "locale": null, "primary": false}]} +{"entity_id": "Q19968623", "mbid": "e343f9b6-df77-4d79-9fe6-e8ed90d76de6", "wikidata_canonical": "Flex D'Paper", "mb_name": "Flex D’Paper", "mb_sort_name": "Flex D’Paper", "mb_disambiguation": "Ugandan rapper", "mb_country": "UG", "mb_type": "Person", "aliases": [{"name": "Alex Julius Kwesigabo", "sort_name": "Kwesigabo, Alex Julius", "type": "Legal name", "locale": null, "primary": false}, {"name": "Flex D’Paper", "sort_name": "Flex D’Paper", "type": "Artist name", "locale": null, "primary": false}]} +{"entity_id": "Q20011599", "mbid": "9937bdc8-e282-4f8a-b9f9-f66264c43cdf", "wikidata_canonical": "B'Flow", "mb_name": "B'Flow", "mb_sort_name": "B'Flow", "mb_disambiguation": "Zambian hip-hop and dancehall artist", "mb_country": "ZM", "mb_type": "Person", "aliases": [{"name": "Brian Mumba Kasoka Bwembya", "sort_name": "Mumba Kasoka Bwembya, Brian", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q20090531", "mbid": "261fa8cd-d4d8-4885-9409-47cf12dfae5d", "wikidata_canonical": "DJ Cuppy", "mb_name": "DJ Cuppy", "mb_sort_name": "Cuppy, DJ", "mb_disambiguation": "Nigerian DJ Florence Ifeoluwa Otedola", "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Florence Ifeoluwa Otedola", "sort_name": "Otedola, Florence Ifeoluwa", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q20090536", "mbid": "02a3b5c9-5173-44b4-a87b-116398bede6f", "wikidata_canonical": "Cynthia Morgan", "mb_name": "Cynthia Morgan", "mb_sort_name": "Morgan, Cynthia", "mb_disambiguation": "Nigerian", "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Cynthia Ikponmwenosa Morgan", "sort_name": "Morgan, Cynthia Ikponmwenosa", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q20196194", "mbid": "b0712f0b-0df1-420c-bba9-166cecfd3fa6", "wikidata_canonical": "Hal Shaper", "mb_name": "Hal Shaper", "mb_sort_name": "Shaper, Hal", "mb_disambiguation": null, "mb_country": "GB", "mb_type": "Person", "aliases": [{"name": "Harold David Shaper", "sort_name": "Harold David Shaper", "type": null, "locale": null, "primary": false}, {"name": "Shaper", "sort_name": "Shaper", "type": null, "locale": "en", "primary": false}, {"name": "Г. Шапер", "sort_name": "Шапер, Г.", "type": null, "locale": "ru", "primary": false}]} +{"entity_id": "Q20489135", "mbid": "8659a81e-3f22-4035-bdc6-8cf89ada7d50", "wikidata_canonical": "Runtown", "mb_name": "Runtown", "mb_sort_name": "Runtown", "mb_disambiguation": "alias for Douglas Jack Agu from Nigeria", "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Douglas Jack Agu", "sort_name": "Douglas Jack Agu", "type": "Search hint", "locale": null, "primary": false}, {"name": "Douglas Jack Agu Listen", "sort_name": "Douglas Jack Agu Listen", "type": "Legal name", "locale": null, "primary": false}, {"name": "Runtown", "sort_name": "Runtown", "type": "Artist name", "locale": null, "primary": false}]} +{"entity_id": "Q20605859", "mbid": "feba5625-96f5-4333-9831-4461cbc57adb", "wikidata_canonical": "Lemma Gebrehiwot", "mb_name": "Lemma Gebre Hiwot", "mb_sort_name": "Hiwot, Lemma Gebre", "mb_disambiguation": null, "mb_country": "ET", "mb_type": "Person", "aliases": [{"name": "ለማ ገብረ ሕይወት", "sort_name": "ለማ ገብረ ሕይወት", "type": null, "locale": "am", "primary": true}]} +{"entity_id": "Q20655913", "mbid": "0655d720-0ebc-4d8d-a4a3-a24e7f09024f", "wikidata_canonical": "Pappy Kojo", "mb_name": "Pappy Kojo", "mb_sort_name": "Pappy Kojo", "mb_disambiguation": "Ghanaian hip hop and hiplife recording artist Jason Gaisie", "mb_country": "GH", "mb_type": "Person", "aliases": []} +{"entity_id": "Q20684328", "mbid": "58019c23-d7f3-4932-b87f-5351df1ccc79", "wikidata_canonical": "Kcee", "mb_name": "Kingsley Chinweike Okonkwo", "mb_sort_name": "Okonkwo, Kingsley Chinweike", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Kcee", "sort_name": "Kcee", "type": "Artist name", "locale": null, "primary": false}]} +{"entity_id": "Q20684376", "mbid": "56209d47-f5ae-4f41-acb2-ddc73f285b9c", "wikidata_canonical": "King Wadada", "mb_name": "King Wadada", "mb_sort_name": "King Wadada", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q20684384", "mbid": "c203e6dc-3f1e-4783-afc3-d0274b0e23ee", "wikidata_canonical": "Kizz Daniel", "mb_name": "Kizz Daniel", "mb_sort_name": "Daniel, Kizz", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Daniel Anidugbe", "sort_name": "Daniel Anidugbe", "type": "Search hint", "locale": null, "primary": false}, {"name": "Kiss Daniel", "sort_name": "Kiss Daniel", "type": "Search hint", "locale": null, "primary": false}, {"name": "Kizz Daniel", "sort_name": "Kizz Daniel", "type": "Artist name", "locale": null, "primary": false}, {"name": "Oluwatobiloba Daniel Anidugbe", "sort_name": "Oluwatobiloba Daniel Anidugbe", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q20685012", "mbid": "86d9170b-4e2e-4880-8ebe-54f47f3998cf", "wikidata_canonical": "Evi Edna Ogholi", "mb_name": "Evi Edna Ogholi", "mb_sort_name": "Evi Edna Ogholi", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q20685053", "mbid": "f849d0a1-a808-4848-bd95-0b8e3442134c", "wikidata_canonical": "Sasha P", "mb_name": "Sasha P", "mb_sort_name": "Sasha P", "mb_disambiguation": "Nigerian rapper", "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q20685445", "mbid": "4396961c-d5bb-4301-8fee-07b218ddf67e", "wikidata_canonical": "Sarz", "mb_name": "Sarz", "mb_sort_name": "Sarz", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Osabuohien Osaretin", "sort_name": "Osaretin, Osabuohien", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q20685759", "mbid": "ae248b9b-cf7d-485b-a4cf-efd9fdbb50b8", "wikidata_canonical": "MCskill ThaPreacha", "mb_name": "MCskill ThaPreacha", "mb_sort_name": "MCskill ThaPreacha", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q20687318", "mbid": "b1d75ab2-8bed-4e1a-a197-44dd3e36b320", "wikidata_canonical": "Peter Klatzow", "mb_name": "Peter Klatzow", "mb_sort_name": "Klatzow, Peter", "mb_disambiguation": null, "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "Peter James Leonard Klatzow", "sort_name": "Klatzow, Peter James Leonard", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q20687449", "mbid": "f0aad82f-e36d-4ae1-bdfe-a4895bc6b42b", "wikidata_canonical": "Toyin Sokefun-Bello", "mb_name": "TY Bello", "mb_sort_name": "TY Bello", "mb_disambiguation": "Nigerian singer Toyin Sokefun-Bello", "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q20744636", "mbid": "2c48b2a9-e1fc-4e12-afa2-138fefe782ee", "wikidata_canonical": "Praiz", "mb_name": "Praiz", "mb_sort_name": "Praiz", "mb_disambiguation": "Nigerian singer Praise Ugbede Adejo", "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q20882463", "mbid": "a6ce36dc-6dcc-46d9-aec8-4825a5679c79", "wikidata_canonical": "Malcolm Guite", "mb_name": "Malcolm Guite", "mb_sort_name": "Guite, Malcolm", "mb_disambiguation": "English poet", "mb_country": "GB", "mb_type": "Person", "aliases": []} +{"entity_id": "Q21004692", "mbid": "6a2f166f-7ed3-450c-bca4-4f62723aa6d7", "wikidata_canonical": "Mr 2Kay", "mb_name": "Mr 2Kay", "mb_sort_name": "Mr 2Kay", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q21005496", "mbid": "a7cd7ca9-5249-4033-99cc-819318742e07", "wikidata_canonical": "D-Black", "mb_name": "D-Black", "mb_sort_name": "D-Black", "mb_disambiguation": "Ghanian rapper", "mb_country": null, "mb_type": "Person", "aliases": []} +{"entity_id": "Q21005498", "mbid": "e1f0fd13-5328-4b34-b54f-f27091b9ad82", "wikidata_canonical": "D'Prince", "mb_name": "D’Prince", "mb_sort_name": "D’Prince", "mb_disambiguation": "Nigerian Afro-pop", "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Charles Enebeli", "sort_name": "Charles Enebeli", "type": "Legal name", "locale": null, "primary": false}, {"name": "D’Prince", "sort_name": "D’Prince", "type": null, "locale": null, "primary": false}, {"name": "Omoba", "sort_name": "Omoba", "type": null, "locale": null, "primary": false}]} +{"entity_id": "Q21063945", "mbid": "cbbd8643-19cf-4a01-b258-d21f2d1b2461", "wikidata_canonical": "DJ Spinall", "mb_name": "Spinall", "mb_sort_name": "Spinall", "mb_disambiguation": "Nigerian", "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "DJ Spinall", "sort_name": "Spinall, DJ", "type": "Artist name", "locale": null, "primary": false}, {"name": "Sodamola Oluseye Desmond", "sort_name": "Sodamola Oluseye Desmond", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q21065015", "mbid": "3a351781-cad2-43b3-9fb9-cb44a9960719", "wikidata_canonical": "Senyaka", "mb_name": "Senyaka", "mb_sort_name": "Senyaka", "mb_disambiguation": "kwaito artist", "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "Senyaka Kekana", "sort_name": "Kekana, Senyaka", "type": "Artist name", "locale": null, "primary": false}, {"name": "Thula Kekana", "sort_name": "Kekana, Thula", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q21066979", "mbid": "9365ad76-6e2b-4984-ba52-227245a1f951", "wikidata_canonical": "Joe Mettle", "mb_name": "Joe Mettle", "mb_sort_name": "Joe Mettle", "mb_disambiguation": null, "mb_country": null, "mb_type": null, "aliases": []} +{"entity_id": "Q21127453", "mbid": "56ca6fdf-2ed0-405b-b797-5adb82699e8c", "wikidata_canonical": "Harrysong", "mb_name": "Harrysong", "mb_sort_name": "Harrysong", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Harrison Tare Okiri", "sort_name": "Harrison Tare Okiri", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q21190376", "mbid": "b109c0fe-15ab-4bf8-9575-22658fdef4dc", "wikidata_canonical": "Yeni Kuti", "mb_name": "Yeni Anikulapo-Kuti", "mb_sort_name": "Anikulapo-Kuti, Yeni", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q21260615", "mbid": "419bc801-028f-4e12-9444-891eec318cb2", "wikidata_canonical": "Da L.E.S", "mb_name": "Da L.E.S.", "mb_sort_name": "Da L.E.S.", "mb_disambiguation": "South African Leslie J. Mampe Jr.", "mb_country": null, "mb_type": "Person", "aliases": [{"name": "Da L.E.S.", "sort_name": "Da L.E.S.", "type": "Artist name", "locale": null, "primary": false}, {"name": "Da L.E.S.", "sort_name": "Da L.E.S.", "type": "Search hint", "locale": null, "primary": false}, {"name": "Leslie Jonathan Mampe Jr.", "sort_name": "Leslie Jonathan Mampe Jr.", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q21274965", "mbid": "664d7846-d659-49b7-9d47-5e0dac2c5e7c", "wikidata_canonical": "Lil Khalid4grace", "mb_name": "Lil Kesh", "mb_sort_name": "Lil Kesh", "mb_disambiguation": "Nigerian singer", "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q21280581", "mbid": "a3cadfbd-d2ac-430f-8e53-3964e3d5d46a", "wikidata_canonical": "Adekunle Gold", "mb_name": "Adekunle Gold", "mb_sort_name": "Gold, Adekunle", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Adekunle Almoruf Kosoko", "sort_name": "Adekunle Almoruf Kosoko", "type": "Legal name", "locale": null, "primary": false}, {"name": "Adekunle Kosoko", "sort_name": "Kosoko, Adekunle", "type": "Legal name", "locale": "en", "primary": false}, {"name": "Adenkule Gold", "sort_name": "Adenkue Gold", "type": null, "locale": null, "primary": false}, {"name": "Adkunle Gold", "sort_name": "Gold, Adkunle", "type": null, "locale": null, "primary": false}]} +{"entity_id": "Q21281870", "mbid": "59e42031-8153-471a-a375-9b3183cc89a0", "wikidata_canonical": "Ycee", "mb_name": "YCEE", "mb_sort_name": "YCEE", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q21282387", "mbid": "94242f77-6659-4229-9481-7fed05b9e003", "wikidata_canonical": "Tonye", "mb_name": "Tonye", "mb_sort_name": "Tonye", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q21284617", "mbid": "e6ef3328-309c-4227-8c42-43b0ccf93433", "wikidata_canonical": "Bisa Kdei", "mb_name": "Bisa Kdei", "mb_sort_name": "Kdei, Bisa", "mb_disambiguation": null, "mb_country": "GH", "mb_type": "Person", "aliases": []} +{"entity_id": "Q21285312", "mbid": "b68e051f-2a02-40c5-a99f-da78cc65a5d5", "wikidata_canonical": "Ali Kiba", "mb_name": "Alikiba", "mb_sort_name": "Alikiba", "mb_disambiguation": "Tanzanian singer song-writer", "mb_country": "TZ", "mb_type": "Person", "aliases": [{"name": "Ali Salehe kiba", "sort_name": "Ali Salehe kiba", "type": "Legal name", "locale": null, "primary": false}, {"name": "Alikiba", "sort_name": "Alikiba", "type": "Artist name", "locale": null, "primary": false}, {"name": "ali kiba", "sort_name": "kiba, ali", "type": null, "locale": null, "primary": false}]} +{"entity_id": "Q21499025", "mbid": "61fa6777-1fdc-4392-938c-029d79cd8667", "wikidata_canonical": "Del B", "mb_name": "Del B", "mb_sort_name": "Del B", "mb_disambiguation": "alias for Ayodele Basil. Nigerian composer.", "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Ayodele Basil", "sort_name": "Ayodele Basil", "type": "Search hint", "locale": null, "primary": false}, {"name": "Ayodele Joseph Basil", "sort_name": "Ayodele Joseph Basil", "type": "Legal name", "locale": null, "primary": false}, {"name": "Del B", "sort_name": "Del B", "type": "Artist name", "locale": null, "primary": false}]} +{"entity_id": "Q21503256", "mbid": "41e6febf-2ce1-4f8c-b4e6-7b6c9d5fcd32", "wikidata_canonical": "Pheelz", "mb_name": "Pheelz", "mb_sort_name": "Pheelz", "mb_disambiguation": "Nigerian record producer", "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Philip Kayode Moses", "sort_name": "Moses, Philip Kayode", "type": "Legal name", "locale": "en", "primary": false}]} +{"entity_id": "Q21535528", "mbid": "f9b9f6d9-3ef6-4bc3-b81d-d504a97e70d7", "wikidata_canonical": "Falz", "mb_name": "Falz", "mb_sort_name": "Falz", "mb_disambiguation": "Nigerian rapper", "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "FALZ THE BAHDGUY", "sort_name": "BAHDGUY, FALZ THE", "type": "Artist name", "locale": null, "primary": false}, {"name": "Folarin Falana", "sort_name": "Falana, Folarin", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q21574887", "mbid": "a10c8d0c-30c0-48f3-bd29-0f8080aae522", "wikidata_canonical": "Young Jon", "mb_name": "Young Jonn", "mb_sort_name": "Jonn, Young", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "John Saviours Udomboso", "sort_name": "John Saviours Udomboso", "type": "Legal name", "locale": null, "primary": false}, {"name": "Young John", "sort_name": "Young John", "type": "Artist name", "locale": null, "primary": false}]} +{"entity_id": "Q21642673", "mbid": "7b7083a6-8d0c-4463-89a3-5c1aea404bcb", "wikidata_canonical": "Giovanni Kiyingi", "mb_name": "Giovanni Kiyingi", "mb_sort_name": "Kiyingi, Giovanni", "mb_disambiguation": null, "mb_country": "UG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q21872807", "mbid": "d9268043-ebad-44d2-867e-e73b47727754", "wikidata_canonical": "Waconzy", "mb_name": "Waconzy", "mb_sort_name": "Waconzy", "mb_disambiguation": "Nigerian singer Obinna Kelvin Anyanwu", "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q22135939", "mbid": "73f21c6a-7ea0-4f8d-81c8-66a688457d21", "wikidata_canonical": "Emtee", "mb_name": "Emtee", "mb_sort_name": "Emtee", "mb_disambiguation": "South African rapper", "mb_country": "ZA", "mb_type": "Person", "aliases": []} +{"entity_id": "Q22138550", "mbid": "03b33dce-6a0b-4ce6-a084-89771743ff8d", "wikidata_canonical": "Nasty C", "mb_name": "Nasty C", "mb_sort_name": "Nasty C", "mb_disambiguation": "South African rapper Nsikayesizwe David Ngcobo", "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "Nasty C", "sort_name": "Nasty C", "type": "Artist name", "locale": null, "primary": false}, {"name": "Nsikayesizwe David Junior Ngcobo", "sort_name": "Ngcobo, Nsikayesizwe David Junior", "type": null, "locale": null, "primary": false}, {"name": "Nsikayesizwe David Ngcobo", "sort_name": "Ngcobo, Nsikayesizwe David", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q22278278", "mbid": "638f1437-be52-4be8-aa55-7a8bba826296", "wikidata_canonical": "IFANi", "mb_name": "iFani", "mb_sort_name": "iFani", "mb_disambiguation": "South African rapper", "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "Mzayifani Mzondeleli Boltina", "sort_name": "Boltina, Mzayifani Mzondeleli", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q22695308", "mbid": "ff7a88fa-ac5f-4781-84f8-fd1cf13328d6", "wikidata_canonical": "Anatii", "mb_name": "Anatii", "mb_sort_name": "Anatii", "mb_disambiguation": null, "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "Anathi Bhongo Mnyango", "sort_name": "Mnyango, Anathi Bhongo", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q22807439", "mbid": "69589622-f38a-442f-bd97-57d733b2b201", "wikidata_canonical": "Tekno", "mb_name": "Tekno", "mb_sort_name": "Tekno", "mb_disambiguation": "Nigerian singer, real name Augustine Miles Kelechi", "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Augustine Miles Kelechi Okechukwu", "sort_name": "Okechukwu, Augustine Miles Kelechi", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q23541121", "mbid": "517a2c5e-87df-454b-b355-0c927cbb1a7e", "wikidata_canonical": "OC Osilliation", "mb_name": "OC Osilliation", "mb_sort_name": "OC Osilliation", "mb_disambiguation": "Zambian singer Siame O'Brien", "mb_country": "ZM", "mb_type": "Person", "aliases": [{"name": "OC", "sort_name": "OC", "type": null, "locale": null, "primary": false}]} +{"entity_id": "Q23541204", "mbid": "f98dc6d0-5a53-4721-809e-c458ab49be9a", "wikidata_canonical": "Ruby Gyang", "mb_name": "Ruby Gyang", "mb_sort_name": "Ruby Gyang", "mb_disambiguation": "Nigerian singer Ngohide Ruby Ann GyangGyang", "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q23541243", "mbid": "ea29f47e-e906-4716-9d56-1f1bed26af46", "wikidata_canonical": "Sanaipei Tande", "mb_name": "Sanaipei Tande", "mb_sort_name": "Sanaipei Tande", "mb_disambiguation": null, "mb_country": "KE", "mb_type": "Person", "aliases": []} +{"entity_id": "Q23657368", "mbid": "86efcbcd-cb33-4609-988c-8e409fe3c4a6", "wikidata_canonical": "J Martins", "mb_name": "J. Martins", "mb_sort_name": "J. Martins", "mb_disambiguation": "Nigerian R&B/Hip hop artist. Real name: Martins Oke Justice", "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q23771666", "mbid": "26e68a4d-d7e2-4c2d-9a34-b4a65dbcb57a", "wikidata_canonical": "Chef 187", "mb_name": "Chef 187", "mb_sort_name": "Chef 187", "mb_disambiguation": "Zambian rapper Kondwani Kaira", "mb_country": "ZM", "mb_type": "Person", "aliases": []} +{"entity_id": "Q23801122", "mbid": "91808028-d715-4b5e-adfb-87c9e3141663", "wikidata_canonical": "WizzyPro", "mb_name": "WizzyPro", "mb_sort_name": "WizzyPro", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q23883590", "mbid": "91037a8b-c604-43a5-b6a0-6342f4e84a31", "wikidata_canonical": "Iwan", "mb_name": "Iwan", "mb_sort_name": "Iwan", "mb_disambiguation": "Reggae and Dance Hall artist from Ghana", "mb_country": "GH", "mb_type": "Person", "aliases": []} +{"entity_id": "Q23899788", "mbid": "54fefc16-9c4f-4c79-8995-4d1d9e1f0998", "wikidata_canonical": "Simi", "mb_name": "Simi", "mb_sort_name": "Simi", "mb_disambiguation": "Nigerian singer and songwriter Simisola Bolatito Ogunleye", "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Simi", "sort_name": "Simi", "type": "Artist name", "locale": null, "primary": false}, {"name": "Simisola Bolatito Ogunleye", "sort_name": "Ogunleye, Simisola Bolatito", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q23927041", "mbid": "44d2c069-7641-49ed-bb35-4e7c41f40c2a", "wikidata_canonical": "Kiddominant (KDDO)", "mb_name": "Kiddominant", "mb_sort_name": "Kiddominant", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Ayoola Oladapo Agboola", "sort_name": "Ayoola Oladapo Agboola", "type": "Legal name", "locale": null, "primary": false}, {"name": "KDDO", "sort_name": "KDDO", "type": "Artist name", "locale": null, "primary": false}, {"name": "Kiddominant", "sort_name": "Kiddominant", "type": "Artist name", "locale": null, "primary": false}]} +{"entity_id": "Q24004852", "mbid": "c4e1de29-2e62-4924-b351-6a1981415ed7", "wikidata_canonical": "Sandy Soul", "mb_name": "Sandra Nankoma", "mb_sort_name": "Nankoma, Sandra", "mb_disambiguation": "Uganda", "mb_country": "UG", "mb_type": "Person", "aliases": [{"name": "Sandy Soul", "sort_name": "Soul, Sandy", "type": null, "locale": null, "primary": false}]} +{"entity_id": "Q24005067", "mbid": "7559f591-d012-468f-bab9-43f3d57b54c7", "wikidata_canonical": "Kwesta", "mb_name": "Kwesta", "mb_sort_name": "Kwesta", "mb_disambiguation": "South African rapper", "mb_country": "ZA", "mb_type": "Person", "aliases": []} +{"entity_id": "Q24039677", "mbid": "ff12b493-cfcb-4e18-b966-8fea341ed5f9", "wikidata_canonical": "Kofi Kinaata", "mb_name": "Kofi Kinaata", "mb_sort_name": "Kinaata, Kofi", "mb_disambiguation": null, "mb_country": "GH", "mb_type": "Person", "aliases": [{"name": "Martin King Arthur", "sort_name": "Martin King Arthur", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q24255698", "mbid": "c638bf27-a1ac-4c1a-80a3-3d7de8ed606a", "wikidata_canonical": "Niniola", "mb_name": "Niniola", "mb_sort_name": "Niniola", "mb_disambiguation": "Nigerian singer", "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Níníọlá Àpáta", "sort_name": "Àpáta, Níníọlá", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q24256417", "mbid": "47846ccf-a581-4734-824a-122d1afd8397", "wikidata_canonical": "Emma Nyra", "mb_name": "Emma Nyra", "mb_sort_name": "Nyra, Emma", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q24259953", "mbid": "b25d6bcb-8dd5-4d78-b4f0-6443dcac3c48", "wikidata_canonical": "Fifi Cooper", "mb_name": "Fifi Cooper", "mb_sort_name": "Fifi Cooper", "mb_disambiguation": null, "mb_country": "ZA", "mb_type": "Person", "aliases": []} +{"entity_id": "Q24260530", "mbid": "637d7628-b079-4663-97c1-fd46aaa5458c", "wikidata_canonical": "K1 De Ultimate", "mb_name": "K1 De Ultimate", "mb_sort_name": "K1 De Ultimate", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Olasunkanmi Wasiu Ishola", "sort_name": "Wasiu Ishola, Olasunkanmi", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q24264057", "mbid": "5c72c55a-11e5-44ae-8cb8-e3a45dd3fea0", "wikidata_canonical": "Shaydee", "mb_name": "Shaydee", "mb_sort_name": "Shaydee", "mb_disambiguation": "Nigerian musician", "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Shadrach Adeboye Folarin", "sort_name": "Shadrach Adeboye Folarin", "type": "Legal name", "locale": null, "primary": false}, {"name": "Shaydee", "sort_name": "Shaydee", "type": "Artist name", "locale": null, "primary": false}]} +{"entity_id": "Q24307358", "mbid": "63883e49-102d-4fec-863e-9af98ba9b69c", "wikidata_canonical": "Lola Rae", "mb_name": "Lola Rae", "mb_sort_name": "Rae, Lola", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q24341755", "mbid": "243a31cc-672e-43ed-b4d5-25ad137fad69", "wikidata_canonical": "Adèle Ruffine Ngono", "mb_name": "Lady Ponce", "mb_sort_name": "Lady Ponce", "mb_disambiguation": null, "mb_country": "CM", "mb_type": "Person", "aliases": []} +{"entity_id": "Q24432534", "mbid": "67ce7efa-7d13-4dc2-882b-ff03a4774cc7", "wikidata_canonical": "Nathi", "mb_name": "Nathi", "mb_sort_name": "Nathi", "mb_disambiguation": null, "mb_country": "ZA", "mb_type": "Person", "aliases": []} +{"entity_id": "Q24475747", "mbid": "40b0b187-1bb2-410b-a555-ed6cdda2b67d", "wikidata_canonical": "Zonke", "mb_name": "Zonke", "mb_sort_name": "Zonke", "mb_disambiguation": null, "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "Zonke Dikana", "sort_name": "Dikana, Zonke", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q24493964", "mbid": "00d5310b-e159-42ac-9b39-7c36e77bae69", "wikidata_canonical": "Lulu Dikana", "mb_name": "Lulu Dikana", "mb_sort_name": "Lulu Dikana", "mb_disambiguation": null, "mb_country": "ZA", "mb_type": "Person", "aliases": []} +{"entity_id": "Q24851525", "mbid": "ff193174-c293-4361-93e8-ffcb1f24c3ec", "wikidata_canonical": "Akwaboah Jnr", "mb_name": "Akwaboah", "mb_sort_name": "Akwaboah", "mb_disambiguation": "Ghanaian singer-songwriter and producer", "mb_country": "GH", "mb_type": "Person", "aliases": []} +{"entity_id": "Q24872105", "mbid": "e4f9b302-18f7-41e7-860e-9b0e7f8e0f7a", "wikidata_canonical": "Sheebah Karungi", "mb_name": "Sheebah", "mb_sort_name": "Sheebah", "mb_disambiguation": null, "mb_country": "UG", "mb_type": "Person", "aliases": [{"name": "Queen Karma", "sort_name": "Queen Karma", "type": null, "locale": null, "primary": false}, {"name": "Sheebah", "sort_name": "Sheebah", "type": "Artist name", "locale": null, "primary": false}, {"name": "Sheebah Karungi", "sort_name": "Karungi Sheebah", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q269244", "mbid": "961f31f2-31bf-4469-bc66-f6a2fda12db5", "wikidata_canonical": "Trevor Jones", "mb_name": "Trevor Jones", "mb_sort_name": "Jones, Trevor", "mb_disambiguation": "South African score composer", "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "Alfred Jones", "sort_name": "Alfred Jones", "type": "Search hint", "locale": null, "primary": false}, {"name": "Charles Jones", "sort_name": "Charles Jones", "type": "Search hint", "locale": null, "primary": false}, {"name": "Jones", "sort_name": "Jones", "type": "Search hint", "locale": null, "primary": false}, {"name": "Tremor Jones", "sort_name": "Tremor Jones", "type": "Search hint", "locale": null, "primary": false}, {"name": "Trevon Jones", "sort_name": "Trevon Jones", "type": "Search hint", "locale": null, "primary": false}, {"name": "Trevor A.C. Jones", "sort_name": "Trevor A.C. Jones", "type": "Search hint", "locale": null, "primary": false}, {"name": "Trevor AC Jones", "sort_name": "Trevor AC Jones", "type": "Search hint", "locale": null, "primary": false}, {"name": "Trevor Alfred Charles Jones", "sort_name": "Jones, Trevor Alfred Charles", "type": "Legal name", "locale": null, "primary": false}, {"name": "Trevor Jhones", "sort_name": "Trevor Jhones", "type": "Search hint", "locale": null, "primary": false}, {"name": "Trevor Johnes", "sort_name": "Trevor Johnes", "type": "Search hint", "locale": null, "primary": false}, {"name": "Trevor Jonas", "sort_name": "Trevor Jonas", "type": "Search hint", "locale": null, "primary": false}, {"name": "Trevor Jones", "sort_name": "Jones, Trevor", "type": "Artist name", "locale": null, "primary": false}, {"name": "Trevor Jonez", "sort_name": "Trevor Jonez", "type": "Search hint", "locale": null, "primary": false}, {"name": "Trevor Jons", "sort_name": "Trevor Jons", "type": "Search hint", "locale": null, "primary": false}, {"name": "Trevor Jonz", "sort_name": "Trevor Jonz", "type": "Search hint", "locale": null, "primary": false}, {"name": "Trewor Jones", "sort_name": "Trewor Jones", "type": "Search hint", "locale": null, "primary": false}]} +{"entity_id": "Q276268", "mbid": "d1d9cfa4-43b2-4acf-8971-4b429a0b4473", "wikidata_canonical": "Stella Chiweshe", "mb_name": "Stella Chiweshe", "mb_sort_name": "Chiweshe, Stella", "mb_disambiguation": null, "mb_country": "DE", "mb_type": "Person", "aliases": [{"name": "Stella Chiswese", "sort_name": "Stella Chiswese", "type": null, "locale": null, "primary": false}, {"name": "Stella Chiweche", "sort_name": "Chiweche, Stella", "type": null, "locale": null, "primary": false}, {"name": "Stella Nekati Chiweshe", "sort_name": "Stella Nekati Chiweshe", "type": null, "locale": null, "primary": false}, {"name": "Stella Rambisai Chiweshe", "sort_name": "Chiweshe, Stella Rambisai", "type": null, "locale": null, "primary": false}, {"name": "Stella Rambisai Chiweshe Nekati", "sort_name": "Stella Rambisai Chiweshe Nekati", "type": null, "locale": null, "primary": false}]} +{"entity_id": "Q290813", "mbid": "d9ac79c1-7fa5-414a-b365-d1b03f2f95a5", "wikidata_canonical": "Meryl Cassie", "mb_name": "Meryl Cassie", "mb_sort_name": "Cassie, Meryl", "mb_disambiguation": null, "mb_country": "NZ", "mb_type": "Person", "aliases": []} +{"entity_id": "Q290837", "mbid": "d64a8727-d962-4092-9d40-32ec9c39fbb4", "wikidata_canonical": "Dale Stewart", "mb_name": "Dale Stewart", "mb_sort_name": "Stewart, Dale", "mb_disambiguation": null, "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "Dale William Stewart", "sort_name": "Stewart, Dale William", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q291431", "mbid": "271973a1-7177-4bcf-9a01-ac75d3691035", "wikidata_canonical": "Nneka", "mb_name": "Nneka", "mb_sort_name": "Nneka", "mb_disambiguation": null, "mb_country": "DE", "mb_type": "Person", "aliases": [{"name": "Nineka", "sort_name": "Nineka", "type": null, "locale": null, "primary": false}, {"name": "Nneka Lucia Egbuna", "sort_name": "Egbuna, Nneka Lucia", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q313366", "mbid": "85a3072a-08eb-43a4-a57d-f7084503ee4c", "wikidata_canonical": "Dr. Alban", "mb_name": "Dr. Alban", "mb_sort_name": "Dr. Alban", "mb_disambiguation": null, "mb_country": "SE", "mb_type": "Person", "aliases": [{"name": "Alban Nwapa", "sort_name": "Nwapa, Alban", "type": null, "locale": null, "primary": false}, {"name": "Alban Uzoma Nwapa", "sort_name": "Nwapa, Alban Uzoma", "type": "Legal name", "locale": null, "primary": false}, {"name": "Doctor Alban", "sort_name": "Doctor Alban", "type": null, "locale": null, "primary": false}, {"name": "Dr Alban", "sort_name": "Dr Alban", "type": null, "locale": null, "primary": false}]} +{"entity_id": "Q313868", "mbid": "6514cffa-fbe0-4965-ad88-e998ead8a82a", "wikidata_canonical": "Fela Kuti", "mb_name": "Fela Kuti", "mb_sort_name": "Kuti, Fela", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Fela", "sort_name": "Fela", "type": null, "locale": null, "primary": false}, {"name": "Fela & Egypt 80", "sort_name": "Fela & Egypt 80", "type": "Search hint", "locale": null, "primary": false}, {"name": "Fela Anikulapo Kuti", "sort_name": "Anikulapo Kuti, Fela", "type": "Artist name", "locale": null, "primary": false}, {"name": "Fela Anikulapo Kuti & Africa '70", "sort_name": "Fela Anikulapo Kuti & Africa '70", "type": "Search hint", "locale": null, "primary": false}, {"name": "Fela Anikulapo-kuti", "sort_name": "Anikulapo-Kuti, Fela", "type": "Artist name", "locale": null, "primary": false}, {"name": "Fela Ransome Kuti", "sort_name": "Ransome Kuti, Fela", "type": "Artist name", "locale": null, "primary": false}, {"name": "Fela and Africa 70", "sort_name": "Fela and Africa 70", "type": "Search hint", "locale": null, "primary": false}, {"name": "Olufela Olusegun Oludotun Ransome-Kuti", "sort_name": "Ransome-Kuti, Olufela Olusegun Oludotun", "type": "Legal name", "locale": null, "primary": false}, {"name": "フェラ・クティ", "sort_name": "フェラ・クティ", "type": "Artist name", "locale": "ja", "primary": true}]} +{"entity_id": "Q317677", "mbid": "fd64e185-9973-44d5-ad09-5d5562804292", "wikidata_canonical": "Abdullah Ibrahim", "mb_name": "Abdullah Ibrahim", "mb_sort_name": "Ibrahim, Abdullah", "mb_disambiguation": "South African pianist and composer", "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "Abdullah Abrahim", "sort_name": "Abdullah Abrahim", "type": "Search hint", "locale": null, "primary": false}, {"name": "Abdullah Ibrahim", "sort_name": "Ibrahim, Abdullah", "type": "Legal name", "locale": null, "primary": false}, {"name": "Abdullah Ibrahim (Dollar Brand)", "sort_name": "Abdullah Ibrahim (Dollar Brand)", "type": "Search hint", "locale": null, "primary": false}, {"name": "Adolph Johannes Brand", "sort_name": "Brand, Adolph Johannes", "type": "Legal name", "locale": null, "primary": false}, {"name": "Dollar Brand", "sort_name": "Brand, Dollar", "type": "Artist name", "locale": null, "primary": false}, {"name": "Dollar Brand / Abdullah Ibrahim", "sort_name": "Dollar Brand / Abdullah Ibrahim", "type": "Search hint", "locale": null, "primary": false}, {"name": "Dollar Brand; Abdullah Ibrahim", "sort_name": "Dollar Brand; Abdullah Ibrahim", "type": "Search hint", "locale": null, "primary": false}, {"name": "ダラー・ブランド", "sort_name": "ダラー・ブランド", "type": "Artist name", "locale": "ja", "primary": false}]} +{"entity_id": "Q335479", "mbid": "4bdd63a0-486f-4197-a6cc-95d815b8a4ee", "wikidata_canonical": "George Wilberforce Kakoma", "mb_name": "George Wilberforch Kakoma", "mb_sort_name": "Wilberforch Kakoma, George", "mb_disambiguation": null, "mb_country": "UG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q337061", "mbid": "d45aeffc-ab0d-4534-94c7-6c9ce31d4838", "wikidata_canonical": "Kippie Moeketsi", "mb_name": "Kippie Moeketsi", "mb_sort_name": "Kippie Moeketsi", "mb_disambiguation": null, "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "Jeremiah Morolong Moeketsi", "sort_name": "Jeremiah Morolong Moeketsi", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q339248", "mbid": "a18dc02f-8000-4eb5-8e2a-9b884873f009", "wikidata_canonical": "Mahlathini", "mb_name": "Mahlathini", "mb_sort_name": "Mahlathini", "mb_disambiguation": null, "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "Simon Mahlathini Nkabinde", "sort_name": "Nkabinde, Simon Mahlathini", "type": "Artist name", "locale": null, "primary": false}, {"name": "Simon Nkabinde", "sort_name": "Nkabinde, Simon", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q349703", "mbid": "26dc1641-9e83-46bb-ba77-bf331ca41bfb", "wikidata_canonical": "Wes", "mb_name": "Wes", "mb_sort_name": "Wes", "mb_disambiguation": "Cameroonian musician", "mb_country": "CM", "mb_type": "Person", "aliases": [{"name": "Patrice Éric Delacour", "sort_name": "Delacour, Patrice Éric", "type": "Legal name", "locale": null, "primary": false}, {"name": "Wes Madiko", "sort_name": "Madiko, Wes", "type": "Artist name", "locale": null, "primary": false}]} +{"entity_id": "Q2700036", "mbid": "84672b6f-fe11-4dbd-944a-736cee8388e4", "wikidata_canonical": "Leon Botha", "mb_name": "Leon Botha", "mb_sort_name": "Botha, Leon", "mb_disambiguation": "South African painter and DJ", "mb_country": "ZA", "mb_type": "Person", "aliases": []} +{"entity_id": "Q2740796", "mbid": "d4938195-6548-479f-9f11-a4e22d915770", "wikidata_canonical": "Getatchew Mekurya", "mb_name": "ጌታቸው፡መኩሪያ", "mb_sort_name": "Mèkurya, Gétatchèw", "mb_disambiguation": null, "mb_country": "ET", "mb_type": "Person", "aliases": [{"name": "Getachew Mekuria", "sort_name": "Mekuria, Getachew", "type": null, "locale": null, "primary": false}, {"name": "Getatchew Mekurya", "sort_name": "Getatchew Mekurya", "type": "Search hint", "locale": null, "primary": false}, {"name": "Getatchew Mekurya", "sort_name": "Mekurya, Getatchew", "type": null, "locale": null, "primary": false}, {"name": "Gétatchèw Mèkurya", "sort_name": "Mèkurya, Gétatchèw", "type": "Artist name", "locale": "en", "primary": true}, {"name": "Gétatchèw Mèkurya", "sort_name": "Mèkurya, Gétatchèw", "type": null, "locale": "fr", "primary": true}, {"name": "ጌታቸው፡መኩሪያ፡ወልደተክሌ", "sort_name": "Mekuria Woldetekle, Getachew", "type": "Legal name", "locale": "am", "primary": false}]} +{"entity_id": "Q2821665", "mbid": "f68e6eda-bbc7-41f6-82dd-03d7d72b5389", "wikidata_canonical": "Ablaye Cissoko", "mb_name": "Ablaye Cissoko", "mb_sort_name": "Cissoko, Ablaye", "mb_disambiguation": null, "mb_country": "SN", "mb_type": "Person", "aliases": []} +{"entity_id": "Q2840713", "mbid": "864e1fb8-c35c-40ee-9882-0dd5da1ea4ec", "wikidata_canonical": "Alemayehu Eshete", "mb_name": "አለማየሁ እሸቴ", "mb_sort_name": "Alemayehu Eshete", "mb_disambiguation": "Ethiopian jazz singer", "mb_country": "ET", "mb_type": "Person", "aliases": [{"name": "Alemayehu", "sort_name": "Alemayehu", "type": null, "locale": null, "primary": false}, {"name": "Alemayehu Eshete", "sort_name": "Eshete, Alemayehu", "type": "Artist name", "locale": "en_001", "primary": true}, {"name": "Alèmayèhu Eshèté", "sort_name": "Eshèté, Alèmayèhu", "type": "Artist name", "locale": "fr", "primary": true}, {"name": "Eshèté, Alèmayèhu", "sort_name": "Eshèté, Alèmayèhu", "type": null, "locale": null, "primary": false}, {"name": "Ethiopiques", "sort_name": "Ethiopiques", "type": null, "locale": null, "primary": false}, {"name": "ዓለማየሁ እሸቴ", "sort_name": "እሸቴ, ዓለማየሁ", "type": "Legal name", "locale": "am", "primary": true}]} +{"entity_id": "Q2844693", "mbid": "4f0742f7-2df7-4bb0-9609-26f20ce03152", "wikidata_canonical": "Amédée Pierre", "mb_name": "Amédée Pierre", "mb_sort_name": "Pierre, Amédée", "mb_disambiguation": null, "mb_country": "CI", "mb_type": "Person", "aliases": []} +{"entity_id": "Q2847091", "mbid": "ff4465fc-e3ee-4606-8825-701113a70233", "wikidata_canonical": "André-Marie Tala", "mb_name": "André-Marie Tala", "mb_sort_name": "Tala, André-Marie", "mb_disambiguation": null, "mb_country": "CM", "mb_type": "Person", "aliases": []} +{"entity_id": "Q2852401", "mbid": "f73004b6-1524-4f99-9f24-b5cb0d85b118", "wikidata_canonical": "Anouman Brou Félix", "mb_name": "Anoma Brou Félix", "mb_sort_name": "Félix, Anoma Brou", "mb_disambiguation": null, "mb_country": "CI", "mb_type": "Person", "aliases": []} +{"entity_id": "Q2866726", "mbid": "c860bed7-9756-4bf8-bd31-190d405170ef", "wikidata_canonical": "Asnaketch Worku", "mb_name": "አስናቀች ወርቁ", "mb_sort_name": "Worku, Asnakech", "mb_disambiguation": null, "mb_country": "ET", "mb_type": "Person", "aliases": [{"name": "Asnakech Worku", "sort_name": "Worku, Asnakech", "type": "Artist name", "locale": "en", "primary": true}, {"name": "Asnaketch Worku", "sort_name": "Worku, Asnaketch", "type": "Artist name", "locale": "en", "primary": false}, {"name": "Asnaketch Worku", "sort_name": "Asnaketch Worku", "type": "Artist name", "locale": "vi", "primary": false}, {"name": "Asnatqètch Wèrqu", "sort_name": "Wèrqu, Asnatqètch", "type": "Artist name", "locale": "fr", "primary": false}, {"name": "Аснакеч Верку", "sort_name": "Аснакеч Верку", "type": "Artist name", "locale": "uk", "primary": false}, {"name": "אסנקץ' וורקו", "sort_name": "אסנקץ' וורקו", "type": "Artist name", "locale": "he", "primary": false}, {"name": "اسناكيتش وركو", "sort_name": "اسناكيتش وركو", "type": "Artist name", "locale": "ar_EG", "primary": false}]} +{"entity_id": "Q2875035", "mbid": "2e9c624b-f2d6-456d-9778-8d0b004b8ffa", "wikidata_canonical": "Ayub Ogada", "mb_name": "Ayub Ogada", "mb_sort_name": "Ogada, Ayub", "mb_disambiguation": null, "mb_country": "KE", "mb_type": "Person", "aliases": [{"name": "Job Seda", "sort_name": "Seda, Job", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q2876580", "mbid": "3ddb510b-04f8-4c22-8408-2831b1616ec7", "wikidata_canonical": "A'Salfo", "mb_name": "A’salfo", "mb_sort_name": "A’salfo", "mb_disambiguation": null, "mb_country": "CI", "mb_type": "Person", "aliases": [{"name": "A' Salfo", "sort_name": "A' Salfo", "type": "Search hint", "locale": null, "primary": false}, {"name": "A'salfo", "sort_name": "A'salfo", "type": "Artist name", "locale": null, "primary": false}, {"name": "Assalfo", "sort_name": "Assalfo", "type": "Search hint", "locale": null, "primary": false}, {"name": "Assalfo Traoré", "sort_name": "Assalfo Traoré", "type": "Search hint", "locale": null, "primary": false}, {"name": "S. Traore", "sort_name": "S. Traore", "type": "Search hint", "locale": null, "primary": false}, {"name": "Salif A'Salfo", "sort_name": "Salif A'Salfo", "type": "Search hint", "locale": null, "primary": false}, {"name": "Salif Traore", "sort_name": "Salif Traore", "type": "Search hint", "locale": null, "primary": false}, {"name": "Salif Traoré", "sort_name": "Traoré, Salif", "type": "Legal name", "locale": null, "primary": false}, {"name": "Salif Traoré A'Salfo", "sort_name": "Salif Traoré A'Salfo", "type": "Search hint", "locale": null, "primary": false}, {"name": "Traore Salif A'Salfo", "sort_name": "Traore Salif A'Salfo", "type": "Search hint", "locale": null, "primary": false}, {"name": "Traoré Salif", "sort_name": "Traoré Salif", "type": "Search hint", "locale": null, "primary": false}, {"name": "Traoré Salif \"A'Salfo\"", "sort_name": "Traoré Salif \"A'Salfo\"", "type": "Search hint", "locale": null, "primary": false}, {"name": "Traoré Salif \"A-Salfo\"", "sort_name": "Traoré Salif \"A-Salfo\"", "type": "Search hint", "locale": null, "primary": false}]} +{"entity_id": "Q2936258", "mbid": "c40f4457-5a6f-4e6b-9257-6dafaf8e0007", "wikidata_canonical": "Candîce Hillebrand", "mb_name": "Candice", "mb_sort_name": "Candice", "mb_disambiguation": "South African singer Candice Hillebrand, key track \"Hello\"", "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "Candice Hillebrand", "sort_name": "Hillebrand, Candice", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q2956322", "mbid": "ad27e0fd-2249-4bba-a5fd-ece246829989", "wikidata_canonical": "Chantal Taïba", "mb_name": "Chantal Taïba", "mb_sort_name": "Taïba, Chantal", "mb_disambiguation": null, "mb_country": "CI", "mb_type": "Person", "aliases": []} +{"entity_id": "Q2998861", "mbid": "e8e3cf54-3dde-40c6-8a5e-c80d43a5c6d3", "wikidata_canonical": "Coumba Gawlo", "mb_name": "Coumba Gawlo", "mb_sort_name": "Gawlo, Coumba", "mb_disambiguation": null, "mb_country": "SN", "mb_type": "Person", "aliases": [{"name": "Comba Gawlo", "sort_name": "Comba Gawlo", "type": "Search hint", "locale": null, "primary": false}, {"name": "Coumba Gwalo", "sort_name": "Coumba Gwalo", "type": "Search hint", "locale": null, "primary": false}]} +{"entity_id": "Q3014517", "mbid": "dd697d6b-7ff7-43e1-af73-45f5abe92341", "wikidata_canonical": "Daniel Owino Misiani", "mb_name": "Daniel Owino Misiani", "mb_sort_name": "Misiani, Daniel Owino", "mb_disambiguation": null, "mb_country": "KE", "mb_type": "Person", "aliases": []} +{"entity_id": "Q3028670", "mbid": "7b5db501-41f9-4e94-b560-8e1fb74ca8ba", "wikidata_canonical": "Diogal", "mb_name": "Diogal", "mb_sort_name": "Diogal", "mb_disambiguation": null, "mb_country": "FR", "mb_type": "Person", "aliases": []} +{"entity_id": "Q3037333", "mbid": "1d69ce47-7ec6-4fac-a82e-40e66dfd34f6", "wikidata_canonical": "Dosseh", "mb_name": "Dosseh", "mb_sort_name": "Dosseh", "mb_disambiguation": null, "mb_country": "FR", "mb_type": "Person", "aliases": [{"name": "Dohsey", "sort_name": "Dohsey", "type": "Search hint", "locale": null, "primary": false}, {"name": "Dorian Dosseh N’Goumou", "sort_name": "N’Goumou, Dorian Dosseh", "type": "Legal name", "locale": null, "primary": false}, {"name": "Dosseh", "sort_name": "Dosseh", "type": "Artist name", "locale": null, "primary": false}]} +{"entity_id": "Q3037895", "mbid": "6db0aa2f-7d59-4c9e-a3cb-730f3a127a9a", "wikidata_canonical": "Doudou N'Diaye Rose", "mb_name": "Doudou N’diaye Rose", "mb_sort_name": "N’diaye Rose, Doudou", "mb_disambiguation": null, "mb_country": "SN", "mb_type": "Person", "aliases": [{"name": "Doudou N'Diaye Rose Percussion Orchestra", "sort_name": "Doudou N'Diaye Rose Percussion Orchestra", "type": null, "locale": null, "primary": false}]} +{"entity_id": "Q3059434", "mbid": "dedc2f96-1433-4bb1-981f-74d81df2826f", "wikidata_canonical": "Eténèsh Wassié", "mb_name": "Eténèsh Wassié", "mb_sort_name": "Wassié, Eténèsh", "mb_disambiguation": "ethiopian female jazz singer from Addis Abeba", "mb_country": "ET", "mb_type": "Person", "aliases": []} +{"entity_id": "Q3063489", "mbid": "b3c89b39-4564-4dc4-a071-24b649bf3dfe", "wikidata_canonical": "Faada Freddy", "mb_name": "Faada Freddy", "mb_sort_name": "Freddy, Faada", "mb_disambiguation": null, "mb_country": "FR", "mb_type": "Person", "aliases": [{"name": "Abdoul Fatah Seck", "sort_name": "Seck, Abdoul Fatah", "type": "Legal name", "locale": null, "primary": false}, {"name": "Faada Fredy", "sort_name": "Faada Fredy", "type": "Search hint", "locale": null, "primary": false}, {"name": "Faada Freedy", "sort_name": "Faada Freedy", "type": "Search hint", "locale": null, "primary": false}, {"name": "Fadda Freddy", "sort_name": "Fadda Freddy", "type": "Search hint", "locale": null, "primary": false}]} +{"entity_id": "Q3064379", "mbid": "9b982925-f0b3-440f-b2a1-fedb544ce983", "wikidata_canonical": "Fadhili William", "mb_name": "Fadhili William", "mb_sort_name": "Fadhili William", "mb_disambiguation": null, "mb_country": "KE", "mb_type": "Person", "aliases": [{"name": "William Fedhile", "sort_name": "Fedhile, William", "type": null, "locale": null, "primary": false}]} +{"entity_id": "Q3066400", "mbid": "8202fc9c-575b-456f-8366-fbd11d186417", "wikidata_canonical": "Fania Niang", "mb_name": "Fania", "mb_sort_name": "Fania", "mb_disambiguation": null, "mb_country": "SN", "mb_type": "Person", "aliases": []} +{"entity_id": "Q3092609", "mbid": "20f0c423-497a-4b57-b6fb-7b6e65d69b75", "wikidata_canonical": "Félix Sabal-Lecco", "mb_name": "Félix Sabal Lecco", "mb_sort_name": "Sabal Lecco, Félix", "mb_disambiguation": null, "mb_country": "FR", "mb_type": "Person", "aliases": [{"name": "Felix Sabal Lecco", "sort_name": "Lecco, Felix Sabal", "type": null, "locale": "fr", "primary": false}, {"name": "Félix Sabal-Lecco", "sort_name": "Sabal-Lecco, Félix", "type": null, "locale": null, "primary": false}, {"name": "Félix Yves Silvère Sabal-Lecco", "sort_name": "Sabal-Lecco, Félix Yves Silvère", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q3106820", "mbid": "d43190ca-1919-40ec-be56-4cd7657c2008", "wikidata_canonical": "Gino Sitson", "mb_name": "Gino Sitson", "mb_sort_name": "Sitson, Gino", "mb_disambiguation": null, "mb_country": "US", "mb_type": "Person", "aliases": [{"name": "Pierre-Eugène Sitchet", "sort_name": "Sitchet Pierre-Eugene", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q3107653", "mbid": "cb8dad1a-a721-4e7d-a598-217848d9ad7e", "wikidata_canonical": "Girma Bèyènè", "mb_name": "ግርማ በየነ", "mb_sort_name": "Bèyènè, Girma", "mb_disambiguation": null, "mb_country": "US", "mb_type": "Person", "aliases": [{"name": "Girma Beyene", "sort_name": "Beyene, Girma", "type": null, "locale": "en", "primary": true}]} +{"entity_id": "Q3111214", "mbid": "23cac0c4-a2ad-43b2-9256-5aa404c8c431", "wikidata_canonical": "Seun Kuti", "mb_name": "Seun Kuti & Egypt 80", "mb_sort_name": "Kuti, Seun & Egypt 80", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Group", "aliases": [{"name": "Seun Anikulapo Kuti & Egypt 80", "sort_name": "Seun Anikulapo Kuti & Egypt 80", "type": null, "locale": null, "primary": false}, {"name": "Seun Kuti & Egypt 80", "sort_name": "Seun Kuti & Egypt 80", "type": "Artist name", "locale": null, "primary": false}]} +{"entity_id": "Q3124631", "mbid": "ce1e63df-5d87-4618-8ad0-61aff87290e6", "wikidata_canonical": "Majek Fashek", "mb_name": "Majek Fashek", "mb_sort_name": "Fashek, Majek", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Majekodumni Fasheke", "sort_name": "Majekodumni Fasheke", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q3155106", "mbid": "92fec04d-18fe-4a2e-9831-fc64c6da429d", "wikidata_canonical": "I. K. Dairo", "mb_name": "I.K. Dairo", "mb_sort_name": "Dairo, I.K.", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "I.K. Dairo M.B.E.", "sort_name": "Dairo, I.K., M.B.E.", "type": null, "locale": null, "primary": false}, {"name": "Isaiah Kehinde Dairo", "sort_name": "Dairo, Isaiah Kehinde", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q3159030", "mbid": "9bd9d2a4-e877-40ee-b341-6b03a05604dc", "wikidata_canonical": "Jacques Greg-Belobo", "mb_name": "Jacques-Greg Belobo", "mb_sort_name": "Belobo, Jacques-Greg", "mb_disambiguation": "bass-baritone", "mb_country": "CM", "mb_type": "Person", "aliases": []} +{"entity_id": "Q3180279", "mbid": "adf045f4-8028-4cc0-96fb-c63ad91149e3", "wikidata_canonical": "Joelle Séka", "mb_name": "Joëlle Seka", "mb_sort_name": "Seka, Joëlle", "mb_disambiguation": null, "mb_country": "CI", "mb_type": "Person", "aliases": []} +{"entity_id": "Q3217752", "mbid": "6750e56c-ff7b-40a3-ad2f-a20048350ab5", "wikidata_canonical": "Lambo Sandjo Pierre Roger", "mb_name": "Lapiro De Mbanga", "mb_sort_name": "Lapiro De Mbanga", "mb_disambiguation": null, "mb_country": "CM", "mb_type": "Person", "aliases": []} +{"entity_id": "Q3320940", "mbid": "070ee2a6-9cc9-49d6-8f88-01d3237e5298", "wikidata_canonical": "Monique Séka", "mb_name": "Monique Seka", "mb_sort_name": "Monique Seka", "mb_disambiguation": null, "mb_country": "FR", "mb_type": "Person", "aliases": []} +{"entity_id": "Q3337358", "mbid": "a4b33cdb-8bc0-4ad0-a356-b110962e64ba", "wikidata_canonical": "Nayanka Bell", "mb_name": "Nayanka Bell", "mb_sort_name": "Bell, Nayanka", "mb_disambiguation": null, "mb_country": "CI", "mb_type": "Person", "aliases": [{"name": "Nayanka Bel", "sort_name": "Nayanka Bel", "type": null, "locale": null, "primary": false}]} +{"entity_id": "Q3389313", "mbid": "324cf6ef-2a29-483b-b7d8-8a1a534079a5", "wikidata_canonical": "Pit Baccardi", "mb_name": "Pit Baccardi", "mb_sort_name": "Baccardi, Pit", "mb_disambiguation": "French rapper", "mb_country": "FR", "mb_type": "Person", "aliases": [{"name": "Guillaume N’Goumou", "sort_name": "N’Goumou, Guillaume", "type": "Legal name", "locale": null, "primary": false}, {"name": "Pit", "sort_name": "Pit", "type": "Search hint", "locale": null, "primary": false}, {"name": "Pit Bacardi", "sort_name": "Pit Bacardi", "type": "Search hint", "locale": null, "primary": false}, {"name": "Pit Baccardi", "sort_name": "Pit Baccardi", "type": "Artist name", "locale": null, "primary": false}, {"name": "Pitt Baccardi", "sort_name": "Pitt Baccardi", "type": "Search hint", "locale": null, "primary": false}]} +{"entity_id": "Q3471935", "mbid": "7cc8b119-b2c4-4917-bf78-c5c66d6f4304", "wikidata_canonical": "Sandra Nkaké", "mb_name": "Sandra Nkaké", "mb_sort_name": "Nkaké, Sandra", "mb_disambiguation": null, "mb_country": "FR", "mb_type": "Person", "aliases": [{"name": "Sandra N' Kake", "sort_name": "Sandra N' Kake", "type": null, "locale": null, "primary": false}]} +{"entity_id": "Q3491728", "mbid": "a3af8fdd-1184-4932-9033-44b6556e7420", "wikidata_canonical": "Soum Bill", "mb_name": "Soum Bill", "mb_sort_name": "Soum Bill", "mb_disambiguation": null, "mb_country": "CI", "mb_type": "Person", "aliases": []} +{"entity_id": "Q3505879", "mbid": "84a30ec1-2f38-49ba-86f9-dfe0da16e0a0", "wikidata_canonical": "Suzanna Owíyo", "mb_name": "Suzanna Owiyo", "mb_sort_name": "Owiyo, Suzanna", "mb_disambiguation": null, "mb_country": "KE", "mb_type": "Person", "aliases": [{"name": "Suzzana Owiyo", "sort_name": "Suzzana Owiyo", "type": "Artist name", "locale": null, "primary": false}, {"name": "Suzzana Owíyo", "sort_name": "Owíyo, Suzzana", "type": null, "locale": null, "primary": false}]} +{"entity_id": "Q26710796", "mbid": "b39bfaac-ddb6-4db6-958e-b5d57d721766", "wikidata_canonical": "Adam Ro", "mb_name": "Adam Ro", "mb_sort_name": "Adam Ro", "mb_disambiguation": null, "mb_country": "GH", "mb_type": "Person", "aliases": []} +{"entity_id": "Q26710833", "mbid": "9c14317c-87b9-4f7c-a5a5-80add17a1709", "wikidata_canonical": "Alice Phoebe Lou", "mb_name": "Alice Phoebe Lou", "mb_sort_name": "Alice Phoebe Lou", "mb_disambiguation": null, "mb_country": "DE", "mb_type": "Person", "aliases": [{"name": "Alice Matthew", "sort_name": "Matthew, Alice", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q26837431", "mbid": "18b5f9f6-0a5a-4522-8c11-d09b736fd3af", "wikidata_canonical": "Sugarboy", "mb_name": "Sugarboy", "mb_sort_name": "Sugarboy", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q26924118", "mbid": "c8cc915b-991d-4afd-9b12-964554c852a0", "wikidata_canonical": "Shane Eagle", "mb_name": "Shane Eagle", "mb_sort_name": "Shane Eagle", "mb_disambiguation": "South African rapper", "mb_country": "ZA", "mb_type": "Person", "aliases": []} +{"entity_id": "Q26944974", "mbid": "1582445b-4505-4f85-bba1-711893e7828d", "wikidata_canonical": "Chioma Omeruah", "mb_name": "Chigul", "mb_sort_name": "Chigul", "mb_disambiguation": "Nigerian comedian, singer, actress", "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q27050233", "mbid": "c78a5170-de8c-445b-ab40-052ccf9d5396", "wikidata_canonical": "Dekumzy", "mb_name": "Dekumzy", "mb_sort_name": "Dekumzy", "mb_disambiguation": null, "mb_country": null, "mb_type": null, "aliases": []} +{"entity_id": "Q27062890", "mbid": "73530fb8-1d18-4bdd-9334-e682b1aec0ca", "wikidata_canonical": "Ndom’a Deccah Grace", "mb_name": "Grace Decca", "mb_sort_name": "Decca, Grace", "mb_disambiguation": "Cameroonian artist", "mb_country": "CM", "mb_type": "Person", "aliases": []} +{"entity_id": "Q27135118", "mbid": "b494cf38-d239-4514-9a3a-0f6cb531c452", "wikidata_canonical": "Helen Parker-Jayne Isibor", "mb_name": "The Venus Bushfires", "mb_sort_name": "Venus Bushfires, The", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q27576297", "mbid": "0748ffcc-16c6-413a-801c-04e57f02369f", "wikidata_canonical": "Bertha Egnos", "mb_name": "Bertha Egnos", "mb_sort_name": "Egnos, Bertha", "mb_disambiguation": null, "mb_country": "ZA", "mb_type": "Person", "aliases": []} +{"entity_id": "Q27656673", "mbid": "716325ce-2df7-4af1-ada2-d6a96be340a0", "wikidata_canonical": "May D", "mb_name": "May D", "mb_sort_name": "May D", "mb_disambiguation": "Nigerian singer", "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Akinmayokun Awodumila", "sort_name": "Awodumila, Akinmayokun", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q27671039", "mbid": "37c6adc6-053d-4dc9-b3ed-ac5a3fccdc90", "wikidata_canonical": "Tweezy", "mb_name": "Tweezy", "mb_sort_name": "Tweezy", "mb_disambiguation": "South African rapper", "mb_country": "ZA", "mb_type": "Person", "aliases": []} +{"entity_id": "Q27830782", "mbid": "a5cdc812-f93e-47ff-8f6d-e53c5c8469e1", "wikidata_canonical": "Chike", "mb_name": "Chike", "mb_sort_name": "Chike", "mb_disambiguation": "Nigerian actor, songwriter and singer", "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Chike", "sort_name": "Chike", "type": "Artist name", "locale": null, "primary": false}, {"name": "Chike Ezekpeazu Osebuka", "sort_name": "Chike Ezekpeazu Osebuka", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q27899052", "mbid": "f02be024-8599-403b-acf4-2dfde734f1c3", "wikidata_canonical": "A-Reece", "mb_name": "A-Reece", "mb_sort_name": "A Reece", "mb_disambiguation": "South African rapper", "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "Lehlogonolo Ronald Mataboge", "sort_name": "Mataboge, Lehlogonolo Ronald", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q28006763", "mbid": "02e8c845-36ca-468c-9300-d06a3a9257b6", "wikidata_canonical": "Reniss", "mb_name": "Reniss", "mb_sort_name": "Reniss", "mb_disambiguation": "Cameroonian singer and songwriter", "mb_country": "CM", "mb_type": "Person", "aliases": []} +{"entity_id": "Q28028794", "mbid": "1de38950-9199-40e7-bcef-645c83aa9c94", "wikidata_canonical": "Aleah Stanbridge", "mb_name": "Aleah", "mb_sort_name": "Aleah", "mb_disambiguation": "Swedish / ex‐South African singer Aleah Liane Stanbridge", "mb_country": "SE", "mb_type": "Person", "aliases": [{"name": "Aleah", "sort_name": "Aleah", "type": "Artist name", "locale": "en", "primary": false}, {"name": "Aleah Liane Stanbridge", "sort_name": "Stanbridge, Aleah Liane", "type": "Artist name", "locale": "en", "primary": false}, {"name": "Aleah Stanbridge", "sort_name": "Stanbridge, Aleah", "type": "Artist name", "locale": "en", "primary": false}, {"name": "Aleah Starbridge", "sort_name": "Starbridge, Aleah", "type": "Artist name", "locale": "en", "primary": false}, {"name": "Julia Liane Stanbridge", "sort_name": "Stanbridge, Julia Liane", "type": "Legal name", "locale": "en", "primary": false}]} +{"entity_id": "Q28039442", "mbid": "a3038b66-7d71-439e-b4be-522c5e8a3779", "wikidata_canonical": "Moneoa Moshesh", "mb_name": "Moneoa Moshesh", "mb_sort_name": "Moneoa Moshesh", "mb_disambiguation": "musical artist", "mb_country": "ZA", "mb_type": "Person", "aliases": []} +{"entity_id": "Q28039448", "mbid": "7d2de86a-8d0f-43d7-8e63-f524d6139c8c", "wikidata_canonical": "LeAnne Dlamini", "mb_name": "LeAnne Dlamini", "mb_sort_name": "Dlamini, LeAnne", "mb_disambiguation": "South African singer", "mb_country": "ZA", "mb_type": "Person", "aliases": []} +{"entity_id": "Q28039875", "mbid": "d8b9e0dd-2d22-49f3-9b19-6440527f1c8b", "wikidata_canonical": "Babes Wodumo", "mb_name": "Babes Wodumo", "mb_sort_name": "Babes Wodumo", "mb_disambiguation": null, "mb_country": "ZA", "mb_type": "Person", "aliases": []} +{"entity_id": "Q28112194", "mbid": "0e68006a-7644-403e-874e-3d378f8551a8", "wikidata_canonical": "Winning Jah", "mb_name": "Winning Jah", "mb_sort_name": "Winning Jah", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Kingsley Eno Osagie", "sort_name": "Osagie, Kingsley Eno", "type": "Legal name", "locale": "it", "primary": true}]} +{"entity_id": "Q28146094", "mbid": "43696104-c1ee-4508-b49c-3338eb9c11a2", "wikidata_canonical": "Ray BLK", "mb_name": "Ray BLK", "mb_sort_name": "BLK, Ray", "mb_disambiguation": null, "mb_country": "GB", "mb_type": "Person", "aliases": [{"name": "RAY BLK", "sort_name": "RAY BLK", "type": "Artist name", "locale": null, "primary": false}, {"name": "Ray Blizzy", "sort_name": "Ray Blizzy", "type": null, "locale": null, "primary": false}, {"name": "Rita Ekwere", "sort_name": "Rita Ekwere", "type": "Legal name", "locale": null, "primary": false}, {"name": "Rita Ifiok Abasi Ekwere", "sort_name": "Rita Ifiok Abasi Ekwere", "type": null, "locale": null, "primary": false}]} +{"entity_id": "Q28180252", "mbid": "246ca6e2-2608-4bd6-8425-746b82dfcb52", "wikidata_canonical": "DeepTouchSA", "mb_name": "DeepTouchSA", "mb_sort_name": "DeepTouchSA", "mb_disambiguation": null, "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "Simbarashe Musingarimi", "sort_name": "Musingarimi, Simbarashe", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q28343685", "mbid": "77e80d96-665e-4d71-ad8f-72c9d99176ad", "wikidata_canonical": "Fancy Gadam", "mb_name": "Fancy Gadam", "mb_sort_name": "Fancy Gadam", "mb_disambiguation": null, "mb_country": null, "mb_type": "Person", "aliases": []} +{"entity_id": "Q28528673", "mbid": "f455dca4-394e-4d2e-92a8-bc46652c193d", "wikidata_canonical": "Nakhane", "mb_name": "Nakhane", "mb_sort_name": "Nakhane", "mb_disambiguation": "South African artist", "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "Nakhane", "sort_name": "Nakhane", "type": "Artist name", "locale": null, "primary": false}, {"name": "Nakhane Toure", "sort_name": "Toure, Nakhane", "type": null, "locale": null, "primary": false}, {"name": "Nakhane Touré", "sort_name": "Touré, Nakhane", "type": null, "locale": null, "primary": false}]} +{"entity_id": "Q28555236", "mbid": "9ae8ca5c-e8d3-4bf5-8947-2d935b44dd7a", "wikidata_canonical": "Abigail Kubeka", "mb_name": "Abigail Kubeka", "mb_sort_name": "Kubeka, Abigail", "mb_disambiguation": null, "mb_country": "ZA", "mb_type": "Person", "aliases": []} +{"entity_id": "Q28555400", "mbid": "4fa729c9-babb-4f11-828b-ecad8a2bcfec", "wikidata_canonical": "Dizzy Dee", "mb_name": "Dizzy Dee", "mb_sort_name": "Dee, Dizzy", "mb_disambiguation": "Zimbabwean Reggae singer-songwriter", "mb_country": "AU", "mb_type": "Person", "aliases": [{"name": "Desire Sibanda", "sort_name": "Desire Sibanda", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q28654904", "mbid": "160d74f7-cc90-4b9b-9150-3440a7a2918e", "wikidata_canonical": "Shekhinah", "mb_name": "Shekhinah", "mb_sort_name": "Shekhinah", "mb_disambiguation": "South African singer", "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "Shekhinah Thandi Donnell", "sort_name": "Donnell, Shekhinah Thandi", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q28839217", "mbid": "ca173ff1-9c83-4b68-9eb0-cfd2679a8b8d", "wikidata_canonical": "Madelaine Petsch", "mb_name": "Madelaine Petsch", "mb_sort_name": "Petsch, Madelaine", "mb_disambiguation": null, "mb_country": "US", "mb_type": "Person", "aliases": []} +{"entity_id": "Q29168524", "mbid": "86a5c686-f1c5-4e4e-87c0-0a1cd64cc012", "wikidata_canonical": "Hope Masike", "mb_name": "Hope Masike", "mb_sort_name": "Masike, Hope", "mb_disambiguation": null, "mb_country": "ZW", "mb_type": "Person", "aliases": [{"name": "Ruvimbo Hope Masike", "sort_name": "Masike, Ruvimbo Hope", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q29313086", "mbid": "b5402cac-a7b1-484f-bfd8-b8e97c6488f3", "wikidata_canonical": "Medikal", "mb_name": "Medikal", "mb_sort_name": "Medikal", "mb_disambiguation": "Ghanian hip hop singer", "mb_country": "GH", "mb_type": "Person", "aliases": [{"name": "Samuel Adu Frimpong", "sort_name": "Frimpong, Samuel Adu", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q29481045", "mbid": "593bee5f-36b9-401d-bbfe-996339961285", "wikidata_canonical": "Nadia Nakai", "mb_name": "Nadia Nakai", "mb_sort_name": "Nadia Nakai", "mb_disambiguation": null, "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "Nadia Nakai Kandava", "sort_name": "Kandava, Nadia Nakai", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q29617769", "mbid": "44d8a9c5-f641-4c00-a925-a0a8d5ba058f", "wikidata_canonical": "Dice Ailes", "mb_name": "Dice Ailes", "mb_sort_name": "Ailes, Dice", "mb_disambiguation": "Nigerian singer", "mb_country": "CA", "mb_type": "Person", "aliases": [{"name": "Shasha Damilola Alesh", "sort_name": "Alesh, Shasha Damilola", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q30006172", "mbid": "59eb2f70-b694-4003-bcfc-cb6fe44999bd", "wikidata_canonical": "Amanda Black", "mb_name": "Amanda Black", "mb_sort_name": "Black, Amanda", "mb_disambiguation": "South African singer-songwriter", "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "Amanda Benedicta Antony", "sort_name": "Antony, Amanda Benedicta", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q30117947", "mbid": "b94a02f2-32f2-450d-a451-a9e0d5ce0943", "wikidata_canonical": "Tony Sunboy", "mb_name": "Tony Sunboy", "mb_sort_name": "Sunboy, Tony", "mb_disambiguation": "Tony Sunshyne", "mb_country": "CM", "mb_type": "Person", "aliases": []} +{"entity_id": "Q30307252", "mbid": "0d99cc9b-2702-43cd-a19e-5d467b473d6e", "wikidata_canonical": "Ssewa Ssewa", "mb_name": "Ssewa Ssewa", "mb_sort_name": "Ssewa Ssewa", "mb_disambiguation": "James Ssewakiryanga Junior", "mb_country": "UG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q30323578", "mbid": "796eb750-c49e-4ea4-b7b5-16e6fc6da8e3", "wikidata_canonical": "Flint Bedrock", "mb_name": "Flint Bedrock", "mb_sort_name": "Bedrock, Flint", "mb_disambiguation": null, "mb_country": "GB", "mb_type": "Person", "aliases": []} +{"entity_id": "Q30567425", "mbid": "8b89b5cf-8680-4940-8d3a-bdc4305e120e", "wikidata_canonical": "CDQ", "mb_name": "CDQ", "mb_sort_name": "CDQ", "mb_disambiguation": null, "mb_country": null, "mb_type": "Person", "aliases": []} +{"entity_id": "Q30596023", "mbid": "4b50ec9e-ea83-4824-8dae-2e520d45e6f9", "wikidata_canonical": "Vagabon", "mb_name": "Vagabon", "mb_sort_name": "Vagabon", "mb_disambiguation": "Cameroonian-American singer-songwriter and multi-instrumentalist", "mb_country": "US", "mb_type": "Person", "aliases": [{"name": "Laetitia Tamko", "sort_name": "Tamko, Laetitia", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q31051346", "mbid": "bc84981d-64e5-4749-bc98-4f1c02acdee3", "wikidata_canonical": "Thando Sikwila", "mb_name": "thndo", "mb_sort_name": "thndo", "mb_disambiguation": "Zimbabwean/Australian singer, songwriter and actor", "mb_country": "AU", "mb_type": "Person", "aliases": [{"name": "Thando", "sort_name": "Thando", "type": null, "locale": null, "primary": false}, {"name": "Thando Sikwila", "sort_name": "Sikwila, Thando", "type": null, "locale": null, "primary": false}, {"name": "Thandolwethu Emily Nomvula Sikwila", "sort_name": "Sikwila, Thandolwethu Emily Nomvula", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q33141631", "mbid": "f06368b7-c8b0-4578-8c64-7a3ed517f745", "wikidata_canonical": "Sho Madjozi", "mb_name": "Sho Madjozi", "mb_sort_name": "Madjozi, Sho", "mb_disambiguation": null, "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "Maya Christinah Xichavo Wegerif", "sort_name": "Wegerif, Maya Christinah Xichavo", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q48774004", "mbid": "de224d2f-13e2-48a2-beb3-538a596cd502", "wikidata_canonical": "Eko Roosevelt", "mb_name": "Eko", "mb_sort_name": "Eko", "mb_disambiguation": "Cameroonian pianist and singer Eko Louis Roosevelt", "mb_country": "CM", "mb_type": "Person", "aliases": [{"name": "Eko Louis Roosevelt", "sort_name": "Roosevelt, Eko Louis", "type": "Legal name", "locale": null, "primary": false}, {"name": "Eko Roosevelt Louis", "sort_name": "Louis, Eko Roosevelt", "type": null, "locale": null, "primary": false}]} +{"entity_id": "Q50414836", "mbid": "71b1bda9-d0e8-468a-8964-62c8d62d8c00", "wikidata_canonical": "Darkovibes", "mb_name": "DarkoVibes", "mb_sort_name": "DarkoVibes", "mb_disambiguation": null, "mb_country": "GH", "mb_type": "Person", "aliases": [{"name": "Paul Nii Amu Andrew Darko", "sort_name": "Darko, Paul Nii Amu Andrew", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q50505948", "mbid": "a2447c0b-f698-4553-a930-b970f57b608a", "wikidata_canonical": "Mwasiti", "mb_name": "Mwasiti", "mb_sort_name": "Mwasiti", "mb_disambiguation": null, "mb_country": "TZ", "mb_type": "Person", "aliases": []} +{"entity_id": "Q50633774", "mbid": "c945656a-2af9-4069-8b67-74793ab3999a", "wikidata_canonical": "Tiwatope Ayodeji", "mb_name": "Cici Tiwa", "mb_sort_name": "Tiwa, Cici", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q50720645", "mbid": "9d79c790-9897-464e-aef0-db5bd3290f00", "wikidata_canonical": "Sampa the Great", "mb_name": "Sampa the Great", "mb_sort_name": "Sampa the Great", "mb_disambiguation": null, "mb_country": "AU", "mb_type": "Person", "aliases": [{"name": "Sampa Tembo", "sort_name": "Tembo, Sampa", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q51385723", "mbid": "997e218b-28b7-4691-9edf-5e7fb5983f89", "wikidata_canonical": "Mlex Songz", "mb_name": "Mlex Songz", "mb_sort_name": "Mlex Songz", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Alex Obeheremen Usiabulu", "sort_name": "Usiabulu, Alex Obeheremen", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q51858630", "mbid": "122a4be4-9c10-4894-995c-c26e790e660c", "wikidata_canonical": "St. Chika", "mb_name": "St. Chika", "mb_sort_name": "St. Chika", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q52219241", "mbid": "97cfb888-e022-4fc0-87c2-a07351f50c78", "wikidata_canonical": "Cina Soul", "mb_name": "Cina Soul", "mb_sort_name": "Cina Soul", "mb_disambiguation": null, "mb_country": null, "mb_type": null, "aliases": []} +{"entity_id": "Q52566539", "mbid": "07b800a1-cd69-4e16-a7f7-02064ecd396b", "wikidata_canonical": "Busiswa", "mb_name": "Busiswa", "mb_sort_name": "Busiswa", "mb_disambiguation": "singer and performance poet", "mb_country": "ZA", "mb_type": "Person", "aliases": []} +{"entity_id": "Q52634149", "mbid": "42f500e9-805f-43e7-8cee-34b12956bfac", "wikidata_canonical": "Petra", "mb_name": "Petra Bockle", "mb_sort_name": "Bockle, Petra", "mb_disambiguation": null, "mb_country": null, "mb_type": "Person", "aliases": []} +{"entity_id": "Q52801612", "mbid": "524f4652-b984-4a71-8328-9f98494060cc", "wikidata_canonical": "Kuami Eugene", "mb_name": "Kuami Eugene", "mb_sort_name": "Kuami Eugene", "mb_disambiguation": null, "mb_country": "GH", "mb_type": "Person", "aliases": []} +{"entity_id": "Q52985936", "mbid": "4118d265-cd4d-4a24-a2c3-6f3376048a0e", "wikidata_canonical": "Allan Watson Waswa", "mb_name": "Allan Watson Waswa", "mb_sort_name": "Waswa, Allan Watson", "mb_disambiguation": null, "mb_country": null, "mb_type": "Person", "aliases": []} +{"entity_id": "Q53836319", "mbid": "d0c5743b-3a8c-494d-b6a1-47ca695d1b61", "wikidata_canonical": "Benjamin Tyamzashe", "mb_name": "Benjamin Tyamzashe", "mb_sort_name": "Tyamzashe, Benjamin", "mb_disambiguation": "hymn composer", "mb_country": "ZA", "mb_type": "Person", "aliases": []} +{"entity_id": "Q54358753", "mbid": "7fe8d501-e105-404b-990b-4733db0b7be5", "wikidata_canonical": "Ayesem", "mb_name": "Ayesem", "mb_sort_name": "Ayesem", "mb_disambiguation": null, "mb_country": null, "mb_type": null, "aliases": []} +{"entity_id": "Q364881", "mbid": "884ee438-f185-4b2c-b23b-f96886bdc91f", "wikidata_canonical": "Trevor Rabin", "mb_name": "Trevor Rabin", "mb_sort_name": "Rabin, Trevor", "mb_disambiguation": "South African musician and score composer", "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "Charles Rabin", "sort_name": "Charles Rabin", "type": "Search hint", "locale": null, "primary": false}, {"name": "Rabin", "sort_name": "Rabin", "type": "Search hint", "locale": null, "primary": false}, {"name": "Trevon Rabin", "sort_name": "Trevon Rabin", "type": "Search hint", "locale": null, "primary": false}, {"name": "Trevor Charles", "sort_name": "Trevor Charles", "type": "Search hint", "locale": null, "primary": false}, {"name": "Trevor Charles Rabin", "sort_name": "Rabin, Trevor Charles", "type": "Legal name", "locale": null, "primary": false}, {"name": "Trevor Rabin", "sort_name": "Rabin, Trevor", "type": "Artist name", "locale": null, "primary": false}, {"name": "Trevor Rabinn", "sort_name": "Trevor Rabinn", "type": "Search hint", "locale": null, "primary": false}, {"name": "Trevor Rabyn", "sort_name": "Trevor Rabyn", "type": "Search hint", "locale": null, "primary": false}, {"name": "Trevor Raebin", "sort_name": "Trevor Raebin", "type": "Search hint", "locale": null, "primary": false}, {"name": "Trevor Robin", "sort_name": "Trevor Robin", "type": "Search hint", "locale": null, "primary": false}, {"name": "Trevor Rubin", "sort_name": "Trevor Rubin", "type": "Search hint", "locale": null, "primary": false}]} +{"entity_id": "Q380147", "mbid": "97aeedc1-f252-4cfa-a8d8-c895c490532f", "wikidata_canonical": "Lucky Dube", "mb_name": "Lucky Dube", "mb_sort_name": "Dube, Lucky", "mb_disambiguation": null, "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "Lucky Philip Dube", "sort_name": "Lucky Philip Dube", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q380381", "mbid": "2fa95b32-3c11-42d7-b495-12fc6be0a024", "wikidata_canonical": "Dave Matthews", "mb_name": "Dave Matthews", "mb_sort_name": "Matthews, Dave", "mb_disambiguation": "of Dave Matthews Band", "mb_country": "US", "mb_type": "Person", "aliases": [{"name": "Dave J. Matthews", "sort_name": "Dave J. Matthews", "type": null, "locale": null, "primary": false}, {"name": "David J. Matthews", "sort_name": "Matthews, David J.", "type": null, "locale": "en", "primary": false}, {"name": "David John Matthews", "sort_name": "Matthews, David John", "type": "Legal name", "locale": null, "primary": false}, {"name": "David Matthews", "sort_name": "Matthews, David", "type": null, "locale": null, "primary": false}]} +{"entity_id": "Q383215", "mbid": "9f7483cf-d8aa-45ce-b90c-da2e359a7815", "wikidata_canonical": "Letta Mbulu", "mb_name": "Letta Mbulu", "mb_sort_name": "Mbulu, Letta", "mb_disambiguation": "South African musician", "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "Letta", "sort_name": "Letta", "type": null, "locale": null, "primary": false}]} +{"entity_id": "Q388729", "mbid": "756335e3-00c1-4094-b878-b28d70477fd2", "wikidata_canonical": "Blondie Chaplin", "mb_name": "Blondie Chaplin", "mb_sort_name": "Chaplin, Blondie", "mb_disambiguation": "singer, guitarist and songwriter", "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "Terence William Chaplin", "sort_name": "Chaplin, Terence William", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q418503", "mbid": "388f57f9-1c2d-4fb1-9176-0b9a78bba9ed", "wikidata_canonical": "Akin Euba", "mb_name": "Akin Euba", "mb_sort_name": "Euba, Akin", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q426950", "mbid": "6253d563-08a8-404e-9336-d3312825827e", "wikidata_canonical": "Robert Calvert", "mb_name": "Robert Calvert", "mb_sort_name": "Calvert, Robert", "mb_disambiguation": "South African-British writer, poet, and musician, lead vocals for Hawkwind", "mb_country": "GB", "mb_type": "Person", "aliases": [{"name": "Bob Calvert", "sort_name": "Bob Calvert", "type": null, "locale": null, "primary": false}, {"name": "Robert Newton Calvert", "sort_name": "Calvert, Robert Newton", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q430407", "mbid": "fbb0fe9c-5d2c-4c94-950b-cc1a1b60f6ac", "wikidata_canonical": "Tessema Eshete", "mb_name": "Tessema Eshete", "mb_sort_name": "Eshete, Tessema", "mb_disambiguation": null, "mb_country": null, "mb_type": null, "aliases": []} +{"entity_id": "Q439028", "mbid": "889693ef-6f88-4f87-8e42-1efa2c673b79", "wikidata_canonical": "Irma", "mb_name": "Irma", "mb_sort_name": "Irma", "mb_disambiguation": "Cameroun/French singer", "mb_country": "FR", "mb_type": "Person", "aliases": [{"name": "Irma Carine Pany", "sort_name": "Pany, Irma Carine", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q439331", "mbid": "054171e2-d157-48ce-9e04-d6b1f075ed5b", "wikidata_canonical": "Mira Calix", "mb_name": "Mira Calix", "mb_sort_name": "Calix, Mira", "mb_disambiguation": null, "mb_country": "GB", "mb_type": "Person", "aliases": [{"name": "Chantal Francesca Passamonte", "sort_name": "Passamonte, Chantal Francesca", "type": "Legal name", "locale": null, "primary": false}, {"name": "Chantal Passamonte", "sort_name": "Passamonte, Chantal", "type": null, "locale": null, "primary": false}]} +{"entity_id": "Q445829", "mbid": "826b488f-5164-45ca-abc4-ab11b3c321eb", "wikidata_canonical": "Manu Dibango", "mb_name": "Manu Dibango", "mb_sort_name": "Dibango, Manu", "mb_disambiguation": null, "mb_country": "CM", "mb_type": "Person", "aliases": [{"name": "Dibango, Manu", "sort_name": "Dibango, Manu", "type": null, "locale": null, "primary": false}, {"name": "Emmanuel N'Djoké Dibango", "sort_name": "Emmanuel N'Djoké Dibango", "type": "Legal name", "locale": null, "primary": false}, {"name": "Manu Dibangu", "sort_name": "Manu Dibangu", "type": null, "locale": null, "primary": false}]} +{"entity_id": "Q448917", "mbid": "1585a80a-4489-4004-adf7-b6629c52c87e", "wikidata_canonical": "Simphiwe Dana", "mb_name": "Simphiwe Dana", "mb_sort_name": "Dana, Simphiwe", "mb_disambiguation": null, "mb_country": "ZA", "mb_type": "Person", "aliases": []} +{"entity_id": "Q455304", "mbid": "7241c957-ae3d-48a2-897d-2e4f11f25cdb", "wikidata_canonical": "Jean Grae", "mb_name": "Tsidi Ibrahim", "mb_sort_name": "Ibrahim, Tsidi", "mb_disambiguation": null, "mb_country": "US", "mb_type": "Person", "aliases": [{"name": "Tsidi A. Ibrahim", "sort_name": "Ibrahim, Tsidi A.", "type": "Legal name", "locale": "en", "primary": false}]} +{"entity_id": "Q457447", "mbid": "424b6f2c-9cb8-40f6-9ee0-d03685659a2a", "wikidata_canonical": "Sally Nyolo", "mb_name": "Sally Nyolo", "mb_sort_name": "Nyolo, Sally", "mb_disambiguation": null, "mb_country": "FR", "mb_type": "Person", "aliases": [{"name": "Solange Nyolo", "sort_name": "Nyolo, Solange", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q458337", "mbid": "d9ac16b0-f873-4454-9e4c-e93e404b696b", "wikidata_canonical": "Yolandi Visser", "mb_name": "¥o-Landi Vi$$er", "mb_sort_name": "Visser, Yolandi", "mb_disambiguation": null, "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "Anica the Snufling", "sort_name": "Anica the Snufling", "type": "Artist name", "locale": null, "primary": false}, {"name": "Anri du Toit", "sort_name": "du Toit, Anri", "type": "Legal name", "locale": null, "primary": false}, {"name": "Neon Demon", "sort_name": "Neon Demon", "type": "Artist name", "locale": null, "primary": false}, {"name": "Yolandi Visser", "sort_name": "Visser, Yolandi", "type": "Artist name", "locale": null, "primary": false}, {"name": "¥O-LANDI VI$$ER", "sort_name": "VI$$ER, ¥O-LANDI", "type": "Artist name", "locale": null, "primary": false}]} +{"entity_id": "Q458985", "mbid": "966e9735-f97c-40b8-b54c-9a9acf8d7c86", "wikidata_canonical": "Dobet Gnahoré", "mb_name": "Dobet Gnahoré", "mb_sort_name": "Gnahoré, Dobet", "mb_disambiguation": null, "mb_country": "CI", "mb_type": "Person", "aliases": []} +{"entity_id": "Q465211", "mbid": "cc48bc25-869e-4cfa-b817-09838976ef36", "wikidata_canonical": "Gigi", "mb_name": "Ejigayehu “Gigi” Shibabaw", "mb_sort_name": "Shibabaw, Ejigayehu “Gigi”", "mb_disambiguation": null, "mb_country": "US", "mb_type": "Person", "aliases": [{"name": "Ejigayehu Shibabaw", "sort_name": "Shibabaw, Ejigayehu", "type": null, "locale": null, "primary": false}, {"name": "Gigi", "sort_name": "Gigi", "type": null, "locale": null, "primary": false}]} +{"entity_id": "Q466741", "mbid": "fd1069ae-f5f5-4ae7-8416-c0d081c6db36", "wikidata_canonical": "Meiway", "mb_name": "Meiway", "mb_sort_name": "Meiway", "mb_disambiguation": "Ivory Coast singer", "mb_country": "CI", "mb_type": "Person", "aliases": [{"name": "Frederic Desire Ehui", "sort_name": "Ehui, Frederic Desire", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q471774", "mbid": "3a4de95b-22f9-4325-afd6-c4d648befcba", "wikidata_canonical": "Ismaël Lô", "mb_name": "Ismaël Lô", "mb_sort_name": "Lô, Ismaël", "mb_disambiguation": null, "mb_country": "SN", "mb_type": "Person", "aliases": [{"name": "Isma l Lo", "sort_name": "Isma l Lo", "type": null, "locale": null, "primary": false}, {"name": "Ismael Lo", "sort_name": "Ismael Lo", "type": null, "locale": null, "primary": false}, {"name": "Ismaël Lo", "sort_name": "Ismaël Lo", "type": null, "locale": null, "primary": false}, {"name": "Iso", "sort_name": "Iso", "type": "Artist name", "locale": null, "primary": false}]} +{"entity_id": "Q519965", "mbid": "2d45bf53-a714-4cb5-8dc8-16e80d4edf76", "wikidata_canonical": "Professor Jay", "mb_name": "Professor Jay", "mb_sort_name": "Professor Jay", "mb_disambiguation": null, "mb_country": "TZ", "mb_type": "Person", "aliases": []} +{"entity_id": "Q522874", "mbid": "dc37528a-4dad-40c9-9cf2-e36ba326606d", "wikidata_canonical": "Busi Mhlongo", "mb_name": "Busi Mhlongo", "mb_sort_name": "Mhlongo, Busi", "mb_disambiguation": null, "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "Vickie", "sort_name": "Vickie", "type": "Artist name", "locale": null, "primary": false}, {"name": "Vicky Mhlongo", "sort_name": "Mhlongo, Vicky", "type": "Artist name", "locale": null, "primary": false}, {"name": "Victoria Busisiwe Mhlongo", "sort_name": "Mhlongo, Victoria Busisiwe", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q529942", "mbid": "fab6adab-b46f-45f8-8700-bc44408ba583", "wikidata_canonical": "Francis Bebey", "mb_name": "Francis Bebey", "mb_sort_name": "Bebey, Francis", "mb_disambiguation": null, "mb_country": "CM", "mb_type": "Person", "aliases": [{"name": "Francis Etonde Bebey", "sort_name": "Etonde Bebey, Francis", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q538748", "mbid": "d82728c3-4908-4386-8252-835bbef4c97c", "wikidata_canonical": "Lebo Mathosa", "mb_name": "Lebo Mathosa", "mb_sort_name": "Mathosa, Lebo", "mb_disambiguation": "South African kwaito singer", "mb_country": "ZA", "mb_type": "Person", "aliases": []} +{"entity_id": "Q539193", "mbid": "f2e3abb3-6b9c-4aaa-a08e-b1fde9528f09", "wikidata_canonical": "Yvonne Chaka Chaka", "mb_name": "Yvonne Chaka Chaka", "mb_sort_name": "Chaka Chaka, Yvonne", "mb_disambiguation": null, "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "Yvonne Chanka Chanka", "sort_name": "Yvonne Chanka Chanka", "type": null, "locale": null, "primary": false}]} +{"entity_id": "Q3510150", "mbid": "3888af8c-2cf2-40f6-9d98-531529418ad4", "wikidata_canonical": "Tunde Nightingale", "mb_name": "Tunde Nightingale", "mb_sort_name": "Tunde Nightingale", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q3511609", "mbid": "4dba3d8a-d94c-4bcc-b611-16166628f7d3", "wikidata_canonical": "Haruna Ishola", "mb_name": "Haruna Ishola", "mb_sort_name": "Ishola, Haruna", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q3524673", "mbid": "f4298cb3-d6c4-4904-a76d-fa21e2ce0f34", "wikidata_canonical": "Thione Seck", "mb_name": "Thione Seck", "mb_sort_name": "Seck, Thione", "mb_disambiguation": null, "mb_country": "SN", "mb_type": "Person", "aliases": [{"name": "Thione Ballago Seck", "sort_name": "Seck, Thione Ballago", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q3546449", "mbid": "dea3360c-501c-4d10-9710-8729f6a50d90", "wikidata_canonical": "Tèshomè Meteku", "mb_name": "Teshome Mitiku", "mb_sort_name": "Mitiku, Teshome", "mb_disambiguation": "Ethiopian singer and saxophonist", "mb_country": "US", "mb_type": "Person", "aliases": [{"name": "Teshome Meteku", "sort_name": "Meteku, Teshome", "type": null, "locale": null, "primary": false}, {"name": "Tèshomè Meteku", "sort_name": "Meteku, Tèshomè", "type": null, "locale": "fr", "primary": true}, {"name": "ተሾመ ምትኩ", "sort_name": "ምትኩ, ተሾመ", "type": null, "locale": "am", "primary": false}]} +{"entity_id": "Q3575123", "mbid": "15233f5e-1763-4418-b8b8-3b5b31595beb", "wikidata_canonical": "Zekuhl", "mb_name": "Zekuhl", "mb_sort_name": "Zekuhl", "mb_disambiguation": null, "mb_country": "CA", "mb_type": "Person", "aliases": [{"name": "Atna Jean Emmanuel Njock", "sort_name": "Njock, Atna Jean Emmanuel", "type": "Legal name", "locale": null, "primary": false}, {"name": "Manu Njock", "sort_name": "Njock, Manu", "type": "Artist name", "locale": null, "primary": false}]} +{"entity_id": "Q3586228", "mbid": "25b0d755-16e6-4ff8-ab4f-7226279019c2", "wikidata_canonical": "Élage Diouf", "mb_name": "Élage Diouf", "mb_sort_name": "Diouf, Élage", "mb_disambiguation": null, "mb_country": "CA", "mb_type": "Person", "aliases": [{"name": "Alhadji Fall Diouf", "sort_name": "Diouf, Alhadji Fall", "type": null, "locale": null, "primary": false}, {"name": "El Hadj Diouf", "sort_name": "Diouf, El Hadj", "type": null, "locale": null, "primary": false}, {"name": "El Hadji Fall Diouf", "sort_name": "Diouf, El Hadji Fall", "type": "Legal name", "locale": null, "primary": false}, {"name": "Élage Diouf", "sort_name": "Diouf, Élage", "type": "Artist name", "locale": null, "primary": false}]} +{"entity_id": "Q3637341", "mbid": "26f887f1-a9e4-46c3-89e6-1e22aa931654", "wikidata_canonical": "Bebe Cool", "mb_name": "Bebe Cool", "mb_sort_name": "Cool, Bebe", "mb_disambiguation": "Ugandan reggae and ragga musician", "mb_country": "UG", "mb_type": "Person", "aliases": [{"name": "Bebe Bunton", "sort_name": "Bebe Bunton", "type": "Artist name", "locale": null, "primary": false}, {"name": "Bebe Cool", "sort_name": "Bebe Cool", "type": "Artist name", "locale": null, "primary": false}, {"name": "Moses Ssali", "sort_name": "Moses Ssali", "type": "Legal name", "locale": null, "primary": false}, {"name": "Ssali Moses Bebe Cool", "sort_name": "Ssali Moses Bebe Cool", "type": null, "locale": null, "primary": false}]} +{"entity_id": "Q3644160", "mbid": "8ed2dbf1-a0cf-4fa3-a72e-13df57b46f69", "wikidata_canonical": "Lira", "mb_name": "Lira", "mb_sort_name": "Lira", "mb_disambiguation": "South African singer", "mb_country": "ZA", "mb_type": "Person", "aliases": []} +{"entity_id": "Q3644382", "mbid": "da662d98-6372-41d6-82e2-3ed0b95b5a75", "wikidata_canonical": "Hendrik Hofmeyr", "mb_name": "Hendrik Hofmeyr", "mb_sort_name": "Hofmeyr, Hendrik", "mb_disambiguation": "composer", "mb_country": "ZA", "mb_type": "Person", "aliases": []} +{"entity_id": "Q3667785", "mbid": "7bda5026-b75a-4025-bd6b-fda416958172", "wikidata_canonical": "Muraina Oyelami", "mb_name": "Muraina Oyelami", "mb_sort_name": "Oyelami, Muraina", "mb_disambiguation": null, "mb_country": null, "mb_type": "Person", "aliases": []} +{"entity_id": "Q3844075", "mbid": "d42f3094-8274-4c56-8c82-30f579bdf648", "wikidata_canonical": "Jimi Mbaye", "mb_name": "Jimi Mbaye", "mb_sort_name": "Mbaye, Jimi", "mb_disambiguation": "guitarist", "mb_country": "SN", "mb_type": "Person", "aliases": []} +{"entity_id": "Q3945157", "mbid": "28607ab6-859f-474d-a085-ef3ec049e420", "wikidata_canonical": "Saka-Acquaye", "mb_name": "Saka Acquaye", "mb_sort_name": "Acquaye, Saka", "mb_disambiguation": null, "mb_country": "GH", "mb_type": "Person", "aliases": []} +{"entity_id": "Q3953554", "mbid": "911c6073-0be3-4b52-91c3-dfe1ca6c1500", "wikidata_canonical": "Sean Daniel Martin", "mb_name": "Sean Martin", "mb_sort_name": "Martin, Sean", "mb_disambiguation": "Sean Daniel Martin", "mb_country": "IT", "mb_type": "Person", "aliases": []} +{"entity_id": "Q4348940", "mbid": "d7878ca7-b760-47c0-a8c3-f6eb0a0223ad", "wikidata_canonical": "Thandiswa Mazwai", "mb_name": "Thandiswa Mazwai", "mb_sort_name": "Mazwai, Thandiswa", "mb_disambiguation": null, "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "Thandiswa", "sort_name": "Thandiswa", "type": null, "locale": null, "primary": false}, {"name": "Thandiswa Nyameka Mazwai", "sort_name": "Mazwai, Thandiswa Nyameka", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q4357891", "mbid": "5c9d0b1c-8441-4049-864a-ab929030fe36", "wikidata_canonical": "Ismaila Sané", "mb_name": "Ismaila Sané", "mb_sort_name": "Sané, Ismaila", "mb_disambiguation": null, "mb_country": "FI", "mb_type": "Person", "aliases": []} +{"entity_id": "Q4646468", "mbid": "eaaae1cd-1307-4e79-8b3f-ba27bf3b9aee", "wikidata_canonical": "9ice", "mb_name": "9ice", "mb_sort_name": "9ice", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Abolore Adegbola Akande", "sort_name": "Abolore Adegbola Akande", "type": null, "locale": null, "primary": false}]} +{"entity_id": "Q4647546", "mbid": "c783dbc7-c1a7-4548-8fb9-195efc79bd85", "wikidata_canonical": "A. B. Crentsil", "mb_name": "A.B. Crentsil", "mb_sort_name": "Crentsil, A.B.", "mb_disambiguation": null, "mb_country": "GH", "mb_type": "Person", "aliases": [{"name": "Alfred Benjamin Crentsil Jr.", "sort_name": "Crentsil Jr, Alfred Benjamin", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q4673664", "mbid": "14ee0a96-0321-4689-b64a-291a972808e7", "wikidata_canonical": "Achieng Abura", "mb_name": "Achieng Abura", "mb_sort_name": "Abura, Achieng", "mb_disambiguation": null, "mb_country": "KE", "mb_type": "Person", "aliases": [{"name": "Lydia Achieng Abura", "sort_name": "Abura, Lydia Achieng", "type": "Legal name", "locale": null, "primary": false}, {"name": "Lydia Achieng Abura", "sort_name": "Abura, Lydia Achieng", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q4682418", "mbid": "f50702ea-21c5-43de-884a-5c516726eba0", "wikidata_canonical": "Adewale Ayuba", "mb_name": "Adewale Ayuba", "mb_sort_name": "Ayuba, Adewale", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q4685692", "mbid": "c397f020-e97b-48e2-8a11-f551b6ada756", "wikidata_canonical": "Melissa Camp", "mb_name": "Adrienne Camp", "mb_sort_name": "Camp, Adrienne", "mb_disambiguation": null, "mb_country": null, "mb_type": "Person", "aliases": []} +{"entity_id": "Q4710814", "mbid": "bc46365a-e217-44cf-8c04-0926971895ab", "wikidata_canonical": "Albert Mazibuko", "mb_name": "Albert Mazibuko", "mb_sort_name": "Mazibuko, Albert", "mb_disambiguation": null, "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "Mdletshe Albert Mazibuko", "sort_name": "Mazibuko, Mdletshe Albert", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q4720649", "mbid": "cda66df2-3463-4015-897e-8ce05050ac6b", "wikidata_canonical": "Shungudzo Kuyimba", "mb_name": "Alexandra Govere", "mb_sort_name": "Govere, Alexandra", "mb_disambiguation": null, "mb_country": null, "mb_type": "Person", "aliases": []} +{"entity_id": "Q4726804", "mbid": "b476b84d-4675-4dbf-b3da-fa45203833c4", "wikidata_canonical": "Alioune Mbaye Nder", "mb_name": "Alioune MBaye Nder", "mb_sort_name": "Nder, Alioune MBaye", "mb_disambiguation": null, "mb_country": "SN", "mb_type": "Person", "aliases": []} +{"entity_id": "Q4739847", "mbid": "6174b040-7b86-4bed-8c39-663a936f8a57", "wikidata_canonical": "Cecilia Wairimu", "mb_name": "Amani", "mb_sort_name": "Amani", "mb_disambiguation": "Kenyan singer and songwriter", "mb_country": null, "mb_type": "Person", "aliases": []} +{"entity_id": "Q4775776", "mbid": "e761a240-d962-4fd2-985e-c0d3bef94ab6", "wikidata_canonical": "Anton Goosen", "mb_name": "Anton Goosen", "mb_sort_name": "Goosen, Anton", "mb_disambiguation": "South African musician and songwriter", "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "Anton Goosen en Dozi", "sort_name": "Anton Goosen en Dozi", "type": null, "locale": null, "primary": false}, {"name": "Anton Lodewyk Goosen", "sort_name": "Goosen, Anton Lodewyk", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q4795338", "mbid": "08f5f4c9-4ac0-4d44-bbe1-8ccfb56dc97b", "wikidata_canonical": "Arnold van Wyk", "mb_name": "Arnold van Wyk", "mb_sort_name": "Wyk, Arnold van", "mb_disambiguation": null, "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "Arnoldus Christiaan Vlok van Wyk", "sort_name": "Wyk, Arnoldus Christiaan Vlok van", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q4801078", "mbid": "28d0a393-4335-4f7d-bb24-13f3bc435424", "wikidata_canonical": "Goldie Harvey", "mb_name": "Goldie Harvey", "mb_sort_name": "Harvey, Goldie", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q4838553", "mbid": "2d8e66ab-3389-41f4-bd9b-691e0f1b9c5d", "wikidata_canonical": "Babá Ken Okulolo", "mb_name": "Babá Ken Okulolo and the Nigerian Brothers", "mb_sort_name": "Babá Ken Okulolo and the Nigerian Brothers", "mb_disambiguation": null, "mb_country": null, "mb_type": null, "aliases": []} +{"entity_id": "Q4851326", "mbid": "7ecde9e9-446e-4487-b7dd-bbf57aa48e74", "wikidata_canonical": "Andrew Ballad Mutale Zulu", "mb_name": "Ballad Zulu", "mb_sort_name": "Zulu, Ballad", "mb_disambiguation": null, "mb_country": "ZM", "mb_type": "Person", "aliases": []} +{"entity_id": "Q4869273", "mbid": "2f5d9fdb-c7ea-4b8e-8bce-d37ab4752a26", "wikidata_canonical": "Batile Alake", "mb_name": "Batile Alake", "mb_sort_name": "Alake, Batile", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Batili Alake", "sort_name": "Alake, Batili", "type": null, "locale": null, "primary": false}]} +{"entity_id": "Q4875441", "mbid": "132f6722-f2c2-4fe6-86a0-5ad21d6a0c7a", "wikidata_canonical": "BeBe Zahara Benet", "mb_name": "BeBe Zahara Benet", "mb_sort_name": "Benet, BeBe Zahara", "mb_disambiguation": null, "mb_country": "US", "mb_type": "Person", "aliases": [{"name": "Nea Marshall Kudi Ngwa", "sort_name": "Ngwa, Nea Marshall Kudi", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q4886438", "mbid": "25bf053c-609f-4523-8a7c-1fedc2ff74e6", "wikidata_canonical": "Ben Sharpa", "mb_name": "Ben Sharpa", "mb_sort_name": "Ben Sharpa", "mb_disambiguation": null, "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "Kgotso Semela", "sort_name": "Semela, Kgotso", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q4926959", "mbid": "290dc7b2-a2f6-4b5b-92c7-f8cf875d057b", "wikidata_canonical": "Blitz the Ambassador", "mb_name": "Blitz the Ambassador", "mb_sort_name": "Blitz the Ambassador", "mb_disambiguation": "Ghanaian-American hip-hop artist", "mb_country": "GH", "mb_type": "Person", "aliases": [{"name": "Blitz", "sort_name": "Blitz", "type": null, "locale": null, "primary": false}, {"name": "Samuel Bazawule", "sort_name": "Bazawule, Samuel", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q4934770", "mbid": "dcd9acd8-ee79-48a4-a7ba-5a4e5022932f", "wikidata_canonical": "Bobby Benson", "mb_name": "Bobby Benson", "mb_sort_name": "Benson, Bobby", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q4936827", "mbid": "747019b6-bc94-4fc8-9ef6-9a3e3ab21502", "wikidata_canonical": "Astrid Assefa", "mb_name": "Astrid Assefa", "mb_sort_name": "Assefa, Astrid", "mb_disambiguation": null, "mb_country": "SE", "mb_type": "Person", "aliases": []} +{"entity_id": "Q4958419", "mbid": "820431d1-d4fc-4f3f-8e13-51dcfe991211", "wikidata_canonical": "Kayo Shekoni", "mb_name": "Kayo", "mb_sort_name": "Kayo", "mb_disambiguation": "Swedish singer", "mb_country": "SE", "mb_type": "Person", "aliases": []} +{"entity_id": "Q4967394", "mbid": "37196c23-ba77-4830-87de-e0eb40b42a16", "wikidata_canonical": "Bright Chimezie", "mb_name": "Bright Chimezie", "mb_sort_name": "Chimezie, Bright", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q4980805", "mbid": "6f2bbf2f-1218-47e2-835b-ace1d21bb12f", "wikidata_canonical": "Brymo", "mb_name": "Brymo", "mb_sort_name": "Brymo", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q5044405", "mbid": "6f4a7731-3a98-46a3-88a6-242acfef876f", "wikidata_canonical": "Carol Jiani", "mb_name": "Carol Jiani", "mb_sort_name": "Jiani, Carol", "mb_disambiguation": null, "mb_country": "GB", "mb_type": "Person", "aliases": []} +{"entity_id": "Q5069763", "mbid": "5391dd5e-12ee-4be4-8246-98e37a8a6335", "wikidata_canonical": "Jose Chameleone", "mb_name": "Jose Chameleone", "mb_sort_name": "Chameleone, Jose", "mb_disambiguation": "Ugandan AfroBeat artist Joseph Mayanja", "mb_country": "UG", "mb_type": "Person", "aliases": [{"name": "Jose Chameleone", "sort_name": "Jose Chameleone", "type": "Artist name", "locale": null, "primary": false}, {"name": "Joseph Mayanja", "sort_name": "Joseph Mayanja", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q5096937", "mbid": "17ebba35-783a-43fc-b5b7-b2559816e0fa", "wikidata_canonical": "Chief Stephen Osita Osadebe", "mb_name": "Chief Stephen Osita Osadebe", "mb_sort_name": "Osadebe, Stephen Osita, Chief", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Chief Stephen Osita Osadeb", "sort_name": "Chief Stephen Osita Osadeb", "type": null, "locale": null, "primary": false}, {"name": "Stephen Osita Osadebe", "sort_name": "Stephen Osita Osadebe", "type": null, "locale": null, "primary": false}]} +{"entity_id": "Q5113640", "mbid": "cbd2fc31-e1ee-492c-a36e-659ff4ccf42e", "wikidata_canonical": "Christy Essien-Igbokwe", "mb_name": "Christy Essien Igbokwe", "mb_sort_name": "Essien Igbokwe, Christy", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Christy Essien", "sort_name": "Essien, Christy", "type": null, "locale": null, "primary": false}, {"name": "Christy Essien-Igbokwe", "sort_name": "Essien-Igbokwe, Christy", "type": null, "locale": null, "primary": false}]} +{"entity_id": "Q5138902", "mbid": "f778274a-a25f-40bf-ac53-4b185345615d", "wikidata_canonical": "Cobhams Asuquo", "mb_name": "Cobhams Asuquo", "mb_sort_name": "Asuquo, Cobhams", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q5207241", "mbid": "2d0271a5-0d90-400b-932a-7fcd14eb3f27", "wikidata_canonical": "Da Grin", "mb_name": "Da Grin", "mb_sort_name": "Da Grin", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Oladapo Olaitan Olaonipekun", "sort_name": "Olaitan Olaonipekun, Oladapo", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q5208023", "mbid": "0b824c3e-2d48-4c8a-9054-e664463a24e9", "wikidata_canonical": "Daddy Owen", "mb_name": "Daddy Owen", "mb_sort_name": "Daddy Owen", "mb_disambiguation": "Kenyan contemporary Christian music artist", "mb_country": null, "mb_type": "Person", "aliases": [{"name": "Owen Mwatia", "sort_name": "Mwatia, Owen", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q5227503", "mbid": "4b3851e1-4c6c-40b3-8a76-be34fd142c99", "wikidata_canonical": "Dataz", "mb_name": "Dataz", "mb_sort_name": "Dataz", "mb_disambiguation": "Tanzanian rapper", "mb_country": "TZ", "mb_type": "Person", "aliases": []} +{"entity_id": "Q5237136", "mbid": "1a0e8fec-d5d3-4d70-a448-b11c067df949", "wikidata_canonical": "David Marks", "mb_name": "David Marks", "mb_sort_name": "Marks, David", "mb_disambiguation": "South African singer, songwriter, producer, et al.", "mb_country": "ZA", "mb_type": "Person", "aliases": []} +{"entity_id": "Q5304552", "mbid": "e759d6f4-b3cd-4202-9a66-37fe9b344dcb", "wikidata_canonical": "Dr Sid", "mb_name": "Dr Sid", "mb_sort_name": "Sid, Dr", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Dr Sid", "sort_name": "Sid, Dr", "type": "Artist name", "locale": null, "primary": false}, {"name": "Sidney Esiri", "sort_name": "Sidney Esiri", "type": "Search hint", "locale": null, "primary": false}, {"name": "Sidney Onoriode Esiri", "sort_name": "Sidney Onoriode Esiri", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q5304553", "mbid": "44103f6a-f5db-4a69-92f3-4b6fa51e4f87", "wikidata_canonical": "Dr Sir Warrior", "mb_name": "Dr. Sir Warrior", "mb_sort_name": "Warrior, Sir, Dr.", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Christogonus Ezebuiro Obinna", "sort_name": "Obinna, Christogonus Ezebuiro", "type": "Legal name", "locale": null, "primary": false}, {"name": "Dr Sir Warrior", "sort_name": "Dr Sir Warrior", "type": null, "locale": null, "primary": false}]} +{"entity_id": "Q5323276", "mbid": "d70a35a5-9883-4694-9ba0-b78c9f98a905", "wikidata_canonical": "eLDee", "mb_name": "elDee", "mb_sort_name": "elDee", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Eldee the Don", "sort_name": "Eldee the Don", "type": null, "locale": null, "primary": false}, {"name": "Lanre Dabiri", "sort_name": "Dabiri, Lanre", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q5347028", "mbid": "01921a39-1090-4e0a-ba91-423fc759e2f5", "wikidata_canonical": "Eedris Abdulkareem", "mb_name": "Eedris Abdulkareem", "mb_sort_name": "Abdulkareem, Eedris", "mb_disambiguation": null, "mb_country": null, "mb_type": "Person", "aliases": []} +{"entity_id": "Q5347655", "mbid": "37349096-c325-42f9-a6fe-7c67e33f2958", "wikidata_canonical": "Efua Baker", "mb_name": "Efua", "mb_sort_name": "Efua", "mb_disambiguation": null, "mb_country": "GB", "mb_type": "Person", "aliases": [{"name": "Efua Ruth Baker", "sort_name": "Baker, Efua Ruth", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q5367109", "mbid": "9ef4c1d2-0b1c-41a7-b0bc-87b658d71001", "wikidata_canonical": "Elom Adablah", "mb_name": "EL", "mb_sort_name": "EL", "mb_disambiguation": "Ghanaian Afrobeats musician and rapper", "mb_country": "GH", "mb_type": "Person", "aliases": [{"name": "E.L", "sort_name": "E.L", "type": null, "locale": null, "primary": false}, {"name": "EL", "sort_name": "EL", "type": "Artist name", "locale": null, "primary": false}, {"name": "Elom Adablah", "sort_name": "Elom Adablah", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q5414996", "mbid": "3b3a3431-a010-4327-a2f3-278e51f49f2f", "wikidata_canonical": "Eva Alordiah", "mb_name": "Eva Alordiah", "mb_sort_name": "Alordiah, Eva", "mb_disambiguation": "Nigerian singer", "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Elohor Eva Alordiah", "sort_name": "Alordiah, Elohor Eva", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q38902387", "mbid": "bbe412f3-9dde-49be-abf4-b233f957a992", "wikidata_canonical": "Harmonize", "mb_name": "Harmonize", "mb_sort_name": "Harmonize", "mb_disambiguation": "Tanzanian musician", "mb_country": "TZ", "mb_type": "Person", "aliases": [{"name": "Hamonize", "sort_name": "Hamonize", "type": "Artist name", "locale": null, "primary": false}, {"name": "Rajab Abdul Kahali", "sort_name": "Rajab Abdul Kahali", "type": "Search hint", "locale": null, "primary": false}, {"name": "Rajabu Abdulkahali Ibrahim", "sort_name": "Rajabu Abdulkahali Ibrahim", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q39054685", "mbid": "54065509-8c69-41e3-968c-01345e49075f", "wikidata_canonical": "Ada Ehi", "mb_name": "Ada Ehi", "mb_sort_name": "Ehi, Ada", "mb_disambiguation": "gospel singer", "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q40914017", "mbid": "028949b5-29f4-4da1-b39a-eb1ab81b8139", "wikidata_canonical": "Ebere Chi", "mb_name": "Ebere Chi", "mb_sort_name": "Ebere Chi", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Mercy Eberechi Uwaka", "sort_name": "Uwaka, Mercy Eberechi", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q41187710", "mbid": "0c620755-1b02-4bf8-afe3-0402a823153a", "wikidata_canonical": "Eno Barony", "mb_name": "Eno Barony", "mb_sort_name": "Barony, Eno", "mb_disambiguation": null, "mb_country": "GH", "mb_type": "Person", "aliases": []} +{"entity_id": "Q41555515", "mbid": "1e8ae15c-2bdb-4542-a9a2-cc91de0b80b0", "wikidata_canonical": "Rayvanny", "mb_name": "Rayvanny", "mb_sort_name": "Rayvanny", "mb_disambiguation": "Raymond Shaban Mwakyusa", "mb_country": "TZ", "mb_type": "Person", "aliases": [{"name": "Raymond Shaban Mwakyusa", "sort_name": "Shaban Mwakyusa, Raymond", "type": "Legal name", "locale": null, "primary": false}, {"name": "Rayvanny", "sort_name": "Rayvanny", "type": "Artist name", "locale": null, "primary": false}]} +{"entity_id": "Q41694090", "mbid": "4643fb4d-f605-4137-ab16-995c586cbc8e", "wikidata_canonical": "Mercy Chinwo-Blessed", "mb_name": "Mercy Chinwo", "mb_sort_name": "Mercy Chinwo", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q42720208", "mbid": "ee601600-ceec-4b41-872d-4ac921f5c6f1", "wikidata_canonical": "Tsehaytu Beraki", "mb_name": "ጽሃይቱ፡በራኺ", "mb_sort_name": "Tsèhaytu Bèraki", "mb_disambiguation": "Eritrean krarist & tigrinay singer", "mb_country": "ER", "mb_type": "Person", "aliases": [{"name": "ጽሃይቱ በራኺ", "sort_name": "ጽሃይቱ በራኺ", "type": null, "locale": null, "primary": false}]} +{"entity_id": "Q44627126", "mbid": "2d27c6b3-b904-40e5-84df-c060348c65f0", "wikidata_canonical": "Renaida Braun", "mb_name": "Renaida", "mb_sort_name": "Renaida", "mb_disambiguation": "Swedish-Tanzanian singer", "mb_country": "SE", "mb_type": "Person", "aliases": [{"name": "Renaida Kebyera Braun", "sort_name": "Braun, Renaida Kebyera", "type": "Legal name", "locale": "en_TZ", "primary": false}]} +{"entity_id": "Q44737083", "mbid": "d2370516-351d-46f9-9dd0-4383011370f6", "wikidata_canonical": "Slim Marion", "mb_name": "Slim Marion", "mb_sort_name": "Slim Marion", "mb_disambiguation": null, "mb_country": "FR", "mb_type": "Person", "aliases": []} +{"entity_id": "Q44953232", "mbid": "ae3b1984-8dc5-4d1e-9087-2c2575192983", "wikidata_canonical": "Tryt", "mb_name": "Tryt", "mb_sort_name": "Tryt", "mb_disambiguation": "Zimbabwean Rapper", "mb_country": "ZW", "mb_type": "Person", "aliases": [{"name": "StyleBoy", "sort_name": "StyleBoy", "type": "Search hint", "locale": null, "primary": false}, {"name": "Terrence Tichapondwa", "sort_name": "Tichapondwa, Terrence", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q45349965", "mbid": "ece0d907-4872-4404-a5b6-502067f23076", "wikidata_canonical": "King Promise", "mb_name": "King Promise", "mb_sort_name": "King Promise", "mb_disambiguation": "Gregory Bortey Newman, Ghanaian singer and songwriter", "mb_country": "GH", "mb_type": "Person", "aliases": [{"name": "Gregory Bortey Newman", "sort_name": "Newman, Gregory Bortey", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q46233612", "mbid": "c34ea418-15cf-4219-b621-f1851ee6a27e", "wikidata_canonical": "Dqueen", "mb_name": "Dqueen", "mb_sort_name": "Dqueen", "mb_disambiguation": "Nigerian reggae artist", "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Adesuwa Omoyeme Obatta", "sort_name": "Obatta, Adesuwa Omoyeme", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q47035383", "mbid": "a211ccff-6931-4022-b572-45a2f2141345", "wikidata_canonical": "Fonyuy Leonard Nsohburinka", "mb_name": "Mr. Leo", "mb_sort_name": "Leo, Mr.", "mb_disambiguation": "Cameroonian Afro-pop musician", "mb_country": "CM", "mb_type": "Person", "aliases": []} +{"entity_id": "Q47151523", "mbid": "437605f9-9c99-40ae-a89e-5034102a0958", "wikidata_canonical": "Lisa-Kaindé Diaz", "mb_name": "Lisa‐Kaindé Díaz", "mb_sort_name": "Díaz, Lisa‐Kaindé", "mb_disambiguation": null, "mb_country": "FR", "mb_type": "Person", "aliases": []} +{"entity_id": "Q47371377", "mbid": "c78acdee-916c-4ad4-a3e3-b382340d7918", "wikidata_canonical": "Daphne", "mb_name": "Daphne", "mb_sort_name": "Daphne", "mb_disambiguation": "Daphne Cameroon", "mb_country": "CM", "mb_type": "Person", "aliases": [{"name": "Daphne Njie Efundem", "sort_name": "Njie Efundem, Daphne", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q47461247", "mbid": "f5c86e27-f5a0-45ba-b0a1-941164469739", "wikidata_canonical": "Rookie SBK", "mb_name": "Rookie SBK", "mb_sort_name": "Rookie SBK", "mb_disambiguation": "Nigerian Singer", "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q547660", "mbid": "61f2ae93-ab59-4c59-aef6-43f5f9afceae", "wikidata_canonical": "Mutt Lange", "mb_name": "Robert John “Mutt” Lange", "mb_sort_name": "Lange, Robert John “Mutt”", "mb_disambiguation": null, "mb_country": "GB", "mb_type": "Person", "aliases": [{"name": "\"Mutt\" Lange", "sort_name": "\"Mutt\" Lange", "type": null, "locale": null, "primary": false}, {"name": "John \"Mutt\" Lange", "sort_name": "John \"Mutt\" Lange", "type": null, "locale": null, "primary": false}, {"name": "John Mutt Lange", "sort_name": "John Mutt Lange", "type": null, "locale": null, "primary": false}, {"name": "John R. Lange", "sort_name": "Lange, John R.", "type": null, "locale": null, "primary": false}, {"name": "Mutt", "sort_name": "Mutt", "type": null, "locale": null, "primary": false}, {"name": "Mutt Lange", "sort_name": "Mutt Lange", "type": null, "locale": null, "primary": false}, {"name": "R. Lange", "sort_name": "Lange, R.", "type": null, "locale": "en", "primary": false}, {"name": "R.J. Lange", "sort_name": "R.J. Lange", "type": null, "locale": null, "primary": false}, {"name": "Robert John Lange", "sort_name": "Lange, Robert John", "type": "Legal name", "locale": "en", "primary": true}]} +{"entity_id": "Q561270", "mbid": "fb808d75-a87a-492c-8ba9-c10a6389abe4", "wikidata_canonical": "Koos du Plessis", "mb_name": "Koos du Plessis", "mb_sort_name": "Plessis, Koos du", "mb_disambiguation": null, "mb_country": "ZA", "mb_type": "Person", "aliases": []} +{"entity_id": "Q561596", "mbid": "961498e7-b097-4341-891d-781235a8aebd", "wikidata_canonical": "Johnny Clegg", "mb_name": "Johnny Clegg", "mb_sort_name": "Clegg, Johnny", "mb_disambiguation": null, "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "Jonathan Paul Clegg", "sort_name": "Clegg, Jonathan Paul", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q575989", "mbid": "0b1e097a-4afa-4e82-b5ef-b49cfcb54927", "wikidata_canonical": "Cheikh Lô", "mb_name": "Cheikh Lô", "mb_sort_name": "Lô, Cheikh", "mb_disambiguation": null, "mb_country": "SN", "mb_type": "Person", "aliases": [{"name": "Cheikh Lo", "sort_name": "Cheikh Lo", "type": null, "locale": null, "primary": false}, {"name": "Cheikh NDigel Lo", "sort_name": "Cheikh NDigel Lo", "type": null, "locale": null, "primary": false}]} +{"entity_id": "Q613413", "mbid": "905d806b-8794-4256-854a-0336a892b03c", "wikidata_canonical": "Chris Chameleon", "mb_name": "Chris Chameleon", "mb_sort_name": "Chameleon, Chris", "mb_disambiguation": null, "mb_country": "ZA", "mb_type": "Person", "aliases": []} +{"entity_id": "Q613471", "mbid": "2b63ea57-8619-4fba-9dff-9a20a1af6cb8", "wikidata_canonical": "Watkin Tudor Jones", "mb_name": "Watkin Tudor Jones", "mb_sort_name": "Jones, Watkin Tudor", "mb_disambiguation": null, "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "Waddy Jones", "sort_name": "Waddy Jones", "type": null, "locale": null, "primary": false}, {"name": "Watkin Tudor Jones Jnr", "sort_name": "Watkin Tudor Jones Jnr", "type": null, "locale": null, "primary": false}, {"name": "Watkin Tudor Jones, Jr.", "sort_name": "Watkin Tudor Jones, Jr.", "type": null, "locale": null, "primary": false}]} +{"entity_id": "Q716053", "mbid": "7147eef1-7c2f-4259-89e5-572c76dc16e5", "wikidata_canonical": "J.R. Rotem", "mb_name": "Jonathan “J.R.” Rotem", "mb_sort_name": "Rotem, Jonathan “J.R.”", "mb_disambiguation": null, "mb_country": "US", "mb_type": "Person", "aliases": [{"name": "J. R. Rotem", "sort_name": "J. R. Rotem", "type": "Search hint", "locale": null, "primary": false}, {"name": "J. Rotem", "sort_name": "J. Rotem", "type": "Search hint", "locale": null, "primary": false}, {"name": "J.R. Rotem", "sort_name": "J.R. Rotem", "type": "Search hint", "locale": null, "primary": false}, {"name": "Jonathan JR Rotem", "sort_name": "Jonathan JR Rotem", "type": "Search hint", "locale": null, "primary": false}, {"name": "Jonathan Reuven Rotem", "sort_name": "Rotem, Jonathan Reuven", "type": "Legal name", "locale": null, "primary": false}, {"name": "Jonathan Rotem", "sort_name": "Jonathan Rotem", "type": "Search hint", "locale": null, "primary": false}, {"name": "Jonathan “J.R.” Rotem", "sort_name": "Jonathan “J.R.” Rotem", "type": "Search hint", "locale": null, "primary": false}]} +{"entity_id": "Q717159", "mbid": "66ccfea3-a7da-4d70-8a79-e490efa28798", "wikidata_canonical": "Louis Moholo", "mb_name": "Louis Moholo", "mb_sort_name": "Moholo, Louis", "mb_disambiguation": null, "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "Loius Moholo-Moholo", "sort_name": "Loius Moholo-Moholo", "type": null, "locale": null, "primary": false}, {"name": "Louis Moholo-Moholo", "sort_name": "Louis Moholo-Moholo", "type": null, "locale": null, "primary": false}]} +{"entity_id": "Q724255", "mbid": "9dcca4a2-2e05-4f94-9a02-cb97b1beed56", "wikidata_canonical": "Kenna", "mb_name": "Kenna", "mb_sort_name": "Kenna", "mb_disambiguation": "Ethiopian-born American musician Kenna Zemedkun", "mb_country": "US", "mb_type": "Person", "aliases": [{"name": "KNA", "sort_name": "KNA", "type": null, "locale": null, "primary": false}, {"name": "Kenna Zemedkun", "sort_name": "Zemedkun, Kenna", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q5458212", "mbid": "25a7bad5-dc39-446f-ad04-ea9b6dc5fe32", "wikidata_canonical": "Flavour", "mb_name": "Flavour N'abania", "mb_sort_name": "N'abania, Flavour", "mb_disambiguation": "Chinedu Okoli", "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Chinedu Okoli", "sort_name": "Okoli Chinedu", "type": "Legal name", "locale": null, "primary": false}, {"name": "Flavour", "sort_name": "Flavour", "type": "Artist name", "locale": null, "primary": false}, {"name": "Flavour N'abania", "sort_name": "Flavour N'abania", "type": "Search hint", "locale": null, "primary": false}]} +{"entity_id": "Q5533114", "mbid": "0e940ca2-82f1-438f-9fc0-21639e960065", "wikidata_canonical": "Genevieve Waite", "mb_name": "Geneviève Waïte", "mb_sort_name": "Waïte, Geneviève", "mb_disambiguation": null, "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "Geneviève Waile", "sort_name": "Geneviève Waile", "type": null, "locale": null, "primary": false}]} +{"entity_id": "Q5734832", "mbid": "4bcef1aa-7ea9-44b9-926d-6593965bd4cd", "wikidata_canonical": "Herbert Kretzmer", "mb_name": "Herbert Kretzmer", "mb_sort_name": "Kretzmer, Herbert", "mb_disambiguation": null, "mb_country": "GB", "mb_type": "Person", "aliases": []} +{"entity_id": "Q5761489", "mbid": "f42551c6-28bd-4537-b55c-3b287f1ccf7f", "wikidata_canonical": "Hilda Tloubatla", "mb_name": "Hilda Tloubatla", "mb_sort_name": "Tloubatla, Hilda", "mb_disambiguation": null, "mb_country": "ZA", "mb_type": "Person", "aliases": []} +{"entity_id": "Q5767912", "mbid": "36b47aca-c378-4f7f-b4a8-9cb2ccb81dc1", "wikidata_canonical": "Hip Hop Pantsula", "mb_name": "Hip Hop Pantsula", "mb_sort_name": "Hip Hop Pantsula", "mb_disambiguation": "South African Motswako rapper Jabulani Tsambo", "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "HHP", "sort_name": "HHP", "type": "Search hint", "locale": null, "primary": false}]} +{"entity_id": "Q5905042", "mbid": "bc4b3d3a-bfdb-4400-8616-cf2d5692f6eb", "wikidata_canonical": "Steve Kekana", "mb_name": "Steve Kekana", "mb_sort_name": "Kekana, Steve", "mb_disambiguation": null, "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "Tebogo Stephen Kekana", "sort_name": "Kekana, Tebogo Stephen", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q5984748", "mbid": "b457e829-aae4-40a1-b290-d63cb209da04", "wikidata_canonical": "Ibrahim Sylla", "mb_name": "Ibrahima Sylla", "mb_sort_name": "Sylla, Ibrahima", "mb_disambiguation": null, "mb_country": "SN", "mb_type": "Person", "aliases": []} +{"entity_id": "Q5985341", "mbid": "83468752-0a35-4d9b-91d3-5e2544a816b0", "wikidata_canonical": "Ice Prince", "mb_name": "Ice Prince", "mb_sort_name": "Ice Prince", "mb_disambiguation": "Nigerian hip hop artist Panshak Zamani", "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Ice Prince", "sort_name": "Ice Prince", "type": "Artist name", "locale": null, "primary": false}, {"name": "Panshak Henry Zamani", "sort_name": "Panshak Henry Zamani", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q6075178", "mbid": "c36a4bee-bf9e-410a-a020-ad6ea2f696cb", "wikidata_canonical": "Iryn Namubiru", "mb_name": "Iryn Namubiru", "mb_sort_name": "Namubiru, Iryn", "mb_disambiguation": null, "mb_country": "UG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q6108846", "mbid": "7b674b02-fabe-481c-8d87-22ccdcf74e45", "wikidata_canonical": "JR Bogopa", "mb_name": "JR", "mb_sort_name": "JR", "mb_disambiguation": "South African Hip-Hop artist Tabure Thabo Bogopa Junior", "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "JR (SA)", "sort_name": "JR (SA)", "type": "Search hint", "locale": null, "primary": false}, {"name": "JR Bogopa", "sort_name": "JR Bogopa", "type": "Search hint", "locale": null, "primary": false}, {"name": "JRafrika", "sort_name": "JRafrika", "type": "Search hint", "locale": null, "primary": false}, {"name": "Tabure Thabo Bogopa", "sort_name": "Bogopa, Tabure Thabo", "type": "Legal name", "locale": null, "primary": false}, {"name": "Thabo Bogopa", "sort_name": "Thabo Bogopa", "type": "Search hint", "locale": null, "primary": false}]} +{"entity_id": "Q6211073", "mbid": "42899eed-710e-440a-85cf-04bd207bd14f", "wikidata_canonical": "Joe Mafela", "mb_name": "Joe Mafela", "mb_sort_name": "Mafela, Joe", "mb_disambiguation": null, "mb_country": "ZA", "mb_type": "Person", "aliases": []} +{"entity_id": "Q6226728", "mbid": "99eb2652-7e55-4f05-96f0-c7b1580a8107", "wikidata_canonical": "John Collins", "mb_name": "John Collins", "mb_sort_name": "Collins, John", "mb_disambiguation": "Ghanaian musician", "mb_country": "GH", "mb_type": "Person", "aliases": []} +{"entity_id": "Q6279998", "mbid": "adff8fcd-3659-40f2-91e9-41b8bd3aee2b", "wikidata_canonical": "Josef Marais", "mb_name": "Josef Marais", "mb_sort_name": "Marais, Josef", "mb_disambiguation": "South African singer, songwriter", "mb_country": "US", "mb_type": "Person", "aliases": [{"name": "Joseph Pessach", "sort_name": "Pessach, Joseph", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q6298712", "mbid": "6f8f8d62-f84e-4363-8683-571bd3f19c89", "wikidata_canonical": "Jua Cali", "mb_name": "Jua Cali", "mb_sort_name": "Jua Cali", "mb_disambiguation": null, "mb_country": "KE", "mb_type": "Person", "aliases": []} +{"entity_id": "Q6323333", "mbid": "0b11004f-3b38-45c1-9ccb-7a69666d2fd3", "wikidata_canonical": "Alhaji Kwabena Frimpong", "mb_name": "Alhaji K. Frimpong", "mb_sort_name": "Frimpong, Alhaji K.", "mb_disambiguation": "Ghanaian highlife singer", "mb_country": "GH", "mb_type": "Person", "aliases": [{"name": "Alhaji K. Frimpong", "sort_name": "Alhaji K. Frimpong", "type": null, "locale": null, "primary": false}]} +{"entity_id": "Q6370860", "mbid": "084dda37-ce6d-4d93-a629-50cf1e6cc2c1", "wikidata_canonical": "Karin Kortje", "mb_name": "Karin Kortje", "mb_sort_name": "Kortje, Karin", "mb_disambiguation": null, "mb_country": "ZA", "mb_type": "Person", "aliases": []} +{"entity_id": "Q6381846", "mbid": "d2c1559a-29d2-4698-960a-72e7115f126f", "wikidata_canonical": "Kaïssa", "mb_name": "Kaïssa", "mb_sort_name": "Kaïssa", "mb_disambiguation": null, "mb_country": "CM", "mb_type": "Person", "aliases": [{"name": "Kaïssa Doumbé", "sort_name": "Doumbé, Kaïssa", "type": null, "locale": null, "primary": false}]} +{"entity_id": "Q6386129", "mbid": "3ab1477d-4103-4356-8a37-473a2cedfa7e", "wikidata_canonical": "Kelly Khumalo", "mb_name": "Kelly Khumalo", "mb_sort_name": "Kelly Khumalo", "mb_disambiguation": null, "mb_country": null, "mb_type": "Person", "aliases": []} +{"entity_id": "Q6397797", "mbid": "cfda6cc2-7eb3-42be-bb01-d2ff9f50d43c", "wikidata_canonical": "Kevin Wyre", "mb_name": "Wyre", "mb_sort_name": "Wyre", "mb_disambiguation": null, "mb_country": "KE", "mb_type": "Person", "aliases": [{"name": "Kevin Waire", "sort_name": "Waire, Kevin", "type": "Legal name", "locale": null, "primary": false}, {"name": "Lovechild", "sort_name": "Lovechild", "type": "Artist name", "locale": null, "primary": false}]} +{"entity_id": "Q6430491", "mbid": "51a5e85c-85b7-4cfd-82b0-2d8f815f2efc", "wikidata_canonical": "Koo Nimo", "mb_name": "Koo Nimo", "mb_sort_name": "Nimo, Koo", "mb_disambiguation": null, "mb_country": "GH", "mb_type": "Person", "aliases": [{"name": "Daniel Amponsah", "sort_name": "Daniel Amponsah", "type": null, "locale": null, "primary": false}, {"name": "Kwabena Boa-Amponsem", "sort_name": "Kwabena Boa-Amponsem", "type": null, "locale": null, "primary": false}]} +{"entity_id": "Q6471947", "mbid": "c1897096-0202-4dc2-a3db-e3976166b880", "wikidata_canonical": "Lagbaja", "mb_name": "Lágbájá", "mb_sort_name": "Lágbájá", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "'Bisade Ologunde", "sort_name": "'Bisade Ologunde", "type": "Legal name", "locale": null, "primary": false}, {"name": "ASCAP", "sort_name": "ASCAP", "type": "Artist name", "locale": null, "primary": false}, {"name": "Bisade Ologunde", "sort_name": "Bisade Ologunde", "type": "Legal name", "locale": null, "primary": false}, {"name": "Langbaja", "sort_name": "Langbaja", "type": "Search hint", "locale": null, "primary": false}]} +{"entity_id": "Q6523491", "mbid": "dba1acd5-baa3-40f7-90a2-2a20ce3ca4d0", "wikidata_canonical": "K'millian", "mb_name": "K'Millian", "mb_sort_name": "K'Millian", "mb_disambiguation": "Zambian R&B Hip Hop Artist Leo Moyo", "mb_country": "ZM", "mb_type": "Person", "aliases": [{"name": "K'Million", "sort_name": "K'Million", "type": null, "locale": null, "primary": false}]} +{"entity_id": "Q6692305", "mbid": "3e4722f2-892c-41a6-b380-447d2a3c13d9", "wikidata_canonical": "Lovemore Majaivana", "mb_name": "Lovemore Majaivana", "mb_sort_name": "Lovemore Majaivana", "mb_disambiguation": null, "mb_country": null, "mb_type": null, "aliases": []} +{"entity_id": "Q6712192", "mbid": "bfe2ae79-d0fe-463f-87b2-bbc4a3ab0cc2", "wikidata_canonical": "M.I Abaga", "mb_name": "M.I. Abaga", "mb_sort_name": "M.I. Abaga", "mb_disambiguation": "Nigerian rapper", "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "M.I", "sort_name": "M.I", "type": null, "locale": null, "primary": false}, {"name": "M.I Abaga", "sort_name": "M.I Abaga", "type": null, "locale": null, "primary": false}, {"name": "M.I.", "sort_name": "M.I.", "type": null, "locale": null, "primary": false}, {"name": "Mr Incredible", "sort_name": "Incredible, \"Mr\"", "type": "Artist name", "locale": null, "primary": false}]} +{"entity_id": "Q6713451", "mbid": "c68b0d91-26ad-4945-bfea-b16ce3bbfbc0", "wikidata_canonical": "M.anifest", "mb_name": "M.anifest", "mb_sort_name": "M.anifest", "mb_disambiguation": "Hybrid Hip-Hop artist from Accra merging Hip-Hop and African vibes", "mb_country": "GH", "mb_type": "Person", "aliases": [{"name": "Kwame Ametepee Tsikata", "sort_name": "Tsikata, Kwame Ametepee", "type": "Legal name", "locale": null, "primary": false}, {"name": "Kwame Tsikata", "sort_name": "Kwame Tsikata", "type": null, "locale": null, "primary": false}]} +{"entity_id": "Q6776373", "mbid": "0499e713-4ee8-476c-94dd-cb989efbeb7d", "wikidata_canonical": "Martin Phike", "mb_name": "Martin PK", "mb_sort_name": "PK, Martin", "mb_disambiguation": "gospel singer", "mb_country": "ZA", "mb_type": "Person", "aliases": []} +{"entity_id": "Q6796228", "mbid": "51720b5e-ec6e-4fdc-9b77-d5a3ccd354ed", "wikidata_canonical": "May7ven", "mb_name": "May7ven", "mb_sort_name": "May7ven", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q6799750", "mbid": "4d9ad9a7-0737-4ff3-81c0-eb12117daf76", "wikidata_canonical": "Mbongeni Ngema", "mb_name": "Mbongeni Ngema", "mb_sort_name": "Ngema, Mbongeni", "mb_disambiguation": null, "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "Israel Mbongeni Ngema", "sort_name": "Ngema, Israel Mbongeni", "type": "Legal name", "locale": null, "primary": false}, {"name": "Mbogeni Ngema", "sort_name": "Mbogeni Ngema", "type": null, "locale": null, "primary": false}]} +{"entity_id": "Q6935557", "mbid": "ae544086-5024-40fa-a882-aedd01c03397", "wikidata_canonical": "Muna", "mb_name": "Muna", "mb_sort_name": "Muna", "mb_disambiguation": "Muna (rapper) - Nigerian rapper/hip hop artist", "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Munachi Abii", "sort_name": "Abii, Munachi", "type": "Artist name", "locale": "en_NG", "primary": false}]} +{"entity_id": "Q6958125", "mbid": "57364cbc-d56e-4b67-a34d-d718a757d127", "wikidata_canonical": "Naeto C", "mb_name": "Naeto C", "mb_sort_name": "C, Naeto", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Naetochukwu Chikwe", "sort_name": "Chikwe, Naetochukwu", "type": "Legal name", "locale": null, "primary": false}, {"name": "Neato C", "sort_name": "Neato C", "type": null, "locale": null, "primary": false}]} +{"entity_id": "Q6966853", "mbid": "389d05a1-3b64-4d67-bfa8-622b5948558b", "wikidata_canonical": "Nashil Pichen", "mb_name": "Nashil Pitchen Kazembe", "mb_sort_name": "Kazembe, Nashil Pitchen", "mb_disambiguation": null, "mb_country": "ZM", "mb_type": "Person", "aliases": [{"name": "Nashil Pichen", "sort_name": "Pichen, Nashil", "type": null, "locale": null, "primary": false}, {"name": "Nashil Pichenb Kazembe", "sort_name": "Nashil Pichenb Kazembe", "type": null, "locale": null, "primary": false}, {"name": "Nashill Pitchen Kazembe", "sort_name": "Kazembe, Nashill Pitchen", "type": null, "locale": null, "primary": false}]} +{"entity_id": "Q6968395", "mbid": "2762d714-f4a5-4a8c-be49-8b93a9b8587c", "wikidata_canonical": "Nataniël", "mb_name": "Nataniël", "mb_sort_name": "Nataniël", "mb_disambiguation": "South African singer, TV presenter and author", "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "Nataniël le Roux", "sort_name": "Le Roux, Nataniël", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q7002140", "mbid": "a2c6295d-9d30-4c28-9621-d7e7bdc17431", "wikidata_canonical": "Doomams", "mb_name": "Doomams", "mb_sort_name": "Doomams", "mb_disambiguation": "French rapper", "mb_country": "FR", "mb_type": "Person", "aliases": []} +{"entity_id": "Q7028768", "mbid": "41af9d3a-8ae8-4b73-8e7b-cba95483cfc1", "wikidata_canonical": "Nico Carstens", "mb_name": "Nico Carstens", "mb_sort_name": "Carstens, Nico", "mb_disambiguation": "accordionist and composer", "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "Nicolaas Cornelius Carstens", "sort_name": "Carstens, Nicolaas Cornelius", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q7049430", "mbid": "5219f88b-9360-4c6a-8b56-fd6feea8a1cc", "wikidata_canonical": "Nonini", "mb_name": "Nonini", "mb_sort_name": "Nonini", "mb_disambiguation": null, "mb_country": null, "mb_type": "Person", "aliases": [{"name": "Nonini Mgenge2Tru", "sort_name": "Nonini Mgenge2Tru", "type": null, "locale": null, "primary": false}]} +{"entity_id": "Q7074993", "mbid": "b303cdda-6d6e-4041-9569-8274197a62fb", "wikidata_canonical": "Obiwon", "mb_name": "Obiwon", "mb_sort_name": "Obiwon", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Obiora Nwokolobia-Agu", "sort_name": "Nwokolobia-Agu, Obiora", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q7088835", "mbid": "e6ada169-71ae-4fec-bfd0-e0b9aaa8603b", "wikidata_canonical": "Olugbenga Adelekan", "mb_name": "Gbenga Adelekan", "mb_sort_name": "Adelekan, Gbenga", "mb_disambiguation": null, "mb_country": "GB", "mb_type": "Person", "aliases": [{"name": "Olugbenga Adelekan", "sort_name": "Adelekan, Olugbenga", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q7103150", "mbid": "abd26bac-8051-4e6b-a9e8-fcc2860fa233", "wikidata_canonical": "Orlando Owoh", "mb_name": "Dr. Orlando Owoh", "mb_sort_name": "Owomoyela Oladipupo", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q7119483", "mbid": "58cc9dcb-767a-488f-b07d-299635c74274", "wikidata_canonical": "PJ Powers", "mb_name": "P.J. Powers", "mb_sort_name": "Powers, P.J.", "mb_disambiguation": "South African singer", "mb_country": "ZA", "mb_type": "Person", "aliases": []} +{"entity_id": "Q7183599", "mbid": "eb3a82ad-7f60-4452-9e15-5117da6801b3", "wikidata_canonical": "Philip Gbeho", "mb_name": "Philip Gbeho", "mb_sort_name": "Gbeho, Philip", "mb_disambiguation": null, "mb_country": "GH", "mb_type": "Person", "aliases": []} +{"entity_id": "Q7242524", "mbid": "70a2d072-b90a-449d-9990-6416a402b418", "wikidata_canonical": "Priaulx Rainier", "mb_name": "Priaulx Rainier", "mb_sort_name": "Rainier, Priaulx", "mb_disambiguation": null, "mb_country": "GB", "mb_type": "Person", "aliases": []} +{"entity_id": "Q7320503", "mbid": "7edc4fa0-32eb-4a53-88b4-1b804b39fee5", "wikidata_canonical": "Rhian Benson", "mb_name": "Rhian Benson", "mb_sort_name": "Benson, Rhian", "mb_disambiguation": null, "mb_country": "GH", "mb_type": "Person", "aliases": []} +{"entity_id": "Q7352226", "mbid": "b5e5e81e-6a8e-4b26-a59e-4c5fe6d3e49b", "wikidata_canonical": "Robin Auld", "mb_name": "Robin Auld", "mb_sort_name": "Auld, Robin", "mb_disambiguation": null, "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "Robin Morton Auld", "sort_name": "Auld, Robin Morton", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q55584913", "mbid": "4d475f90-b106-4267-8af3-cdc291b2e1eb", "wikidata_canonical": "Ric Hassani", "mb_name": "Ric Hassani", "mb_sort_name": "Ric Hassani", "mb_disambiguation": "Nigerian singer Ikechukwu Eric Ahiauzu", "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q55759635", "mbid": "a384ca56-b618-40de-8e2c-bba254eef29e", "wikidata_canonical": "Tobechukwu Victor Okoh", "mb_name": "Peruzzi", "mb_sort_name": "Peruzzi", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Peruzzi", "sort_name": "Peruzzi", "type": "Artist name", "locale": null, "primary": false}, {"name": "Tobechukwu Victor Okoh", "sort_name": "Tobechukwu Victor Okoh", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q56065009", "mbid": "0efcd9c5-4c89-4a74-bbce-173d96402c6a", "wikidata_canonical": "Mr Real", "mb_name": "Mr Real", "mb_sort_name": "Mr Real", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Mr Real", "sort_name": "Mr Real", "type": "Artist name", "locale": null, "primary": false}, {"name": "Okafor Uchenna Victor", "sort_name": "Okafor Uchenna Victor", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q56217083", "mbid": "6b64f895-7ea9-4b39-b206-be8fffb0121d", "wikidata_canonical": "Mic Burner", "mb_name": "Mic Burner", "mb_sort_name": "Mic Burner", "mb_disambiguation": "Zambian rapper Michael Mandona", "mb_country": "ZM", "mb_type": "Person", "aliases": []} +{"entity_id": "Q56224088", "mbid": "33e65895-20b4-4bb4-b7dd-338ffcb1cb8a", "wikidata_canonical": "John Ighodaro", "mb_name": "Johnny Drille", "mb_sort_name": "Drille, Johnny", "mb_disambiguation": "Nigerian singer-songwriter", "mb_country": null, "mb_type": "Person", "aliases": [{"name": "John Ighodaro", "sort_name": "Ighodaro John", "type": "Legal name", "locale": null, "primary": false}, {"name": "Johnny Drille", "sort_name": "Johnny Drille", "type": "Artist name", "locale": null, "primary": false}]} +{"entity_id": "Q56513324", "mbid": "07ab04d4-bdbc-4c93-bfb2-457693a4ff94", "wikidata_canonical": "Sheck Wes", "mb_name": "Sheck Wes", "mb_sort_name": "Sheck Wes", "mb_disambiguation": "rapper, on Cactus Jack Records and G.O.O.D. Music", "mb_country": "US", "mb_type": "Person", "aliases": [{"name": "Khadimou Fall", "sort_name": "Khadimou Fall", "type": "Search hint", "locale": null, "primary": false}, {"name": "Khadimoul Rassoul Cheikh Fall", "sort_name": "Fall, Khadimoul Rassoul Cheikh", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q58301979", "mbid": "b738ddfc-6f9d-4c46-8bee-92ba871f421e", "wikidata_canonical": "Teni", "mb_name": "Teni", "mb_sort_name": "Teni", "mb_disambiguation": "Nigerian singer, songwriter and entertainer.", "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Teniola Apata", "sort_name": "Apata, Teniola", "type": "Legal name", "locale": null, "primary": false}, {"name": "Teniola Apata", "sort_name": "Teniola Apata", "type": "Legal name", "locale": null, "primary": false}, {"name": "Teniola ‘Teni’ Apata", "sort_name": "Teniola ‘Teni’ Apata", "type": "Artist name", "locale": null, "primary": false}]} +{"entity_id": "Q58303488", "mbid": "0a1c9fb8-7c3a-458d-ab0e-749f8e079de5", "wikidata_canonical": "Kwesi Arthur", "mb_name": "Kwesi Arthur", "mb_sort_name": "Kwesi Arthur", "mb_disambiguation": "Ghanaian rapper, singer and songwriter", "mb_country": "GH", "mb_type": "Person", "aliases": [{"name": "Emmanuel Kwesi Danso Arthur", "sort_name": "Arthur, Emmanuel Kwesi Danso", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q58806824", "mbid": "d79c2397-7e0c-47f4-bfe6-e49ccfdf8445", "wikidata_canonical": "Wendy Shay", "mb_name": "Wendy Shay", "mb_sort_name": "Wendy Shay", "mb_disambiguation": null, "mb_country": "GH", "mb_type": "Person", "aliases": []} +{"entity_id": "Q59655841", "mbid": "d21cd4a3-279b-45ed-98ee-588c1f37a470", "wikidata_canonical": "Mayorkun", "mb_name": "Mayorkun", "mb_sort_name": "Mayorkun", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Adewale Mayowa Emmanuel", "sort_name": "Adewale Mayowa Emmanuel", "type": "Legal name", "locale": null, "primary": false}, {"name": "Mayorkun", "sort_name": "Mayorkun", "type": "Artist name", "locale": null, "primary": false}]} +{"entity_id": "Q59693026", "mbid": "e1c5c6f1-1f4f-4ad3-9094-e588519e6ec2", "wikidata_canonical": "Zoro", "mb_name": "Zoro Swagbag", "mb_sort_name": "Zoro", "mb_disambiguation": "Owoh Chimaobi Chrismathner", "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q60286763", "mbid": "b43d8f22-f265-4745-b9d7-0f863304b510", "wikidata_canonical": "Amerado", "mb_name": "Amerado", "mb_sort_name": "Amerado", "mb_disambiguation": null, "mb_country": "GH", "mb_type": "Person", "aliases": []} +{"entity_id": "Q60524021", "mbid": "6b4e962d-3dbc-4bda-82f0-25d35786f076", "wikidata_canonical": "Ecca Vandal", "mb_name": "Ecca Vandal", "mb_sort_name": "Vandal, Ecca", "mb_disambiguation": "Melbourne alt-rock singer/rapper", "mb_country": "AU", "mb_type": "Person", "aliases": []} +{"entity_id": "Q60836183", "mbid": "249f3780-1a08-4d31-bbde-f524d1cf9ce3", "wikidata_canonical": "Muthoni Drummer Queen", "mb_name": "Muthoni Drummer Queen", "mb_sort_name": "Muthoni Drummer Queen", "mb_disambiguation": "Kenyan rapper, drummer and cultural entrepreneur", "mb_country": "KE", "mb_type": "Person", "aliases": [{"name": "MDQ", "sort_name": "MDQ", "type": "Search hint", "locale": null, "primary": false}, {"name": "Muthoni", "sort_name": "Muthoni", "type": null, "locale": null, "primary": false}, {"name": "Muthoni Ndonga", "sort_name": "Ndonga, Muthoni", "type": "Legal name", "locale": null, "primary": false}, {"name": "Muthoni the Drummer Queen", "sort_name": "Muthoni the Drummer Queen", "type": "Artist name", "locale": null, "primary": false}]} +{"entity_id": "Q61082024", "mbid": "5c2b697c-2952-4b98-a3ef-45d1deb8289b", "wikidata_canonical": "Jux", "mb_name": "Jux", "mb_sort_name": "Jux", "mb_disambiguation": null, "mb_country": "TZ", "mb_type": "Person", "aliases": []} +{"entity_id": "Q61467100", "mbid": "f25585f0-37b7-413e-ba7d-b5b7b898a813", "wikidata_canonical": "Tim Godfrey", "mb_name": "Tim Godfrey", "mb_sort_name": "Godfrey, Tim", "mb_disambiguation": "gospel singer", "mb_country": "US", "mb_type": "Person", "aliases": []} +{"entity_id": "Q61746862", "mbid": "2f75ab54-9326-4e4b-835c-db38fe0de988", "wikidata_canonical": "Moonchild Sanelly", "mb_name": "Moonchild Sanelly", "mb_sort_name": "Moonchild Sanelly", "mb_disambiguation": null, "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "Sanelisiwe Twisha", "sort_name": "Twisha, Sanelisiwe", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q63107626", "mbid": "57b0a5a0-3eb5-45a8-82bb-962c95b44716", "wikidata_canonical": "Small Doctor", "mb_name": "SmallDoctor", "mb_sort_name": "Small Doctor", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q64009108", "mbid": "233f6da8-ad25-42e1-ad6a-81a3a4bfc194", "wikidata_canonical": "Mereba", "mb_name": "Mereba", "mb_sort_name": "Mereba", "mb_disambiguation": "Marian Azeb Mereba", "mb_country": "US", "mb_type": "Person", "aliases": [{"name": "Marian Mereba", "sort_name": "Mereba, Marian", "type": "Legal name", "locale": null, "primary": false}, {"name": "Mereba", "sort_name": "Mereba", "type": null, "locale": null, "primary": false}]} +{"entity_id": "Q64010220", "mbid": "bbaab51a-fac2-4995-8119-8f2b45bc3b4a", "wikidata_canonical": "Zlatan Ibile", "mb_name": "Zlatan", "mb_sort_name": "Zlatan", "mb_disambiguation": "Nigerian afrobeat/rap artist", "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Omoniyi Temidayo Raphael", "sort_name": "Omoniyi Temidayo Raphael", "type": "Legal name", "locale": null, "primary": false}, {"name": "Zlatan", "sort_name": "Zlatan", "type": "Artist name", "locale": null, "primary": false}]} +{"entity_id": "Q64364745", "mbid": "1c3bd0a7-3323-4619-b76d-6d3a3dc2b1d4", "wikidata_canonical": "Rhymz", "mb_name": "Rhymz", "mb_sort_name": "Rhymz", "mb_disambiguation": null, "mb_country": null, "mb_type": "Person", "aliases": []} +{"entity_id": "Q64374971", "mbid": "cc81ed60-b0d9-4348-a8cc-eb2d0ca98447", "wikidata_canonical": "Dizasta Vina", "mb_name": "Dizasta Vina", "mb_sort_name": "Dizasta Vina", "mb_disambiguation": "Tanzanian rapper and record producer", "mb_country": "TZ", "mb_type": "Person", "aliases": [{"name": "Edger Vicent Mwaipeta", "sort_name": "Mwaipeta, Edger Vicent", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q64627824", "mbid": "755a2e24-de97-4fa8-ad81-1fafe79c2a4a", "wikidata_canonical": "Gemini Orleans", "mb_name": "Gemini Orleans", "mb_sort_name": "Gemini Orleans", "mb_disambiguation": "Ghanaian rapper Victor Mawuli Orleans-Fiaka", "mb_country": "GH", "mb_type": "Person", "aliases": []} +{"entity_id": "Q64729746", "mbid": "437b356d-88f1-4dde-af5e-dec1c9d7dde4", "wikidata_canonical": "Orville Peck", "mb_name": "Orville Peck", "mb_sort_name": "Peck, Orville", "mb_disambiguation": null, "mb_country": "US", "mb_type": "Person", "aliases": []} +{"entity_id": "Q64745647", "mbid": "96338645-d3db-4a59-a238-16f4ea43f4f3", "wikidata_canonical": "Ladipoe", "mb_name": "LADIPOE", "mb_sort_name": "LADIPOE", "mb_disambiguation": "Ladipoe Eso, Nigerian Rapper", "mb_country": null, "mb_type": "Person", "aliases": [{"name": "Ladipo Eso", "sort_name": "Eso, Ladipo", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q64746249", "mbid": "23370dbd-6d98-4bd1-a2c1-a9fd1167110b", "wikidata_canonical": "Mlindo the Vocalist", "mb_name": "Mlindo the Vocalist", "mb_sort_name": "Mlindo the Vocalist", "mb_disambiguation": null, "mb_country": "ZA", "mb_type": "Person", "aliases": []} +{"entity_id": "Q65071082", "mbid": "d2981120-8ac4-48c4-a979-18f2d48a96f9", "wikidata_canonical": "Rema", "mb_name": "Rema", "mb_sort_name": "Rema", "mb_disambiguation": "Nigerian singer and rapper", "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Divine Ikubor", "sort_name": "Divine Ikubor", "type": "Search hint", "locale": null, "primary": false}, {"name": "Divine Joshua Ikubor", "sort_name": "Divine Joshua Ikubor", "type": "Legal name", "locale": null, "primary": false}, {"name": "Rema", "sort_name": "Rema", "type": "Artist name", "locale": null, "primary": false}]} +{"entity_id": "Q65509006", "mbid": "54c73832-5780-4b98-9e5d-3c210d123fd9", "wikidata_canonical": "Lamisi", "mb_name": "Lamisi", "mb_sort_name": "Lamisi", "mb_disambiguation": "Ghanaian singer and songwriter", "mb_country": "GH", "mb_type": "Person", "aliases": [{"name": "Regina Lamisi Awiniman Anabilla Akuka", "sort_name": "Akuka, Regina Lamisi Awiniman Anabilla", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q65532709", "mbid": "4414ea57-08c2-49d9-bd19-d4e81868d555", "wikidata_canonical": "Monelle", "mb_name": "Monelle", "mb_sort_name": "Monelle", "mb_disambiguation": "Neo-Soul/R&B singer and songwriter, published author and poet.", "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "Floëme", "sort_name": "Floeme", "type": "Artist name", "locale": null, "primary": false}, {"name": "Khumo Mminele", "sort_name": "Mminele, Khumo", "type": "Legal name", "locale": null, "primary": false}, {"name": "Khutsang Khumo Mminele", "sort_name": "Mminele, Khutsang", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q65665679", "mbid": "a89582b4-a0af-4820-b25a-5150042c172a", "wikidata_canonical": "Maurixxin", "mb_name": "Maurixxin", "mb_sort_name": "Maurixxin", "mb_disambiguation": "Formerly E.M.S and Maurice A God", "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "A God", "sort_name": "A God", "type": "Search hint", "locale": null, "primary": false}, {"name": "E.M.S", "sort_name": "E.M.S", "type": "Artist name", "locale": null, "primary": false}, {"name": "Eloka", "sort_name": "Eloka", "type": "Search hint", "locale": null, "primary": false}, {"name": "God", "sort_name": "God", "type": "Search hint", "locale": null, "primary": false}, {"name": "Lil Maurice", "sort_name": "Lil Maurice", "type": "Artist name", "locale": null, "primary": false}, {"name": "MAG", "sort_name": "MAG", "type": "Search hint", "locale": null, "primary": false}, {"name": "Maurice", "sort_name": "Maurice", "type": "Search hint", "locale": null, "primary": false}, {"name": "Maurice A God", "sort_name": "Maurice A God", "type": "Artist name", "locale": null, "primary": false}, {"name": "Maurice E.S. Okeoma", "sort_name": "Maurice E.S. Okeoma", "type": "Search hint", "locale": null, "primary": false}, {"name": "Maurice ES Okeoma", "sort_name": "Maurice ES Okeoma", "type": "Search hint", "locale": null, "primary": false}, {"name": "Maurice Eloka Okeoma", "sort_name": "Maurice Eloka Okeoma", "type": "Search hint", "locale": null, "primary": false}, {"name": "Maurice Eloka Soye Okeoma", "sort_name": "Okeoma, Maurice Eloka Soye", "type": "Legal name", "locale": null, "primary": false}, {"name": "Maurice Okeoma", "sort_name": "Maurice Okeoma", "type": "Search hint", "locale": null, "primary": false}, {"name": "Maurice Soye Okeoma", "sort_name": "Maurice Soye Okeoma", "type": "Search hint", "locale": null, "primary": false}, {"name": "Maurixxin", "sort_name": "Maurixxin", "type": "Artist name", "locale": null, "primary": false}, {"name": "Soye", "sort_name": "Soye", "type": "Search hint", "locale": null, "primary": false}]} +{"entity_id": "Q66069869", "mbid": "382e47c5-fd95-4643-83af-db87a2304c1d", "wikidata_canonical": "T.K. Mathabela", "mb_name": "OGK4Lyf", "mb_sort_name": "OGK4Lyf", "mb_disambiguation": null, "mb_country": "ZA", "mb_type": "Person", "aliases": []} +{"entity_id": "Q66305342", "mbid": "5a0a9f9f-a029-4a8b-a49c-856ecae0be61", "wikidata_canonical": "Miraboi", "mb_name": "Miraboi", "mb_sort_name": "Miraboi", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q66693072", "mbid": "0dc49473-5a5a-4def-aba7-e02b0ded3bae", "wikidata_canonical": "Eugy", "mb_name": "Eugy Official", "mb_sort_name": "Eugy Official", "mb_disambiguation": "Ghanaian-British singer, rapper, and songwriter", "mb_country": "GB", "mb_type": "Person", "aliases": [{"name": "Eugene Entsir", "sort_name": "Entsir, Eugene", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q66736561", "mbid": "42ecbc24-420b-4c38-aea2-5650ee37921c", "wikidata_canonical": "Nkodo Sitony", "mb_name": "Nkodo Si-Tony", "mb_sort_name": "Si-Tony, Nkodo", "mb_disambiguation": null, "mb_country": "CM", "mb_type": "Person", "aliases": [{"name": "Nkodo Si Tobi François", "sort_name": "Si Tobi François, Nkodo", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q67180082", "mbid": "038d1b94-46da-4332-b380-6da0c2350c97", "wikidata_canonical": "Katlego Maboe", "mb_name": "Katlego Maboe", "mb_sort_name": "Maboe, Katlego", "mb_disambiguation": "South African", "mb_country": null, "mb_type": null, "aliases": []} +{"entity_id": "Q67222718", "mbid": "f5cc1ab7-a1fc-4ef2-beae-5c5507699b17", "wikidata_canonical": "Blaqbonez", "mb_name": "Blaqbonez", "mb_sort_name": "Blaqbonez", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Blaqbonez", "sort_name": "Blaqbonez", "type": "Artist name", "locale": null, "primary": false}, {"name": "Emeka Akumefule", "sort_name": "Emeka Akumefule", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q72759173", "mbid": "5b2a8faa-ffee-4706-a1a8-58f109bc8ca2", "wikidata_canonical": "Tems", "mb_name": "Tems", "mb_sort_name": "Tems", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Temilade Openiyi", "sort_name": "Openiyi, Temilade", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q714", "mbid": "85db5120-7b1d-4b18-be06-630840398fbc", "wikidata_canonical": "Stevie Wonder", "mb_name": "Eivets Rednow", "mb_sort_name": "Rednow, Eivets", "mb_disambiguation": null, "mb_country": null, "mb_type": "Person", "aliases": []} +{"entity_id": "Q32849", "mbid": "1138a764-2212-4d0a-b02d-0dc14df91e08", "wikidata_canonical": "Q32849", "mb_name": "Akon", "mb_sort_name": "Akon", "mb_disambiguation": "US singer and producer", "mb_country": "SN", "mb_type": "Person", "aliases": [{"name": "Aliaume Damala Badara Akon Thiam", "sort_name": "Thiam, Aliaume Damala Badara Akon", "type": "Legal name", "locale": null, "primary": false}, {"name": "Aliaune Thiam", "sort_name": "Thiam, Aliaune", "type": "Artist name", "locale": null, "primary": false}, {"name": "Aliaune “Akon” Thiam", "sort_name": "Thiam, Aliaune “Akon”", "type": "Artist name", "locale": null, "primary": false}]} +{"entity_id": "Q64494", "mbid": "d290ca9b-4a12-4dae-96c7-863356a93f26", "wikidata_canonical": "Bébé Manga", "mb_name": "Bébé Manga", "mb_sort_name": "Manga, Bébé", "mb_disambiguation": null, "mb_country": "CM", "mb_type": "Person", "aliases": []} +{"entity_id": "Q86105", "mbid": "506aa5b0-c6fb-4a69-8dd3-f06a369d5abc", "wikidata_canonical": "Howard Carpendale", "mb_name": "Howard Carpendale", "mb_sort_name": "Carpendale, Howard", "mb_disambiguation": null, "mb_country": "DE", "mb_type": "Person", "aliases": [{"name": "Howard Capendale", "sort_name": "Howard Capendale", "type": null, "locale": null, "primary": false}, {"name": "Howard Carppendale", "sort_name": "Howard Carppendale", "type": null, "locale": null, "primary": false}, {"name": "Springbock", "sort_name": "Springbock", "type": null, "locale": null, "primary": false}]} +{"entity_id": "Q737403", "mbid": "1b54f3c7-ed24-4fd0-be86-bd2a669850a3", "wikidata_canonical": "Reggie Rockstone", "mb_name": "Reggie Rockstone", "mb_sort_name": "Rockstone, Reggie", "mb_disambiguation": null, "mb_country": "GH", "mb_type": "Person", "aliases": []} +{"entity_id": "Q775883", "mbid": "746e59cc-37d8-4152-abff-6569d209c3c6", "wikidata_canonical": "Solomon Linda", "mb_name": "Solomon Linda", "mb_sort_name": "Linda, Solomon", "mb_disambiguation": null, "mb_country": "ZA", "mb_type": "Person", "aliases": []} +{"entity_id": "Q816860", "mbid": "536e001d-e78f-4026-ba46-34d028e0e6ff", "wikidata_canonical": "Pa Odiase", "mb_name": "Benedict Elide Odiase", "mb_sort_name": "Odiase, Benedict Elide", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "B. E. Odiase", "sort_name": "B. E. Odiase", "type": null, "locale": null, "primary": false}, {"name": "Ben E. Odiase", "sort_name": "Odiase, Ben E.", "type": "Artist name", "locale": null, "primary": false}, {"name": "Benedict Elide Odiase", "sort_name": "Odiase, Benedict Elide", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q854935", "mbid": "1c1c5264-ab73-4af4-84a0-ceb18b928f30", "wikidata_canonical": "Bheki Mseleku", "mb_name": "Bheki Mseleku", "mb_sort_name": "Mseleku, Bheki", "mb_disambiguation": null, "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "Bhekumuzi Hyacinth Mseleku", "sort_name": "Mseleku, Bhekumuzi Hyacinth", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q901829", "mbid": "463e38a9-94e1-4d37-b890-868b44cb54d9", "wikidata_canonical": "Danny K", "mb_name": "Danny K", "mb_sort_name": "Danny K", "mb_disambiguation": "South African Pop-R&B singer", "mb_country": "ZA", "mb_type": "Person", "aliases": []} +{"entity_id": "Q916743", "mbid": "29641117-f908-4fa4-9240-92b959bb3eed", "wikidata_canonical": "Ray Phiri", "mb_name": "Chikapa “Ray” Phiri", "mb_sort_name": "Phiri, Chikapa “Ray”", "mb_disambiguation": null, "mb_country": "ZA", "mb_type": "Person", "aliases": []} +{"entity_id": "Q935241", "mbid": "caee69a4-7f3d-40f4-9857-b5cdad222f7e", "wikidata_canonical": "DJ Arafat", "mb_name": "DJ Arafat", "mb_sort_name": "DJ Arafat", "mb_disambiguation": "Ivorian DJ and singer", "mb_country": "CI", "mb_type": "Person", "aliases": [{"name": "Ange Didier Houon", "sort_name": "Houon, Ange Didier", "type": "Legal name", "locale": null, "primary": false}, {"name": "Arafat Muana", "sort_name": "Arafat Muana", "type": "Search hint", "locale": null, "primary": false}, {"name": "Commandant Zabra", "sort_name": "Commandant Zabra", "type": "Search hint", "locale": null, "primary": false}, {"name": "Le Roi du Coupé-décalé", "sort_name": "Le Roi du Coupé-décalé", "type": "Search hint", "locale": null, "primary": false}, {"name": "Sao Tao le Dictateur", "sort_name": "Sao Tao le Dictateur", "type": "Search hint", "locale": null, "primary": false}, {"name": "Yôrôbô", "sort_name": "Yôrôbô", "type": "Search hint", "locale": null, "primary": false}]} +{"entity_id": "Q944365", "mbid": "6e1d2796-ab2b-4ed4-8cfa-1b7214a9adf9", "wikidata_canonical": "D'banj", "mb_name": "D’banj", "mb_sort_name": "D’banj", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Oladapo Daniel Oyebanjo", "sort_name": "Oyebanjo, Oladapo Daniel", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q965420", "mbid": "ebee757e-48d6-4403-827f-7a36b107e674", "wikidata_canonical": "J. H. Kwabena Nketia", "mb_name": "J. H. Kwabena Nketia", "mb_sort_name": "Kwabena Nketia, J. H.", "mb_disambiguation": null, "mb_country": "GH", "mb_type": "Person", "aliases": []} +{"entity_id": "Q971620", "mbid": "3950381a-1b0e-4761-8890-2013d17ad85b", "wikidata_canonical": "Jonas Gwangwa", "mb_name": "Jonas Gwangwa", "mb_sort_name": "Gwangwa, Jonas", "mb_disambiguation": null, "mb_country": "ZA", "mb_type": "Person", "aliases": []} +{"entity_id": "Q982678", "mbid": "3e110caa-e9e8-4c33-98dc-ebbf0c6d2494", "wikidata_canonical": "King Sunny Adé", "mb_name": "King Sunny Adé", "mb_sort_name": "Ade, King Sunny", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q982872", "mbid": "702d2b90-eef0-4354-b2c4-6366eba92b7f", "wikidata_canonical": "Femi Kuti", "mb_name": "Femi Kuti", "mb_sort_name": "Kuti, Femi", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Femi Anikulap Kuti", "sort_name": "Femi Anikulap Kuti", "type": null, "locale": null, "primary": false}, {"name": "Femi Anikulapo-Kuti", "sort_name": "Femi Anikulapo-Kuti", "type": null, "locale": null, "primary": false}, {"name": "Olufela Olufemi Anikulapo Kuti", "sort_name": "Olufela Olufemi Anikulapo Kuti", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q7367866", "mbid": "5e5465c8-b597-4f92-a150-6859973a1d28", "wikidata_canonical": "Rose Mhando", "mb_name": "Rose Muhando", "mb_sort_name": "Rose Muhando", "mb_disambiguation": "Gospel singer from Tanzania", "mb_country": "TZ", "mb_type": "Person", "aliases": []} +{"entity_id": "Q7378568", "mbid": "7f9f419a-57c3-449f-b4f7-fbadceb88a15", "wikidata_canonical": "Ruggedman", "mb_name": "Ruggedman", "mb_sort_name": "Ruggedman", "mb_disambiguation": "Nigerian rapper", "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q7395791", "mbid": "41ae80e2-3e5f-4a1b-bc45-373fb8a1927f", "wikidata_canonical": "Saba Saba", "mb_name": "Saba Saba", "mb_sort_name": "Saba Saba", "mb_disambiguation": "Uganda", "mb_country": null, "mb_type": "Person", "aliases": [{"name": "Alex Kirya", "sort_name": "Kirya, Alex", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q7409469", "mbid": "36a6d6af-58c2-4dc0-9c62-beb4241f7d40", "wikidata_canonical": "Samini", "mb_name": "Samini", "mb_sort_name": "Samini", "mb_disambiguation": "Ghanaian artist", "mb_country": "GH", "mb_type": "Person", "aliases": [{"name": "Batman", "sort_name": "Batman", "type": null, "locale": null, "primary": false}, {"name": "Batman Samini", "sort_name": "Batman Samini", "type": "Artist name", "locale": null, "primary": false}]} +{"entity_id": "Q7424230", "mbid": "6f937dd2-1aa8-49ce-9052-8127714db3d2", "wikidata_canonical": "Sarkodie", "mb_name": "Sarkodie", "mb_sort_name": "Sarkodie", "mb_disambiguation": null, "mb_country": "GH", "mb_type": "Person", "aliases": [{"name": "Michael Owusu Addo", "sort_name": "Addo, Michael Owusu", "type": "Legal name", "locale": null, "primary": false}, {"name": "Sarkodie", "sort_name": "Sarkodie", "type": "Artist name", "locale": null, "primary": false}]} +{"entity_id": "Q7564718", "mbid": "ac5ddc32-2a45-4c63-bf6c-ba53fce6fa61", "wikidata_canonical": "Sound Sultan", "mb_name": "Sound Sultan", "mb_sort_name": "Sound Sultan", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Olanrewaju Abdul-Ganiu Fasasi", "sort_name": "Fasasi, Olanrewaju Abdul-Ganiu", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q7607054", "mbid": "bd8b9a0f-c063-48d5-996c-8b1cada8a778", "wikidata_canonical": "Stella Damasus", "mb_name": "Stella Damasus", "mb_sort_name": "Stella Damasus", "mb_disambiguation": "Nigerian R&B and soul singer", "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q7659705", "mbid": "78a32141-e325-49e7-ac65-ee030db5bff8", "wikidata_canonical": "Syd Kitchen", "mb_name": "Syd Kitchen", "mb_sort_name": "Kitchen, Syd", "mb_disambiguation": null, "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "Sydney Stanley Kitchen", "sort_name": "Kitchen, Sydney Stanley", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q7793393", "mbid": "c8e592b1-cf7b-42a2-bbff-1e966cb4e56b", "wikidata_canonical": "Thomas Rajna", "mb_name": "Thomas Rajna", "mb_sort_name": "Rajna, Thomas", "mb_disambiguation": null, "mb_country": "HU", "mb_type": "Person", "aliases": [{"name": "T. Rajna", "sort_name": "T. Rajna", "type": null, "locale": null, "primary": false}]} +{"entity_id": "Q7804587", "mbid": "f483e8a0-baca-427a-b1c3-b06752ab88cf", "wikidata_canonical": "Timaya", "mb_name": "Timaya", "mb_sort_name": "Timaya", "mb_disambiguation": "Nigerian singer Inetimi Timaya Odon", "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Inetimi Alfred Odon", "sort_name": "Inetimi Alfred Odon", "type": "Legal name", "locale": null, "primary": false}, {"name": "Timaya", "sort_name": "Timaya", "type": "Artist name", "locale": null, "primary": false}]} +{"entity_id": "Q7808395", "mbid": "83f2dbd7-e0cd-4664-8b8c-4a32e5df3936", "wikidata_canonical": "Tinny", "mb_name": "Tinny", "mb_sort_name": "Tinny", "mb_disambiguation": "Ghanaian vocalist", "mb_country": "GH", "mb_type": "Person", "aliases": [{"name": "Nii Addo Quaynor", "sort_name": "Quaynor, Nii Addo", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q7810465", "mbid": "9d9f7ce8-e1cf-4413-b2c9-b90b69bc17f6", "wikidata_canonical": "Tiwa Savage", "mb_name": "Tiwa Savage", "mb_sort_name": "Savage, Tiwa", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Tiwa Savage", "sort_name": "Tiwa Savage", "type": "Artist name", "locale": null, "primary": false}, {"name": "Tiwatope Omolara Savage", "sort_name": "Tiwatope Omolara Savage", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q7852623", "mbid": "d6cd6ee7-9fd7-4a49-abe7-0ea8f51ab20b", "wikidata_canonical": "Tumi Molekane", "mb_name": "Stogie T", "mb_sort_name": "Stogie T", "mb_disambiguation": null, "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "Stogie T", "sort_name": "Stogie T", "type": "Artist name", "locale": null, "primary": false}, {"name": "Tumi Molekane", "sort_name": "Tumi Molekane", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q7917787", "mbid": "70522781-f802-4f4a-a24a-d02460d569fc", "wikidata_canonical": "Vector the Viper", "mb_name": "Vector", "mb_sort_name": "Vector", "mb_disambiguation": "Nigerian rapper, singer, songwriter, actor and philosopher", "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Olanrewaju Ogunmefun", "sort_name": "Ogunmefun Olanrewaju", "type": "Legal name", "locale": null, "primary": false}, {"name": "Vector", "sort_name": "Vector", "type": "Artist name", "locale": null, "primary": false}, {"name": "Vector Tha Viper", "sort_name": "Vector Tha Viper", "type": null, "locale": null, "primary": false}]} +{"entity_id": "Q7926410", "mbid": "a77f26ec-ec08-40dc-bc22-aeec8ce7c610", "wikidata_canonical": "Victor Uwaifo", "mb_name": "Victor Uwaifo", "mb_sort_name": "Uwaifo, Victor", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Sir Victor Uwaifo", "sort_name": "Uwaifo, Sir Victor", "type": "Artist name", "locale": null, "primary": false}, {"name": "Victor Efosa Uwaifo", "sort_name": "Uwaifo, Victor Efosa", "type": "Legal name", "locale": null, "primary": false}, {"name": "Victor Uwaifo", "sort_name": "Victor Uwaifo", "type": null, "locale": null, "primary": false}]} +{"entity_id": "Q7967172", "mbid": "fd32fe8c-2592-44de-84c8-daf40a4e017a", "wikidata_canonical": "Wande Coal", "mb_name": "Wande Coal", "mb_sort_name": "Wande Coal", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Oluwatobi Wande Ojosipe", "sort_name": "Oluwatobi Wande Ojosipe", "type": "Legal name", "locale": null, "primary": false}, {"name": "Wande Coal", "sort_name": "Wande Coal", "type": "Artist name", "locale": null, "primary": false}]} +{"entity_id": "Q7970692", "mbid": "d7729872-9b7f-4273-88c2-335ad0f61dda", "wikidata_canonical": "Warrick Sony", "mb_name": "Kalahari Surfers", "mb_sort_name": "Kalahari Surfers", "mb_disambiguation": null, "mb_country": "ZA", "mb_type": "Group", "aliases": []} +{"entity_id": "Q7980319", "mbid": "8740661f-e60a-4b79-99d9-dfa5ace9c4ef", "wikidata_canonical": "Weird MC", "mb_name": "Weird MC", "mb_sort_name": "MC, Weird", "mb_disambiguation": "A Nigerian rapper and songwriter", "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q8016354", "mbid": "53dd0229-8a42-4bd7-8ffb-29bdec25e9c6", "wikidata_canonical": "William Onyeabor", "mb_name": "William Onyeabor", "mb_sort_name": "Onyeabor, William", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q8073797", "mbid": "439f9f44-80a1-4b64-b94a-a127a7795dd6", "wikidata_canonical": "Zombo", "mb_name": "Zombo", "mb_sort_name": "Zombo", "mb_disambiguation": "South African singer, songwriter & music producer Tebogo Ndlovu", "mb_country": "ZA", "mb_type": "Person", "aliases": []} +{"entity_id": "Q8401922", "mbid": "1f9bda46-50d5-43ba-aa06-d2ba467a60ee", "wikidata_canonical": "Patrice Wilson", "mb_name": "Patrice Wilson", "mb_sort_name": "Wilson, Patrice", "mb_disambiguation": null, "mb_country": "US", "mb_type": "Person", "aliases": [{"name": "Patrice Iteke Wilson", "sort_name": "Wilson, Patrice Iteke", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q9029227", "mbid": "6fa65b14-7064-41b8-b9a5-b3c803c93120", "wikidata_canonical": "Marita Napier", "mb_name": "Marita Napier", "mb_sort_name": "Napier, Marita", "mb_disambiguation": null, "mb_country": "ZA", "mb_type": "Person", "aliases": []} +{"entity_id": "Q81848231", "mbid": "bf82380b-efc2-473a-a9d3-4d087ce0feb0", "wikidata_canonical": "Naira Marley", "mb_name": "Naira Marley", "mb_sort_name": "Marley, Naira", "mb_disambiguation": "Nigerian-British singer, songwriter and rapper.", "mb_country": "GB", "mb_type": "Person", "aliases": [{"name": "Azeez Adeshina Fashola", "sort_name": "Azeez Adeshina Fashola", "type": "Legal name", "locale": null, "primary": false}, {"name": "Naira Marley", "sort_name": "Naira Marley", "type": "Artist name", "locale": null, "primary": false}]} +{"entity_id": "Q82759301", "mbid": "4d09a017-4e09-47a7-b274-a7e0767ac4e0", "wikidata_canonical": "Fireboy DML", "mb_name": "Fireboy DML", "mb_sort_name": "Fireboy DML", "mb_disambiguation": "Nigerian musician", "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Adedamola Adefolahan", "sort_name": "Adedamola Adefolahan", "type": "Search hint", "locale": null, "primary": false}, {"name": "Adedamola Oyinlola Adefolahan", "sort_name": "Adedamola Oyinlola Adefolahan", "type": "Legal name", "locale": null, "primary": false}, {"name": "Fireboy DML", "sort_name": "Fireboy DML", "type": "Artist name", "locale": null, "primary": false}]} +{"entity_id": "Q83492370", "mbid": "2eabb579-9ade-48e3-b263-b2aa9d9ba271", "wikidata_canonical": "Vonenzo Baschello", "mb_name": "Vonenzo Baschello", "mb_sort_name": "Baschello, Vonenzo", "mb_disambiguation": null, "mb_country": "ZA", "mb_type": "Character", "aliases": [{"name": "Vaughn Wesley Cunningham", "sort_name": "Cunningham, Vaughn Wesley", "type": "Legal name", "locale": "en_ZA", "primary": true}]} +{"entity_id": "Q85758435", "mbid": "cf821909-fc70-4e0f-bc0b-1e6958c14de1", "wikidata_canonical": "Eben", "mb_name": "Eben", "mb_sort_name": "Eben", "mb_disambiguation": "Nigerian Gospel singer Emmanuel Benjamin", "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q85771346", "mbid": "719feeff-47ab-482b-8101-859cac49776b", "wikidata_canonical": "Joeboy", "mb_name": "Joeboy", "mb_sort_name": "Joeboy", "mb_disambiguation": "Nigerian singer", "mb_country": null, "mb_type": "Person", "aliases": [{"name": "Joeboy", "sort_name": "Joeboy", "type": "Artist name", "locale": null, "primary": false}, {"name": "Joseph Akinwale Akinfenwa-Donus", "sort_name": "Akinfenwa-Donus, Joseph Akinwale", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q85946567", "mbid": "13332404-48bd-4175-a956-9a54f77ee10a", "wikidata_canonical": "Lyta", "mb_name": "Lyta", "mb_sort_name": "Lyta", "mb_disambiguation": "Nigerian singer-songwriter", "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Lawal Opeyemi Raimi", "sort_name": "Lawal Opeyemi Raimi", "type": null, "locale": null, "primary": false}, {"name": "Lyta", "sort_name": "Lyta", "type": "Artist name", "locale": null, "primary": false}, {"name": "Lyta skuri", "sort_name": "Lyta skuri", "type": null, "locale": null, "primary": false}, {"name": "Lyta ybnl", "sort_name": "Lyta ybnl", "type": null, "locale": null, "primary": false}, {"name": "Opeyemi Babatunde Rahim", "sort_name": "Opeyemi Babatunde Rahim", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q87368609", "mbid": "b2a3cd7c-19dd-419e-b2e8-c1e2f8b3dff4", "wikidata_canonical": "Master KG", "mb_name": "Master KG", "mb_sort_name": "Master KG", "mb_disambiguation": "South African musician and record producer", "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "Kgaogelo Moagi", "sort_name": "Moagi, Kgaogelo", "type": "Legal name", "locale": null, "primary": false}, {"name": "Khaogelo Moagi", "sort_name": "Khaogelo Moagi", "type": "Search hint", "locale": null, "primary": false}]} +{"entity_id": "Q89554764", "mbid": "2a5337f0-d89c-4756-a7a4-bc477cdd1e2f", "wikidata_canonical": "Herbie Tsoaeli", "mb_name": "Herbie Tsoaeli", "mb_sort_name": "Tsoaeli, Herbie", "mb_disambiguation": null, "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "Herbert Motlatsi Tsoaeli", "sort_name": "Tsoaeli, Herbert Motlatsi", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q89559258", "mbid": "ea97a3a9-415d-4810-ae40-0d4ecbc719e3", "wikidata_canonical": "Tanasha Donna", "mb_name": "Tanasha Donna", "mb_sort_name": "Donna, Tanasha", "mb_disambiguation": null, "mb_country": "KE", "mb_type": "Person", "aliases": []} +{"entity_id": "Q91915280", "mbid": "fbc72450-e5b9-4369-bb1d-c3fc27c019d4", "wikidata_canonical": "Paul Okoye", "mb_name": "Rudeboy", "mb_sort_name": "Rudeboy", "mb_disambiguation": "Born Paul Okoye, member of P-Square", "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Rudeboy", "sort_name": "Rudeboy", "type": "Artist name", "locale": null, "primary": false}]} +{"entity_id": "Q95578142", "mbid": "f77224dd-14d5-4f8f-8075-a4d3c76013e4", "wikidata_canonical": "Ami Faku", "mb_name": "Ami Faku", "mb_sort_name": "Faku, Ami", "mb_disambiguation": null, "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "Amanda Phumeza Faku", "sort_name": "Faku, Amanda Phumeza", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q95728291", "mbid": "1d331dbc-1b67-42a4-8a19-26d7ffc64856", "wikidata_canonical": "Elaine", "mb_name": "Elaine", "mb_sort_name": "Elaine", "mb_disambiguation": "South African singer", "mb_country": "ZA", "mb_type": "Person", "aliases": []} +{"entity_id": "Q95839715", "mbid": "e5db2f43-39e1-4315-a2ae-17106f637258", "wikidata_canonical": "YoungstaCPT", "mb_name": "YoungstaCPT", "mb_sort_name": "YoungstaCPT", "mb_disambiguation": "Hip Hop Artist from Cape Town", "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "Youngsta CPT", "sort_name": "Youngsta CPT", "type": "Search hint", "locale": null, "primary": false}]} +{"entity_id": "Q96270510", "mbid": "b74bbe56-8171-44d3-a13f-08b924be9b20", "wikidata_canonical": "John Blaq", "mb_name": "John Blaq", "mb_sort_name": "Blaq, John", "mb_disambiguation": "Ugandan singer and rapper", "mb_country": "UG", "mb_type": "Person", "aliases": [{"name": "John Blaq", "sort_name": "John Blaq", "type": "Artist name", "locale": null, "primary": false}, {"name": "John Kasadha", "sort_name": "Kasadha, John", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q96311327", "mbid": "b86d9303-007c-4a3f-874f-8dae117c572d", "wikidata_canonical": "Nana Tuffour", "mb_name": "Nana Tuffour", "mb_sort_name": "Tuffour, Nana", "mb_disambiguation": null, "mb_country": "GH", "mb_type": "Person", "aliases": []} +{"entity_id": "Q96945267", "mbid": "120bddbe-ea0a-4664-812a-c20e64667569", "wikidata_canonical": "Wally Seck", "mb_name": "Wally Seck", "mb_sort_name": "Seck, Wally", "mb_disambiguation": null, "mb_country": "SN", "mb_type": "Person", "aliases": [{"name": "Wally Ballago Seck", "sort_name": "Wally Ballago Seck", "type": "Artist name", "locale": null, "primary": false}, {"name": "Waly Seck", "sort_name": "Seck, Waly", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q97029562", "mbid": "bddb655c-4ab6-4dd3-8ddb-c96604ab7467", "wikidata_canonical": "Sha Sha", "mb_name": "Sha Sha", "mb_sort_name": "Sha Sha", "mb_disambiguation": null, "mb_country": "ZW", "mb_type": "Person", "aliases": [{"name": "Charmaine Shamiso Mapimbiro", "sort_name": "Mapimbiro, Charmaine Shamiso", "type": "Legal name", "locale": "en", "primary": false}]} +{"entity_id": "Q97064578", "mbid": "f51d2982-29dd-43cd-8fa1-bc38dd6c1467", "wikidata_canonical": "Broda Shaggi", "mb_name": "Broda Shaggi", "mb_sort_name": "Broda Shaggi", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Samuel Animashaun Perry", "sort_name": "Perry, Samuel Animashaun", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q97277937", "mbid": "03fb62d0-8aa9-4c56-b87c-8f92731e5732", "wikidata_canonical": "Duc-Z", "mb_name": "Duc-Z", "mb_sort_name": "Duc-Z", "mb_disambiguation": null, "mb_country": "CM", "mb_type": "Person", "aliases": []} +{"entity_id": "Q97487703", "mbid": "209cfbf5-6fcb-4bee-a3b6-a65e33e12ab2", "wikidata_canonical": "Marioo", "mb_name": "Marioo", "mb_sort_name": "Marioo", "mb_disambiguation": null, "mb_country": "TZ", "mb_type": "Person", "aliases": [{"name": "Omary Ally Mwanga", "sort_name": "Mwanga, Omary Ally", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q97959357", "mbid": "81952b92-1c43-4a7f-be54-be0217702de2", "wikidata_canonical": "Zayn Africa", "mb_name": "Zayn Africa", "mb_sort_name": "Zayn Africa", "mb_disambiguation": null, "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "Abdulmajid Aliyu", "sort_name": "Abdulmajid Aliyu", "type": "Legal name", "locale": "en_NG", "primary": false}, {"name": "Zayn Africa", "sort_name": "Zayn Africa", "type": "Artist name", "locale": "en_NG", "primary": false}]} +{"entity_id": "Q98016557", "mbid": "9b928538-a2c4-4c48-be86-366b4c7cc8a5", "wikidata_canonical": "P2J", "mb_name": "Richard “P2J” Isong", "mb_sort_name": "Isong, Richard “P2J”", "mb_disambiguation": null, "mb_country": null, "mb_type": "Person", "aliases": [{"name": "Richard Olowaranti Mbu Isong", "sort_name": "Richard Olowaranti Mbu Isong", "type": "Legal name", "locale": "en", "primary": false}]} +{"entity_id": "Q98312451", "mbid": "eb1febcf-9902-4962-9dc4-8fe4d7fc25b4", "wikidata_canonical": "CKay", "mb_name": "CKay", "mb_sort_name": "CKay", "mb_disambiguation": "Nigerian musician", "mb_country": "NG", "mb_type": "Person", "aliases": [{"name": "CKay", "sort_name": "CKay", "type": "Artist name", "locale": null, "primary": false}, {"name": "Chukwuka Chukwuma Ekweani", "sort_name": "Chukwuka Chukwuma Ekweani", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q98815370", "mbid": "4e39c7cd-a631-4399-bbd8-13107be50938", "wikidata_canonical": "Nomcebo Zikode", "mb_name": "Nomcebo Zikode", "mb_sort_name": "Zikode, Nomcebo", "mb_disambiguation": null, "mb_country": "ZA", "mb_type": "Person", "aliases": [{"name": "Nomcebo", "sort_name": "Nomcebo", "type": "Artist name", "locale": null, "primary": false}, {"name": "Nomcebo Nothule Nkwanyana", "sort_name": "Nomcebo Nothule Nkwanyana", "type": "Legal name", "locale": null, "primary": false}, {"name": "Nomcebo Zikode", "sort_name": "Nomcebo Zikode", "type": "Search hint", "locale": null, "primary": false}]} +{"entity_id": "Q98925658", "mbid": "741c2900-db34-4c70-82ff-0d97b54a18d3", "wikidata_canonical": "D Policy", "mb_name": "D. POLICY", "mb_sort_name": "D. POLICY", "mb_disambiguation": "Artist from Edo", "mb_country": "NG", "mb_type": "Person", "aliases": []} +{"entity_id": "Q99237224", "mbid": "a0b85283-b193-4558-8ff0-dab1655b55f3", "wikidata_canonical": "Simmy", "mb_name": "Simmy", "mb_sort_name": "Simmy", "mb_disambiguation": "South African", "mb_country": null, "mb_type": "Person", "aliases": [{"name": "Simphiwe Majobe Nhlangulela", "sort_name": "Nhlangulela, Simphiwe Majobe", "type": "Legal name", "locale": null, "primary": false}]} +{"entity_id": "Q99673245", "mbid": "303d5fe6-ebb8-4691-9772-2e901fcc978b", "wikidata_canonical": "Laycon", "mb_name": "Laycon", "mb_sort_name": "Laycon", "mb_disambiguation": "Nigeria", "mb_country": null, "mb_type": null, "aliases": []} diff --git a/datasets/data/wikidata_artist_aliases.jsonl b/datasets/data/wikidata_artist_aliases.jsonl new file mode 100644 index 0000000..1e4bc78 --- /dev/null +++ b/datasets/data/wikidata_artist_aliases.jsonl @@ -0,0 +1,1468 @@ +{"canonical": "Joe El", "country": "Nigeria", "entity_id": "Q100146369", "variants": ["Joe Everlasting", "Joel Amadi", "Joel Amadi Didam"]} +{"canonical": "Ace Leen", "country": "South Africa", "entity_id": "Q100253451", "variants": ["Aceleen"]} +{"canonical": "Ian Reigns", "country": "South Africa", "entity_id": "Q100298072", "variants": ["Dunisani Ian Tlhabani"]} +{"canonical": "Tamy Moyo", "country": "Zimbabwe", "entity_id": "Q100741876", "variants": ["Thamsanqa 'Tamy' Moyo", "Thamsanqa Moyo"]} +{"canonical": "Julie Mutesasira", "country": "Uganda", "entity_id": "Q100801324", "variants": ["Julie Nalujja"]} +{"canonical": "Jacob Radebe", "country": "South Africa", "entity_id": "Q100807882", "variants": ["Mpharanyana"]} +{"canonical": "Pearl Jansen", "country": "South Africa", "entity_id": "Q101573786", "variants": ["Pearl Gladys Jansen"]} +{"canonical": "Dlmadeit", "country": "Ghana", "entity_id": "Q102039752", "variants": ["Divine Lawoe"]} +{"canonical": "Nomvelo Makhanya", "country": "South Africa", "entity_id": "Q102045752", "variants": ["Mvelo Makhanya"]} +{"canonical": "PdotO", "country": "South Africa", "entity_id": "Q102045758", "variants": ["Siphelele Mnyande"]} +{"canonical": "Francesca Emanuel", "country": "Nigeria", "entity_id": "Q102077235", "variants": ["Francesca Yetunde Emanuel"]} +{"canonical": "Phatiah", "country": "Nigeria", "entity_id": "Q102227958", "variants": ["Fatiah Kanyinsola Ojediran"]} +{"canonical": "Judy Ditchfield", "country": "South Africa", "entity_id": "Q102323079", "variants": ["Judith Angela Broderick"]} +{"canonical": "Noluthando Meje", "country": "South Africa", "entity_id": "Q102353316", "variants": ["Noluthando Meje Nqayi"]} +{"canonical": "Mizan", "country": "Ethiopia", "entity_id": "Q102905406", "variants": ["Mizan K."]} +{"canonical": "Kim Clement", "country": "South Africa", "entity_id": "Q103001286", "variants": ["The singing prophet"]} +{"canonical": "Shanga", "country": "Nigeria", "entity_id": "Q103908669", "variants": ["Manuela Modupe Udemba"]} +{"canonical": "David Dargie", "country": "South Africa", "entity_id": "Q104229491", "variants": ["Dave Dargie", "David John Dargie"]} +{"canonical": "Bill Nass", "country": "Tanzania", "entity_id": "Q104276204", "variants": ["William Nicholaus Lyimo"]} +{"canonical": "TinyM", "country": "South Africa", "entity_id": "Q104523176", "variants": ["Tiny M"]} +{"canonical": "Mayestron", "country": "Tanzania", "entity_id": "Q104603190", "variants": ["Mayani Pelo Luhabanya"]} +{"canonical": "Ms Cosmo", "country": "South Africa", "entity_id": "Q104640300", "variants": ["Nonqaba Nozuko Rwaxa"]} +{"canonical": "Abidemi Ayodeji Ogunmolu", "country": "Nigeria", "entity_id": "Q104716710", "variants": ["Bidemi Olaoba"]} +{"canonical": "Tommy Flavour", "country": "Tanzania", "entity_id": "Q104721884", "variants": ["Yong king"]} +{"canonical": "Rich Mavoko", "country": "Tanzania", "entity_id": "Q104774788", "variants": ["Richard Martin", "Richard Martin Lusinga"]} +{"canonical": "S2Kizzy", "country": "Tanzania", "entity_id": "Q104775888", "variants": ["Zombie, S2KIZZY"]} +{"canonical": "Dinah Reindorf", "country": "Ghana", "entity_id": "Q104795610", "variants": ["Dinah Twumwa Reindorf"]} +{"canonical": "Tobe Nwigwe", "country": "Nigeria", "entity_id": "Q104835395", "variants": ["Tobechukwu Dubem Nwigwe"]} +{"canonical": "Makhadzi", "country": "South Africa", "entity_id": "Q104842940", "variants": ["Ndivhudzannyi Ralivhona"]} +{"canonical": "Sancho Gebre", "country": "Ethiopia", "entity_id": "Q104888177", "variants": ["Tamirat Gebre Lenga"]} +{"canonical": "Bella Shmurda", "country": "Nigeria", "entity_id": "Q105565282", "variants": ["Dangbana", "kinbiyi Abiola Ahmed"]} +{"canonical": "Olumireggae", "country": "Nigeria", "entity_id": "Q105674524", "variants": ["Helen Adaobi Obi"]} +{"canonical": "Bennylee", "country": "Nigeria", "entity_id": "Q105745220", "variants": ["Omo Mama Eleja"]} +{"canonical": "Naby", "country": "Senegal", "entity_id": "Q105809685", "variants": ["Naby Ibrahima Condé"]} +{"canonical": "Jessie M. Soga", "country": "South Africa", "entity_id": "Q105821611", "variants": ["Jessie Margaret Soga"]} +{"canonical": "Radiko", "country": "Uganda", "entity_id": "Q106070421", "variants": ["James Wanyama"]} +{"canonical": "Chidimma Ekile", "country": "Nigeria", "entity_id": "Q106231917", "variants": ["Chidimma"]} +{"canonical": "Kel-P", "country": "Nigeria", "entity_id": "Q106238467", "variants": ["Udoma Peter Kelvin Amba"]} +{"canonical": "Peter Okoye", "country": "Nigeria", "entity_id": "Q106308191", "variants": ["Mr. P"]} +{"canonical": "Gerrit Scheepers", "country": "South Africa", "entity_id": "Q106308272", "variants": ["Gerhardus Scheepers", "Gerhardus Stephanus Scheepers"]} +{"canonical": "Yaw Tog", "country": "Ghana", "entity_id": "Q106363150", "variants": ["Thorsten Owusu Gyimah", "YT"]} +{"canonical": "Aralola Olamuyiwa", "country": "Nigeria", "entity_id": "Q106367501", "variants": ["Ara"]} +{"canonical": "Ayra Starr", "country": "Nigeria", "entity_id": "Q106462586", "variants": ["Celestial Being", "Oyinkansola Sarah Aderibigbe", "Sabi girl"]} +{"canonical": "Berita", "country": "Zimbabwe", "entity_id": "Q106518302", "variants": ["Gugulethu Khumalo"]} +{"canonical": "Omah Lay", "country": "Nigeria", "entity_id": "Q106558182", "variants": ["Stanley Didia", "Stanley Omah Didia"]} +{"canonical": "Dexellency", "country": "Nigeria", "entity_id": "Q106568097", "variants": ["Igbrude Wilson"]} +{"canonical": "Bayo Ododo", "country": "Nigeria", "entity_id": "Q106602791", "variants": ["Bayo Adeeyo"]} +{"canonical": "Jess ETA", "country": "Nigeria", "entity_id": "Q106622895", "variants": ["Jesse Godwin Ede Ekagbo"]} +{"canonical": "Mbosso", "country": "Tanzania", "entity_id": "Q106808963", "variants": ["Joseph Kulungi", "Mbwana Yusuf Kilungi"]} +{"canonical": "Rexxie", "country": "Nigeria", "entity_id": "Q106812063", "variants": ["Ezeh Chisom Faith"]} +{"canonical": "Tim", "country": "Zambia", "entity_id": "Q106832149", "variants": ["Thugga", "Tim Thugga", "Timbwama", "Timbwama Chisenga"]} +{"canonical": "Dambisa", "country": "Zambia", "entity_id": "Q106857666", "variants": ["Michelle", "Dambisa Michelle Lunda", "Queen of Dancehall"]} +{"canonical": "Kameni", "country": "Cameroon", "entity_id": "Q106977880", "variants": ["Kate Ebude Kameni"]} +{"canonical": "Efemena Mukoro", "country": "Nigeria", "entity_id": "Q107087806", "variants": ["Blackmagic", "Ejay Blackmagic"]} +{"canonical": "Supernovamusician", "country": "Nigeria", "entity_id": "Q107138372", "variants": ["Nweke Joy Chinenye Serrato"]} +{"canonical": "Linda Sebezo", "country": "South Africa", "entity_id": "Q107238608", "variants": ["Linda Lorraine Sebezo"]} +{"canonical": "Chima", "country": "Nigeria", "entity_id": "Q1073062", "variants": ["Chimaobinna Enyiakanwanne Onyele"]} +{"canonical": "Liya", "country": "Nigeria", "entity_id": "Q107315471", "variants": ["Abdulsalam Suliyat Modasola"]} +{"canonical": "Aloma Isaac Junior", "country": "Nigeria", "entity_id": "Q107326448", "variants": ["Zicsaloma"]} +{"canonical": "Phineas Mkhize", "country": "South Africa", "entity_id": "Q107338619", "variants": ["Phineas Dlezakhe Mkhize", "Phineas McHize", "Phineas Mkize"]} +{"canonical": "Rami Chuene", "country": "South Africa", "entity_id": "Q107340974", "variants": ["Ramatsui Chuene"]} +{"canonical": "Duprie", "country": "Cameroon", "entity_id": "Q107451358", "variants": ["Damen Dume", "Damen Priestley Dume"]} +{"canonical": "Rizi Timane", "country": "Nigeria", "entity_id": "Q107453108", "variants": ["Nasele Bamaiyi"]} +{"canonical": "Nabila", "country": "Cameroon", "entity_id": "Q107491783", "variants": ["Fatima Rodriguez"]} +{"canonical": "Mimie", "country": "Cameroon", "entity_id": "Q107491845", "variants": ["Melanie Ngoga", "MIMIE"]} +{"canonical": "Rosa Ree", "country": "Tanzania", "entity_id": "Q107504428", "variants": ["Rosary Robert Iwole"]} +{"canonical": "Jamopyper", "country": "Nigeria", "entity_id": "Q107510693", "variants": ["Jamiu Damilare Tajudeen", "Jamo"]} +{"canonical": "Juiciy ML", "country": "Nigeria", "entity_id": "Q107513862", "variants": ["J.M"]} +{"canonical": "Temi Dee", "country": "Nigeria", "entity_id": "Q107557416", "variants": ["Temidee"]} +{"canonical": "TBwoy", "country": "Zambia", "entity_id": "Q107590765", "variants": ["Tanonga Nswana"]} +{"canonical": "Black Sherif", "country": "Ghana", "entity_id": "Q107740983", "variants": ["Blacko", "Mohammed Ismail Sherif", "Mohammed Ismail Sherif Kwaku Frimpong"]} +{"canonical": "Aminu Ala", "country": "Nigeria", "entity_id": "Q107987201", "variants": ["Aminu Ladan Abubakar"]} +{"canonical": "Marah Louw", "country": "South Africa", "entity_id": "Q108127747", "variants": ["Marah Louw Thomson"]} +{"canonical": "Bob Pinodo", "country": "Ghana", "entity_id": "Q108171933", "variants": ["Robert Kweku Idan", "Show Master of Africa"]} +{"canonical": "Balogun Olamilekan", "country": "Nigeria", "entity_id": "Q108179841", "variants": ["Ballo Ranking", "Balloranking"]} +{"canonical": "Funbi Emiola", "country": "Nigeria", "entity_id": "Q108180111", "variants": ["Funbi"]} +{"canonical": "Oyinkansola Aderibigbe", "country": "Nigeria", "entity_id": "Q108180872", "variants": ["Ayra star"]} +{"canonical": "Zinoleesky", "country": "Nigeria", "entity_id": "Q108181101", "variants": ["Oniyide Azeez", "https://gospelbaze.com.ng/music"]} +{"canonical": "Olawale Ayodeji Martins", "country": "Nigeria", "entity_id": "Q108201517", "variants": ["Martins feelz"]} +{"canonical": "Omeje David Chidiebere", "country": "Nigeria", "entity_id": "Q108201953", "variants": ["Chidokeyz"]} +{"canonical": "Aneke Efeanyi Emeka", "country": "Nigeria", "entity_id": "Q108202266", "variants": ["Maxcot Brown"]} +{"canonical": "Afeez Adesina", "country": "Nigeria", "entity_id": "Q108219323", "variants": ["Destiny boy"]} +{"canonical": "Otega", "country": "Nigeria", "entity_id": "Q108220447", "variants": ["Otega Billz", "Stephen Ifedayo Oghenetega"]} +{"canonical": "Busari Idris Seun", "country": "Nigeria", "entity_id": "Q108221466", "variants": ["Aloma Dmw"]} +{"canonical": "Taiwo Olajide Daniel", "country": "Nigeria", "entity_id": "Q108223012", "variants": ["Jaido p"]} +{"canonical": "Shokoya Oluwasegunfunmi", "country": "Nigeria", "entity_id": "Q108223305", "variants": ["Davolee"]} +{"canonical": "Qudus Fakoya Oluwadamilare", "country": "Nigeria", "entity_id": "Q108223419", "variants": ["Qdot"]} +{"canonical": "Charles Chibueze Chukwu", "country": "Nigeria", "entity_id": "Q108223660", "variants": ["Crayon"]} +{"canonical": "Moshood Adeola", "country": "Nigeria", "entity_id": "Q108224881", "variants": ["Hotkid fire"]} +{"canonical": "Emmanuel Anyanso", "country": "Nigeria", "entity_id": "Q108225246", "variants": ["OBJ"]} +{"canonical": "Deinde Okubajo", "country": "Nigeria", "entity_id": "Q108245173", "variants": ["Deinde"]} +{"canonical": "Spyro", "country": "Nigeria", "entity_id": "Q108273396", "variants": ["Oludipe Oluwasanmi David"]} +{"canonical": "Collins Uche Faith", "country": "Nigeria", "entity_id": "Q108273500", "variants": ["Soft"]} +{"canonical": "Olaonipekun Olatubosun", "country": "Nigeria", "entity_id": "Q108273780", "variants": ["Trod"]} +{"canonical": "Ifeanyichukwu David Bryan Onoka", "country": "Nigeria", "entity_id": "Q108274009", "variants": ["Brainee"]} +{"canonical": "Bisi Alawiye Aluko", "country": "Nigeria", "entity_id": "Q108284819", "variants": ["Evangelist Shindara Adebisi Alawiye-Aluko (JP)"]} +{"canonical": "Daniel Alaba Ojamomi", "country": "Nigeria", "entity_id": "Q108295252", "variants": ["Ajura"]} +{"canonical": "Folashade Olukoya", "country": "Nigeria", "entity_id": "Q108295382", "variants": ["Shade Olukoya"]} +{"canonical": "Jibola Toriola Jasper", "country": "Nigeria", "entity_id": "Q108295513", "variants": ["Jhybo (Rap Woli)"]} +{"canonical": "Rebecca Chinonso Arinola", "country": "Nigeria", "entity_id": "Q108295695", "variants": ["Raybekah"]} +{"canonical": "Akogun John", "country": "Nigeria", "entity_id": "Q108296229", "variants": ["Kayz Moore"]} +{"canonical": "Asikpi Tombra", "country": "Nigeria", "entity_id": "Q108305756", "variants": ["Payper Corleone"]} +{"canonical": "Adekunle Oluwashina Abdulateef", "country": "Nigeria", "entity_id": "Q108314842", "variants": ["Zamorra"]} +{"canonical": "Made Kuti", "country": "Nigeria", "entity_id": "Q108318919", "variants": ["Omorinmade Anikulapo Kuti", "Omorinmade Kuti"]} +{"canonical": "Edwin Ubah Azubuike", "country": "Nigeria", "entity_id": "Q108320680", "variants": ["Rafa"]} +{"canonical": "Chinonso Young Umesiobi", "country": "Nigeria", "entity_id": "Q108332151", "variants": ["Chinonso young"]} +{"canonical": "Efe ejeba", "country": "Nigeria", "entity_id": "Q108332401", "variants": ["Efe", "Efe Money", "Michael Ejeba"]} +{"canonical": "Dremo", "country": "Nigeria", "entity_id": "Q108333151", "variants": ["Aboriomoh Femi Raymond"]} +{"canonical": "Paul Ephraim", "country": "Nigeria", "entity_id": "Q108338066", "variants": ["JayPaul"]} +{"canonical": "Folabi Nuel", "country": "Nigeria", "entity_id": "Q108352543", "variants": ["Afolabi Emmanuel Fagbemi"]} +{"canonical": "Oniyide Azeez", "country": "Nigeria", "entity_id": "Q108354158", "variants": ["Dablixx Osha"]} +{"canonical": "Kaywa", "country": "Ghana", "entity_id": "Q108624813", "variants": ["David Kojo Kyei"]} +{"canonical": "S3fa", "country": "Ghana", "entity_id": "Q108631491", "variants": ["Sefa", "Sefadzi Abena Amesu"]} +{"canonical": "Cruel Santino", "country": "Nigeria", "entity_id": "Q108824597", "variants": ["Osayaba Andrew Ize-Iyamu"]} +{"canonical": "PhillBill", "country": "Cameroon", "entity_id": "Q108862298", "variants": ["Diannee", "Diyani Bill Munyenge", "Philbill", "Phillbill Beatz", "Shaba", "Diyani", "Shabamuzik"]} +{"canonical": "Tswagg Bankz", "country": "Nigeria", "entity_id": "Q108880628", "variants": ["Bankz"]} +{"canonical": "Uwade", "country": "Nigeria", "entity_id": "Q108933361", "variants": ["Uwade Akhere"]} +{"canonical": "Saimondy", "country": "Cameroon", "entity_id": "Q109044498", "variants": ["Simon Ngaka"]} +{"canonical": "Lebo M.", "country": "South Africa", "entity_id": "Q109045", "variants": ["Lebohang \"Lebo M\" Morake", "Lebohang Morake"]} +{"canonical": "Focalistic", "country": "South Africa", "entity_id": "Q109106572", "variants": ["Lethabo Sebetso"]} +{"canonical": "Allan Wong", "country": "Uganda", "entity_id": "Q109119139", "variants": ["Allan Wong Music Uganda"]} +{"canonical": "Mvzzle", "country": "South Africa", "entity_id": "Q109313236", "variants": ["Silencer", "Mvzzle Beatz", "Mvzzle with the V"]} +{"canonical": "JAE5", "country": "Ghana", "entity_id": "Q109333506", "variants": ["Jonathan Kweku Awotwe-Mensah", "Jonathan Mensah"]} +{"canonical": "Biwom", "country": "Nigeria", "entity_id": "Q109335882", "variants": ["Okudare Marytonette"]} +{"canonical": "Elohsound", "country": "Nigeria", "entity_id": "Q109383522", "variants": ["Othowhora eloghene olawunmi"]} +{"canonical": "Sarki Vibez", "country": "Nigeria", "entity_id": "Q109446437", "variants": ["Abubakar Mohammed"]} +{"canonical": "Nelisiwe Sibiya", "country": "South Africa", "entity_id": "Q109562997", "variants": ["Nelisiwe Faith Sibiya"]} +{"canonical": "Rethabile Khumalo", "country": "South Africa", "entity_id": "Q109632215", "variants": ["Rethabile", "Rethabile Nomalanga Khumalo"]} +{"canonical": "Ehiz Lenz", "country": "Nigeria", "entity_id": "Q109646788", "variants": ["Ehinomen Samson Isibor"]} +{"canonical": "Presh Milli", "country": "Nigeria", "entity_id": "Q109647208", "variants": ["Precious Patrick"]} +{"canonical": "Indira", "country": "Cameroon", "entity_id": "Q109653690", "variants": ["Indira Baboke"]} +{"canonical": "Nana Adjoa", "country": "Ghana", "entity_id": "Q109684363", "variants": ["Nana Effa-Bekoe"]} +{"canonical": "Regina Kihwele", "country": "Tanzania", "entity_id": "Q109740472", "variants": ["Gynah", "Regina Beraldo Kihwele"]} +{"canonical": "Shalati Joseph Khosa", "country": "South Africa", "entity_id": "Q109753750", "variants": ["S.J Khosa", "SJ Khosa"]} +{"canonical": "Vernyuy Tina", "country": "Cameroon", "entity_id": "Q109814231", "variants": ["Musica"]} +{"canonical": "Darina Victry", "country": "Cameroon", "entity_id": "Q109816323", "variants": ["Darina Jeanne Elandi Mballa"]} +{"canonical": "Tilla Tafari", "country": "Cameroon", "entity_id": "Q109891140", "variants": ["God Mother Don Dada"]} +{"canonical": "Guchi", "country": "Nigeria", "entity_id": "Q109927917", "variants": ["Ugochi Lydia Onuoha"]} +{"canonical": "Young Stunna", "country": "South Africa", "entity_id": "Q109981068", "variants": ["Sandile Msimango"]} +{"canonical": "Shaybo", "country": "Nigeria", "entity_id": "Q110010690", "variants": ["Laura Adeola Adegbite"]} +{"canonical": "shelovesneo", "country": "South Africa", "entity_id": "Q110075061", "variants": ["Neo Motlatla"]} +{"canonical": "Reason SA", "country": "South Africa", "entity_id": "Q110110574", "variants": ["Reason (rapper)", "Reason (South Africa)", "Sizwe Alakine", "Sizwe Moeketsi"]} +{"canonical": "Civilize", "country": "Nigeria", "entity_id": "Q110154480", "variants": ["Samson Monday"]} +{"canonical": "Morris Mugisha", "country": "Uganda", "entity_id": "Q110197504", "variants": ["Morris Herbert Mugisha"]} +{"canonical": "Xtacy", "country": "Nigeria", "entity_id": "Q110265034", "variants": ["Nwaoha Happiness Nneoma"]} +{"canonical": "Prince Afo Akom", "country": "Cameroon", "entity_id": "Q110279302", "variants": ["Prince Bobe Yerima", "Prince Yerima Afo-Akom", "Tamdjon"]} +{"canonical": "B Major SA", "country": "South Africa", "entity_id": "Q110281105", "variants": ["B Major", "B Major CPT", "B Major musician", "Bjorn Martin"]} +{"canonical": "S. C. Molefe", "country": "South Africa", "entity_id": "Q110315657", "variants": ["Stephen Cuthbert Molefe"]} +{"canonical": "Blxckie", "country": "South Africa", "entity_id": "Q110377447", "variants": ["Sihle Sithole", "Somnyama"]} +{"canonical": "Buju", "country": "Nigeria", "entity_id": "Q110442584", "variants": ["BNXN", "Bujutoyourear", "Daniel Benson"]} +{"canonical": "Roseline Layo", "country": "Ivory Coast", "entity_id": "Q110498357", "variants": ["Layo Man Roseline"]} +{"canonical": "Bigiano", "country": "Nigeria", "entity_id": "Q110529927", "variants": ["Babalola Oluwagbemiga Gabriel"]} +{"canonical": "Aida Vee", "country": "Uganda", "entity_id": "Q110604850", "variants": ["Aida Vee Official", "Aida Victoria Nkityo Sebakiggye"]} +{"canonical": "Ray G", "country": "Uganda", "entity_id": "Q110608385", "variants": ["Ray G Rhiganz", "Reagan Muhairwe"]} +{"canonical": "25K", "country": "South Africa", "entity_id": "Q110653609", "variants": ["Lehlohonolo Molefe"]} +{"canonical": "Ruger", "country": "Nigeria", "entity_id": "Q110661297", "variants": ["Michael Adebayo Olayinka"]} +{"canonical": "Popsi", "country": "Nigeria", "entity_id": "Q110670422", "variants": ["OluMighty", "Pop Daddy", "Timileyin Benjamin Majasan"]} +{"canonical": "Glory Ohams", "country": "Nigeria", "entity_id": "Q110689559", "variants": ["Glory Oham"]} +{"canonical": "Chosen Becky", "country": "Uganda", "entity_id": "Q110781877", "variants": ["Becky", "Chosen", "Rebecca Kukiriza"]} +{"canonical": "Excel Falope", "country": "Nigeria", "entity_id": "Q110932339", "variants": ["Excel"]} +{"canonical": "Kamo Mphela", "country": "South Africa", "entity_id": "Q110966777", "variants": ["Kamogelo Mphela"]} +{"canonical": "Tshego", "country": "South Africa", "entity_id": "Q111136127", "variants": ["Tshegofatso Ketshabile"]} +{"canonical": "Betty Nakibuka", "country": "Uganda", "entity_id": "Q111192252", "variants": ["Betty Nakibuuka", "Betty Nakibuuka Senyonjo"]} +{"canonical": "Mugeni Elijah", "country": "South Africa", "entity_id": "Q111212975", "variants": ["Awelani Mugeni", "Mugeni Eliyahu"]} +{"canonical": "Vuyo Brown", "country": "Zimbabwe", "entity_id": "Q111242541", "variants": ["Nokufeza Vuyolethu Ngwenya"]} +{"canonical": "Valee Music", "country": "Zimbabwe", "entity_id": "Q111263021", "variants": ["Valerie Menyiwe Sibanda"]} +{"canonical": "Damian Addy", "country": "Tanzania", "entity_id": "Q111365101", "variants": ["Dman Addy"]} +{"canonical": "Azana", "country": "South Africa", "entity_id": "Q111383421", "variants": ["Makhosazana", "Makhosazana Masongo", "Masongo"]} +{"canonical": "Kweku Darlington", "country": "Ghana", "entity_id": "Q111443122", "variants": ["Emmanuel Kweku Owusu Darlington", "Kwaku Darlington"]} +{"canonical": "Ko-c", "country": "Cameroon", "entity_id": "Q111470436", "variants": ["Njang Mengu Collins"]} +{"canonical": "Winnie Nwagi", "country": "Uganda", "entity_id": "Q111530450", "variants": ["Fire Baby", "Nwagi", "Winnie Nakanwagi"]} +{"canonical": "Priscilla Zawedde (Azawi)", "country": "Uganda", "entity_id": "Q111530519", "variants": ["Azawi"]} +{"canonical": "Karol Kasita", "country": "Uganda", "entity_id": "Q111534595", "variants": ["Namulindwa Kasita", "Karole Kasiita"]} +{"canonical": "Anita Chukwumfumnanya Obidi", "country": "Nigeria", "entity_id": "Q111600123", "variants": ["Korra Obidi"]} +{"canonical": "Abiana", "country": "Ghana", "entity_id": "Q111692574", "variants": ["Eldah Naa Abiana Dickson"]} +{"canonical": "Eddy Yawe", "country": "Uganda", "entity_id": "Q111730247", "variants": ["Eddy Yawe Sentamu"]} +{"canonical": "Ado Gwanja", "country": "Nigeria", "entity_id": "Q111743457", "variants": ["Ado Isah Gwanja"]} +{"canonical": "Mona 4Reall", "country": "Ghana", "entity_id": "Q111948575", "variants": ["Hajia4Reall", "Mona Faiz Montrage"]} +{"canonical": "Haruna Abdullahi", "country": "Nigeria", "entity_id": "Q111949092", "variants": ["DJ AB"]} +{"canonical": "Comrade Chinx", "country": "Zimbabwe", "entity_id": "Q112006423", "variants": ["Cde Chinx", "Dick Chingaira", "Dickson Chingaira"]} +{"canonical": "Bouqui", "country": "Nigeria", "entity_id": "Q112030602", "variants": ["Bukola Folayan"]} +{"canonical": "Tay Iwar", "country": "Nigeria", "entity_id": "Q112041187", "variants": ["Austin Iornongu Iwar"]} +{"canonical": "Sergeo Polo", "country": "Cameroon", "entity_id": "Q112112912", "variants": ["Serge Mpollo"]} +{"canonical": "Nono Flavy", "country": "Cameroon", "entity_id": "Q112113310", "variants": ["Nono Flavie"]} +{"canonical": "Tagne Condom", "country": "Cameroon", "entity_id": "Q112113367", "variants": ["Kamela Soh Lyance", "Tagne Kondom"]} +{"canonical": "Victony", "country": "Nigeria", "entity_id": "Q112120810", "variants": ["Anthony Ebuka Victor"]} +{"canonical": "Asuquomo", "country": "Nigeria", "entity_id": "Q112162702", "variants": ["Emeka Morris Ogbowu"]} +{"canonical": "Veeby", "country": "Cameroon", "entity_id": "Q112189110", "variants": ["Vanessa Kanga"]} +{"canonical": "Amaka Okwuoha", "country": "Nigeria", "entity_id": "Q112228991", "variants": ["Chioma Jesús"]} +{"canonical": "Muroki Mbote Wa Githinji", "country": "Kenya", "entity_id": "Q112237028", "variants": ["Muroki"]} +{"canonical": "Ama Diaka", "country": "Ghana", "entity_id": "Q112242798", "variants": ["Poetra"]} +{"canonical": "Chinyere Udoma", "country": "Nigeria", "entity_id": "Q112243013", "variants": ["Big Chi"]} +{"canonical": "Mr. Leo", "country": "Cameroon", "entity_id": "Q112248555", "variants": ["Fonyuy Leonard Nsohburinka"]} +{"canonical": "David Segun Makanjuola", "country": "Nigeria", "entity_id": "Q112252474", "variants": ["Dite Kamelli"]} +{"canonical": "Samuel Nana Yaw Dabo", "country": "Ghana", "entity_id": "Q112289843", "variants": ["Dabo, Adwen Kessie", "Yaw Dabo"]} +{"canonical": "Judikay", "country": "Nigeria", "entity_id": "Q112321588", "variants": ["Judith Kanayo", "Judith Kanayo-Opara"]} +{"canonical": "Luc Séraphin Ayissi Fouda", "country": "Cameroon", "entity_id": "Q112349557", "variants": ["Ayissi Le Duc"]} +{"canonical": "Aramide", "country": "Nigeria", "entity_id": "Q112571237", "variants": ["Aramide Sarumoh"]} +{"canonical": "Cheikh Tidiane Fall", "country": "Senegal", "entity_id": "Q112584956", "variants": ["cheikh tidiane fall"]} +{"canonical": "Yung Bylez", "country": "Ghana", "entity_id": "Q112663060", "variants": ["YB", "Papa Kofi Akyen Kwegyir"]} +{"canonical": "Menzi Biyela", "country": "South Africa", "entity_id": "Q112690165", "variants": ["Menzi Brighton Biyela"]} +{"canonical": "Kwabena Onyina", "country": "Ghana", "entity_id": "Q112709339", "variants": ["King Onyina"]} +{"canonical": "KS Bloom", "country": "Ivory Coast", "entity_id": "Q112723099", "variants": ["youyou"]} +{"canonical": "Asake", "country": "Nigeria", "entity_id": "Q112861798", "variants": ["Ahmed Ololade"]} +{"canonical": "Cassandra Rosman", "country": "Nigeria", "entity_id": "Q113128707", "variants": ["Nwaduito Cassandra Rosman", "Uto Rosman"]} +{"canonical": "Chimezie Imo", "country": "Nigeria", "entity_id": "Q113264860", "variants": ["Emmanuel Chimezie Imo"]} +{"canonical": "Olalere Fagbola", "country": "Nigeria", "entity_id": "Q113335884", "variants": ["Fagbola, Lere", "Lere Fagbola"]} +{"canonical": "ID Cabasa", "country": "Nigeria", "entity_id": "Q113379489", "variants": ["Olumide Ogunade"]} +{"canonical": "Akotcholo Micheline N'guessan", "country": "Ivory Coast", "entity_id": "Q113441652", "variants": ["Misha", "Akotcholo Affoué Micheline N'guessan", "Mishaa"]} +{"canonical": "Suspect 95", "country": "Ivory Coast", "entity_id": "Q113472398", "variants": ["Guy Ange Emmanuel"]} +{"canonical": "Portable (musician)", "country": "Nigeria", "entity_id": "Q113499551", "variants": ["Habeeb Okikiola Badmus"]} +{"canonical": "Kouamé Gilles Romuald Kacou", "country": "Ivory Coast", "entity_id": "Q113565267", "variants": ["Boukary"]} +{"canonical": "Veeiye", "country": "Nigeria", "entity_id": "Q113574335", "variants": ["Victoria Adeyele"]} +{"canonical": "Manser Michelle", "country": "Nigeria", "entity_id": "Q113580000", "variants": ["Manser Michelle Efemena"]} +{"canonical": "St. Seii", "country": "Nigeria", "entity_id": "Q113593776", "variants": ["$ENSEII", "Jalal I. Iyonagbe", "St. Seií"]} +{"canonical": "Yaa Jackson", "country": "Ghana", "entity_id": "Q113621102", "variants": ["Maame Yaa Konadu Jackson"]} +{"canonical": "Tuutulapato", "country": "Ghana", "entity_id": "Q113623679", "variants": ["Cosmos Boakoh"]} +{"canonical": "Magixx", "country": "Nigeria", "entity_id": "Q113662051", "variants": ["Alexander Adelabu"]} +{"canonical": "Cheesy Vibes", "country": "Nigeria", "entity_id": "Q113866068", "variants": ["CHEESY VIBES", "Chidera Ogbuo", "Chidera Victory Ogbuo", "Ogbuo Chidera"]} +{"canonical": "Raymond Zamani", "country": "Nigeria", "entity_id": "Q114383729", "variants": ["Ray Zam"]} +{"canonical": "Emperor Pick Peters", "country": "Nigeria", "entity_id": "Q114401695", "variants": ["Emperor Peters", "Omo ode de", "Peter Akanni Akorede"]} +{"canonical": "Ephraimbeatz", "country": "Ghana", "entity_id": "Q114660148", "variants": ["Ephraim Churchill Gakpetor"]} +{"canonical": "Johnel Nnamani", "country": "Nigeria", "entity_id": "Q114742280", "variants": ["Johnel", "Chimaobi John Nnamani"]} +{"canonical": "Shu Nyatta", "country": "Kenya", "entity_id": "Q114874451", "variants": ["Mwashuma K Nyatta", "Mwashuma K. Nyatta", "Mwashuma Nyatta"]} +{"canonical": "Otitié Kiri", "country": "Cameroon", "entity_id": "Q114919687", "variants": ["Kiri Otty"]} +{"canonical": "Fulbert Feudjio Fokoua", "country": "Cameroon", "entity_id": "Q115128809", "variants": ["Ful"]} +{"canonical": "Yo Maps", "country": "Zambia", "entity_id": "Q115280566", "variants": ["Elton Mulenga"]} +{"canonical": "Cysoul", "country": "Cameroon", "entity_id": "Q115452649", "variants": ["Cyril Fouda Etoundi"]} +{"canonical": "Seppo", "country": "Cameroon", "entity_id": "Q115452740", "variants": ["Bito Alexandra Seppo Hortense"]} +{"canonical": "Krys M", "country": "Cameroon", "entity_id": "Q115452792", "variants": ["Megne Noubissi Christelle"]} +{"canonical": "PsychoYP", "country": "Nigeria", "entity_id": "Q115492435", "variants": ["Nicholas Ihua-Maduenyi"]} +{"canonical": "H3riQ", "country": "Cameroon", "entity_id": "Q115527001", "variants": ["Eugène Armand Ntone"]} +{"canonical": "Oghenemairo Okechukwu Ese", "country": "Nigeria", "entity_id": "Q115537035", "variants": ["Mairo Ese"]} +{"canonical": "Marenikae", "country": "Nigeria", "entity_id": "Q115574303", "variants": ["Morenike Mojisola Olayemi Enobong Lasode"]} +{"canonical": "Daniel Darius", "country": "Nigeria", "entity_id": "Q115608867", "variants": ["Dandizzy", "Daniel Tuotamuno Darius"]} +{"canonical": "Happy d'Efoulan", "country": "Cameroon", "entity_id": "Q115612456", "variants": ["Roger Essindi"]} +{"canonical": "Petit Malo", "country": "Cameroon", "entity_id": "Q115612593", "variants": ["Lionel Malongo Belinga"]} +{"canonical": "DJ Lexus", "country": "Cameroon", "entity_id": "Q115612642", "variants": ["Christian Evina"]} +{"canonical": "Petit Bozard", "country": "Cameroon", "entity_id": "Q115612717", "variants": ["Bimam Assimizelle Frank Taylor"]} +{"canonical": "Ulanda", "country": "Cameroon", "entity_id": "Q115627805", "variants": ["Ulanda Oben"]} +{"canonical": "David Eribe King", "country": "Nigeria", "entity_id": "Q115631754", "variants": ["David King", "DEK", "DAEKY", "David Eribe", "David Onyedikachukwu Eribe"]} +{"canonical": "Moses Bliss", "country": "Nigeria", "entity_id": "Q115633993", "variants": ["Moses Bliss Uyoh Enang,"]} +{"canonical": "Ceemahn", "country": "Nigeria", "entity_id": "Q115644767", "variants": ["Alaman"]} +{"canonical": "Jeiel Damina", "country": "Nigeria", "entity_id": "Q115657691", "variants": ["Olive"]} +{"canonical": "Israel Henry", "country": "Nigeria", "entity_id": "Q115668665", "variants": ["Romeo"]} +{"canonical": "Venom le Cascadeur", "country": "Ivory Coast", "entity_id": "Q115679647", "variants": ["Koffi Olivier"]} +{"canonical": "Odumodublvck", "country": "Nigeria", "entity_id": "Q115688374", "variants": ["Big gun", "Big kala", "Onye pumper", "Tochukwu Gbubemi Ojogwu", "Vladimirovich"]} +{"canonical": "Djene Djento", "country": "Cameroon", "entity_id": "Q115715274", "variants": ["Alain Djene Djento"]} +{"canonical": "Sol Amarfio", "country": "Ghana", "entity_id": "Q115723694", "variants": ["Solomon Amarfio", "Solomon Amarki Amarfio"]} +{"canonical": "Manulo Nguimè", "country": "Cameroon", "entity_id": "Q115732514", "variants": ["Manulo Nguime"]} +{"canonical": "Senaya", "country": "Senegal", "entity_id": "Q115769592", "variants": ["Divinesenaya"]} +{"canonical": "Isis Kingue", "country": "Cameroon", "entity_id": "Q115788270", "variants": ["Thérèse Judith Kingue"]} +{"canonical": "Rinyu", "country": "Cameroon", "entity_id": "Q115790591", "variants": ["Ngah Rinyu"]} +{"canonical": "Libianca", "country": "Cameroon", "entity_id": "Q115790718", "variants": ["Libianca Kenzonkinboum Fonji"]} +{"canonical": "Didi B", "country": "Ivory Coast", "entity_id": "Q115791127", "variants": ["Bassa Diyilem"]} +{"canonical": "Elow'n", "country": "Ivory Coast", "entity_id": "Q115801275", "variants": ["Elown", "N'wole Brice"]} +{"canonical": "Boy Tag", "country": "Cameroon", "entity_id": "Q115802305", "variants": ["Felganie Tongwa Njopmu"]} +{"canonical": "Fhish", "country": "Cameroon", "entity_id": "Q115819893", "variants": ["Mbonjem lesly Aponglen"]} +{"canonical": "Yilim", "country": "Ivory Coast", "entity_id": "Q115820017", "variants": ["Yilim Zerehoue"]} +{"canonical": "Rémy Adan", "country": "Ivory Coast", "entity_id": "Q115820490", "variants": ["Anoh Aimé Ange Daniel Ebalé"]} +{"canonical": "Hoïgen Ekwalla", "country": "Cameroon", "entity_id": "Q115849403", "variants": ["Eugène Ekwalla Mpouli"]} +{"canonical": "Sissy Dipoko", "country": "Cameroon", "entity_id": "Q115852777", "variants": ["Catherine Elolongue Mbango"]} +{"canonical": "Guillaume Toto", "country": "Cameroon", "entity_id": "Q115856917", "variants": ["Toguy"]} +{"canonical": "Penda Dallé", "country": "Cameroon", "entity_id": "Q115868701", "variants": ["Tete Dalle Penda Jeannot"]} +{"canonical": "Abby Chams", "country": "Tanzania", "entity_id": "Q115915562", "variants": ["Abigail Chams", "Abigail Chamungwana", "Abigail Anthony Chamungwana"]} +{"canonical": "Barnaba Classic", "country": "Tanzania", "entity_id": "Q115915565", "variants": ["Barnaba boy", "Elias Barnabas Inyasi"]} +{"canonical": "Lucas Mkenda", "country": "Tanzania", "entity_id": "Q115915566", "variants": ["Mr. Nice"]} +{"canonical": "Albert Mangwea", "country": "Tanzania", "entity_id": "Q115955988", "variants": ["Albert Keneth Mangweha", "Mangwair", "Mangwea", "Ngwair", "Ngwea"]} +{"canonical": "Ejay Stephanie", "country": "Nigeria", "entity_id": "Q116057433", "variants": ["Ejovwokeoghene Stephanie Avbenagha"]} +{"canonical": "Mercy Alu", "country": "Nigeria", "entity_id": "Q116301502", "variants": ["Mercy Ngozi Alu"]} +{"canonical": "Eezzy", "country": "Uganda", "entity_id": "Q116483773", "variants": ["Opoka Eric"]} +{"canonical": "Capasta", "country": "Ghana", "entity_id": "Q116699152", "variants": ["Capasta Ambandi", "Imurana Abdul Karim"]} +{"canonical": "Papi 5Five", "country": "Ghana", "entity_id": "Q116753813", "variants": ["Ladies Man", "Papi Adabraka", "Luther Azameti"]} +{"canonical": "Bloody Civilian", "country": "Nigeria", "entity_id": "Q116767429", "variants": ["Emoseh Khamofu"]} +{"canonical": "Jonathan Butler", "country": "South Africa", "entity_id": "Q1168056", "variants": ["Jonathan Kenneth Butler"]} +{"canonical": "Maglera Doe Boy", "country": "South Africa", "entity_id": "Q116856286", "variants": ["Maglera"]} +{"canonical": "Mazi Ukonu", "country": "Nigeria", "entity_id": "Q116879146", "variants": ["Mazi Anyogu Elekwachi Ukonu", "Mazi Anyogu Ukonu"]} +{"canonical": "Yanga Sobetwa", "country": "South Africa", "entity_id": "Q116880018", "variants": ["Yanga"]} +{"canonical": "Khaid", "country": "Nigeria", "entity_id": "Q116896873", "variants": ["Shekoni", "Sulaimon Shekoni Solomon"]} +{"canonical": "Costa Titch", "country": "South Africa", "entity_id": "Q117074600", "variants": ["Constantinos Tsobanoglou"]} +{"canonical": "Minister GUC", "country": "Nigeria", "entity_id": "Q117192012", "variants": ["Gift Ugochukwu Christopher"]} +{"canonical": "DJ Mix Premier", "country": "Ivory Coast", "entity_id": "Q117220956", "variants": ["Dj Mix", "el panturo", "la panthère", "Mix Premier"]} +{"canonical": "Jaigbade Alao", "country": "Nigeria", "entity_id": "Q117337931", "variants": ["Oba Orin, Baba n Kwara"]} +{"canonical": "Neon Adejo", "country": "Nigeria", "entity_id": "Q117360253", "variants": ["Neon Adejo Yunisa"]} +{"canonical": "Jeriq", "country": "Nigeria", "entity_id": "Q117455373", "variants": ["Jeremiah Chukwuebuka Ani", "Jeriq Thehussla Ogbe"]} +{"canonical": "Layori", "country": "Nigeria", "entity_id": "Q11753344", "variants": ["Labi Layori"]} +{"canonical": "Madi", "country": "South Africa", "entity_id": "Q117557897", "variants": ["Madi Nelson"]} +{"canonical": "Sunmisola Agbebi", "country": "Nigeria", "entity_id": "Q117640054", "variants": ["Sunmisola Agbebi Elizabeth", "Sunmisola Agbebi Okeleye", "Sunmisola Elizabeth Agbebi Okeleye"]} +{"canonical": "Apoutchou National", "country": "Ivory Coast", "entity_id": "Q117712984", "variants": ["Le guide", "Stéphane Agbré"]} +{"canonical": "Snoway", "country": "Nigeria", "entity_id": "Q117813768", "variants": ["Smith Agbonaye"]} +{"canonical": "Yadah", "country": "Nigeria", "entity_id": "Q117885849", "variants": ["Agaga Praise Kukeurim"]} +{"canonical": "Jimoh Abiodun Prince", "country": "Nigeria", "entity_id": "Q118212907", "variants": ["Zeel Tiger"]} +{"canonical": "Mesach Semakula", "country": "Uganda", "entity_id": "Q118383331", "variants": ["Paapa"]} +{"canonical": "Nkosinathi Maphalala", "country": "South Africa", "entity_id": "Q118630794", "variants": ["Nay Maps"]} +{"canonical": "Nkosazana Daughter", "country": "South Africa", "entity_id": "Q118719877", "variants": ["Nkosazana Nolwazi Kimberly Nzama", "Nolwazi Kimberly", "Nolwazi Kimberly Nzama", "Nolwazi Nzama"]} +{"canonical": "Ifé", "country": "Nigeria", "entity_id": "Q119013497", "variants": ["Ifechukwu Mercy Michael"]} +{"canonical": "Bisk", "country": "Nigeria", "entity_id": "Q119154144", "variants": ["Bisk musician", "Bisk Singer"]} +{"canonical": "Sonnie Badu", "country": "Ghana", "entity_id": "Q119157716", "variants": ["Author"]} +{"canonical": "Fadal Dey", "country": "Ivory Coast", "entity_id": "Q119293764", "variants": ["Koné Ibrahim Khaline"]} +{"canonical": "Emmanuel Iren", "country": "Nigeria", "entity_id": "Q119320391", "variants": ["Emmanuel Aniefiok Iren", "Pastor Emmanuel Iren"]} +{"canonical": "Dippy Padi", "country": "South Africa", "entity_id": "Q119439897", "variants": ["Kea"]} +{"canonical": "MohBad", "country": "Nigeria", "entity_id": "Q119700248", "variants": ["Ilerioluwa Oladimeji Aloba"]} +{"canonical": "Grantedboy", "country": "Nigeria", "entity_id": "Q119858544", "variants": ["Marvel Samuel"]} +{"canonical": "Samukele Mkhize", "country": "South Africa", "entity_id": "Q119986955", "variants": ["Khwezi in Skeem Saam", "Mabuyi in Isibaya"]} +{"canonical": "Qing Madi", "country": "Nigeria", "entity_id": "Q120001835", "variants": ["Chimamanda Pearl Chukwuma"]} +{"canonical": "Feli Nandi", "country": "Zimbabwe", "entity_id": "Q120373278", "variants": ["Felistus Winnie Chipendo"]} +{"canonical": "Limoblaze", "country": "Nigeria", "entity_id": "Q120635829", "variants": ["Samuel Onwubiko"]} +{"canonical": "Jack Rollen", "country": "Uganda", "entity_id": "Q120702285", "variants": ["JARO", "JAVIN"]} +{"canonical": "Teezee", "country": "Nigeria", "entity_id": "Q120798316", "variants": ["Teni Zaccheaus JR."]} +{"canonical": "Gavin Cracck", "country": "Nigeria", "entity_id": "Q120834948", "variants": ["Edamwen Gavin Ikponmwosa", "Gavin Cracck Musician"]} +{"canonical": "Faridah Seriki", "country": "Nigeria", "entity_id": "Q120920323", "variants": ["Kah-Lo"]} +{"canonical": "Shallipopi", "country": "Nigeria", "entity_id": "Q120943157", "variants": ["Crown Uzama"]} +{"canonical": "Gugulethu Duma", "country": "South Africa", "entity_id": "Q120959731", "variants": ["dumamma"]} +{"canonical": "Chinonso Emmanuel Ome", "country": "Nigeria", "entity_id": "Q120964214", "variants": ["Jaywillz"]} +{"canonical": "Adintu Victor", "country": "Nigeria", "entity_id": "Q120964413", "variants": ["AV"]} +{"canonical": "Roelof Willem Temmingh", "country": "South Africa", "entity_id": "Q121252876", "variants": ["Roelof Temmingh", "Roelof Temmingh, Sr."]} +{"canonical": "Steve Crown", "country": "Nigeria", "entity_id": "Q121295856", "variants": ["Steve Crown Uche Okolo"]} +{"canonical": "Yaw Ray", "country": "Ghana", "entity_id": "Q121600157", "variants": ["Kingsley Agyapong Boateng"]} +{"canonical": "Andre Vibez", "country": "Nigeria", "entity_id": "Q121769985", "variants": ["Alexander Uwaifo"]} +{"canonical": "Daniel Jeddman", "country": "Ghana", "entity_id": "Q122208237", "variants": ["Daniel Adu-Boahene"]} +{"canonical": "Joëlle Esso", "country": "Cameroon", "entity_id": "Q122472900", "variants": ["Jeki Esso"]} +{"canonical": "Asaba (Singer)", "country": "Cameroon", "entity_id": "Q122501891", "variants": ["Asaba"]} +{"canonical": "Stella Mwangi", "country": "Kenya", "entity_id": "Q122823", "variants": ["Stella Nyambura Mwangi"]} +{"canonical": "Myztro", "country": "South Africa", "entity_id": "Q122956422", "variants": ["Bra Biza"]} +{"canonical": "Ayo Vincent", "country": "Nigeria", "entity_id": "Q123028350", "variants": ["Ayodele Enitan Bajulaiye"]} +{"canonical": "T.I Blaze", "country": "Nigeria", "entity_id": "Q123059233", "variants": ["Akintunde Abiodun Timileyin"]} +{"canonical": "Decoo Jay", "country": "Nigeria", "entity_id": "Q123060975", "variants": ["Okojie Daniel Collins"]} +{"canonical": "Lanie Banks", "country": "Uganda", "entity_id": "Q123191860", "variants": ["Micheal Osings"]} +{"canonical": "Snazzy the Optimist", "country": "Nigeria", "entity_id": "Q123279566", "variants": ["Michael Chimereuche Alozie"]} +{"canonical": "Lebohang Mpyana", "country": "South Africa", "entity_id": "Q123286892", "variants": ["Lebohang \"Lettie\" Mpyana", "Queen Sekwatakwata"]} +{"canonical": "Deebiz", "country": "Nigeria", "entity_id": "Q123461787", "variants": ["Ibe Samuel Chukwuebuka"]} +{"canonical": "Staqk G", "country": "Nigeria", "entity_id": "Q123537507", "variants": ["Tony Brown", "Jude Brown Tamunoibim", "Tamunoibim Jude Tonye-Brown"]} +{"canonical": "Yamê", "country": "Cameroon", "entity_id": "Q123574342", "variants": ["Emmanuel Sow", "Yamê Bantu"]} +{"canonical": "Sess", "country": "Nigeria", "entity_id": "Q123755585", "variants": ["Sess ProblM Kid"]} +{"canonical": "Kaestrings", "country": "Nigeria", "entity_id": "Q123758826", "variants": ["Kingsley Innocent Owoicho-Oche"]} +{"canonical": "Yung Willis", "country": "Nigeria", "entity_id": "Q123784647", "variants": ["Daniel Williams", "Willis", "Willisgivedem"]} +{"canonical": "Mr. Wealth", "country": "Nigeria", "entity_id": "Q123846666", "variants": ["Wealth Freedom"]} +{"canonical": "Ebuka Songs", "country": "Nigeria", "entity_id": "Q123846991", "variants": ["Apostle of fire", "Ebuka Emmanuel Hilary"]} +{"canonical": "Naomi Mac", "country": "Nigeria", "entity_id": "Q123849087", "variants": ["Naomi Oyintare Mac Ebiama"]} +{"canonical": "African China", "country": "Nigeria", "entity_id": "Q123863181", "variants": ["Chinagorom Onuoha"]} +{"canonical": "Azadus", "country": "Nigeria", "entity_id": "Q123965074", "variants": ["Olalekan Fadeyi"]} +{"canonical": "Djinee", "country": "Nigeria", "entity_id": "Q123979833", "variants": ["Osayamwen Nosa Donald"]} +{"canonical": "Socket", "country": "Nigeria", "entity_id": "Q124024092", "variants": ["Socket musical artist"]} +{"canonical": "Phantom", "country": "Nigeria", "entity_id": "Q124039768", "variants": ["Ayobami Olaleye"]} +{"canonical": "Capital F.E.M.I", "country": "Nigeria", "entity_id": "Q124047364", "variants": ["Olufemi Adeyinka"]} +{"canonical": "Kas", "country": "Nigeria", "entity_id": "Q124077221", "variants": ["Kas Lionheart Jonathan"]} +{"canonical": "Kelly Hansome", "country": "Nigeria", "entity_id": "Q124125276", "variants": ["Kelechi Orji Obinna George Michael"]} +{"canonical": "T Dollar", "country": "Nigeria", "entity_id": "Q124157123", "variants": ["Olabinjo Ayotunde Quam"]} +{"canonical": "Khid Ceejay", "country": "Nigeria", "entity_id": "Q124248942", "variants": ["Ceejay", "Chinedu Emmanuel Chijioke"]} +{"canonical": "Abba Jérôme", "country": "Ethiopia", "entity_id": "Q124256063", "variants": ["Gäbrä-Mädhen Gäbrä-Musé"]} +{"canonical": "Paul Asare (Musician)", "country": "Ghana", "entity_id": "Q124364112", "variants": ["Yaw Tuba"]} +{"canonical": "Clayrocksu", "country": "Nigeria", "entity_id": "Q124395568", "variants": ["Clay"]} +{"canonical": "Nompumelelo Ledwaba", "country": "South Africa", "entity_id": "Q124412780", "variants": ["Mpoomy"]} +{"canonical": "Uchechi Treasure", "country": "Nigeria", "entity_id": "Q124467565", "variants": ["Ada kirikiri"]} +{"canonical": "Daliwonga", "country": "South Africa", "entity_id": "Q124467996", "variants": ["Daliwonga Matiwane"]} +{"canonical": "Nienke Nasserian", "country": "Tanzania", "entity_id": "Q124550085", "variants": ["Nienke Nasserian Nillesen"]} +{"canonical": "Saba", "country": "Ethiopia", "entity_id": "Q124606307", "variants": ["SABA", "Anna Lykke Oehlenschlæger", "Anna Oehlenschlæger", "Anna Saba Lykke Oehlenschlæger", "Anna Saba Oehlenschlæger", "Saba Lykke Oehlenschlæger", "Saba Oehlenschlæger"]} +{"canonical": "Deborah Okolie", "country": "Nigeria", "entity_id": "Q124642799", "variants": ["Kam Debie"]} +{"canonical": "Chidnma Ekile", "country": "Nigeria", "entity_id": "Q124652280", "variants": ["Chidnma"]} +{"canonical": "Nontobeko Thandeka Ngema", "country": "South Africa", "entity_id": "Q124654210", "variants": ["Mawhoo"]} +{"canonical": "Virginia Quabe,Viggy Quabe", "country": "South Africa", "entity_id": "Q124654415", "variants": ["Quabe Twins"]} +{"canonical": "Ecko Miles", "country": "Nigeria", "entity_id": "Q124658615", "variants": ["Edison Ogums"]} +{"canonical": "Naledi Aphiwe", "country": "South Africa", "entity_id": "Q124658789", "variants": ["Ma'Squbu", "Naledi Aphiwe Myogwane"]} +{"canonical": "Sasco Breez", "country": "Nigeria", "entity_id": "Q124664097", "variants": ["Sasco Osayamen"]} +{"canonical": "Samela Tyelbooi", "country": "South Africa", "entity_id": "Q124666080", "variants": ["Samantha Tyelbooi"]} +{"canonical": "Unathi Fundiswa Nsengana", "country": "South Africa", "entity_id": "Q124666277", "variants": ["Unathi Nkayi"]} +{"canonical": "Keamogetswe Trudy Leburu", "country": "South Africa", "entity_id": "Q124679903", "variants": ["Bontle", "Kea Leburu"]} +{"canonical": "Yallunder", "country": "South Africa", "entity_id": "Q124728857", "variants": ["Yolanda Nyembezi"]} +{"canonical": "Anne Nassanga", "country": "Uganda", "entity_id": "Q124883282", "variants": ["Afrie"]} +{"canonical": "K.K. Kabobo", "country": "Ghana", "entity_id": "Q125056028", "variants": ["Kwabena Kwakye Kabobo", "Rev. Kwabena Kwakye Kabobo"]} +{"canonical": "Sofiya Nzau", "country": "Kenya", "entity_id": "Q125118085", "variants": ["Sofiya Wanjiku"]} +{"canonical": "Douk Saga", "country": "Ivory Coast", "entity_id": "Q1252624", "variants": ["Stéphane Hamidou Doukouré"]} +{"canonical": "Estelle Mveng", "country": "Cameroon", "entity_id": "Q125319243", "variants": ["Mveng Amougou Estelle Victorine"]} +{"canonical": "Josephine Kakooza", "country": "Uganda", "entity_id": "Q125423041", "variants": ["CP Josephine Kakooza", "Maama Police"]} +{"canonical": "Will Linley", "country": "South Africa", "entity_id": "Q125554868", "variants": ["William Linley"]} +{"canonical": "Zerrydl", "country": "Nigeria", "entity_id": "Q125689741", "variants": ["Divine Uzama"]} +{"canonical": "Joshua Baraka", "country": "Uganda", "entity_id": "Q126165407", "variants": ["J. Baraka"]} +{"canonical": "Jon Germain", "country": "Ghana", "entity_id": "Q126281206", "variants": ["The Supremo"]} +{"canonical": "Etsegenet Mekonnen", "country": "Ethiopia", "entity_id": "Q126325171", "variants": ["Esy Tadesse"]} +{"canonical": "Makon", "country": "Cameroon", "entity_id": "Q126370160", "variants": ["Yong Mark Ndi"]} +{"canonical": "Dudu Pukwana", "country": "South Africa", "entity_id": "Q1263803", "variants": ["Mthutuzeli Dudu Pukwana"]} +{"canonical": "Dumisani Maraire", "country": "Zimbabwe", "entity_id": "Q1264998", "variants": ["Abraham Dumisani Maraire", "Abraham Maraire", "Dumisani Abraham Maraire"]} +{"canonical": "Johnny Junior", "country": "Kenya", "entity_id": "Q126641075", "variants": ["John Odhiambo Orondo", "Johny Junior", "Ojuno", "Wuod Nyasega"]} +{"canonical": "Eva Noel Harvey", "country": "South Africa", "entity_id": "Q126685317", "variants": ["Eva Noel Donovan", "Eva Harvey"]} +{"canonical": "Saliou Sarr", "country": "Senegal", "entity_id": "Q126685858", "variants": ["Alibéta", "Saliou Waa Guendoum Sarr"]} +{"canonical": "Sulaiman Kiggundu", "country": "Uganda", "entity_id": "Q126962709", "variants": ["McSan", "Mr Finelines"]} +{"canonical": "Alemeda", "country": "Ethiopia", "entity_id": "Q127513953", "variants": ["Rahema Shifa Alameda"]} +{"canonical": "B-Right", "country": "Ivory Coast", "entity_id": "Q127689463", "variants": ["Yann"]} +{"canonical": "Eboa Lotin", "country": "Cameroon", "entity_id": "Q1279965", "variants": ["Emmanuel Eboa Lotin"]} +{"canonical": "Boy Marvel", "country": "Nigeria", "entity_id": "Q128199460", "variants": ["Marvel Samuel"]} +{"canonical": "William Plomer", "country": "South Africa", "entity_id": "Q1282985", "variants": ["William Charles Franklyn Plomer"]} +{"canonical": "Tiggs Da Author", "country": "Tanzania", "entity_id": "Q128601752", "variants": ["Adam Muhabwa"]} +{"canonical": "Zee Nxumalo", "country": "South Africa", "entity_id": "Q128694020", "variants": ["Zandile Nxumalo"]} +{"canonical": "Mthandeni SK", "country": "South Africa", "entity_id": "Q128759149", "variants": ["Igcokama Elisha", "Indlabeyiphika", "Manqele Mthandeni Igcokama Elisha", "Mthandeni Manqele", "Mthandeni Skhosana"]} +{"canonical": "D Voice", "country": "Tanzania", "entity_id": "Q129033469", "variants": ["Abdul Hamisi Mtambo"]} +{"canonical": "Jack Maradona", "country": "South Africa", "entity_id": "Q130231738", "variants": ["Jack M."]} +{"canonical": "Elozonam", "country": "Nigeria", "entity_id": "Q130240326", "variants": ["Elozonam Ogbolu"]} +{"canonical": "Frida Amani", "country": "Tanzania", "entity_id": "Q130287368", "variants": ["Madam President", "Frida Amani Bakula"]} +{"canonical": "Solly Moholo", "country": "South Africa", "entity_id": "Q130307368", "variants": ["Solomon Majafela Molokoane"]} +{"canonical": "Bobby van Jaarsveld", "country": "South Africa", "entity_id": "Q13034376", "variants": ["Pieter van Jaarsveld"]} +{"canonical": "Dozi", "country": "South Africa", "entity_id": "Q13034645", "variants": ["Hendrik Opperman"]} +{"canonical": "Gawie Cillié", "country": "South Africa", "entity_id": "Q13034762", "variants": ["Gabriel Cillie", "Gabriel Cillié", "Gabriël Gideon Cillie", "Gabriël Gideon Cillié", "Gawie Cillie"]} +{"canonical": "Jannie du Toit", "country": "South Africa", "entity_id": "Q13035046", "variants": ["Johannes Hendrik du Toit"]} +{"canonical": "Joe Niemand", "country": "South Africa", "entity_id": "Q13035064", "variants": ["J. J. Niemand", "J. Niemand", "Johannes Jordaan Niemand", "Niemand, Joe", "Niemand, Johannes Jordaan"]} +{"canonical": "Snotkop", "country": "South Africa", "entity_id": "Q13036057", "variants": ["Francois Henning"]} +{"canonical": "Morravey", "country": "Nigeria", "entity_id": "Q130396077", "variants": ["Ravi"]} +{"canonical": "Nasibo", "country": "Zimbabwe", "entity_id": "Q130472241", "variants": ["Nasibo Music", "Nasibo Mutize"]} +{"canonical": "Sol'E", "country": "Ivory Coast", "entity_id": "Q130478152", "variants": ["Jazzy Rapper"]} +{"canonical": "Ayo Maff", "country": "Nigeria", "entity_id": "Q130558726", "variants": ["Ayomide Mafoluku Ayodele"]} +{"canonical": "King Flekky", "country": "Nigeria", "entity_id": "Q130710351", "variants": ["Akinbule Oluwafemi Olamilekan"]} +{"canonical": "Kingsley Q", "country": "Ghana", "entity_id": "Q130759608", "variants": ["Kingsley Quainoo"]} +{"canonical": "Rebecca Jjingo", "country": "Uganda", "entity_id": "Q131152357", "variants": ["Becky", "Rebecca Alice Jjingo"]} +{"canonical": "John Knox Bokwe", "country": "South Africa", "entity_id": "Q13123158", "variants": ["Mdengentonga"]} +{"canonical": "Safiya Yusuf", "country": "Nigeria", "entity_id": "Q131288640", "variants": ["Safara'u", "Safara'u 442", "Safara'u Kwana Casa'in"]} +{"canonical": "King Paluta", "country": "Ghana", "entity_id": "Q131303439", "variants": ["Thomas Adjei Wireko"]} +{"canonical": "Llona", "country": "Nigeria", "entity_id": "Q131323436", "variants": ["Michael Ajuma Attah"]} +{"canonical": "Remi Aluko", "country": "Nigeria", "entity_id": "Q131356580", "variants": ["Ajela", "Baba Bose", "Igwe1"]} +{"canonical": "PLXNET", "country": "Nigeria", "entity_id": "Q131357603", "variants": ["Black Lavender"]} +{"canonical": "Nandor Love", "country": "Uganda", "entity_id": "Q131362422", "variants": ["Nantume Dorcus Tendo", "Dorcus Nantume Tendo"]} +{"canonical": "Sandra Nansambu Kalungi", "country": "Uganda", "entity_id": "Q131362670", "variants": ["Nansambu Sandra"]} +{"canonical": "Waje", "country": "Nigeria", "entity_id": "Q13140891", "variants": ["Aituaje Aina Vivian Ebele Iruobe", "Aituaje Iruobe"]} +{"canonical": "Sahele Degago", "country": "Ethiopia", "entity_id": "Q13143800", "variants": ["Sahel Degago", "Sahle Degago"]} +{"canonical": "Bahta Gebrehiwot", "country": "Ethiopia", "entity_id": "Q13144204", "variants": ["Bahta Gebre Hiwot"]} +{"canonical": "Tezera Hailemichael", "country": "Ethiopia", "entity_id": "Q13144346", "variants": ["Tezera Haile Michael"]} +{"canonical": "Abebe Tessema", "country": "Ethiopia", "entity_id": "Q13144683", "variants": ["Abebe Tesema"]} +{"canonical": "Esatu Tessema", "country": "Ethiopia", "entity_id": "Q13144801", "variants": ["Essatu Tessema", "Issatu Tessema"]} +{"canonical": "Eyob Mekonnen", "country": "Ethiopia", "entity_id": "Q13144969", "variants": ["Eyob Mekonnen Yalem"]} +{"canonical": "Tibebu Workiye", "country": "Ethiopia", "entity_id": "Q13146463", "variants": ["Tibebu Workeye", "Tibebu Workyie"]} +{"canonical": "Frew Hailu", "country": "Ethiopia", "entity_id": "Q13146582", "variants": ["Fréw Haylou"]} +{"canonical": "Julia Church", "country": "South Africa", "entity_id": "Q131527357", "variants": ["Julia Margaret Church"]} +{"canonical": "Natalie Kassanga", "country": "Tanzania", "entity_id": "Q131550264", "variants": ["Natalie Soni Kassanga"]} +{"canonical": "Black T Igwe", "country": "Ghana", "entity_id": "Q131579712", "variants": ["Black T", "Black T Togo", "Eric Yaw Otu"]} +{"canonical": "Peter Miles", "country": "Uganda", "entity_id": "Q13188765", "variants": ["Peter Kanyike"]} +{"canonical": "King Tri-Zi", "country": "Nigeria", "entity_id": "Q132741597", "variants": ["Kayode Felix Abifarin", "KING TRI-Zi", "King Tri-Zi Music", "Tri-Zi", "Tri-Zi Popstar"]} +{"canonical": "Krexx Nv", "country": "Nigeria", "entity_id": "Q132889082", "variants": ["Honest Ornan Okoawo", "Krexx"]} +{"canonical": "Mün The Shinobi", "country": "Nigeria", "entity_id": "Q133277887", "variants": ["Boy Called Mün", "Didam Jonah Duniya", "Jay Mün"]} +{"canonical": "Kwesike Nkwachukwu Nuria", "country": "Nigeria", "entity_id": "Q133540622", "variants": ["Dagentle"]} +{"canonical": "Paul Henry Eboh", "country": "Nigeria", "entity_id": "Q133567436", "variants": ["Eboh Paul Henry"]} +{"canonical": "Christopher Duigan", "country": "South Africa", "entity_id": "Q133730716", "variants": ["Chris Duigan"]} +{"canonical": "e4 wizard", "country": "Nigeria", "entity_id": "Q133809200", "variants": ["e4wizard", "Oswald Essien"]} +{"canonical": "Josco Boy", "country": "Tanzania", "entity_id": "Q133847605", "variants": ["Jonathan Aoso"]} +{"canonical": "Tobiloba Abraham", "country": "Nigeria", "entity_id": "Q133862496", "variants": ["Teefamous"]} +{"canonical": "Adepah Kay", "country": "Ghana", "entity_id": "Q133881349", "variants": ["Mavis Atta"]} +{"canonical": "Alien Skin", "country": "Uganda", "entity_id": "Q133885671", "variants": ["Kimenke", "Mulwana Patrick"]} +{"canonical": "Awosika Olayemi Josiah", "country": "Nigeria", "entity_id": "Q133932634", "variants": ["Fido"]} +{"canonical": "Olumide Kehinde Emmanuel", "country": "Nigeria", "entity_id": "Q134082309", "variants": ["Kehinde Olumide", "Kehinde Olumide E.", "Olumide Kehinde"]} +{"canonical": "Steve Mweusi", "country": "Tanzania", "entity_id": "Q134185004", "variants": ["Steve Moses Musa"]} +{"canonical": "DJ Davizo", "country": "Tanzania", "entity_id": "Q134313194", "variants": ["David William Mchome"]} +{"canonical": "Calvin Boyce", "country": "South Africa", "entity_id": "Q134393624", "variants": ["Spookiez, Cal"]} +{"canonical": "Panic Jo", "country": "Uganda", "entity_id": "Q134527241", "variants": ["Heavy weight Ganja"]} +{"canonical": "Idowest", "country": "Nigeria", "entity_id": "Q134609046", "variants": ["Adekunle Idowu", "Awa mafia", "Ibagaza", "Mafia Gang"]} +{"canonical": "Oladips", "country": "Nigeria", "entity_id": "Q134729802", "variants": ["Dips", "Oladipupo Olabode Oladimeji"]} +{"canonical": "Elizabeth Serunye", "country": "South Africa", "entity_id": "Q134889976", "variants": ["Mapaseka Montsho(Moferefere Lenyalong)"]} +{"canonical": "Black-K", "country": "Ivory Coast", "entity_id": "Q135104542", "variants": ["Gnabo Gnahoré Okou Camille"]} +{"canonical": "Abomé Léléfant", "country": "Ivory Coast", "entity_id": "Q135176756", "variants": ["Anassin Boris Médard"]} +{"canonical": "Fela Sowande", "country": "Nigeria", "entity_id": "Q1352462", "variants": ["Olufela Obafunmilayo \"Fela\" Sowande"]} +{"canonical": "Youngboi OG", "country": "South Africa", "entity_id": "Q135336042", "variants": ["Geraldo Gershwin Saal", "Geraldo Saal"]} +{"canonical": "Harry Cushy", "country": "Nigeria", "entity_id": "Q135420205", "variants": ["HYC, Harry Cushy, Cushy, Jombo"]} +{"canonical": "Koko Pee", "country": "Nigeria", "entity_id": "Q135436723", "variants": ["Koko P", "Okokowa Jerry"]} +{"canonical": "Towela Kaira", "country": "Zambia", "entity_id": "Q135451541", "variants": ["Towela"]} +{"canonical": "Ernesto Djédjé", "country": "Ivory Coast", "entity_id": "Q1356737", "variants": ["Ernesto Djedje"]} +{"canonical": "Nuru Mhina", "country": "Tanzania", "entity_id": "Q135965281", "variants": ["Baby White"]} +{"canonical": "Khadija Mnoga", "country": "Tanzania", "entity_id": "Q135965594", "variants": ["KImobitel"]} +{"canonical": "Snura", "country": "Tanzania", "entity_id": "Q135965672", "variants": ["Snura Mushi"]} +{"canonical": "Lina Sanga", "country": "Tanzania", "entity_id": "Q135965917", "variants": ["Linah Sanga"]} +{"canonical": "Recho", "country": "Tanzania", "entity_id": "Q135966753", "variants": ["Winifrida Josephat"]} +{"canonical": "Mary G", "country": "Tanzania", "entity_id": "Q135967405", "variants": ["Mary Godfrey"]} +{"canonical": "Lolo Da Prince", "country": "Tanzania", "entity_id": "Q135967584", "variants": ["Zuhura A. Lwodyah"]} +{"canonical": "Mimah", "country": "Tanzania", "entity_id": "Q135967770", "variants": ["Mimah TZ"]} +{"canonical": "Kendrick David", "country": "Nigeria", "entity_id": "Q136142722", "variants": ["Luceàvá"]} +{"canonical": "Troye Sivan", "country": "South Africa", "entity_id": "Q1362028", "variants": ["Troye Sivan Mellet"]} +{"canonical": "Five O’ Clock", "country": "Nigeria", "entity_id": "Q136349597", "variants": ["1806", "Adebayo Taiwo Obafemi", "Five O Clock", "Five o’clock", "Five o’Clock", "Five O’Clock"]} +{"canonical": "DarkerRSA", "country": "South Africa", "entity_id": "Q136351800", "variants": ["Darker", "Dondada", "Sibusiso Given Ndimande"]} +{"canonical": "Grace Lubega", "country": "Uganda", "entity_id": "Q136357064", "variants": ["Apostle Grace Lubega", "Apostle Grace Lubega Matovu"]} +{"canonical": "joshfiks", "country": "Uganda", "entity_id": "Q136393610", "variants": ["Every girl's dream boy"]} +{"canonical": "Rozevn", "country": "Nigeria", "entity_id": "Q136416359", "variants": ["Rv, Aisosa FX,"]} +{"canonical": "Priscille Josée Gnakrou", "country": "Ivory Coast", "entity_id": "Q136490091", "variants": ["josey"]} +{"canonical": "De Catamon", "country": "Nigeria", "entity_id": "Q136536130", "variants": ["Boy Ken", "Kenneth Chukwuemeka Asogwa", "Emmy Dollar", "Lil Boz"]} +{"canonical": "Shamitu", "country": "Ethiopia", "entity_id": "Q136542769", "variants": ["Nuria Ahmed Shami Kalid", "Nuria Ahmed Ali Shami Kalid", "Nuria Ahmed"]} +{"canonical": "HapiVaal", "country": "South Africa", "entity_id": "Q136646497", "variants": ["Happy Mhlongo", "vaal"]} +{"canonical": "Kezia Swartz", "country": "South Africa", "entity_id": "Q136681868", "variants": ["Kezia"]} +{"canonical": "ABEDNEGO ABRAK PETER", "country": "Nigeria", "entity_id": "Q136682810", "variants": ["Abrak"]} +{"canonical": "Pop Theo", "country": "Nigeria", "entity_id": "Q136703931", "variants": ["Pop", "Theo"]} +{"canonical": "Egbenuneghen", "country": "Nigeria", "entity_id": "Q136705869", "variants": ["Agbada", "Glory Akhuemokhan", "Glory Osebhajajemhen Akhuemokhan"]} +{"canonical": "Emperor Wadada", "country": "Nigeria", "entity_id": "Q136721849", "variants": ["Emperor Wadada Aikore", "Wadada Aikore", "Oba Teku Teku 1", "Oba Teku-Teku 1"]} +{"canonical": "Anthony Musaala", "country": "Uganda", "entity_id": "Q136734158", "variants": ["Fr. Musaala", "dancing priest", "Anthony Aliddeki Musaala"]} +{"canonical": "Kikumbi Mwanza Pango", "country": "Tanzania", "entity_id": "Q136745706", "variants": ["Kikumbi", "Kiki Kikumbi", "Kiki Kikumbi King Of Masantula", "Kikumbi M. Mpango", "Kikumbi Mwanza Mpango"]} +{"canonical": "Nana Ama Dadzie", "country": "Ghana", "entity_id": "Q136831409", "variants": ["Adadziewaa"]} +{"canonical": "Kasita Carol", "country": "Uganda", "entity_id": "Q136914570", "variants": ["Karole Kasita"]} +{"canonical": "Sneepa", "country": "Kenya", "entity_id": "Q137004448", "variants": ["Sanchez Demoso"]} +{"canonical": "Tony Allen", "country": "Nigeria", "entity_id": "Q1371393", "variants": ["Tony Oladipo Allen"]} +{"canonical": "Johnson Rays", "country": "Nigeria", "entity_id": "Q137185362", "variants": ["Akinniyi Oluwaseun Johnson", "Johnson Rays NG"]} +{"canonical": "Odunayo Oke", "country": "Nigeria", "entity_id": "Q137209847", "variants": ["Odunayo Oke (gospel artist) Odunayo"]} +{"canonical": "Mr Gee TupaZ", "country": "Zimbabwe", "entity_id": "Q137242235", "variants": ["Gabriel Mutupanyama", "Mr Gee"]} +{"canonical": "Ange Ebogo Emérent", "country": "Cameroon", "entity_id": "Q137533920", "variants": ["Ange Ebogo Emerent"]} +{"canonical": "Heis", "country": "Tanzania", "entity_id": "Q137593924", "variants": ["Heispabio", "Johnson John Albert"]} +{"canonical": "Fatou Khar Mbaye", "country": "Senegal", "entity_id": "Q137643341", "variants": ["Khar Mbaye", "Khar Mbaye Madiaga"]} +{"canonical": "Jaytainer", "country": "Nigeria", "entity_id": "Q137674311", "variants": ["Uyama, John"]} +{"canonical": "Larry Cruz", "country": "Nigeria", "entity_id": "Q137680440", "variants": ["Hillary Okolie"]} +{"canonical": "Constance Olatunde", "country": "Nigeria", "entity_id": "Q137737812", "variants": ["Konstance"]} +{"canonical": "Ruth unde", "country": "Nigeria", "entity_id": "Q137771274", "variants": ["Ru"]} +{"canonical": "Liema Pantsi", "country": "South Africa", "entity_id": "Q137821538", "variants": ["Liyema Pantsi | Liema"]} +{"canonical": "Amanda Chioma David", "country": "Nigeria", "entity_id": "Q137826428", "variants": ["Ermandha"]} +{"canonical": "Rich crown", "country": "Nigeria", "entity_id": "Q137831893", "variants": ["Adesua Samuel Adeola"]} +{"canonical": "Hannah Morris", "country": "South Africa", "entity_id": "Q137909904", "variants": ["Hannah Morris Music"]} +{"canonical": "Ice Buggi", "country": "Nigeria", "entity_id": "Q137923918", "variants": ["Icebuggi,biggi"]} +{"canonical": "Femily", "country": "Nigeria", "entity_id": "Q138035342", "variants": ["Only1femily"]} +{"canonical": "Basetsana Maluleka", "country": "South Africa", "entity_id": "Q138146896", "variants": ["Bassie"]} +{"canonical": "Harrison Dyver", "country": "Uganda", "entity_id": "Q138152985", "variants": ["Muwonge Harrison"]} +{"canonical": "Ifunanya Nwangene", "country": "Nigeria", "entity_id": "Q138187935", "variants": ["Nanyah"]} +{"canonical": "Prudence Katomeni", "country": "Zimbabwe", "entity_id": "Q138294389", "variants": ["Prudence Katomeni Mbofana"]} +{"canonical": "Sheila Mwanyigha", "country": "Kenya", "entity_id": "Q138330472", "variants": ["Mkabili"]} +{"canonical": "Joy Roselyn Rukanzakanza", "country": "Zimbabwe", "entity_id": "Q138337498", "variants": ["JoyRukanza"]} +{"canonical": "AceMob OG", "country": "Zambia", "entity_id": "Q138350910", "variants": ["Dickson Limbikani Mumba Junior", "Dickson Mumba", "The AceMob"]} +{"canonical": "Teemak", "country": "Zimbabwe", "entity_id": "Q138356367", "variants": ["Taona Oswald Chipunza", "Taona Chipunza", "All White Lord"]} +{"canonical": "Sokhna Khady Ba", "country": "Senegal", "entity_id": "Q138391845", "variants": ["Sokhna Khady Bayo"]} +{"canonical": "RemmiQue", "country": "Nigeria", "entity_id": "Q138413708", "variants": ["Hassan Remilekun"]} +{"canonical": "Rowlene", "country": "South Africa", "entity_id": "Q138460877", "variants": ["Rowlene Nicole Bosman"]} +{"canonical": "Adiouza Diallo", "country": "Senegal", "entity_id": "Q138499511", "variants": ["Adji Kane Diallo"]} +{"canonical": "Golden S", "country": "Nigeria", "entity_id": "Q138584015", "variants": ["Golden S Music Golden S Artist"]} +{"canonical": "LaySol", "country": "Tanzania", "entity_id": "Q138603233", "variants": ["Mecqi"]} +{"canonical": "Vadisco", "country": "Cameroon", "entity_id": "Q138603502", "variants": ["VADISCO"]} +{"canonical": "Julie Okine", "country": "Ghana", "entity_id": "Q138634484", "variants": ["Juliana Okine"]} +{"canonical": "Lommy nine", "country": "Tanzania", "entity_id": "Q138666060", "variants": ["Daniel peter"]} +{"canonical": "Witty Minstrel", "country": "Cameroon", "entity_id": "Q138711071", "variants": ["Lukong Dieudonne"]} +{"canonical": "Kulture Scott", "country": "Nigeria", "entity_id": "Q138721140", "variants": ["Favour Chidiebere Ezeagu"]} +{"canonical": "Luster Love", "country": "South Africa", "entity_id": "Q138756114", "variants": ["Lehlogonolo Lekala", "The Romantic Gangster"]} +{"canonical": "Xponent", "country": "Tanzania", "entity_id": "Q138762628", "variants": ["XPONENT Music, Ther3al XPONENT"]} +{"canonical": "Daramola", "country": "Nigeria", "entity_id": "Q138771702", "variants": ["Abraham Oladimeji Olaleye"]} +{"canonical": "Yvonne Ohene-Djan", "country": "Ghana", "entity_id": "Q138818351", "variants": ["SHE"]} +{"canonical": "Kuneli", "country": "Ghana", "entity_id": "Q138818386", "variants": ["Deborah Mawunyo Kunneh"]} +{"canonical": "Saint Bruno Djomegni", "country": "Cameroon", "entity_id": "Q138842911", "variants": ["Saint Bruno"]} +{"canonical": "Nonkululeko Sharon Mthunzi", "country": "South Africa", "entity_id": "Q138966054", "variants": ["Sicka Star-ban Jones"]} +{"canonical": "Nhlanhla Nciza", "country": "South Africa", "entity_id": "Q139036055", "variants": ["Nhlanhla", "Nhlanhla Mafu"]} +{"canonical": "Raymond O Ikponmwoba", "country": "Nigeria", "entity_id": "Q139495851", "variants": ["Ikponmwoba O. Raymond"]} +{"canonical": "Mun G", "country": "Uganda", "entity_id": "Q139541037", "variants": ["Mungi Emmanuel Matovu"]} +{"canonical": "Viviane Chidid", "country": "Senegal", "entity_id": "Q1396717", "variants": ["Viviane"]} +{"canonical": "Tendo Tobel", "country": "Uganda", "entity_id": "Q139859181", "variants": ["Lady TiTi"]} +{"canonical": "SANTAE", "country": "South Africa", "entity_id": "Q139917280", "variants": ["Liyabona Giyose, Liyabona, SANTAE, Liya."]} +{"canonical": "Godswill Trillions", "country": "Nigeria", "entity_id": "Q139947453", "variants": ["Gbasiyo Godswill Jesukobiruo"]} +{"canonical": "Alic Skrrr", "country": "Uganda", "entity_id": "Q139980884", "variants": ["Alic", "Alic skrrr music", "Alic Skrrr official", "alicskrrr", "Kityo Ali"]} +{"canonical": "Confidence Survival Eyong", "country": "Nigeria", "entity_id": "Q140085977", "variants": ["Ciel Music"]} +{"canonical": "Boyonset", "country": "Nigeria", "entity_id": "Q140159484", "variants": ["The Kid Onset"]} +{"canonical": "Lurd Yung Zee", "country": "Nigeria", "entity_id": "Q140190655", "variants": ["Edwinyung Ochonu"]} +{"canonical": "Swanky Olo", "country": "Nigeria", "entity_id": "Q140248519", "variants": ["Any other stage names you use"]} +{"canonical": "Mubanga Natasha Tarukwana", "country": "Zimbabwe", "entity_id": "Q140277996", "variants": ["Mimmie Tarukwana"]} +{"canonical": "Sulumani Chimbetu", "country": "Zimbabwe", "entity_id": "Q140278256", "variants": ["Sulu"]} +{"canonical": "Lass", "country": "Senegal", "entity_id": "Q140278973", "variants": ["Lassana Sané"]} +{"canonical": "Jxt CJay", "country": "Nigeria", "entity_id": "Q140373357", "variants": ["GodsGift Chijioke Nwanna"]} +{"canonical": "Jarxd Anthony", "country": "Zimbabwe", "entity_id": "Q140385786", "variants": ["Bandile Matsena"]} +{"canonical": "Tinashe Gonzara", "country": "Zimbabwe", "entity_id": "Q140386248", "variants": ["Ti Gonzi"]} +{"canonical": "Nkosilathi Sibiya", "country": "Zimbabwe", "entity_id": "Q140386287", "variants": ["Volts JT"]} +{"canonical": "Qeqeshiwe Mntambo", "country": "Zimbabwe", "entity_id": "Q140386322", "variants": ["Qeqe"]} +{"canonical": "Isheanesu Chigagura", "country": "Zimbabwe", "entity_id": "Q140386377", "variants": ["iShan"]} +{"canonical": "KHAL", "country": "Nigeria", "entity_id": "Q140411706", "variants": ["Heiskal", "Heiskhal_"]} +{"canonical": "Rera Sky", "country": "Nigeria", "entity_id": "Q140458341", "variants": ["Rera"]} +{"canonical": "Hondread", "country": "Nigeria", "entity_id": "Q140481034", "variants": ["Hondread Music"]} +{"canonical": "Cavix", "country": "Zimbabwe", "entity_id": "Q140690730", "variants": ["Panashe Dube", "Panashe Tavengana Dube"]} +{"canonical": "Gospel Child", "country": "Nigeria", "entity_id": "Q140757224", "variants": ["Gospel child"]} +{"canonical": "Bissi Mag", "country": "Cameroon", "entity_id": "Q140763665", "variants": ["Noubissi Fotso Luc Romuald"]} +{"canonical": "Joe Lington", "country": "Cameroon", "entity_id": "Q140841663", "variants": ["Joe Lington Music"]} +{"canonical": "Edem Evangelist", "country": "Ghana", "entity_id": "Q140867013", "variants": ["Edem Worlali Tedeku"]} +{"canonical": "Kunmie", "country": "Nigeria", "entity_id": "Q140918125", "variants": ["Oluwabukunmi Peter"]} +{"canonical": "Iceking", "country": "Nigeria", "entity_id": "Q140923106", "variants": ["Iceking01"]} +{"canonical": "Adebola Akinola", "country": "Nigeria", "entity_id": "Q141068876", "variants": ["Adebola Omowunmi Akinola"]} +{"canonical": "Toothzboy", "country": "Nigeria", "entity_id": "Q141119339", "variants": ["Isibor Onyekachukwu Ezekiel"]} +{"canonical": "Gia Réi (Georgia Oviesu)", "country": "Nigeria", "entity_id": "Q141136713", "variants": ["Gia", "Georgia Oviesu", "Gia Réi"]} +{"canonical": "Seka", "country": "Ivory Coast", "entity_id": "Q141180281", "variants": ["Christian Kouassi"]} +{"canonical": "Isaac Bullock Kintu", "country": "Uganda", "entity_id": "Q141184044", "variants": ["Isaac Bullock, Kyakuwa"]} +{"canonical": "Lyghter Man", "country": "Ghana", "entity_id": "Q141188533", "variants": ["Lyghter Man Official", "Seidu Mohammed Naziru"]} +{"canonical": "Jayden Botha", "country": "South Africa", "entity_id": "Q141202913", "variants": ["Jayden Lourens Botha"]} +{"canonical": "BigElli", "country": "Nigeria", "entity_id": "Q141205132", "variants": ["Light", "Ghost", "Elli", "Elliot Oghenevwede Agbomi", "Dbadbllud", "Elliot Vwede", "ThugBaby"]} +{"canonical": "High Trzace", "country": "Nigeria", "entity_id": "Q141212253", "variants": ["High", "Trace", "Also known as: HIGH TRZACE, high trzace, uzoma Stephen iheagwam, high trace, High Trace, HIGH TRACE, High, Trace, Trzace, TRZACE", "High Trace", "HIGH TRACE", "Trzace"]} +{"canonical": "Kerry Nadia", "country": "Uganda", "entity_id": "Q141223181", "variants": ["Kerry Nadrash"]} +{"canonical": "Amooti Omubalanguzi", "country": "Uganda", "entity_id": "Q141290206", "variants": ["Allan Mujuni"]} +{"canonical": "Zulex", "country": "Nigeria", "entity_id": "Q141348137", "variants": ["Nzubechi Alexander Okechukwu"]} +{"canonical": "Isaac Wills", "country": "Uganda", "entity_id": "Q141348738", "variants": ["Mwesigwa Isaac Williams"]} +{"canonical": "Adewale Basit Jimoh", "country": "Nigeria", "entity_id": "Q141349625", "variants": ["Fluent"]} +{"canonical": "Amina Abdi Wako", "country": "Kenya", "entity_id": "Q141385090", "variants": ["Kenya radio and tv hosts"]} +{"canonical": "Ali Birra", "country": "Ethiopia", "entity_id": "Q143095", "variants": ["Ali Mahammed", "Ali Mohammed Musa"]} +{"canonical": "John Kongos", "country": "South Africa", "entity_id": "Q1438869", "variants": ["John Theodore Kongos"]} +{"canonical": "Miriam Makeba", "country": "South Africa", "entity_id": "Q146256", "variants": ["Miriam Zenzi Makeba", "Mirjam Makeba", "Zensile Makeba Qgwashu Nguvama Yiketheli Nxgowa Bantana Balomzi Xa Ufnu Ubajabulisa Ubaphekeli Mbiza Yotshwala Sithi Xa Saku Qgiba Ukutja Sithathe Izitsha Sizi Khabe Singama Lawu Singama Qgwashu Singama Nqamla Nqgithi", "Zenzile Miriam Makeba", "Mama Africa", "Miriam Zenat Makeba"]} +{"canonical": "Slim Burna", "country": "Nigeria", "entity_id": "Q14900355", "variants": ["Gabriel Soprinye Halliday"]} +{"canonical": "Takura", "country": "Zimbabwe", "entity_id": "Q14920149", "variants": ["Takura Tendayi"]} +{"canonical": "Kelly Dénis", "country": "Uganda", "entity_id": "Q15078245", "variants": ["Kimuli Kelly Dénnis"]} +{"canonical": "Winston Mankunku Ngozi", "country": "South Africa", "entity_id": "Q1527319", "variants": ["Winston Monwabisi Ngozi", "Winston Ngozi"]} +{"canonical": "Diamond Platnumz", "country": "Tanzania", "entity_id": "Q15429574", "variants": ["Naseeb Abdul Juma Issack"]} +{"canonical": "Jennifer Ferguson", "country": "South Africa", "entity_id": "Q1550516", "variants": ["Jennifer Kestis Ferguson"]} +{"canonical": "Brequette Cassie", "country": "South Africa", "entity_id": "Q15710750", "variants": ["Brequette"]} +{"canonical": "Ginger Johnson", "country": "Nigeria", "entity_id": "Q15812305", "variants": ["Folorunsho Johnson", "George Folunsho Johnson"]} +{"canonical": "Harry Miller", "country": "South Africa", "entity_id": "Q1586663", "variants": ["Harold Simon Miller"]} +{"canonical": "Francois Van Coke", "country": "South Africa", "entity_id": "Q15875346", "variants": ["Francois Badenhorst"]} +{"canonical": "Jan Blohm", "country": "South Africa", "entity_id": "Q15983182", "variants": ["George Harry (Jurie) Kymdell"]} +{"canonical": "Jeremy Loops", "country": "South Africa", "entity_id": "Q15983685", "variants": ["Jeremy Thomas Hewitt"]} +{"canonical": "Olaf Andresen", "country": "South Africa", "entity_id": "Q15983700", "variants": ["Hans Olaf Andresen", "Hans Olaf Waldemar Rüdiger Emmerich Felix Januarius Andresen"]} +{"canonical": "Joe Foster", "country": "South Africa", "entity_id": "Q15983702", "variants": ["Johan Vorster"]} +{"canonical": "AKA", "country": "South Africa", "entity_id": "Q15987642", "variants": ["Kiernan Jarryd Forbes"]} +{"canonical": "Theo W. Jandrell", "country": "South Africa", "entity_id": "Q16006409", "variants": ["Theodore Walter Jandrell"]} +{"canonical": "Ato Turkson", "country": "Ghana", "entity_id": "Q16013115", "variants": ["Adolphus Acquah Robertson Turkson"]} +{"canonical": "Oleseng Shuping", "country": "South Africa", "entity_id": "Q16018903", "variants": ["Oleseng Shadrack Shuping"]} +{"canonical": "Henri Dikongué", "country": "Cameroon", "entity_id": "Q1605812", "variants": ["Henri Dikongue"]} +{"canonical": "Michael Amissah", "country": "Ghana", "entity_id": "Q16089955", "variants": ["Michael Kofi Amissah"]} +{"canonical": "A-Q", "country": "Nigeria", "entity_id": "Q16148042", "variants": ["Gilbert Bani"]} +{"canonical": "Kenneth Kafui", "country": "Ghana", "entity_id": "Q16149133", "variants": ["Ken Kafui", "Kenneth Kwaku Avotri Kafui"]} +{"canonical": "Ahmedu Augustine Obiabo", "country": "Nigeria", "entity_id": "Q16201415", "variants": ["Blackface Naija"]} +{"canonical": "Chidinma Ekile", "country": "Nigeria", "entity_id": "Q16202024", "variants": ["chidima"]} +{"canonical": "Christopher Evans", "country": "Uganda", "entity_id": "Q16202910", "variants": ["Chris Evans"]} +{"canonical": "Iyanya", "country": "Nigeria", "entity_id": "Q16203843", "variants": ["Iyanya Onoyom Mbuk"]} +{"canonical": "Nikki Laoye", "country": "Nigeria", "entity_id": "Q16204256", "variants": ["Oyenike Laoye"]} +{"canonical": "Duncan Mighty", "country": "Nigeria", "entity_id": "Q16204625", "variants": ["Duncan Wene Mighty Okechukwu"]} +{"canonical": "Frank Edwards", "country": "Nigeria", "entity_id": "Q16207149", "variants": ["Frank Richboy", "Frank the Rich boy", "Frank the richboy", "Frank Ugochukwu Edwards", "FrankRichboy"]} +{"canonical": "Efya", "country": "Ghana", "entity_id": "Q16208867", "variants": ["Jane Awindor", "Jane Fara Fauzzier Afia Boafowaa Yahaya Awindor"]} +{"canonical": "IllRymz", "country": "Nigeria", "entity_id": "Q16209398", "variants": ["Olowu Bardia Adebola"]} +{"canonical": "Omawumi", "country": "Nigeria", "entity_id": "Q16209979", "variants": ["Omawumi Megbele"]} +{"canonical": "Jim Iyke", "country": "Nigeria", "entity_id": "Q16211543", "variants": ["James Ikechukwu Esomugha"]} +{"canonical": "Rymzo", "country": "Nigeria", "entity_id": "Q16215077", "variants": ["Churchill Sosa De Gusto", "Roaring Lion", "The Roaring Lion"]} +{"canonical": "Gloria Muliro", "country": "Kenya", "entity_id": "Q16221075", "variants": ["Gloria Owendi"]} +{"canonical": "Olamide", "country": "Nigeria", "entity_id": "Q16221097", "variants": ["Olamide Gbenga Adedeji"]} +{"canonical": "Spoek Mathambo", "country": "South Africa", "entity_id": "Q16223782", "variants": ["Nthato Mokgata"]} +{"canonical": "Ian Jazzi", "country": "Ghana", "entity_id": "Q16231350", "variants": ["Ian Frederick Oshodi"]} +{"canonical": "Orezi", "country": "Nigeria", "entity_id": "Q16231482", "variants": ["Esegine Orezi Allen"]} +{"canonical": "Wiyaala", "country": "Ghana", "entity_id": "Q16231624", "variants": ["Lioness of Africa", "Noella Wiyaala", "Noella Wiyaala Nwadei"]} +{"canonical": "Wurld", "country": "Nigeria", "entity_id": "Q16232036", "variants": ["Sadiq Onifade"]} +{"canonical": "Prince Kudakwashe Musarurwa", "country": "Zimbabwe", "entity_id": "Q16232298", "variants": ["Prince"]} +{"canonical": "Wizkid", "country": "Nigeria", "entity_id": "Q16233663", "variants": ["Machala", "Ayodeji Ibrahim Balogun", "Big Wiz", "Lil Prinz", "Starboy"]} +{"canonical": "Davido", "country": "Nigeria", "entity_id": "Q16234484", "variants": ["OBO", "David Adedeji Adeleke", "David Adeleke"]} +{"canonical": "KSI", "country": "Nigeria", "entity_id": "Q16235544", "variants": ["JJ", "JJ Olatunji", "KSIOlajideBT", "Olajide \"JJ\" Olatunji", "Olajide Olatunji", "Olajide Olayinka Williams \"JJ\" Olatunji", "Olajide Olayinka Williams Olatunji", "Olajide William Olatunji"]} +{"canonical": "Thomas Hasani Chauke", "country": "South Africa", "entity_id": "Q16247519", "variants": ["Thomas Chauke"]} +{"canonical": "Nathaniel Willemse", "country": "South Africa", "entity_id": "Q16258599", "variants": ["Nathaniel"]} +{"canonical": "Peter Kaberere", "country": "Kenya", "entity_id": "Q16333832", "variants": ["Kabz"]} +{"canonical": "Skepta", "country": "Nigeria", "entity_id": "Q164446", "variants": ["Joseph Adenuga", "Joseph Olaitan Adenuga Jr."]} +{"canonical": "Ifi Ude", "country": "Nigeria", "entity_id": "Q16559392", "variants": ["Diana Ifeoma Ude"]} +{"canonical": "Pierre Nartsiss", "country": "Cameroon", "entity_id": "Q16679640", "variants": ["Mudio Mukutu Pierre Narcisse De Napoli De Suza"]} +{"canonical": "Filipa Carmo da Silva", "country": "South Africa", "entity_id": "Q16728324", "variants": ["Filipa", "Filipa Alexandra Carmo da Silva"]} +{"canonical": "Khadijah Blell", "country": "Nigeria", "entity_id": "Q16728568", "variants": ["Di’ja"]} +{"canonical": "Eddy Kenzo", "country": "Uganda", "entity_id": "Q16728749", "variants": ["Ediriisa Kenzo Musuuza"]} +{"canonical": "GNL Zamba", "country": "Uganda", "entity_id": "Q16729327", "variants": ["Ernest Nsimbi"]} +{"canonical": "L-Tido", "country": "South Africa", "entity_id": "Q16731139", "variants": ["Thato Madonsela"]} +{"canonical": "Lyrikal", "country": "Nigeria", "entity_id": "Q16731737", "variants": ["Jesse James Enoch"]} +{"canonical": "Mary Uranta", "country": "Nigeria", "entity_id": "Q16732088", "variants": ["Mary Data Uranta"]} +{"canonical": "Nomfusi", "country": "South Africa", "entity_id": "Q16733441", "variants": ["Nomfusi Gotyana"]} +{"canonical": "Monica Ogah", "country": "Nigeria", "entity_id": "Q16733638", "variants": ["Monica Ene Ogah"]} +{"canonical": "Ivie Okujaye", "country": "Nigeria", "entity_id": "Q16733669", "variants": ["Ivie Okujaye Egboh"]} +{"canonical": "Dapo Torimiro", "country": "Nigeria", "entity_id": "Q16734181", "variants": ["Dapo"]} +{"canonical": "Muma Gee", "country": "Nigeria", "entity_id": "Q16738959", "variants": ["Gift Iyumame Eke", "Gift Iyumame Uwame"]} +{"canonical": "Seyi", "country": "Nigeria", "entity_id": "Q16752042", "variants": ["Deborah Oluwaseyi Joshua"]} +{"canonical": "JJC", "country": "Nigeria", "entity_id": "Q1676609", "variants": ["Skillz", "Abdul Bello", "Abdulrasheed Bello", "JJC Skillz"]} +{"canonical": "ZP Theart", "country": "South Africa", "entity_id": "Q167757", "variants": ["ZP De Villiers Theart"]} +{"canonical": "Tamara Eteimo", "country": "Nigeria", "entity_id": "Q16832114", "variants": ["Tamara Jones,"]} +{"canonical": "Aziz Azion", "country": "Uganda", "entity_id": "Q16841163", "variants": ["Aziz azinoonya", "Aziz Mukasa"]} +{"canonical": "Dammy Krane", "country": "Nigeria", "entity_id": "Q16845424", "variants": ["Oyindamola Johnson Emmanuel."]} +{"canonical": "Reminisce", "country": "Nigeria", "entity_id": "Q16848112", "variants": ["Alaga Ibile", "Alaga", "Remilekun abdulkalid Safaru", "Remilekun Khalid Safaru"]} +{"canonical": "Euphonik", "country": "South Africa", "entity_id": "Q16864067", "variants": ["Themba Mbongeni Nkosi"]} +{"canonical": "Emahoy Tsegué-Maryam Guèbrou", "country": "Ethiopia", "entity_id": "Q16866345", "variants": ["Emahoy Tsege Mariam Gebru", "Emahoy Tsegue Maryam Guebrou", "Tsegué-Maryam Guèbrou", "Yèwèbdar Guèbrou", "Yewubdar Guebrou"]} +{"canonical": "Femi Jacobs", "country": "Nigeria", "entity_id": "Q16879447", "variants": ["Oluwafemisola Jacobs"]} +{"canonical": "Shatta Wale", "country": "Ghana", "entity_id": "Q16885617", "variants": ["Bandana", "Charles Nii Armah Mensah Jr.", "Shata Wale"]} +{"canonical": "Rema Namakula", "country": "Uganda", "entity_id": "Q16935180", "variants": ["Rema", "Rehema Namakula"]} +{"canonical": "Sizwe Zakho", "country": "South Africa", "entity_id": "Q16975932", "variants": ["Sizwe Zako"]} +{"canonical": "Jovi", "country": "Cameroon", "entity_id": "Q16980116", "variants": ["Le Monstre", "Jovi le Monstre", "Ndukong Godlove Nfor"]} +{"canonical": "Johnny Dyani", "country": "South Africa", "entity_id": "Q1702317", "variants": ["Johnny Mbizo Dyani"]} +{"canonical": "Stanley Ebai Enow", "country": "Cameroon", "entity_id": "Q17150144", "variants": ["Bayangi Boy"]} +{"canonical": "Sinach", "country": "Nigeria", "entity_id": "Q17151212", "variants": ["Osinachi Kalu Okoro", "Osinachi Kalu Okoro Egbu"]} +{"canonical": "Grace Omaboe", "country": "Ghana", "entity_id": "Q17166406", "variants": ["Maame Dokono"]} +{"canonical": "Cassper Nyovest", "country": "South Africa", "entity_id": "Q17198411", "variants": ["Refiloe Maele Phoolo"]} +{"canonical": "Patoranking", "country": "Nigeria", "entity_id": "Q17198434", "variants": ["Patrick Nnaemeka Okorie"]} +{"canonical": "Kefee", "country": "Nigeria", "entity_id": "Q17202612", "variants": ["Kefee Obareki Don Momoh"]} +{"canonical": "Burna Boy", "country": "Nigeria", "entity_id": "Q17305712", "variants": ["African Giant", "Burnaboy", "Oluwa Burna"]} +{"canonical": "Ekambi Brillant", "country": "Cameroon", "entity_id": "Q17350562", "variants": ["Ekambi Louis Brillant", "Mot’a muenya"]} +{"canonical": "Becca", "country": "Ghana", "entity_id": "Q17385631", "variants": ["Rebecca Akosua Acheampomaa Acheampong"]} +{"canonical": "Papa Cidy", "country": "Uganda", "entity_id": "Q17385762", "variants": ["Hamidu Sekyeru"]} +{"canonical": "Emmy Gee", "country": "Nigeria", "entity_id": "Q17465961", "variants": ["Emmanuel Nwankwo"]} +{"canonical": "Skales", "country": "Nigeria", "entity_id": "Q17466567", "variants": ["Raoul John Njeng-Njeng"]} +{"canonical": "Durella", "country": "Nigeria", "entity_id": "Q17486497", "variants": ["Durel", "King of the Zanga", "Oluwadamilare Okulaja"]} +{"canonical": "Niyola", "country": "Nigeria", "entity_id": "Q17492512", "variants": ["Eniola Akinbo"]} +{"canonical": "Avril", "country": "Kenya", "entity_id": "Q17514263", "variants": ["Judith Nyambura Mwangi"]} +{"canonical": "Akosua Busia", "country": "Ghana", "entity_id": "Q175392", "variants": ["Akosua Cyamama Busia", "Akosua Gyamama Busia"]} +{"canonical": "Anne Marie Nzié", "country": "Cameroon", "entity_id": "Q175509", "variants": ["The golden voice of cameroon"]} +{"canonical": "Mo'Cheddah", "country": "Nigeria", "entity_id": "Q17580304", "variants": ["Mocheddah", "Mocheeda", "Modupe-Oreoluwa Oyeyemi Ola"]} +{"canonical": "Nosa", "country": "Nigeria", "entity_id": "Q17612862", "variants": ["Nosa Omoregie"]} +{"canonical": "Pape Diouf", "country": "Senegal", "entity_id": "Q17636313", "variants": ["Pape Cheikh Diouf"]} +{"canonical": "Dave Reynolds", "country": "South Africa", "entity_id": "Q17660074", "variants": ["David George Reynolds"]} +{"canonical": "Kesse", "country": "Ghana", "entity_id": "Q17712898", "variants": ["Michael Kesse Frimpong"]} +{"canonical": "Siti binti Saad", "country": "Tanzania", "entity_id": "Q1775216", "variants": ["Siti binti Saadi"]} +{"canonical": "Bi Kidude", "country": "Tanzania", "entity_id": "Q1775226", "variants": ["Fatuma binti Baraka"]} +{"canonical": "Etoundi Onambélé", "country": "Cameroon", "entity_id": "Q1790048", "variants": ["Krotal"]} +{"canonical": "Laba Sosseh", "country": "Senegal", "entity_id": "Q1799363", "variants": ["Laba Badara Sosseh"]} +{"canonical": "Phyno", "country": "Nigeria", "entity_id": "Q18001561", "variants": ["Alobam", "Chibuzor Nelson Azubuike", "Obiago", "Phyno Fino"]} +{"canonical": "Yemi Alade", "country": "Nigeria", "entity_id": "Q18016138", "variants": ["Yemi Eberechi Alade"]} +{"canonical": "K.O", "country": "South Africa", "entity_id": "Q18044325", "variants": ["Ntokozo Mdluli"]} +{"canonical": "Shizzi", "country": "Nigeria", "entity_id": "Q18163774", "variants": ["Sheyi Akerele"]} +{"canonical": "Khuli Chana", "country": "South Africa", "entity_id": "Q18205896", "variants": ["Khulane Morule"]} +{"canonical": "Gabriel Afolayan", "country": "Nigeria", "entity_id": "Q18206071", "variants": ["G-Fresh"]} +{"canonical": "Daddy Showkey", "country": "Nigeria", "entity_id": "Q18206220", "variants": ["John Odafe Asiemo"]} +{"canonical": "Friday Igwe", "country": "Nigeria", "entity_id": "Q18206946", "variants": ["Baba Fryo"]} +{"canonical": "Willy Paul", "country": "Kenya", "entity_id": "Q18211800", "variants": ["Pozee"]} +{"canonical": "Okyeame Kwame", "country": "Ghana", "entity_id": "Q18217816", "variants": ["Kwame Nsiah-Apau", "Rap Doctor"]} +{"canonical": "Lindley Evans", "country": "South Africa", "entity_id": "Q1826243", "variants": ["Harry Lindley Evans"]} +{"canonical": "Magasco", "country": "Cameroon", "entity_id": "Q18351472", "variants": ["Tohnain Anthony Nguo"]} +{"canonical": "Nick Nola", "country": "Uganda", "entity_id": "Q18353233", "variants": ["Nicholas Tatambuka", "Nicky Nola"]} +{"canonical": "Oritse Femi", "country": "Nigeria", "entity_id": "Q18358182", "variants": ["Oritsefemi Majemite Ekele"]} +{"canonical": "Teddy Afro", "country": "Ethiopia", "entity_id": "Q1853381", "variants": ["Tewodros Kassahun", "Tewodros Kassahun Germamo"]} +{"canonical": "Terry G", "country": "Nigeria", "entity_id": "Q18637375", "variants": ["Gabriel Oche Amanyi"]} +{"canonical": "Leslie 'Lee' Kasumba", "country": "Uganda", "entity_id": "Q18637519", "variants": ["Lee Kasumba", "Leslie Kasumba"]} +{"canonical": "Paddy Man", "country": "Uganda", "entity_id": "Q18637737", "variants": ["Paddy Kayiwa Mukasa"]} +{"canonical": "Elly Wamala", "country": "Uganda", "entity_id": "Q18645729", "variants": ["Elly", "Elishamar Wamala"]} +{"canonical": "Angella Katatumba", "country": "Uganda", "entity_id": "Q18684119", "variants": ["Angella Franklin Keihongani Katatumba"]} +{"canonical": "Fille Mutoni", "country": "Uganda", "entity_id": "Q18686131", "variants": ["Fille"]} +{"canonical": "Tutu Puoane", "country": "South Africa", "entity_id": "Q1869111", "variants": ["Nonthuthuzelo Puoane"]} +{"canonical": "Cristina Boshoff", "country": "South Africa", "entity_id": "Q18719311", "variants": ["Katarina Boshoff"]} +{"canonical": "Cindy Sanyu", "country": "Uganda", "entity_id": "Q18719341", "variants": ["Cinderella Sanyu"]} +{"canonical": "Louise Carver", "country": "South Africa", "entity_id": "Q1872141", "variants": ["Louise Ceri Carver"]} +{"canonical": "Mac Elvis", "country": "Uganda", "entity_id": "Q18763734", "variants": ["Mutalya Mark Elvis"]} +{"canonical": "Enygma", "country": "Uganda", "entity_id": "Q18764043", "variants": ["Enema", "Clyster", "I-Am Enygma", "Enyma", "Enyma L7"]} +{"canonical": "Henry Tigan", "country": "Uganda", "entity_id": "Q18764119", "variants": ["Henry Tony Kirumaganyi"]} +{"canonical": "Jackie Chandiru", "country": "Uganda", "entity_id": "Q18764146", "variants": ["Queen Of The Nile"]} +{"canonical": "Kwaw Kese", "country": "Ghana", "entity_id": "Q18815170", "variants": ["Abodam", "Emmanuel Botchwey"]} +{"canonical": "Wasiu Alabi Pasuma", "country": "Nigeria", "entity_id": "Q18922679", "variants": ["Alh. Wasiu Alabi Pasuma", "Alhaji Wasiu Alabi Ajibola Odetola", "Gauzu Fuji", "Ijoba Fuji", "Oganla", "Wasiu Alabi Odetola"]} +{"canonical": "Prince Nico Mbarga", "country": "Cameroon", "entity_id": "Q1893336", "variants": ["Nico Mbarga", "Nicolas Mbarga"]} +{"canonical": "Afro Candy", "country": "Nigeria", "entity_id": "Q18977605", "variants": ["Judith Chichi Okpara Mazagwu"]} +{"canonical": "Darius Dhlomo", "country": "South Africa", "entity_id": "Q1898916", "variants": ["Darius Mfana Temba Dhlomo"]} +{"canonical": "Gbenga Adeboye", "country": "Nigeria", "entity_id": "Q19282140", "variants": ["Abefe", "Alhaji Pastor Oluwo", "Dr. of Entertainment", "Gbenga Adeboye Abefe Funwontan", "MR. FUNWONTAN"]} +{"canonical": "Sean Tizzle", "country": "Nigeria", "entity_id": "Q19321864", "variants": ["Morhanfen Oluwaseun Oluwabamidele,"]} +{"canonical": "Dean Geyer", "country": "South Africa", "entity_id": "Q195333", "variants": ["Dean Stanley Geyer"]} +{"canonical": "Mzilikazi Khumalo", "country": "South Africa", "entity_id": "Q1956997", "variants": ["James Steven Khumalo", "James Steven Mzilikazi Khumalo", "Mzilikazi James Khumalo"]} +{"canonical": "Odunlade Jonathan Adekola", "country": "Nigeria", "entity_id": "Q19610277", "variants": ["Odunlade Adekola", "Omoga"]} +{"canonical": "Cobus van der Walt", "country": "South Africa", "entity_id": "Q19623755", "variants": ["Bernardt James"]} +{"canonical": "Uzezi Oniko", "country": "Nigeria", "entity_id": "Q19626741", "variants": ["Zei", "Legendury Beatz"]} +{"canonical": "Okiemute Oniko", "country": "Nigeria", "entity_id": "Q19626971", "variants": ["Legendury beatz", "mutay"]} +{"canonical": "Serge Beynaud", "country": "Ivory Coast", "entity_id": "Q19629991", "variants": ["Guy Serge Beynaud Gnolou"]} +{"canonical": "Michael Kiessou", "country": "Cameroon", "entity_id": "Q19631078", "variants": ["Mk baby"]} +{"canonical": "Riky Rick", "country": "South Africa", "entity_id": "Q19662092", "variants": ["Rikhado Muziwendlovu Makhado"]} +{"canonical": "Tomi Odunsi", "country": "Nigeria", "entity_id": "Q19664164", "variants": ["Tomi Odunsi-Fadina"]} +{"canonical": "Levixone", "country": "Uganda", "entity_id": "Q19664772", "variants": ["Sam Lucas Lubyogo"]} +{"canonical": "Esther Farinde", "country": "Nigeria", "entity_id": "Q19665310", "variants": ["Esther Toluwase"]} +{"canonical": "Vampino", "country": "Uganda", "entity_id": "Q19665800", "variants": ["Elvis Kirya"]} +{"canonical": "Mampi", "country": "Zambia", "entity_id": "Q19665909", "variants": ["Mirriam Mukape"]} +{"canonical": "Dunni Olanrewaju", "country": "Nigeria", "entity_id": "Q19665922", "variants": ["Dunni Olarewaju", "Opelope Anointing"]} +{"canonical": "Leila Kayondo", "country": "Uganda", "entity_id": "Q19665925", "variants": ["Kayondo"]} +{"canonical": "Funmi Aragbaye", "country": "Nigeria", "entity_id": "Q19666199", "variants": ["Veronica", "Funmi"]} +{"canonical": "Mega 99", "country": "Nigeria", "entity_id": "Q19666241", "variants": ["Abel Oluwafemi Dosunmu"]} +{"canonical": "QwameGaby", "country": "Ghana", "entity_id": "Q19666509", "variants": ["Gabriel Kwame"]} +{"canonical": "Lilian Mbabazi", "country": "Uganda", "entity_id": "Q19666615", "variants": ["Lillian Mbabazi"]} +{"canonical": "Sello Chicco Twala", "country": "South Africa", "entity_id": "Q19666853", "variants": ["Chicco"]} +{"canonical": "S.O.", "country": "Nigeria", "entity_id": "Q19667489", "variants": ["Oluwaseun Oluwatosin Otukpe", "Seun Otukpe"]} +{"canonical": "Joseph Adebayo Adelakun", "country": "Nigeria", "entity_id": "Q19667499", "variants": ["Baba Ayewa", "Joseph Adebayo Adelakunle"]} +{"canonical": "Macky 2", "country": "Zambia", "entity_id": "Q19667560", "variants": ["Mulaza Kaira"]} +{"canonical": "Maurice Kirya", "country": "Uganda", "entity_id": "Q19667624", "variants": ["Kirya"]} +{"canonical": "Obafemi Lasode", "country": "Nigeria", "entity_id": "Q19667927", "variants": ["Obafemi Bandele Lasode"]} +{"canonical": "Yinka Ayefele", "country": "Nigeria", "entity_id": "Q19668381", "variants": ["Oja", "Dr Olayinka Joel Ayefele"]} +{"canonical": "Thomas King Ekundayo Phillips", "country": "Nigeria", "entity_id": "Q19668524", "variants": ["Thomas Phillips", "T. K. E. Phillips"]} +{"canonical": "A Pass", "country": "Uganda", "entity_id": "Q19757734", "variants": ["Alexander Bagonza", "APassKiller", "Bagonza Alexander"]} +{"canonical": "Orlando Julius", "country": "Nigeria", "entity_id": "Q19886334", "variants": ["Orlando Julius Aremu Olusanya Ekemode", "Orlando Julius Ekemode"]} +{"canonical": "AK 47 Mayanja", "country": "Uganda", "entity_id": "Q19938163", "variants": ["Akayfourtyseven", "Emmanuel Mayanja"]} +{"canonical": "Reekado Banks", "country": "Nigeria", "entity_id": "Q19955851", "variants": ["Ayoleyi Hanniel Solomon"]} +{"canonical": "Gor la Montagne", "country": "Ivory Coast", "entity_id": "Q19956052", "variants": ["Gohili Gôh Mathias"]} +{"canonical": "Missy BK", "country": "Cameroon", "entity_id": "Q19956223", "variants": ["Constance Bih Kimal"]} +{"canonical": "Gasmilla", "country": "Ghana", "entity_id": "Q19957858", "variants": ["International Fisherman", "Odartei Milla Lamptey"]} +{"canonical": "Joey B", "country": "Ghana", "entity_id": "Q19958293", "variants": ["Joey Beezy", "Paa Kwesi"]} +{"canonical": "Alune Wade", "country": "Senegal", "entity_id": "Q19958624", "variants": ["Alioune Wade"]} +{"canonical": "Flex D'Paper", "country": "Uganda", "entity_id": "Q19968623", "variants": ["Alex Julius Kwesigabo"]} +{"canonical": "Gadji Celi", "country": "Ivory Coast", "entity_id": "Q1999155", "variants": ["Saint-Joseph Gadji-Celi"]} +{"canonical": "B'Flow", "country": "Zambia", "entity_id": "Q20011599", "variants": ["B Flow", "Brian Mumba Kasoka Bwembya"]} +{"canonical": "DJ Cuppy", "country": "Nigeria", "entity_id": "Q20090531", "variants": ["Cuppy", "Florence Ifeoluwa Otedola"]} +{"canonical": "Cynthia Morgan", "country": "Nigeria", "entity_id": "Q20090536", "variants": ["Madrina", "Cynthia Ikponmwenosa Morgan"]} +{"canonical": "Shaun Morgan", "country": "South Africa", "entity_id": "Q2014395", "variants": ["Shaun Morgan Welgemoed", "Shaun Welgemoed"]} +{"canonical": "Hal Shaper", "country": "South Africa", "entity_id": "Q20196194", "variants": ["Harold David Shaper"]} +{"canonical": "Robbie Jansen", "country": "South Africa", "entity_id": "Q2027370", "variants": ["Robert Edward Jansen"]} +{"canonical": "Min Shaw", "country": "South Africa", "entity_id": "Q2041827", "variants": ["Wilhelmina Jacoba Viviers"]} +{"canonical": "Phil Ramone", "country": "South Africa", "entity_id": "Q204323", "variants": ["Philip Rabinowitz", "Philip Ramone"]} +{"canonical": "Runtown", "country": "Nigeria", "entity_id": "Q20489135", "variants": ["Douglas", "Douglas Jack Agu"]} +{"canonical": "Zouzouko Africa", "country": "Ivory Coast", "entity_id": "Q20563856", "variants": ["Pierre Liazéré Zouzouko"]} +{"canonical": "Hibist Tiruneh", "country": "Ethiopia", "entity_id": "Q20605761", "variants": ["Hibest Tiruneh"]} +{"canonical": "Lemma Gebrehiwot", "country": "Ethiopia", "entity_id": "Q20605859", "variants": ["Lemma Gebre Hiwot"]} +{"canonical": "Tefera Kassa", "country": "Ethiopia", "entity_id": "Q20607111", "variants": ["Girma Tefera Kassa"]} +{"canonical": "Abinet Agonafir", "country": "Ethiopia", "entity_id": "Q20607654", "variants": ["Abenet Agonafer"]} +{"canonical": "Wegayehu Deginetu", "country": "Ethiopia", "entity_id": "Q20607956", "variants": ["Wegayehu Degenetu", "Wegayehu Degnetu"]} +{"canonical": "Pappy Kojo", "country": "Ghana", "entity_id": "Q20655913", "variants": ["Jason Gaisie"]} +{"canonical": "Mzbel", "country": "Ghana", "entity_id": "Q20655915", "variants": ["Belinda Nana Ekua Amoah"]} +{"canonical": "Jemimah Sanyu", "country": "Uganda", "entity_id": "Q20677143", "variants": ["Stage gladiator"]} +{"canonical": "Kcee", "country": "Nigeria", "entity_id": "Q20684328", "variants": ["Kingsley Chinweike Okonkwo"]} +{"canonical": "King Wadada", "country": "Nigeria", "entity_id": "Q20684376", "variants": ["Austin Peter"]} +{"canonical": "Kizz Daniel", "country": "Nigeria", "entity_id": "Q20684384", "variants": ["Vado", "Anidugbe Oluwatobiloba Daniel"]} +{"canonical": "LKT", "country": "Nigeria", "entity_id": "Q20684612", "variants": ["Olalekan Babatunde Olayade"]} +{"canonical": "Mr Raw", "country": "Nigeria", "entity_id": "Q20684890", "variants": ["Nigga Raw"]} +{"canonical": "Nayaah", "country": "Ghana", "entity_id": "Q20684934", "variants": ["Nana Yaa"]} +{"canonical": "Evi Edna Ogholi", "country": "Nigeria", "entity_id": "Q20685012", "variants": ["Evi-Edna Ogholi"]} +{"canonical": "Olu Maintain", "country": "Nigeria", "entity_id": "Q20685025", "variants": ["Olumide Edwards Adegbulu"]} +{"canonical": "Sasha P", "country": "Nigeria", "entity_id": "Q20685053", "variants": ["Anthonia Yetunde Alabi", "First Lady of Nigerian Hip Hop"]} +{"canonical": "Sarz", "country": "Nigeria", "entity_id": "Q20685445", "variants": ["Osabuohien Osaretin"]} +{"canonical": "MCskill ThaPreacha", "country": "Nigeria", "entity_id": "Q20685759", "variants": ["Supernatural"]} +{"canonical": "Peter Klatzow", "country": "South Africa", "entity_id": "Q20687318", "variants": ["Peter James Leonard Klatzow"]} +{"canonical": "Toyin Sokefun-Bello", "country": "Nigeria", "entity_id": "Q20687449", "variants": ["TY Bello"]} +{"canonical": "Tocky Vibes", "country": "Zimbabwe", "entity_id": "Q20687500", "variants": ["Obey Makambureyi"]} +{"canonical": "Bukky Wright", "country": "Nigeria", "entity_id": "Q20687628", "variants": ["Olúwabùkọ́lá Sekinat Àjọkẹ́ Wright"]} +{"canonical": "Praiz", "country": "Nigeria", "entity_id": "Q20744636", "variants": ["Praise Ugbede Adejo"]} +{"canonical": "VJ Adams", "country": "Nigeria", "entity_id": "Q20827964", "variants": ["Adams Ibrahim Adebola", "Adams Ibrahim Adeolab"]} +{"canonical": "Malcolm Guite", "country": "Nigeria", "entity_id": "Q20882463", "variants": ["Ayodeji Malcolm Guite"]} +{"canonical": "Amarachi", "country": "Nigeria", "entity_id": "Q20982586", "variants": ["Amarachi Uyanne"]} +{"canonical": "Mr 2Kay", "country": "Nigeria", "entity_id": "Q21004692", "variants": ["Abinye David Jumbo"]} +{"canonical": "D-Black", "country": "Ghana", "entity_id": "Q21005496", "variants": ["Desmond Kwesi Blackmore"]} +{"canonical": "D'Prince", "country": "Nigeria", "entity_id": "Q21005498", "variants": ["Omoba", "Charles Enebeli"]} +{"canonical": "Helen Yawson", "country": "Ghana", "entity_id": "Q21061932", "variants": ["Helen Osagiede Obadagbonyi"]} +{"canonical": "DJ Spinall", "country": "Nigeria", "entity_id": "Q21063945", "variants": ["Dj Spinall", "Oluseye Desmond Sodamola", "Spinall", "Top boy"]} +{"canonical": "KODA", "country": "Ghana", "entity_id": "Q21064606", "variants": ["Kofi Owusu Dua Anto"]} +{"canonical": "Senyaka", "country": "South Africa", "entity_id": "Q21065015", "variants": ["Senyaka Kekana", "Thula Kekana"]} +{"canonical": "Nii Okai", "country": "Ghana", "entity_id": "Q21066461", "variants": ["Ernest Nii-Okai Okai"]} +{"canonical": "Joe Mettle", "country": "Ghana", "entity_id": "Q21066979", "variants": ["Joseph Oscar Nii Armah Mettle"]} +{"canonical": "Youssou N’Dour", "country": "Senegal", "entity_id": "Q210734", "variants": ["Youssou Ndour", "Youssou'n'Dour", "Yuusu Nduur"]} +{"canonical": "Harrysong", "country": "Nigeria", "entity_id": "Q21127453", "variants": ["Harrison Tare Okiri"]} +{"canonical": "Yeni Kuti", "country": "Nigeria", "entity_id": "Q21190376", "variants": ["YK", "Omoyeni 'Yeni' Anikulapo-Kuti"]} +{"canonical": "Da L.E.S", "country": "South Africa", "entity_id": "Q21260615", "variants": ["Leslie Jonathan Mampe Jr."]} +{"canonical": "Lil Khalid4grace", "country": "Nigeria", "entity_id": "Q21274965", "variants": ["Lil Kesh", "Emmanuel Khalid Agyei Acheampong"]} +{"canonical": "Adekunle Gold", "country": "Nigeria", "entity_id": "Q21280581", "variants": ["Adekunle Almoruf Kosoko", "Adekunle Kosoko", "AG Baby"]} +{"canonical": "Ycee", "country": "Nigeria", "entity_id": "Q21281870", "variants": ["Oludemilade Martin Alejo"]} +{"canonical": "Tonye", "country": "Nigeria", "entity_id": "Q21282387", "variants": ["Tamunotonye Nneka Nkiruka Ibiyemi Garrick", "Tonye Garrick"]} +{"canonical": "Bisa Kdei", "country": "Ghana", "entity_id": "Q21284617", "variants": ["Ronald Kwaku Dei Appiah"]} +{"canonical": "Ali Kiba", "country": "Tanzania", "entity_id": "Q21285312", "variants": ["Ali Saleh Kiba"]} +{"canonical": "Godzilla", "country": "Tanzania", "entity_id": "Q21285313", "variants": ["Kingzilla", "Golden Jacob Mbunda"]} +{"canonical": "Del B", "country": "Nigeria", "entity_id": "Q21499025", "variants": ["Ayodele Basil"]} +{"canonical": "Pheelz", "country": "Nigeria", "entity_id": "Q21503256", "variants": ["Mr. Producer", "Phillip Kayode Moses", "Ridimakulayo"]} +{"canonical": "Falz", "country": "Nigeria", "entity_id": "Q21535528", "variants": ["Folarin Falana"]} +{"canonical": "Young Jon", "country": "Nigeria", "entity_id": "Q21574887", "variants": ["John Saviours Udomboso", "The wicked producer"]} +{"canonical": "Wangechi", "country": "Kenya", "entity_id": "Q21623275", "variants": ["Wangechi Waweru"]} +{"canonical": "Giovanni Kiyingi", "country": "Uganda", "entity_id": "Q21642673", "variants": ["Giovanni Kremer Kiyingi"]} +{"canonical": "Yandé Codou Sène", "country": "Senegal", "entity_id": "Q2174556", "variants": ["Yande Codou Sene"]} +{"canonical": "Waconzy", "country": "Nigeria", "entity_id": "Q21872807", "variants": ["Obinna Kelvin Anyanwu"]} +{"canonical": "Ohemaa Mercy", "country": "Ghana", "entity_id": "Q22003208", "variants": ["Mercy Amoah"]} +{"canonical": "Emtee", "country": "South Africa", "entity_id": "Q22135939", "variants": ["Mthembeni Ndevu"]} +{"canonical": "Taiwo Lijadu", "country": "Nigeria", "entity_id": "Q22137306", "variants": ["Lijadu, Taiwo"]} +{"canonical": "Kehinde Lijadu", "country": "Nigeria", "entity_id": "Q22137307", "variants": ["Lijadu, Kehinde"]} +{"canonical": "Nasty C", "country": "South Africa", "entity_id": "Q22138550", "variants": ["Nsikayesizwe David Junior Ngcobo"]} +{"canonical": "Samuel Ekpe Akpabot", "country": "Nigeria", "entity_id": "Q2218183", "variants": ["Samuel Akpabot"]} +{"canonical": "Alaché", "country": "Nigeria", "entity_id": "Q22276741", "variants": ["Anne Alaché Jon Ode"]} +{"canonical": "IFANi", "country": "South Africa", "entity_id": "Q22278278", "variants": ["Mzayifani Mzondeleli Boltina"]} +{"canonical": "Anatii", "country": "South Africa", "entity_id": "Q22695308", "variants": ["Anathi Bhongo Mnyango"]} +{"canonical": "Thomas Mapfumo", "country": "Zimbabwe", "entity_id": "Q2270225", "variants": ["Thomas Tafirenyika Mapfumo"]} +{"canonical": "Tekno", "country": "Nigeria", "entity_id": "Q22807439", "variants": ["Augustine Miles Kelechi Okechukwu"]} +{"canonical": "Ray Signature", "country": "Uganda", "entity_id": "Q22935734", "variants": ["Raymond Joseph Mugerwa"]} +{"canonical": "Sister Charity", "country": "Uganda", "entity_id": "Q23007554", "variants": ["Kobutungi Charity"]} +{"canonical": "Bob Junior", "country": "Tanzania", "entity_id": "Q23007714", "variants": ["Raheem Rummy Nanji"]} +{"canonical": "Juma Nature", "country": "Tanzania", "entity_id": "Q2305847", "variants": ["Sir Nature"]} +{"canonical": "Nádine", "country": "South Africa", "entity_id": "Q2328329", "variants": ["Nadine"]} +{"canonical": "D'Tunes", "country": "Nigeria", "entity_id": "Q23540948", "variants": ["Adesanya Doyinsola"]} +{"canonical": "OC Osilliation", "country": "Zambia", "entity_id": "Q23541121", "variants": ["Siame O'Brien"]} +{"canonical": "Ruby Gyang", "country": "Nigeria", "entity_id": "Q23541204", "variants": ["Ngohide Ruby Ann Gyang"]} +{"canonical": "Sanaipei Tande", "country": "Kenya", "entity_id": "Q23541243", "variants": ["Natasha Sanaipei Tande"]} +{"canonical": "J Martins", "country": "Nigeria", "entity_id": "Q23657368", "variants": ["Martins Okechukwu Justice"]} +{"canonical": "Ko-Jo Cue", "country": "Ghana", "entity_id": "Q23664291", "variants": ["PLK", "Linford Kennedy Amankwaa", "P L K", "P. L. K.", "P.L.K.", "Young Daddy Lumba"]} +{"canonical": "Da Emperor", "country": "Nigeria", "entity_id": "Q23771229", "variants": ["Emperor", "The Emperor", "Etiemelo Empire Entertainment", "Etiemelo?!", "Fasasi Mobolaji Gaius", "Mobolaji Fasasi"]} +{"canonical": "Chef 187", "country": "Zambia", "entity_id": "Q23771666", "variants": ["Kondwani Kaira"]} +{"canonical": "Dilana", "country": "South Africa", "entity_id": "Q2380003", "variants": ["Dilana Jansen van Vuuren", "Dilana Robichaux", "Dilana Smith", "Dilana Trudy Smith"]} +{"canonical": "WizzyPro", "country": "Nigeria", "entity_id": "Q23801122", "variants": ["Nifu Haruna"]} +{"canonical": "Sasha Pieterse", "country": "South Africa", "entity_id": "Q238712", "variants": ["Sash"]} +{"canonical": "Just Slim", "country": "Zambia", "entity_id": "Q23881232", "variants": ["Paul Chilupe Banda"]} +{"canonical": "Iwan", "country": "Ghana", "entity_id": "Q23883590", "variants": ["Abdul Razak Issahaku", "Iwan Gh", "Lyrical Gunshot"]} +{"canonical": "Simi", "country": "Nigeria", "entity_id": "Q23899788", "variants": ["Simisola Bolatito Kosoko", "Simisola Bolatito Ogunleye", "Simisola Kosoko"]} +{"canonical": "Kiddominant (KDDO)", "country": "Nigeria", "entity_id": "Q23927041", "variants": ["Ayoola Oladapo Agboola", "KDDO"]} +{"canonical": "Sandy Soul", "country": "Uganda", "entity_id": "Q24004852", "variants": ["Sandra Nankoma"]} +{"canonical": "Kwesta", "country": "South Africa", "entity_id": "Q24005067", "variants": ["Senzo Mfundo Vilakazi"]} +{"canonical": "Kofi Kinaata", "country": "Ghana", "entity_id": "Q24039677", "variants": ["Fante Rap God", "Martin King Arthur"]} +{"canonical": "Chris McGregor", "country": "South Africa", "entity_id": "Q241496", "variants": ["Chris McGregor's Brotherhood Of Breath", "Christopher McGregor", "Christopher McGregor."]} +{"canonical": "Dele Ojo", "country": "Nigeria", "entity_id": "Q24255005", "variants": ["James Ogundele Ojo"]} +{"canonical": "Niniola", "country": "Nigeria", "entity_id": "Q24255698", "variants": ["Niniola Apata", "Níníọlá Àpáta"]} +{"canonical": "Emma Nyra", "country": "Nigeria", "entity_id": "Q24256417", "variants": ["Emma Chukwugoziam Obi"]} +{"canonical": "Fifi Cooper", "country": "South Africa", "entity_id": "Q24259953", "variants": ["Boss Lady", "Refilwe Boingotlo Mooketsi"]} +{"canonical": "K1 De Ultimate", "country": "Nigeria", "entity_id": "Q24260530", "variants": ["Alhaji Wasiu Ayinde Marshall", "King Wasiu Ayinde Marshall", "KWAM 1", "KWAM1", "Olasunkanmi Wasiu Ayinde Marshal", "Wasiu Ayinde Adewale Omogbolahan Anifowoshe"]} +{"canonical": "Shaydee", "country": "Nigeria", "entity_id": "Q24264057", "variants": ["Shadrach Adeboye Folarin"]} +{"canonical": "Shaffy Bello", "country": "Nigeria", "entity_id": "Q24279412", "variants": ["Shaffy Bello-Akinrimisi"]} +{"canonical": "Lola Rae", "country": "Nigeria", "entity_id": "Q24307358", "variants": ["Rachel Akosua Funmilola Garton"]} +{"canonical": "Adèle Ruffine Ngono", "country": "Cameroon", "entity_id": "Q24341755", "variants": ["Lady Ponce"]} +{"canonical": "Todd Matshikiza", "country": "South Africa", "entity_id": "Q2438475", "variants": ["Todd Tozama Matshikiza"]} +{"canonical": "Nathi", "country": "South Africa", "entity_id": "Q24432534", "variants": ["Nkosinathi Mankayi"]} +{"canonical": "Toya Delazy", "country": "South Africa", "entity_id": "Q2447004", "variants": ["Latoya Nontokozo Buthelezi"]} +{"canonical": "Zonke", "country": "South Africa", "entity_id": "Q24475747", "variants": ["Zonke Dikana"]} +{"canonical": "Lulu Dikana", "country": "South Africa", "entity_id": "Q24493964", "variants": ["Lungisa Dikana"]} +{"canonical": "Ken Erics", "country": "Nigeria", "entity_id": "Q24572614", "variants": ["Ekenedilichukwu Ugochukwu Eric Nwenweh", "Ken Erics Ugo"]} +{"canonical": "Franko", "country": "Cameroon", "entity_id": "Q24578963", "variants": ["Franck Junior Kinguè"]} +{"canonical": "Minyeshu", "country": "Ethiopia", "entity_id": "Q2460986", "variants": ["Minyeshu Kifle", "Minyeshu Kifle Tedla"]} +{"canonical": "Hugh Masekela", "country": "South Africa", "entity_id": "Q246594", "variants": ["Hugh Ramapolo Masekela"]} +{"canonical": "Akwaboah Jnr", "country": "Ghana", "entity_id": "Q24851525", "variants": ["Gladstorm Kwabena Akwaboah Jnr."]} +{"canonical": "Sheebah Karungi", "country": "Uganda", "entity_id": "Q24872105", "variants": ["Queen Karma", "Queen Sheebah", "Sheebah K"]} +{"canonical": "Victor Ntoni", "country": "South Africa", "entity_id": "Q2522493", "variants": ["Victor Mhleli Ntoni"]} +{"canonical": "Jahdiel", "country": "Nigeria", "entity_id": "Q25283775", "variants": ["Grace Jahdiel Benjamin", "Grace Okoduwa"]} +{"canonical": "Mr Eazi", "country": "Ghana", "entity_id": "Q25345201", "variants": ["Don Eazi", "Oluwatosin Oluwole Ajibade"]} +{"canonical": "Bello Figo", "country": "Ghana", "entity_id": "Q25560176", "variants": ["Bello FiGo", "Bello Figo Gu", "Gucci Boy", "Paul Yeboah"]} +{"canonical": "Bosman di Ravelli", "country": "South Africa", "entity_id": "Q25613224", "variants": ["Jan Gysbert Hugo Bosman"]} +{"canonical": "Hachalu Hundessa", "country": "Ethiopia", "entity_id": "Q25704167", "variants": ["Haacaaluu Hundeessaa", "Haacaaluu Hundeessaa Boonsaa"]} +{"canonical": "DJ Maphorisa", "country": "South Africa", "entity_id": "Q25706797", "variants": ["Themba Sekowe"]} +{"canonical": "Gurunkz", "country": "Ghana", "entity_id": "Q25750440", "variants": ["Maradona Yeboah Adjei"]} +{"canonical": "Humblesmith", "country": "Nigeria", "entity_id": "Q26036678", "variants": ["Ekenedilichukwu Ijemba"]} +{"canonical": "Stephanie Benson", "country": "Ghana", "entity_id": "Q26162170", "variants": ["Queen of Jazz", "Princess Akua Ohenewaa Asieanem of Kokobin"]} +{"canonical": "Bernice Ofei", "country": "Ghana", "entity_id": "Q26207056", "variants": ["Bernice Offei"]} +{"canonical": "Mc Norman", "country": "Uganda", "entity_id": "Q26211023", "variants": ["Mutebi", "Ronald Mutebi"]} +{"canonical": "A'rese", "country": "Nigeria", "entity_id": "Q26251342", "variants": ["Agharese Emokpae", "Arese Emokpae"]} +{"canonical": "Harcourt Whyte", "country": "Nigeria", "entity_id": "Q26263266", "variants": ["Ikoli Harcourt-Whyte"]} +{"canonical": "Tiken Jah Fakoly", "country": "Ivory Coast", "entity_id": "Q263170", "variants": ["Doumbia Moussa Fakoly"]} +{"canonical": "Koos Kombuis", "country": "South Africa", "entity_id": "Q264520", "variants": ["André le Roux du Toit"]} +{"canonical": "Pepenazi", "country": "Nigeria", "entity_id": "Q26702514", "variants": ["Opeyemi Gbenga Kayode", "PepeIllegal"]} +{"canonical": "Jaywon", "country": "Nigeria", "entity_id": "Q26703032", "variants": ["Oluwajuwonlo Iledare"]} +{"canonical": "Stella Aba Seal", "country": "Ghana", "entity_id": "Q26703045", "variants": ["Stella Dugan"]} +{"canonical": "Diana Hopeson", "country": "Ghana", "entity_id": "Q26703049", "variants": ["Diana Akiwumi", "Diana Botchway"]} +{"canonical": "Joe Praize", "country": "Nigeria", "entity_id": "Q26704658", "variants": ["Joseph Omo Ebhodaghe", "praiza"]} +{"canonical": "Seun Omojola", "country": "Nigeria", "entity_id": "Q26705654", "variants": ["Vilara"]} +{"canonical": "Adam Ro", "country": "Ghana", "entity_id": "Q26710796", "variants": ["Rashid Rauf Adam"]} +{"canonical": "Alice Phoebe Lou", "country": "South Africa", "entity_id": "Q26710833", "variants": ["Alice Matthew"]} +{"canonical": "Sugarboy", "country": "Nigeria", "entity_id": "Q26837431", "variants": ["Umaren Akanimoh Felix"]} +{"canonical": "Shane Eagle", "country": "South Africa", "entity_id": "Q26924118", "variants": ["Shane Patrick Hughes"]} +{"canonical": "Trevor Jones", "country": "South Africa", "entity_id": "Q269244", "variants": ["Trevor Alfred Charles Jones"]} +{"canonical": "Chioma Omeruah", "country": "Nigeria", "entity_id": "Q26944974", "variants": ["Chigul"]} +{"canonical": "Fisayo Ajisola", "country": "Nigeria", "entity_id": "Q26997635", "variants": ["Freezon"]} +{"canonical": "Leon Botha", "country": "South Africa", "entity_id": "Q2700036", "variants": ["Botha Leon"]} +{"canonical": "Serifatu Oladunni Oduguwa", "country": "Nigeria", "entity_id": "Q27023454", "variants": ["Queen Mummy Juju", "Queen Oladunni Decency"]} +{"canonical": "Dekumzy", "country": "Nigeria", "entity_id": "Q27050233", "variants": ["Derek Osonwa"]} +{"canonical": "Ndom’a Deccah Grace", "country": "Cameroon", "entity_id": "Q27062890", "variants": ["Grace Decca"]} +{"canonical": "Chad", "country": "South Africa", "entity_id": "Q27070276", "variants": ["Chad da Don", "Donovan Chad Mansoor"]} +{"canonical": "Seun Oni", "country": "Nigeria", "entity_id": "Q27096204", "variants": ["Saeon"]} +{"canonical": "Maccasio", "country": "Ghana", "entity_id": "Q27101918", "variants": ["Sheriff Abdul Majeed", "King Macca"]} +{"canonical": "Helen Parker-Jayne Isibor", "country": "Nigeria", "entity_id": "Q27135118", "variants": ["The Venus Bushfires"]} +{"canonical": "Yinka Olukunga", "country": "Nigeria", "entity_id": "Q27210423", "variants": ["Nnenna", "Olayinka Garfus Olukunga"]} +{"canonical": "Getatchew Mekurya", "country": "Ethiopia", "entity_id": "Q2740796", "variants": ["Getatchew Mekuria", "Gétatchèw Mèkurya"]} +{"canonical": "Shola Allyson-Obaniyi", "country": "Nigeria", "entity_id": "Q27453751", "variants": ["Shola Allyson", "Sola Allyson"]} +{"canonical": "Bertha Egnos", "country": "South Africa", "entity_id": "Q27576297", "variants": ["BeBe"]} +{"canonical": "Stella Chiweshe", "country": "Zimbabwe", "entity_id": "Q276268", "variants": ["Stella Nekati Chiweshe", "Stella Rambisai Chiweshe", "Stella Rambisai Chiweshe Nekati"]} +{"canonical": "May D", "country": "Nigeria", "entity_id": "Q27656673", "variants": ["Akinmayokun Awodumila"]} +{"canonical": "Tweezy", "country": "South Africa", "entity_id": "Q27671039", "variants": ["Tumelo Thandokuhle Mathebula", "Tweezus", "Tweezy Da Dreema"]} +{"canonical": "Cece Sagini", "country": "Kenya", "entity_id": "Q27804543", "variants": ["Cecilia Sagini Kemunto"]} +{"canonical": "Chike", "country": "Nigeria", "entity_id": "Q27830782", "variants": ["Chike Ezekpeazu Osebuka", "Chike-Ezekpeazu Osebuka"]} +{"canonical": "A-Reece", "country": "South Africa", "entity_id": "Q27899052", "variants": ["Lehlogonolo Ronald Mataboge"]} +{"canonical": "Monica Omorodion Swaida", "country": "Nigeria", "entity_id": "Q27981556", "variants": ["Monicazation"]} +{"canonical": "Olayiwola Olabanji Kokumo", "country": "Nigeria", "entity_id": "Q27982334", "variants": ["Koker"]} +{"canonical": "Reniss", "country": "Cameroon", "entity_id": "Q28006763", "variants": ["Kien Rennise Nde"]} +{"canonical": "Aleah Stanbridge", "country": "South Africa", "entity_id": "Q28028794", "variants": ["Aleah", "Aleah Liane Stanbridge", "Aleah Liane Stanbridge (née Julia Liane Stanbridge)"]} +{"canonical": "Richard Tuwangye", "country": "Uganda", "entity_id": "Q28038485", "variants": ["Amoosi"]} +{"canonical": "Moneoa Moshesh", "country": "South Africa", "entity_id": "Q28039442", "variants": ["Moneoa Moshesh-Sowazi"]} +{"canonical": "LeAnne Dlamini", "country": "South Africa", "entity_id": "Q28039448", "variants": ["Leanne Dlamini"]} +{"canonical": "Nandi Madida", "country": "South Africa", "entity_id": "Q28039713", "variants": ["Nandi Mngoma", "Nandi Mngoma Madida"]} +{"canonical": "Babes Wodumo", "country": "South Africa", "entity_id": "Q28039875", "variants": ["Bongekile Mildred Simelane"]} +{"canonical": "Ebony Reigns", "country": "Ghana", "entity_id": "Q28054133", "variants": ["Priscilla Opoku-Kwarteng"]} +{"canonical": "Maheeda", "country": "Nigeria", "entity_id": "Q28094470", "variants": ["Caroline Samuel"]} +{"canonical": "Cossy Orjiakor", "country": "Nigeria", "entity_id": "Q28095324", "variants": ["Cossy Ojiako", "playgirl"]} +{"canonical": "Winning Jah", "country": "Nigeria", "entity_id": "Q28112194", "variants": ["Kingsley Eno Osagie", "Nigeria King Of Reggae"]} +{"canonical": "Triumph Grandeur", "country": "Nigeria", "entity_id": "Q28124460", "variants": ["Tyrone"]} +{"canonical": "Ray BLK", "country": "Nigeria", "entity_id": "Q28146094", "variants": ["Rita Ekwer"]} +{"canonical": "Mildred Ashong", "country": "Ghana", "entity_id": "Q28151863", "variants": ["Eazzy"]} +{"canonical": "DeepTouchSA", "country": "South Africa", "entity_id": "Q28180252", "variants": ["Simbarashe Musingarimi"]} +{"canonical": "Ablaye Cissoko", "country": "Senegal", "entity_id": "Q2821665", "variants": ["Ablaye Cissokko", "Kimintang Mahamadou Cissoko"]} +{"canonical": "Lory Money", "country": "Senegal", "entity_id": "Q28313909", "variants": ["Dara Dia"]} +{"canonical": "Fancy Gadam", "country": "Ghana", "entity_id": "Q28343685", "variants": ["Ahmed Mujahid Bello", "Muhajid Ahmed Bello"]} +{"canonical": "Alioune Kassé", "country": "Senegal", "entity_id": "Q2837108", "variants": ["Alioune Kasse"]} +{"canonical": "Allah Thérèse", "country": "Ivory Coast", "entity_id": "Q2837643", "variants": ["Allah Therese", "Therese Allah", "Thérèse Allah"]} +{"canonical": "Alemayehu Eshete", "country": "Ethiopia", "entity_id": "Q2840713", "variants": ["Alemayehu Eshete Andarge"]} +{"canonical": "Amédée Pierre", "country": "Ivory Coast", "entity_id": "Q2844693", "variants": ["Amedee Pierre"]} +{"canonical": "André-Marie Tala", "country": "Cameroon", "entity_id": "Q2847091", "variants": ["Andre-Marie Tala"]} +{"canonical": "Anouman Brou Félix", "country": "Ivory Coast", "entity_id": "Q2852401", "variants": ["Anouman Brou Felix"]} +{"canonical": "Nakhane", "country": "South Africa", "entity_id": "Q28528673", "variants": ["Nakhane Touré", "Nakhane Mahlakahlaka", "Nakhane Lubabalo Mavuso"]} +{"canonical": "Abigail Kubeka", "country": "South Africa", "entity_id": "Q28555236", "variants": ["Abi Khumalo", "Abigail Kubheka", "Joe Mafela's BF", "Mrs. Kubeka", "Ms Afrika", "Nomthandazo Khumalo", "Queen of Afrika", "Uzalo & Muvhango"]} +{"canonical": "Dizzy Dee", "country": "Zimbabwe", "entity_id": "Q28555400", "variants": ["Dizzy", "Desire Sibanda", "Dizzy D", "DJ Dizzy Dee"]} +{"canonical": "Shekhinah", "country": "South Africa", "entity_id": "Q28654904", "variants": ["Shekhinah Thandi Donnell"]} +{"canonical": "Asnaketch Worku", "country": "Ethiopia", "entity_id": "Q2866726", "variants": ["Asnaqetch Werqu", "Asnaqètch Wèrqu"]} +{"canonical": "Ayub Ogada", "country": "Kenya", "entity_id": "Q2875035", "variants": ["Job Seda", "Ogada"]} +{"canonical": "A'Salfo", "country": "Ivory Coast", "entity_id": "Q2876580", "variants": ["Salif Traoré", "A'salfo"]} +{"canonical": "Israel Njemanze", "country": "Nigeria", "entity_id": "Q28777384", "variants": ["Israel Nwoba", "Israel Nwoba Njemanze", "Nwoba"]} +{"canonical": "Bachir Touré", "country": "Senegal", "entity_id": "Q2878323", "variants": ["Bachir Toure"]} +{"canonical": "Pericoma Okoye", "country": "Nigeria", "entity_id": "Q28792016", "variants": ["Chief Pericoma Mezuo Okoye", "Pericomo Okoye"]} +{"canonical": "Madelaine Petsch", "country": "South Africa", "entity_id": "Q28839217", "variants": ["Madelaine Grobbelaar Petsch"]} +{"canonical": "Dotman", "country": "Nigeria", "entity_id": "Q28861640", "variants": ["Olatunji Alade"]} +{"canonical": "Mendi Obadike", "country": "Nigeria", "entity_id": "Q28910236", "variants": ["Mendi Lewis", "Mendi Lewis Obadike", "Mendi Obidake"]} +{"canonical": "Meryl Cassie", "country": "South Africa", "entity_id": "Q290813", "variants": ["Meryl Danielle Cassie"]} +{"canonical": "Dale Stewart", "country": "South Africa", "entity_id": "Q290837", "variants": ["Dale William Stewart"]} +{"canonical": "Thembi Mtshali", "country": "South Africa", "entity_id": "Q29109385", "variants": ["Thembi Mtshali-Jones"]} +{"canonical": "Soul Jah Love", "country": "Zimbabwe", "entity_id": "Q29110155", "variants": ["Soul Musaka"]} +{"canonical": "Nneka", "country": "Nigeria", "entity_id": "Q291431", "variants": ["Nneka Egbuna", "Nneka Lucia Egbuna"]} +{"canonical": "Hope Masike", "country": "Zimbabwe", "entity_id": "Q29168524", "variants": ["Ruvimbo Hope Masike"]} +{"canonical": "Béta Simon", "country": "Ivory Coast", "entity_id": "Q2930036", "variants": ["Beta Simon"]} +{"canonical": "Bétika", "country": "Ivory Coast", "entity_id": "Q2930053", "variants": ["Betika"]} +{"canonical": "Medikal", "country": "Ghana", "entity_id": "Q29313086", "variants": ["Samuel Adu Frimpong"]} +{"canonical": "Michael Ekeghasi", "country": "Nigeria", "entity_id": "Q29343892", "variants": ["ME"]} +{"canonical": "Yaa Yaa", "country": "Ghana", "entity_id": "Q29353401", "variants": ["Bertha Bridget Kankam"]} +{"canonical": "Candîce Hillebrand", "country": "South Africa", "entity_id": "Q2936258", "variants": ["Candice Hillebrand", "Candicé Hillebrand"]} +{"canonical": "Nadia Nakai", "country": "South Africa", "entity_id": "Q29481045", "variants": ["Nadia Nakai Kandava"]} +{"canonical": "Chantal Taïba", "country": "Ivory Coast", "entity_id": "Q2956322", "variants": ["Chantal Taiba"]} +{"canonical": "Rachael Okonkwo", "country": "Nigeria", "entity_id": "Q29609257", "variants": ["Nkoli Nwa", "Racheal Okonkwo", "Nkoli Nwa Nsukka"]} +{"canonical": "Dice Ailes", "country": "Nigeria", "entity_id": "Q29617769", "variants": ["Shasha Damilola"]} +{"canonical": "Clémentine Papouet", "country": "Ivory Coast", "entity_id": "Q2980743", "variants": ["Cléclé", "Clementine Papouet"]} +{"canonical": "Dencia", "country": "Cameroon", "entity_id": "Q29835307", "variants": ["Reprudencia Sonkey"]} +{"canonical": "Coumba Gawlo", "country": "Senegal", "entity_id": "Q2998861", "variants": ["Coumba Gawlo Seck"]} +{"canonical": "Amanda Black", "country": "South Africa", "entity_id": "Q30006172", "variants": ["Amanda Benedicta Antony"]} +{"canonical": "Tony Sunboy", "country": "Cameroon", "entity_id": "Q30117947", "variants": ["Gilbert Noumessi", "sunboy", "tony sunshyne"]} +{"canonical": "Adina", "country": "Ghana", "entity_id": "Q30122752", "variants": ["Adina Thembi Ndamse"]} +{"canonical": "Cabum", "country": "Ghana", "entity_id": "Q30122943", "variants": ["Frank Kwame Gyasi- Frimpong"]} +{"canonical": "Daniel Owino Misiani", "country": "Tanzania", "entity_id": "Q3014517", "variants": ["Misiani", "D.O. Misiani"]} +{"canonical": "Diboué Black", "country": "Cameroon", "entity_id": "Q3026502", "variants": ["Diboue Black"]} +{"canonical": "Didier Bilé", "country": "Ivory Coast", "entity_id": "Q3026925", "variants": ["Didier Bile"]} +{"canonical": "Diogal", "country": "Senegal", "entity_id": "Q3028670", "variants": ["Diogal Sakho"]} +{"canonical": "Ssewa Ssewa", "country": "Uganda", "entity_id": "Q30307252", "variants": ["James Ssewakiryanga Junior"]} +{"canonical": "Flint Bedrock", "country": "Zimbabwe", "entity_id": "Q30323578", "variants": ["Edson Masunda"]} +{"canonical": "Dosseh", "country": "Cameroon", "entity_id": "Q3037333", "variants": ["Dosseh Dorian N'Goumou"]} +{"canonical": "Doudou N'Diaye Rose", "country": "Senegal", "entity_id": "Q3037895", "variants": ["Mamadou Ndiaye", "Doudou Coumba Rose", "Doudou N'Ddiaye Rose", "Doudou N'diaye Rose", "Doudou Ndiaye Rose"]} +{"canonical": "Dr Vis-à-vis", "country": "Ivory Coast", "entity_id": "Q3038456", "variants": ["Dr Vis-a-vis"]} +{"canonical": "Erickson Le Zulu", "country": "Ivory Coast", "entity_id": "Q3056512", "variants": ["Éric Bosiki", "Éric Bosiki Ngoyi", "Erickson Le Zoulou"]} +{"canonical": "CDQ", "country": "Nigeria", "entity_id": "Q30567425", "variants": ["Mugabe", "CDQ (rapper)", "Sodiq Abubakar Yusuf"]} +{"canonical": "Eténèsh Wassié", "country": "Ethiopia", "entity_id": "Q3059434", "variants": ["Etenesh Wassie"]} +{"canonical": "Vagabon", "country": "Cameroon", "entity_id": "Q30596023", "variants": ["Laetitia Tamko"]} +{"canonical": "Faada Freddy", "country": "Senegal", "entity_id": "Q3063489", "variants": ["A. F. Seck", "A. Seck", "Abdou Fatha Seck", "Abdou Seck", "Abdoul Fatah Seck"]} +{"canonical": "Fadhili William", "country": "Kenya", "entity_id": "Q3064379", "variants": ["Fadhili William Mdawida", "Fadhili Williams Mdawida", "Fadmili William", "William Fadhili"]} +{"canonical": "Fania Niang", "country": "Senegal", "entity_id": "Q3066400", "variants": ["Fania", "Fatou Niang"]} +{"canonical": "Lynda Raymonde", "country": "Cameroon", "entity_id": "Q30728641", "variants": ["Floriane Linda Nyebe Andella"]} +{"canonical": "François Lougah", "country": "Ivory Coast", "entity_id": "Q3085195", "variants": ["lougah"]} +{"canonical": "Félix Sabal-Lecco", "country": "Cameroon", "entity_id": "Q3092609", "variants": ["Felix Sabal Lecco", "Felix Sabal-Lecco"]} +{"canonical": "Gadoukou la Star", "country": "Ivory Coast", "entity_id": "Q3094243", "variants": ["Edmond Franck Gnaza", "Franck Edmond Yao"]} +{"canonical": "Thando Sikwila", "country": "Zimbabwe", "entity_id": "Q31051346", "variants": ["Thandolwethu Emily Nomvula Sikwila"]} +{"canonical": "Gino Sitson", "country": "Cameroon", "entity_id": "Q3106820", "variants": ["Pierre-Eugene Sitchet", "Pierre-Eugène Sitchet", "Pierre-Eugene Sitson-Sitchet", "Pierre-Eugène Sitson-Sitchet"]} +{"canonical": "Girma Bèyènè", "country": "Ethiopia", "entity_id": "Q3107653", "variants": ["Girma Beyene"]} +{"canonical": "Gnahoré Jimmy", "country": "Ivory Coast", "entity_id": "Q3109430", "variants": ["Gnahore Jimmy"]} +{"canonical": "Seun Kuti", "country": "Nigeria", "entity_id": "Q3111214", "variants": ["Oluseun Anikulapo Kuti"]} +{"canonical": "Guéi Victor", "country": "Ivory Coast", "entity_id": "Q3122410", "variants": ["Guei Victor"]} +{"canonical": "Majek Fashek", "country": "Nigeria", "entity_id": "Q3124631", "variants": ["Majekodunmi Fasheke"]} +{"canonical": "Dr. Alban", "country": "Nigeria", "entity_id": "Q313366", "variants": ["Alban Nwapa", "Alban Uzoma Nwapa"]} +{"canonical": "Fela Kuti", "country": "Nigeria", "entity_id": "Q313868", "variants": ["Abami Eda", "Abàmì Ẹ̀dá", "Fela Anikulapo Kuti", "Fela Aníkúlápó Kuti", "Fela Anikulapo-Kuti", "Fela Kuti & Afrika 70", "Olufela Olusegun Oludotun Ransome-Kuti", "Fela"]} +{"canonical": "I. K. Dairo", "country": "Nigeria", "entity_id": "Q3155106", "variants": ["Isaiah Kehinde Dairo", "Isaiah Kehinde Dairo MBE"]} +{"canonical": "Jacques Greg-Belobo", "country": "Cameroon", "entity_id": "Q3159030", "variants": ["Greg Belobo"]} +{"canonical": "Jean-Jacques Kouamé", "country": "Ivory Coast", "entity_id": "Q3166312", "variants": ["Jean-Jacques Kouame"]} +{"canonical": "Abdullah Ibrahim", "country": "South Africa", "entity_id": "Q317677", "variants": ["Adolph J. Brand"]} +{"canonical": "Joelle Séka", "country": "Ivory Coast", "entity_id": "Q3180279", "variants": ["Joelle Seka"]} +{"canonical": "Julie Mabéa", "country": "Ivory Coast", "entity_id": "Q3189237", "variants": ["Julie Mabea"]} +{"canonical": "Kandet Kanté", "country": "Ivory Coast", "entity_id": "Q3192592", "variants": ["Kandet Kante"]} +{"canonical": "Lambo Sandjo Pierre Roger", "country": "Cameroon", "entity_id": "Q3217752", "variants": ["Lapiro De M'banga", "Lapiro de Mbanga", "Sandjo Lapiro"]} +{"canonical": "Toni Tones", "country": "Nigeria", "entity_id": "Q32280528", "variants": ["Gbemi Antonia Adefoye"]} +{"canonical": "Louis Diène Faye", "country": "Senegal", "entity_id": "Q3261736", "variants": ["Louis Diene Faye"]} +{"canonical": "Marcellin Yacé", "country": "Ivory Coast", "entity_id": "Q3289610", "variants": ["Marcellin Yace"]} +{"canonical": "Mareshal Dj", "country": "Ivory Coast", "entity_id": "Q3290425", "variants": ["DJ Maréchal"]} +{"canonical": "Salawa Abeni", "country": "Nigeria", "entity_id": "Q3294502", "variants": ["Salawa Abeni Alidu"]} +{"canonical": "Mawa Traoré", "country": "Ivory Coast", "entity_id": "Q3301949", "variants": ["Mawa Traore"]} +{"canonical": "Sho Madjozi", "country": "South Africa", "entity_id": "Q33141631", "variants": ["Maya Christinah Xichavo Wegerif"]} +{"canonical": "Molare", "country": "Ivory Coast", "entity_id": "Q3319439", "variants": ["le voleur confirmé"]} +{"canonical": "Monique Séka", "country": "Ivory Coast", "entity_id": "Q3320940", "variants": ["Monique Seka"]} +{"canonical": "Nayanka Bell", "country": "Ivory Coast", "entity_id": "Q3337358", "variants": ["Louise de Marillac"]} +{"canonical": "George Wilberforce Kakoma", "country": "Uganda", "entity_id": "Q335479", "variants": ["G.W Kakoma"]} +{"canonical": "Pasteur Adjé", "country": "Ivory Coast", "entity_id": "Q3368455", "variants": ["Pasteur Adje"]} +{"canonical": "Kippie Moeketsi", "country": "South Africa", "entity_id": "Q337061", "variants": ["Jeremiah \"Kippie\" Morolong Moeketsi"]} +{"canonical": "Petit Yodé", "country": "Ivory Coast", "entity_id": "Q3377226", "variants": ["Petit Yode"]} +{"canonical": "Pierrette Adams", "country": "Ivory Coast", "entity_id": "Q3387889", "variants": ["Mere Z", "Mère Z"]} +{"canonical": "Pit Baccardi", "country": "Cameroon", "entity_id": "Q3389313", "variants": ["Guillaume N'Goumou"]} +{"canonical": "Mahlathini", "country": "South Africa", "entity_id": "Q339248", "variants": ["Simon Mahlathini Nkabinde"]} +{"canonical": "Reine Pélagie", "country": "Ivory Coast", "entity_id": "Q3423849", "variants": ["Reine Pelagie"]} +{"canonical": "Rémi Jegaan Dioh", "country": "Senegal", "entity_id": "Q3456040", "variants": ["Remi Jegaan Dioh"]} +{"canonical": "Sandra Nkaké", "country": "Cameroon", "entity_id": "Q3471935", "variants": ["Sandra Nkake"]} +{"canonical": "Soum Bill", "country": "Ivory Coast", "entity_id": "Q3491728", "variants": ["Soumahoro Mamadou"]} +{"canonical": "Wes", "country": "Cameroon", "entity_id": "Q349703", "variants": ["Wes Madiko", "Wes Wes"]} +{"canonical": "Suzanna Owíyo", "country": "Kenya", "entity_id": "Q3505879", "variants": ["Suzanna Owiyo"]} +{"canonical": "Alh.Dr Mamman Shata", "country": "Nigeria", "entity_id": "Q3509634", "variants": ["Mamman Shata"]} +{"canonical": "Tunde Nightingale", "country": "Nigeria", "entity_id": "Q3510150", "variants": ["Earnest Olatunde Thomas", "Earnest Olátúndé Thomas"]} +{"canonical": "Omotola Jalade Ekeinde", "country": "Nigeria", "entity_id": "Q3511530", "variants": ["Omotola Jalade", "Omotola Jalende Ekeinde"]} +{"canonical": "Haruna Ishola", "country": "Nigeria", "entity_id": "Q3511609", "variants": ["Haruna Ishola Bello"]} +{"canonical": "Thione Seck", "country": "Senegal", "entity_id": "Q3524673", "variants": ["Thione Ballago Seck"]} +{"canonical": "Tèshomè Meteku", "country": "Ethiopia", "entity_id": "Q3546449", "variants": ["Teshome Meteku"]} +{"canonical": "Zekuhl", "country": "Cameroon", "entity_id": "Q3575123", "variants": ["Atna Jean Emmanuel (Manu) Njock"]} +{"canonical": "Élage Diouf", "country": "Senegal", "entity_id": "Q3586228", "variants": ["El Hadji Diouf", "Elage Diouf"]} +{"canonical": "Anna de Brémont", "country": "South Africa", "entity_id": "Q3617855", "variants": ["Anna de Bremont", "Anna Dunphy", "Anna Elizabeth de Bremont", "Anna Elizabeth Dunphy", "Anna Elizabeth, Countess de Brémont", "Anna, Countess de Brémont"]} +{"canonical": "Bebe Cool", "country": "Uganda", "entity_id": "Q3637341", "variants": ["Gagamel President", "Moses Ssali"]} +{"canonical": "Lira", "country": "South Africa", "entity_id": "Q3644160", "variants": ["Lerato Moipone Molapo", "Lerato Molapo"]} +{"canonical": "Hendrik Hofmeyr", "country": "South Africa", "entity_id": "Q3644382", "variants": ["Hendrik Pienaar Hofmeyr"]} +{"canonical": "Trevor Rabin", "country": "South Africa", "entity_id": "Q364881", "variants": ["Trevor C. Rabin"]} +{"canonical": "Muraina Oyelami", "country": "Nigeria", "entity_id": "Q3667785", "variants": ["Chief Muraina Oyelami"]} +{"canonical": "Lucky Dube", "country": "South Africa", "entity_id": "Q380147", "variants": ["Ermelo Dube"]} +{"canonical": "Dave Matthews", "country": "South Africa", "entity_id": "Q380381", "variants": ["David John Matthews"]} +{"canonical": "Letta Mbulu", "country": "South Africa", "entity_id": "Q383215", "variants": ["Letta Mbulu Semenya"]} +{"canonical": "Jimi Mbaye", "country": "Senegal", "entity_id": "Q3844075", "variants": ["Mamadou Mbaye", "Mamadou \"Jimi\" Mbaye"]} +{"canonical": "Poet Teardrops", "country": "Kenya", "entity_id": "Q38460363", "variants": ["Joshua Awili Ouma", "Joshua Awilly", "Mark Joshua Awili Ouma", "Mark Joshua Ouma"]} +{"canonical": "Blondie Chaplin", "country": "South Africa", "entity_id": "Q388729", "variants": ["Terence William Chaplin"]} +{"canonical": "Harmonize", "country": "Tanzania", "entity_id": "Q38902387", "variants": ["konde boy", "Rajab Abdul Kahali", "Rajab Kahali"]} +{"canonical": "Ada Ehi", "country": "Nigeria", "entity_id": "Q39054685", "variants": ["Ada", "Ada Ogochukwu Ehi"]} +{"canonical": "Saka-Acquaye", "country": "Ghana", "entity_id": "Q3945157", "variants": ["F. Saka Acquaye", "Saka Acquaye"]} +{"canonical": "Sean Daniel Martin", "country": "South Africa", "entity_id": "Q3953554", "variants": ["Sean", "Sean Martin"]} +{"canonical": "Ebere Chi", "country": "Nigeria", "entity_id": "Q40914017", "variants": ["Mercy Eberechi Uwaka"]} +{"canonical": "Eno Barony", "country": "Ghana", "entity_id": "Q41187710", "variants": ["Ruth Eno Adjoa Amankwah Nyame Adom"]} +{"canonical": "Rayvanny", "country": "Tanzania", "entity_id": "Q41555515", "variants": ["Raymond Shaban Mwakyusa"]} +{"canonical": "Zee", "country": "South Africa", "entity_id": "Q41672290", "variants": ["Z", "Zamani Ngidi"]} +{"canonical": "Marieme Fall", "country": "Senegal", "entity_id": "Q41673186", "variants": ["Marema"]} +{"canonical": "Mercy Chinwo-Blessed", "country": "Nigeria", "entity_id": "Q41694090", "variants": ["Mercy Chinwo"]} +{"canonical": "Akin Euba", "country": "Nigeria", "entity_id": "Q418503", "variants": ["Akin Yuba", "Olatunji Akin Euba"]} +{"canonical": "Lydia Jazmine", "country": "Uganda", "entity_id": "Q42563115", "variants": ["Emmy", "Lydia Nabawanuka", "Mermaid Queen"]} +{"canonical": "Robert Calvert", "country": "South Africa", "entity_id": "Q426950", "variants": ["Robert Newton Calvert"]} +{"canonical": "Tsehaytu Beraki", "country": "Ethiopia", "entity_id": "Q42720208", "variants": ["Tsèhaytu Bèraki"]} +{"canonical": "Tessema Eshete", "country": "Ethiopia", "entity_id": "Q430407", "variants": ["Tesemma Eshete"]} +{"canonical": "Khabonina Qubeka", "country": "South Africa", "entity_id": "Q43067471", "variants": ["Nina Zamdela(Isidingo)"]} +{"canonical": "Thandiswa Mazwai", "country": "South Africa", "entity_id": "Q4348940", "variants": ["Thandiswa Nyameka Mazwai"]} +{"canonical": "Lady Jaydee", "country": "Tanzania", "entity_id": "Q4349260", "variants": ["Jaydee", "Jay Dee", "Judith Wambura Mbibo", "Lady Jay Dee", "Lady Jay D"]} +{"canonical": "Alfred P. Addaquay", "country": "Ghana", "entity_id": "Q43549182", "variants": ["Alfred Patrick Addaquay"]} +{"canonical": "Ismaila Sané", "country": "Senegal", "entity_id": "Q4357891", "variants": ["Ismaila Sane"]} +{"canonical": "Irma", "country": "Cameroon", "entity_id": "Q439028", "variants": ["Irma Pany"]} +{"canonical": "Mira Calix", "country": "South Africa", "entity_id": "Q439331", "variants": ["Chantal Francesca Passamonte", "Chantal Passamonte"]} +{"canonical": "Manu Dibango", "country": "Cameroon", "entity_id": "Q445829", "variants": ["Jr. Dibbs", "Emmanuel N'Djoké Dibango"]} +{"canonical": "Renaida Braun", "country": "Tanzania", "entity_id": "Q44627126", "variants": ["Renaida", "Renaida Kebyera Braun"]} +{"canonical": "Slim Marion", "country": "Cameroon", "entity_id": "Q44737083", "variants": ["Nouck Jean Luc Alexis"]} +{"canonical": "Simphiwe Dana", "country": "South Africa", "entity_id": "Q448917", "variants": ["Dana"]} +{"canonical": "Tryt", "country": "Zimbabwe", "entity_id": "Q44953232", "variants": ["StyleBoy, Terrence Tichapondwa"]} +{"canonical": "King Promise", "country": "Ghana", "entity_id": "Q45349965", "variants": ["Gregory Bortey Newman"]} +{"canonical": "Jean Grae", "country": "South Africa", "entity_id": "Q455304", "variants": ["Tsidi Ibrahim"]} +{"canonical": "Sally Nyolo", "country": "Cameroon", "entity_id": "Q457447", "variants": ["Sally Soleïnie Nyolo"]} +{"canonical": "Yolandi Visser", "country": "South Africa", "entity_id": "Q458337", "variants": ["Anica The Snuffling", "Yo-Landi Vi$$er"]} +{"canonical": "Dobet Gnahoré", "country": "Ivory Coast", "entity_id": "Q458985", "variants": ["Dobet Gnahore"]} +{"canonical": "Dqueen", "country": "Nigeria", "entity_id": "Q46233612", "variants": ["Adesuwa Omoyeme Obatta"]} +{"canonical": "Genevieve Nnaji", "country": "Nigeria", "entity_id": "Q463902", "variants": ["Genevieve"]} +{"canonical": "9ice", "country": "Nigeria", "entity_id": "Q4646468", "variants": ["Alexander Abodore Adegbola", "Alexander Abolore Adegbola Adigun Alapomeji Ajifolajifaola"]} +{"canonical": "A. B. Crentsil", "country": "Ghana", "entity_id": "Q4647546", "variants": ["A.B. Crentsil", "Alfred Benjamin Crentsil"]} +{"canonical": "Gigi", "country": "Ethiopia", "entity_id": "Q465211", "variants": ["Ejigayehu Shibabaw"]} +{"canonical": "Abednego Mazibuko", "country": "South Africa", "entity_id": "Q4666481", "variants": ["Mpindela Abednego Mazibuko"]} +{"canonical": "Meiway", "country": "Ivory Coast", "entity_id": "Q466741", "variants": ["Frederic Desire Ehui", "Frederic Ehui"]} +{"canonical": "Achieng Abura", "country": "Kenya", "entity_id": "Q4673664", "variants": ["Achien'g Abura", "Achieng' Abura", "Lydia Achieng Abura", "Lydia Achieng' Abura"]} +{"canonical": "Adewale Ayuba", "country": "Nigeria", "entity_id": "Q4682418", "variants": ["Ayuba", "Mr Jackson"]} +{"canonical": "Melissa Camp", "country": "South Africa", "entity_id": "Q4685692", "variants": ["Adrienne Liesching"]} +{"canonical": "Agboola Shadare", "country": "Nigeria", "entity_id": "Q4691665", "variants": ["Agboola"]} +{"canonical": "ajofé.", "country": "Nigeria", "entity_id": "Q47007185", "variants": ["Adukwu Samuel Atadoga", "Ajofé"]} +{"canonical": "Michael Mahendere", "country": "Zimbabwe", "entity_id": "Q47026773", "variants": ["Minister Michael Mahendere"]} +{"canonical": "Fonyuy Leonard Nsohburinka", "country": "Cameroon", "entity_id": "Q47035383", "variants": ["Mr. Leo"]} +{"canonical": "Albert Mazibuko", "country": "South Africa", "entity_id": "Q4710814", "variants": ["Mdletshe Albert Mazibuko"]} +{"canonical": "Lisa-Kaindé Diaz", "country": "Nigeria", "entity_id": "Q47151523", "variants": ["Lisa Diaz"]} +{"canonical": "Ismaël Lô", "country": "Senegal", "entity_id": "Q471774", "variants": ["Ismael Lo"]} +{"canonical": "Shungudzo Kuyimba", "country": "Zimbabwe", "entity_id": "Q4720649", "variants": ["Alexandra Govere", "Alexandra Shungudzo Govere", "Shungudzo"]} +{"canonical": "Alioune Mbaye Nder", "country": "Senegal", "entity_id": "Q4726804", "variants": ["Alioune M'Baye Nder", "NDER", "Nder boy"]} +{"canonical": "Daphne", "country": "Cameroon", "entity_id": "Q47371377", "variants": ["Daphné", "Daphne Njie Efundem", "Njie Efundem Daphne", "Njie Efunden Daphne"]} +{"canonical": "Cecilia Wairimu", "country": "Kenya", "entity_id": "Q4739847", "variants": ["Tamani"]} +{"canonical": "Rookie SBK", "country": "Nigeria", "entity_id": "Q47461247", "variants": ["Rookie"]} +{"canonical": "Ruff Kid", "country": "Zambia", "entity_id": "Q47492949", "variants": ["Kang'ono", "Masautso Nkhoma", "Ruff Kaida", "The Messiah of Zambian music"]} +{"canonical": "Abdu Kiba", "country": "Tanzania", "entity_id": "Q47510108", "variants": ["Abdulkarim Salehe Kiba"]} +{"canonical": "Anton Goosen", "country": "South Africa", "entity_id": "Q4775776", "variants": ["die liedjieboer"]} +{"canonical": "Arnold van Wyk", "country": "South Africa", "entity_id": "Q4795338", "variants": ["Arnoldus Christiaan Vlok van Wyk"]} +{"canonical": "Goldie Harvey", "country": "Nigeria", "entity_id": "Q4801078", "variants": ["Susan Oluwabimpe"]} +{"canonical": "Ayigbe Edem", "country": "Ghana", "entity_id": "Q4831253", "variants": ["Edem", "Denning Edem Hotor"]} +{"canonical": "Babá Ken Okulolo", "country": "Nigeria", "entity_id": "Q4838553", "variants": ["Baba Ken Okulolo"]} +{"canonical": "Andrew Ballad Mutale Zulu", "country": "Zambia", "entity_id": "Q4851326", "variants": ["Ballad Zulu"]} +{"canonical": "Batile Alake", "country": "Nigeria", "entity_id": "Q4869273", "variants": ["Batili Alake"]} +{"canonical": "Kirani Ayat", "country": "Ghana", "entity_id": "Q48700612", "variants": ["Ayat Maqwan Salis"]} +{"canonical": "BeBe Zahara Benet", "country": "Cameroon", "entity_id": "Q4875441", "variants": ["Nea Marshall Kudi Ngwa"]} +{"canonical": "Eko Roosevelt", "country": "Cameroon", "entity_id": "Q48774004", "variants": ["Eko Roosevelt Louis"]} +{"canonical": "Becky Umeh", "country": "Nigeria", "entity_id": "Q4878877", "variants": ["Alejo", "Becky UzoAmaka Umeh"]} +{"canonical": "Ben Sharpa", "country": "South Africa", "entity_id": "Q4886438", "variants": ["Kgotso Semela"]} +{"canonical": "Osas Destiny", "country": "Nigeria", "entity_id": "Q48872169", "variants": ["JamaicaBoy"]} +{"canonical": "Bice Osei Kuffour", "country": "Ghana", "entity_id": "Q4903547", "variants": ["Obour"]} +{"canonical": "Blitz the Ambassador", "country": "Ghana", "entity_id": "Q4926959", "variants": ["Blitz Bazawule", "Samuel Bazawule"]} +{"canonical": "Bobby Benson", "country": "Nigeria", "entity_id": "Q4934770", "variants": ["Bernard Olabinjo \"Bobby\" Benson"]} +{"canonical": "Astrid Assefa", "country": "Ethiopia", "entity_id": "Q4936827", "variants": ["Astrid Margaretha Engelbrektsson"]} +{"canonical": "Kayo Shekoni", "country": "Nigeria", "entity_id": "Q4958419", "variants": ["Kayode Maria Söderberg Shekoni"]} +{"canonical": "Bright Chimezie", "country": "Nigeria", "entity_id": "Q4967394", "variants": ["Okoro Junior"]} +{"canonical": "Brymo", "country": "Nigeria", "entity_id": "Q4980805", "variants": ["Olawale Ashimi", "Olawale Ibrahim Ashimi", "Olawale Oloforo"]} +{"canonical": "Edwin Samson", "country": "Nigeria", "entity_id": "Q50347870", "variants": ["Rhythim"]} +{"canonical": "Darkovibes", "country": "Ghana", "entity_id": "Q50414836", "variants": ["Paul Nii Amu Andrew Darko"]} +{"canonical": "Carol Jiani", "country": "Nigeria", "entity_id": "Q5044405", "variants": ["Uchenna Carol Ikejiani"]} +{"canonical": "Mwasiti", "country": "Tanzania", "entity_id": "Q50505948", "variants": ["Mwasiti Almas Yusuph"]} +{"canonical": "Tiwatope Ayodeji", "country": "Nigeria", "entity_id": "Q50633774", "variants": ["Cici Tiwa"]} +{"canonical": "Jose Chameleone", "country": "Uganda", "entity_id": "Q5069763", "variants": ["Camili", "Joseph Mayanja", "Chameleone", "Dr Jose Chameleone"]} +{"canonical": "Sampa the Great", "country": "Zambia", "entity_id": "Q50720645", "variants": ["Sampa Tembo"]} +{"canonical": "Charity Zisengwe", "country": "Zimbabwe", "entity_id": "Q5074536", "variants": ["Chenai Zisengwe"]} +{"canonical": "Charly Boy", "country": "Nigeria", "entity_id": "Q5086369", "variants": ["Charlie Boy", "Area Fada", "His Royal Punkness"]} +{"canonical": "Chief Stephen Osita Osadebe", "country": "Nigeria", "entity_id": "Q5096937", "variants": ["Osadebe", "Osita Osadebe", "Stephen Osita Osadebe", "The People Star"]} +{"canonical": "Christy Essien-Igbokwe", "country": "Nigeria", "entity_id": "Q5113640", "variants": ["Christiana Uduak Essien-Igbokwe", "Christy Essien Igbokwe", "Lady of Songs"]} +{"canonical": "Mlex Songz", "country": "Nigeria", "entity_id": "Q51385723", "variants": ["Alex Obeheremen Usiabulu"]} +{"canonical": "Cobhams Asuquo", "country": "Nigeria", "entity_id": "Q5138902", "variants": ["Cobhams"]} +{"canonical": "Ali Zainab Nielsen", "country": "Nigeria", "entity_id": "Q51633388", "variants": ["Alizee", "Zainab Ali Nielsen", "Zainab Joy Nielsen"]} +{"canonical": "Dena Kaplan", "country": "South Africa", "entity_id": "Q518185", "variants": ["Dena Amy Kaplan"]} +{"canonical": "St. Chika", "country": "Nigeria", "entity_id": "Q51858630", "variants": ["Chika Nwaogu", "Saint Chika"]} +{"canonical": "Professor Jay", "country": "Tanzania", "entity_id": "Q519965", "variants": ["Joseph Haule", "Joseph Leonard Haule"]} +{"canonical": "DJ Brian", "country": "South Africa", "entity_id": "Q5205260", "variants": ["Giyani Brian \"DJ Brian\" Rikhotso"]} +{"canonical": "Da Grin", "country": "Nigeria", "entity_id": "Q5207241", "variants": ["Oladapo Olaitan Olaonipekun"]} +{"canonical": "Daddy Owen", "country": "Kenya", "entity_id": "Q5208023", "variants": ["Owen Mwatia"]} +{"canonical": "Douyé", "country": "Nigeria", "entity_id": "Q52106816", "variants": ["Douyé Doubara Bella Youduba"]} +{"canonical": "Cina Soul", "country": "Ghana", "entity_id": "Q52219241", "variants": ["Christie Quincyna Quarcoopome"]} +{"canonical": "Darey", "country": "Nigeria", "entity_id": "Q5222572", "variants": ["Dare Art Alade"]} +{"canonical": "Dataz", "country": "Tanzania", "entity_id": "Q5227503", "variants": ["rapa"]} +{"canonical": "Dauda Epo-Akara", "country": "Nigeria", "entity_id": "Q5227867", "variants": ["Dauda Akanmu Epo-Akara"]} +{"canonical": "Busi Mhlongo", "country": "South Africa", "entity_id": "Q522874", "variants": ["Busisiwe Victoria Mhlongo"]} +{"canonical": "Lady Donli", "country": "Nigeria", "entity_id": "Q52345352", "variants": ["Zainab Elizabeth Donli"]} +{"canonical": "David Marks", "country": "South Africa", "entity_id": "Q5237136", "variants": ["David Holland"]} +{"canonical": "Dawid Engela", "country": "South Africa", "entity_id": "Q5242340", "variants": ["Dawid Sofius Engela"]} +{"canonical": "Chimwemwe Chihana-Mtawali", "country": "Zambia", "entity_id": "Q52450631", "variants": ["Chimwemwe Chihana", "Wacheda"]} +{"canonical": "Busiswa", "country": "South Africa", "entity_id": "Q52566539", "variants": ["Busiswa Gqulu"]} +{"canonical": "Petra", "country": "Kenya", "entity_id": "Q52634149", "variants": ["Petra Bockle", "Petra Yolanda Sonia Bockle"]} +{"canonical": "Kuami Eugene", "country": "Ghana", "entity_id": "Q52801612", "variants": ["Rock Star", "Eugene Kwame Marfo"]} +{"canonical": "Allan Watson Waswa", "country": "Uganda", "entity_id": "Q52985936", "variants": ["Allan Tabs"]} +{"canonical": "Francis Bebey", "country": "Cameroon", "entity_id": "Q529942", "variants": ["Francis Etonde Bebey"]} +{"canonical": "Dr Cryme", "country": "Ghana", "entity_id": "Q5304519", "variants": ["Darlington Agyekum"]} +{"canonical": "Dr Sid", "country": "Nigeria", "entity_id": "Q5304552", "variants": ["Sidney Onoriode Esiri"]} +{"canonical": "Dr Sir Warrior", "country": "Nigeria", "entity_id": "Q5304553", "variants": ["Christogonus Ezebuiro Obinna"]} +{"canonical": "Duro Ladipo", "country": "Nigeria", "entity_id": "Q5316704", "variants": ["Sango", "Durodola Durosomo Duroorike Timothy Adisa Ladipo"]} +{"canonical": "eLDee", "country": "Nigeria", "entity_id": "Q5323276", "variants": ["Eldee", "eLDee The Don", "Eldee The Don", "Lanre Dabiri"]} +{"canonical": "Khuzani Mpungose", "country": "South Africa", "entity_id": "Q53385197", "variants": ["Khuzani Nkosikhona Innocent Mpungose"]} +{"canonical": "Sunkanmi", "country": "Nigeria", "entity_id": "Q53411053", "variants": ["Olasunkanmi Rehanat Alonge"]} +{"canonical": "Eedris Abdulkareem", "country": "Nigeria", "entity_id": "Q5347028", "variants": ["Eedris Turayo Abdulkareem Ajenifuja"]} +{"canonical": "Efua Baker", "country": "Ghana", "entity_id": "Q5347655", "variants": ["EFUA"]} +{"canonical": "Ego Ihenacho", "country": "Nigeria", "entity_id": "Q5348152", "variants": ["Ego"]} +{"canonical": "Piet de Villiers", "country": "South Africa", "entity_id": "Q53620563", "variants": ["Pieter De Villiers", "Pieter Johannes de Villiers"]} +{"canonical": "Elom Adablah", "country": "Ghana", "entity_id": "Q5367109", "variants": ["EL"]} +{"canonical": "Benjamin Tyamzashe", "country": "South Africa", "entity_id": "Q53836319", "variants": ["Benjamin John Peter Tyamzashe"]} +{"canonical": "Lebo Mathosa", "country": "South Africa", "entity_id": "Q538748", "variants": ["Lebogang Precious Mathosa"]} +{"canonical": "Yvonne Chaka Chaka", "country": "South Africa", "entity_id": "Q539193", "variants": ["Yvonne Machaka"]} +{"canonical": "Eva Alordiah", "country": "Nigeria", "entity_id": "Q5414996", "variants": ["Eva", "Elohor Eva Alordiah"]} +{"canonical": "Eyasu Berhe", "country": "Ethiopia", "entity_id": "Q5422570", "variants": ["Eyasu Berhe Asemahegne"]} +{"canonical": "Ayesem", "country": "Ghana", "entity_id": "Q54358753", "variants": ["Sketches", "Stephen Kwabena Siaw"]} +{"canonical": "Faze", "country": "Nigeria", "entity_id": "Q5439170", "variants": ["Chibuzor Oji"]} +{"canonical": "Flavour", "country": "Nigeria", "entity_id": "Q5458212", "variants": ["Chinedu Okoli", "Flavour N'abania"]} +{"canonical": "LMN Z7", "country": "Cameroon", "entity_id": "Q54650941", "variants": ["Hi like @6ix9ine"]} +{"canonical": "Charles Arthur Locko", "country": "Cameroon", "entity_id": "Q54652991", "variants": ["Locko"]} +{"canonical": "Mutt Lange", "country": "Zambia", "entity_id": "Q547660", "variants": ["Robert Lange"]} +{"canonical": "Asikey George", "country": "Nigeria", "entity_id": "Q54861216", "variants": ["Asikiya Albright George, Asikey"]} +{"canonical": "Tubuo Evaristus", "country": "Cameroon", "entity_id": "Q54862866", "variants": ["Tson Evas"]} +{"canonical": "François Bloemhof", "country": "South Africa", "entity_id": "Q5493191", "variants": ["Leo Bekker"]} +{"canonical": "Genevieve Waite", "country": "South Africa", "entity_id": "Q5533114", "variants": ["Genevieve Joyce Weight", "Geneviève Waïte"]} +{"canonical": "Ric Hassani", "country": "Nigeria", "entity_id": "Q55584913", "variants": ["Ikechukwu Eric Ahiauzu", "Rico Slim"]} +{"canonical": "Nandy", "country": "Tanzania", "entity_id": "Q55624615", "variants": ["Faustina Charles Mfinanga", "Faustina Mfinanga"]} +{"canonical": "Tobechukwu Victor Okoh", "country": "Nigeria", "entity_id": "Q55759635", "variants": ["Peruzzi"]} +{"canonical": "Bernard Appiah", "country": "Ghana", "entity_id": "Q55761264", "variants": ["Kwesi Slay"]} +{"canonical": "Mr Real", "country": "Nigeria", "entity_id": "Q56065009", "variants": ["Okafor Uchenna Victor"]} +{"canonical": "Koos du Plessis", "country": "South Africa", "entity_id": "Q561270", "variants": ["Koos Doep"]} +{"canonical": "Johnny Clegg", "country": "South Africa", "entity_id": "Q561596", "variants": ["Jonathan", "Jonathan Paul Clegg"]} +{"canonical": "Mic Burner", "country": "Zambia", "entity_id": "Q56217083", "variants": ["Michael Mandona"]} +{"canonical": "John Ighodaro", "country": "Nigeria", "entity_id": "Q56224088", "variants": ["Johnny Drille"]} +{"canonical": "Sheck Wes", "country": "Senegal", "entity_id": "Q56513324", "variants": ["Wes", "Khadimou Fall", "Khadimou Rassoul Cheikh Fall", "Kid Khadi", "Mudboy", "Sheck Jesus", "Young Sheck Wes"]} +{"canonical": "Lady Zamar", "country": "South Africa", "entity_id": "Q56630968", "variants": ["Yamikani Janet Banda"]} +{"canonical": "Headman Shabalala", "country": "South Africa", "entity_id": "Q5689838", "variants": ["Headman Msongelwa Shabalala"]} +{"canonical": "Helen Paul", "country": "Nigeria", "entity_id": "Q5702968", "variants": ["Helen Paul Bamisile", "Professor Helen Paul", "Tatafo"]} +{"canonical": "Herbert Kretzmer", "country": "South Africa", "entity_id": "Q5734832", "variants": ["Kretzmer"]} +{"canonical": "Cheikh Lô", "country": "Senegal", "entity_id": "Q575989", "variants": ["Cheikh Lo"]} +{"canonical": "Hilda Tloubatla", "country": "South Africa", "entity_id": "Q5761489", "variants": ["Hilda Semola Tloubatla"]} +{"canonical": "Hip Hop Pantsula", "country": "South Africa", "entity_id": "Q5767912", "variants": ["HHP", "Jabulani Tsambo"]} +{"canonical": "Bolaji Adedotun Olanrenwaju", "country": "Nigeria", "entity_id": "Q57714240", "variants": ["Big Bolaji"]} +{"canonical": "Daniel Cornel Marivate", "country": "South Africa", "entity_id": "Q57983561", "variants": ["DC Marivate"]} +{"canonical": "Teni", "country": "Nigeria", "entity_id": "Q58301979", "variants": ["Teniola Apata"]} +{"canonical": "Kwesi Arthur", "country": "Ghana", "entity_id": "Q58303488", "variants": ["Emmanuel Kwesi Danso Arthur"]} +{"canonical": "Wendy Shay", "country": "Ghana", "entity_id": "Q58806824", "variants": ["Wendy Asiama Addo", "Wendy Asiamah Addo"]} +{"canonical": "Steve Kekana", "country": "South Africa", "entity_id": "Q5905042", "variants": ["Tebogo Steve Kekana"]} +{"canonical": "Howza", "country": "South Africa", "entity_id": "Q5922658", "variants": ["Tshepo Howard Mosese"]} +{"canonical": "Mayorkun", "country": "Nigeria", "entity_id": "Q59655841", "variants": ["Adewale Mayowa Emmanuel.", "Mayor of Lagos"]} +{"canonical": "Philly Lutaaya", "country": "Uganda", "entity_id": "Q5968234", "variants": ["Fille Bongole Lutaya", "Philly Bongoley Lutaaya", "Philly Bongoley Lutaya", "Philly Lutaya"]} +{"canonical": "Zoro", "country": "Nigeria", "entity_id": "Q59693026", "variants": ["Owoh Chimaobi Chrismathner", "Zoro Swagbag"]} +{"canonical": "Ikechukwu", "country": "Nigeria", "entity_id": "Q59781864", "variants": ["Ikechukwu Onunaku"]} +{"canonical": "Ibrahim Sylla", "country": "Ivory Coast", "entity_id": "Q5984748", "variants": ["Ibrahima Sylla", "Ibrahima Sory Sylla"]} +{"canonical": "Ice Prince", "country": "Nigeria", "entity_id": "Q5985341", "variants": ["Ice Prince Zamani", "Panshak Henry Zamani", "zamani"]} +{"canonical": "Imani Sanga", "country": "Tanzania", "entity_id": "Q6003310", "variants": ["Imani"]} +{"canonical": "Onos Ariyo", "country": "Nigeria", "entity_id": "Q60040652", "variants": ["Onoriode Ebiere Ariyo"]} +{"canonical": "Amerado", "country": "Ghana", "entity_id": "Q60286763", "variants": ["Derrick Sarfo Kantanka"]} +{"canonical": "Betty G", "country": "Ethiopia", "entity_id": "Q60330010", "variants": ["Bruktawit Getahun"]} +{"canonical": "Ecca Vandal", "country": "South Africa", "entity_id": "Q60524021", "variants": ["Rebecca Ari"]} +{"canonical": "Carmelia Maria Neto Lopez", "country": "South Africa", "entity_id": "Q60673727", "variants": ["Maria"]} +{"canonical": "DJ Switch", "country": "Nigeria", "entity_id": "Q60735224", "variants": ["Obianuju Catherine Udeh"]} +{"canonical": "Victor AD", "country": "Nigeria", "entity_id": "Q60736894", "variants": ["Victor Adere", "Victor Eugenie Adere"]} +{"canonical": "Iryn Namubiru", "country": "Uganda", "entity_id": "Q6075178", "variants": ["Irene Gladys Namubiru", "Iryn Namubiru Morel"]} +{"canonical": "Muthoni Drummer Queen", "country": "Kenya", "entity_id": "Q60836183", "variants": ["MDQ", "Muthoni \"MDQ\" Ndonga", "Muthoni Ndonga"]} +{"canonical": "Jux", "country": "Tanzania", "entity_id": "Q61082024", "variants": ["African Boy", "Juma Mussa Mkambala"]} +{"canonical": "JR Bogopa", "country": "South Africa", "entity_id": "Q6108846", "variants": ["JR"]} +{"canonical": "Jabulani Dubazana", "country": "South Africa", "entity_id": "Q6110318", "variants": ["Jabulani Frederick Mwelase Dubazana"]} +{"canonical": "Chris Chameleon", "country": "South Africa", "entity_id": "Q613413", "variants": ["Chris Mulder"]} +{"canonical": "Watkin Tudor Jones", "country": "South Africa", "entity_id": "Q613471", "variants": ["Ninja", "Totally Rad", "2-ply", "Death Walker", "MC Totally Rad", "Panga the Boy Wanda", "Snuffle Gruff", "The Man Who Never Came Back", "Waddy Jones", "Watkin Tudor Jones Jr.", "Yang Weapon"]} +{"canonical": "Tim Godfrey", "country": "Nigeria", "entity_id": "Q61467100", "variants": ["Tim Chukwudi Godfrey"]} +{"canonical": "Djoumessi Tsague Ulrich Coco", "country": "Cameroon", "entity_id": "Q61653218", "variants": ["Duc-Z"]} +{"canonical": "Tzy Panchak", "country": "Cameroon", "entity_id": "Q61653325", "variants": ["Etah Tambe Nyenti", "Panchako"]} +{"canonical": "Ténor", "country": "Cameroon", "entity_id": "Q61653380", "variants": ["Tenor", "Thierry Mengoumou Ayia"]} +{"canonical": "Ethel Eshun", "country": "Ghana", "entity_id": "Q61711245", "variants": ["eShun", "Ethel Esi Eshun"]} +{"canonical": "Moonchild Sanelly", "country": "South Africa", "entity_id": "Q61746862", "variants": ["Sanelisiwe Twisha"]} +{"canonical": "Barima Sidney", "country": "Ghana", "entity_id": "Q61852708", "variants": ["Sidney Kofi Ofori"]} +{"canonical": "Mz Kiss", "country": "Nigeria", "entity_id": "Q62026405", "variants": ["Akindele Justina Omowunmi"]} +{"canonical": "Joe Mafela", "country": "South Africa", "entity_id": "Q6211073", "variants": ["Sdumo"]} +{"canonical": "John Collins", "country": "Ghana", "entity_id": "Q6226728", "variants": ["Edmund John Collins"]} +{"canonical": "Josef Marais", "country": "South Africa", "entity_id": "Q6279998", "variants": ["Joseph Pessach", "Marais & Miranda"]} +{"canonical": "Joseph Sonnabend", "country": "South Africa", "entity_id": "Q6287101", "variants": ["Joseph A. Sonnabend", "Joseph Adolph Sonnabend"]} +{"canonical": "Jua Cali", "country": "Kenya", "entity_id": "Q6298712", "variants": ["Paul Julius Nunda"]} +{"canonical": "Small Doctor", "country": "Nigeria", "entity_id": "Q63107626", "variants": ["Adekunle Temitope"]} +{"canonical": "Esther Akoth", "country": "Kenya", "entity_id": "Q63184880", "variants": ["Akothee"]} +{"canonical": "K-Lyinn", "country": "Tanzania", "entity_id": "Q6322712", "variants": ["Jacqueline Ntuyabaliwe Mengi"]} +{"canonical": "Alhaji Kwabena Frimpong", "country": "Ghana", "entity_id": "Q6323333", "variants": ["Alhaji K. Frimpong", "K. Frimpong", "Mohammed Ibrahim Kwame Frimpong"]} +{"canonical": "Karin Kortje", "country": "South Africa", "entity_id": "Q6370860", "variants": ["Karin Kortje-Aspeling"]} +{"canonical": "Kaïssa", "country": "Cameroon", "entity_id": "Q6381846", "variants": ["Kaissa"]} +{"canonical": "Kelly Khumalo", "country": "South Africa", "entity_id": "Q6386129", "variants": ["Kelly Nonhlanhla Khumalo"]} +{"canonical": "Kevin Wyre", "country": "Kenya", "entity_id": "Q6397797", "variants": ["Wyre"]} +{"canonical": "Mereba", "country": "Ethiopia", "entity_id": "Q64009108", "variants": ["Marian Azeb Mereba", "Marian Mereba"]} +{"canonical": "Zlatan Ibile", "country": "Nigeria", "entity_id": "Q64010220", "variants": ["Zlatan", "Omoniyi Temidayo Raphael"]} +{"canonical": "Yakubu Muhammad", "country": "Nigeria", "entity_id": "Q64011213", "variants": ["Yakubu Mohammed"]} +{"canonical": "Koo Nimo", "country": "Ghana", "entity_id": "Q6430491", "variants": ["Agya Koo Nimo"]} +{"canonical": "Rhymz", "country": "Nigeria", "entity_id": "Q64364745", "variants": ["Esiokugbe Oghenechovwe Choice"]} +{"canonical": "Zikhona Sodlaka", "country": "South Africa", "entity_id": "Q64372844", "variants": ["sodlaka"]} +{"canonical": "Dizasta Vina", "country": "Tanzania", "entity_id": "Q64374971", "variants": ["Dizasta", "Edger Vicent Mwaipeta"]} +{"canonical": "Kwame Dawes", "country": "Ghana", "entity_id": "Q6450075", "variants": ["Kwame Senu Neville Dawes"]} +{"canonical": "Gemini Orleans", "country": "Ghana", "entity_id": "Q64627824", "variants": ["Victor Mawuli Orleans-Fianka"]} +{"canonical": "Blanche Bailly", "country": "Cameroon", "entity_id": "Q64667915", "variants": ["Bailly Larinette Tatah"]} +{"canonical": "Lagbaja", "country": "Nigeria", "entity_id": "Q6471947", "variants": ["Bisinuade Ologunde"]} +{"canonical": "Orville Peck", "country": "South Africa", "entity_id": "Q64729746", "variants": ["Daniel Pitout"]} +{"canonical": "Ladipoe", "country": "Nigeria", "entity_id": "Q64745647", "variants": ["Poe", "Ladipo Eso"]} +{"canonical": "Mlindo the Vocalist", "country": "South Africa", "entity_id": "Q64746249", "variants": ["Lindokuhle Magedezi"]} +{"canonical": "Rema", "country": "Nigeria", "entity_id": "Q65071082", "variants": ["Divine Ikubor"]} +{"canonical": "K'millian", "country": "Zambia", "entity_id": "Q6523491", "variants": ["K'Millian", "Leo \"K'millian\" Moyo", "Leo Moyo"]} +{"canonical": "Lamisi", "country": "Ghana", "entity_id": "Q65509006", "variants": ["Regina Lamisi Awiniman Anabilla Akuka"]} +{"canonical": "Monelle", "country": "South Africa", "entity_id": "Q65532709", "variants": ["Floëme", "Khumo Mminele"]} +{"canonical": "Kazz A.K.A Mr Boomslang", "country": "Zimbabwe", "entity_id": "Q65645587", "variants": ["Boomslang", "Farhaan Khan", "Kazz", "Mister Boomslang", "Mr Boomslang"]} +{"canonical": "Maurixxin", "country": "Nigeria", "entity_id": "Q65665679", "variants": ["E", "EMS", "E.M.S", "Lil Maurice", "Maurice A God", "Maurice Eloka Soye Okeoma", "Maurice Okeoma"]} +{"canonical": "Ariel Kaplan", "country": "South Africa", "entity_id": "Q659130", "variants": ["Ariel Erin Kaplan"]} +{"canonical": "Naziru M Ahmad", "country": "Nigeria", "entity_id": "Q65936024", "variants": ["Nazir M. Ahmad", "Sarkin Waka"]} +{"canonical": "Routine", "country": "Ghana", "entity_id": "Q65965913", "variants": ["Akankobateng Rueben", "Routinemadeit", "Routineonthetrack", "Rueben_Routine"]} +{"canonical": "T.K. Mathabela", "country": "South Africa", "entity_id": "Q66069869", "variants": ["OGK4Lyf"]} +{"canonical": "Dogo Janja", "country": "Tanzania", "entity_id": "Q66076925", "variants": ["Abdulaaziz Chande"]} +{"canonical": "Amani Gracious", "country": "Kenya", "entity_id": "Q66126615", "variants": ["Amani G"]} +{"canonical": "Miraboi", "country": "Nigeria", "entity_id": "Q66305342", "variants": ["Miracle Kelechi Chike"]} +{"canonical": "Enkay Ogboruche", "country": "Nigeria", "entity_id": "Q66685098", "variants": ["Enkay", "Nkiruka Gift Onuabuobi"]} +{"canonical": "Eugy", "country": "Ghana", "entity_id": "Q66693072", "variants": ["Eugene Entsir"]} +{"canonical": "Nkodo Sitony", "country": "Cameroon", "entity_id": "Q66736561", "variants": ["Nkodo Si Tobi François", "Si Tony", "Sitony"]} +{"canonical": "Friction", "country": "Ghana", "entity_id": "Q66764513", "variants": ["Musah Haruna"]} +{"canonical": "Lovemore Majaivana", "country": "Zimbabwe", "entity_id": "Q6692305", "variants": ["Lovemore Tshuma"]} +{"canonical": "Hamisa Mobetto", "country": "Tanzania", "entity_id": "Q67030827", "variants": ["Hamisa Hassan Mobetto"]} +{"canonical": "M.I Abaga", "country": "Nigeria", "entity_id": "Q6712192", "variants": ["Mr Incredible", "Jude Abaga", "Jude Lemfani Abaga", "Jude Lemifani Abaga", "M. I", "M.I"]} +{"canonical": "M.anifest", "country": "Ghana", "entity_id": "Q6713451", "variants": ["Kwame Ametepee Tsikata"]} +{"canonical": "Katlego Maboe", "country": "South Africa", "entity_id": "Q67180082", "variants": ["Katlego Moswane Maboe"]} +{"canonical": "Blaqbonez", "country": "Nigeria", "entity_id": "Q67222718", "variants": ["Mr. Boombastic", "Emeka Akumefule", "Emeka The Stallion"]} +{"canonical": "Martin Phike", "country": "South Africa", "entity_id": "Q6776373", "variants": ["Martin PK"]} +{"canonical": "May7ven", "country": "Nigeria", "entity_id": "Q6796228", "variants": ["May Odegbami"]} +{"canonical": "Mbongeni Ngema", "country": "South Africa", "entity_id": "Q6799750", "variants": ["Mbongheni Ngema"]} +{"canonical": "Ayanda Jiya", "country": "South Africa", "entity_id": "Q68163380", "variants": ["Sibongile Ayanda Sizwesiyanda Jiya"]} +{"canonical": "Msizi Shabalala", "country": "South Africa", "entity_id": "Q6930174", "variants": ["Msizi Innocent Shabalala"]} +{"canonical": "Mulugeta Abate", "country": "Ethiopia", "entity_id": "Q6935207", "variants": ["Roobaa Dhaabaa"]} +{"canonical": "Muna", "country": "Nigeria", "entity_id": "Q6935557", "variants": ["Munachi Abii", "Munachi Gail Teresa Abii Nwankwo"]} +{"canonical": "Dannyyo", "country": "Nigeria", "entity_id": "Q69509912", "variants": ["Dannyyo Of Naija"]} +{"canonical": "Naeto C", "country": "Nigeria", "entity_id": "Q6958125", "variants": ["Super C", "Naetochukwu Chikwe", "The 'P'"]} +{"canonical": "Nana Ama McBrown", "country": "Ghana", "entity_id": "Q6962267", "variants": ["Felicity Ama Agyemang"]} +{"canonical": "Nashil Pichen", "country": "Zambia", "entity_id": "Q6966853", "variants": ["Nashil Pichen Kazembe"]} +{"canonical": "Nataniël", "country": "South Africa", "entity_id": "Q6968395", "variants": ["Nataniel", "Nataniël le Roux"]} +{"canonical": "Doomams", "country": "Senegal", "entity_id": "Q7002140", "variants": ["Doumams"]} +{"canonical": "Joshua Mike-Bamiloye", "country": "Nigeria", "entity_id": "Q70094828", "variants": ["Jaymikee"]} +{"canonical": "Nico Carstens", "country": "South Africa", "entity_id": "Q7028768", "variants": ["Nicolaas Cornelius Carstens"]} +{"canonical": "Nonini", "country": "Kenya", "entity_id": "Q7049430", "variants": ["Hubert Nakitare"]} +{"canonical": "Obi Mhondera", "country": "Zimbabwe", "entity_id": "Q7074917", "variants": ["Obi Simbarashe Mhondera"]} +{"canonical": "Obiwon", "country": "Nigeria", "entity_id": "Q7074993", "variants": ["Obiora Nwokolobia-Agu"]} +{"canonical": "Oliver De Coque", "country": "Nigeria", "entity_id": "Q7087487", "variants": ["Oliver Sunday Akanite"]} +{"canonical": "Olugbenga Adelekan", "country": "Nigeria", "entity_id": "Q7088835", "variants": ["Olugbenga", "Gbenga Adelekan", "OLUGBENGA", "Olugbenga Ochieng Adelekan"]} +{"canonical": "Onyeka Onwenu", "country": "Nigeria", "entity_id": "Q7095172", "variants": ["Onyeka", "Elegant Stallion"]} +{"canonical": "Orlando Owoh", "country": "Nigeria", "entity_id": "Q7103150", "variants": ["Stephen Oladipupo Olaore Owomoyela"]} +{"canonical": "PJ Powers", "country": "South Africa", "entity_id": "Q7119483", "variants": ["P.J. Powers", "Penelope Jane Dunlop"]} +{"canonical": "Paul Job Kafeero", "country": "Uganda", "entity_id": "Q7155240", "variants": ["Golden boy of Africa", "Paulo Kafeero", "Paulo Kafero", "Prince Paulo Kafeero"]} +{"canonical": "J.R. Rotem", "country": "South Africa", "entity_id": "Q716053", "variants": ["Jonathan J.R. Rotem", "Jonathan Rotem"]} +{"canonical": "Louis Moholo", "country": "South Africa", "entity_id": "Q717159", "variants": ["Louis Tebogo Moholo"]} +{"canonical": "Philip Begho", "country": "Nigeria", "entity_id": "Q7183204", "variants": ["Philip"]} +{"canonical": "Philip Gbeho", "country": "Ghana", "entity_id": "Q7183599", "variants": ["Philip Comi Gbeho"]} +{"canonical": "Nonso Bassey", "country": "Nigeria", "entity_id": "Q72219440", "variants": ["Chukwunonso Anozuma Bassey Iwuchukwu"]} +{"canonical": "Portable Bodycode", "country": "South Africa", "entity_id": "Q7231332", "variants": ["Portable", "Alan Abrahams", "African Dubbs", "Bodycode"]} +{"canonical": "Priaulx Rainier", "country": "South Africa", "entity_id": "Q7242524", "variants": ["Ivy Priaulx Rainier"]} +{"canonical": "Kenna", "country": "Ethiopia", "entity_id": "Q724255", "variants": ["Kenna Zemedkun"]} +{"canonical": "Bongo", "country": "Nigeria", "entity_id": "Q72428521", "variants": ["BONGO ByTheWay", "Bongo the Drum GAHD", "Taktix", "Uforo \"Bongo\" Ebong", "Uforo Ebong", "Uforo Imeh Ebong"]} +{"canonical": "Princess Jully", "country": "Kenya", "entity_id": "Q7244658", "variants": ["Lilian Auma Aoka"]} +{"canonical": "Tems", "country": "Nigeria", "entity_id": "Q72759173", "variants": ["Temilade Openiyi"]} +{"canonical": "Ray C", "country": "Tanzania", "entity_id": "Q7297280", "variants": ["Rehema Chalamila"]} +{"canonical": "Rhian Benson", "country": "Ghana", "entity_id": "Q7320503", "variants": ["Rhiannon Afua Benson"]} +{"canonical": "Rhymson", "country": "Tanzania", "entity_id": "Q7321667", "variants": ["Ramadhani Mponjika"]} +{"canonical": "Robin Auld", "country": "South Africa", "entity_id": "Q7352226", "variants": ["Robin Morton Auld"]} +{"canonical": "Pie-Claude Ngumu", "country": "Cameroon", "entity_id": "Q73669301", "variants": ["Pie-Claude Ngoumou"]} +{"canonical": "Rose Mhando", "country": "Tanzania", "entity_id": "Q7367866", "variants": ["Rose Muhando"]} +{"canonical": "Reggie Rockstone", "country": "Ghana", "entity_id": "Q737403", "variants": ["Rockstone", "Reggie Ossei", "Reginald Yaw Asante Ossei"]} +{"canonical": "Ruggedman", "country": "Nigeria", "entity_id": "Q7378568", "variants": ["Ruggedy Baba", "Opomulero", "Michael Ugochukwu Stephens", "Mr Controversial"]} +{"canonical": "Russel Mthembu", "country": "South Africa", "entity_id": "Q7381283", "variants": ["Ndoda Russel Mthembu"]} +{"canonical": "Saba Saba", "country": "Uganda", "entity_id": "Q7395791", "variants": ["Alex Kirya", "Krazy Native"]} +{"canonical": "Samini", "country": "Ghana", "entity_id": "Q7409469", "variants": ["Emmanuel Andrews Sammini"]} +{"canonical": "Samsong", "country": "Nigeria", "entity_id": "Q7410419", "variants": ["Samson Uche Mogekwu"]} +{"canonical": "Sarkodie", "country": "Ghana", "entity_id": "Q7424230", "variants": ["Michael Owusu Addo", "Sarkodie Obidi"]} +{"canonical": "Sibongiseni Shabalala", "country": "South Africa", "entity_id": "Q7507255", "variants": ["Sibongiseni Lucas Shabalala"]} +{"canonical": "Sound Sultan", "country": "Nigeria", "entity_id": "Q7564718", "variants": ["Olanrewaju Abdul-Ganiu Fasasi", "Olanrewaju Fasasi"]} +{"canonical": "Stella Damasus", "country": "Nigeria", "entity_id": "Q7607054", "variants": ["Stella Aboderin", "Stella Damasus-Aboderin"]} +{"canonical": "Syd Kitchen", "country": "South Africa", "entity_id": "Q7659705", "variants": ["Sydney Stanley Kitchen"]} +{"canonical": "System Tazvida", "country": "Zimbabwe", "entity_id": "Q7663688", "variants": ["Funuel Nyasha Tazvida", "Funuel Tazvida"]} +{"canonical": "Dorrys Mutahunga", "country": "Uganda", "entity_id": "Q76854884", "variants": ["Dorys Mutahunga"]} +{"canonical": "Solomon Linda", "country": "South Africa", "entity_id": "Q775883", "variants": ["Solomon Popoli Linda"]} +{"canonical": "Thomas Rajna", "country": "South Africa", "entity_id": "Q7793393", "variants": ["Tamás Rajna"]} +{"canonical": "Timaya", "country": "Nigeria", "entity_id": "Q7804587", "variants": ["Don Dada", "Inetimi Timaya Odon"]} +{"canonical": "Timothy \"Ennovator\" Rimbui", "country": "Kenya", "entity_id": "Q7807016", "variants": ["Ennovator", "Tim Rimbui", "Timothy Rimbui"]} +{"canonical": "Tinny", "country": "Ghana", "entity_id": "Q7808395", "variants": ["Nii Addo Quaynor"]} +{"canonical": "Ndeye Fatou", "country": "Senegal", "entity_id": "Q7809980", "variants": ["Titi", "Ndèye Fatou Tine"]} +{"canonical": "Tiwa Savage", "country": "Nigeria", "entity_id": "Q7810465", "variants": ["Tiwa", "Tiwatope Savage-Balogun"]} +{"canonical": "Tongayi Chirisa", "country": "Zimbabwe", "entity_id": "Q7821058", "variants": ["Tongayi Arnold Chirisa"]} +{"canonical": "Tonto Dikeh", "country": "Nigeria", "entity_id": "Q7821713", "variants": ["Mama king", "Tonto Charity Dikeh"]} +{"canonical": "Tony Tetuila", "country": "Nigeria", "entity_id": "Q7823557", "variants": ["Anthony Olanrewaju Awotoye"]} +{"canonical": "Tope Alabi", "country": "Nigeria", "entity_id": "Q7824795", "variants": ["Agbo Jesu", "Ore ti o"]} +{"canonical": "Tumi Molekane", "country": "South Africa", "entity_id": "Q7852623", "variants": ["Tumi", "Boitumelo Molekane", "MC Fatboy", "Stogie T"]} +{"canonical": "Vector the Viper", "country": "Nigeria", "entity_id": "Q7917787", "variants": ["Vector", "Olanrewaju Ogunmefun", "Olanrewaju Ogunmefun David", "V. E. C", "Vector (music artiste)", "Vector tha viper"]} +{"canonical": "Victor Uwaifo", "country": "Nigeria", "entity_id": "Q7926410", "variants": ["The Guitar Boy", "Victor Efosa Uwaifo"]} +{"canonical": "Wande Coal", "country": "Nigeria", "entity_id": "Q7967172", "variants": ["Oluwatobi Wande Ojosipe"]} +{"canonical": "Warrick Sony", "country": "South Africa", "entity_id": "Q7970692", "variants": ["Warrick Swinney"]} +{"canonical": "Weird MC", "country": "Nigeria", "entity_id": "Q7980319", "variants": ["Idowu", "Shola Idowu", "The Rappatainer"]} +{"canonical": "William Onyeabor", "country": "Nigeria", "entity_id": "Q8016354", "variants": ["William Ezechukwu Onyeabor"]} +{"canonical": "Zigi", "country": "Ghana", "entity_id": "Q8071788", "variants": ["Kweku Sarpong Plahar"]} +{"canonical": "Zombo", "country": "South Africa", "entity_id": "Q8073797", "variants": ["Tebogo Ndlovu"]} +{"canonical": "Chinko Ekun", "country": "Nigeria", "entity_id": "Q81319598", "variants": ["Oladipo Olamide Emmanuel"]} +{"canonical": "Ali Jita", "country": "Nigeria", "entity_id": "Q81385983", "variants": ["Ali Isah Jibrin", "Mai jita"]} +{"canonical": "Pa Odiase", "country": "Nigeria", "entity_id": "Q816860", "variants": ["Benedict E. Odiase", "Benedict Elide Odiase", "Pa Benedict Odiase"]} +{"canonical": "Idahams", "country": "Nigeria", "entity_id": "Q81749851", "variants": ["Hart Idawarifagha Ishmael"]} +{"canonical": "Naira Marley", "country": "Nigeria", "entity_id": "Q81848231", "variants": ["Azeez Adershina Fashola", "Marlians", "Naira marley"]} +{"canonical": "Fireboy DML", "country": "Nigeria", "entity_id": "Q82759301", "variants": ["Adedamola Adefolahan"]} +{"canonical": "Vonenzo Baschello", "country": "South Africa", "entity_id": "Q83492370", "variants": ["Baschello", "Vaughn Vonenzo Baschello Cunningham", "Vaughn Wesley Cunningham", "Vonenzo"]} +{"canonical": "Moses Nsubuga", "country": "Uganda", "entity_id": "Q83612414", "variants": ["Supercharger"]} +{"canonical": "Patrice Wilson", "country": "Nigeria", "entity_id": "Q8401922", "variants": ["Pato", "Patrice Iteke Wilson"]} +{"canonical": "Bheki Mseleku", "country": "South Africa", "entity_id": "Q854935", "variants": ["Bhekumuzi Hyacinth Mseleku"]} +{"canonical": "Eben", "country": "Nigeria", "entity_id": "Q85758435", "variants": ["Emmanuel Benjamin"]} +{"canonical": "Joeboy", "country": "Nigeria", "entity_id": "Q85771346", "variants": ["Joseph Akinfenwa Donus"]} +{"canonical": "Lyta", "country": "Nigeria", "entity_id": "Q85946567", "variants": ["Opeyemi Babatunde Rahim"]} +{"canonical": "Hawa Mayoka Said", "country": "Tanzania", "entity_id": "Q85969631", "variants": ["Hawa Mayoka", "Hawa Ntarejea"]} +{"canonical": "Lava Lava", "country": "Tanzania", "entity_id": "Q85978300", "variants": ["Abdul Juma Idd"]} +{"canonical": "Howard Carpendale", "country": "South Africa", "entity_id": "Q86105", "variants": ["Howard Victor Carpendale", "Springbock"]} +{"canonical": "Jeffery Kenny", "country": "Nigeria", "entity_id": "Q86244200", "variants": ["Jimoh Augustus Kehinde"]} +{"canonical": "Indi-K", "country": "Zambia", "entity_id": "Q87177711", "variants": ["Kombe Monica Bikoko"]} +{"canonical": "Natasha Chansa", "country": "Zambia", "entity_id": "Q87177775", "variants": ["Princess Natasha Chansa"]} +{"canonical": "Master KG", "country": "South Africa", "entity_id": "Q87368609", "variants": ["Kgaogelo Moagi", "Kgaogelo Moagi (also known as Master KG)"]} +{"canonical": "Francicar", "country": "Zambia", "entity_id": "Q87648482", "variants": ["Francisca Magaret Msisha"]} +{"canonical": "Bomb$hell Grenade", "country": "Zambia", "entity_id": "Q88323377", "variants": ["Bwalya Sophie Chibesakunda"]} +{"canonical": "Ded Buddy", "country": "Ghana", "entity_id": "Q88463509", "variants": ["Eric Kwasi Okine Turkson"]} +{"canonical": "Malik Ofori", "country": "Ghana", "entity_id": "Q88922459", "variants": ["MO"]} +{"canonical": "Herbie Tsoaeli", "country": "South Africa", "entity_id": "Q89554764", "variants": ["Herbie Motlatsi Tsoaeli"]} +{"canonical": "Tanasha Donna", "country": "Kenya", "entity_id": "Q89559258", "variants": ["Tanasha"]} +{"canonical": "Kwaku Agyapong Danemah", "country": "Ghana", "entity_id": "Q90169997", "variants": ["Dr. Paa Bobo"]} +{"canonical": "Danny K", "country": "South Africa", "entity_id": "Q901829", "variants": ["Daniel Koppel", "Danny K.", "Danny Koppel"]} +{"canonical": "Marita Napier", "country": "South Africa", "entity_id": "Q9029227", "variants": ["Marita Jacobs"]} +{"canonical": "Rukky Offset", "country": "Nigeria", "entity_id": "Q91125101", "variants": ["Rukevwe"]} +{"canonical": "Ray Phiri", "country": "South Africa", "entity_id": "Q916743", "variants": ["Raymond Chikapa Enock Phiri"]} +{"canonical": "Paul Okoye", "country": "Nigeria", "entity_id": "Q91915280", "variants": ["Rudeboy"]} +{"canonical": "DJ Arafat", "country": "Ivory Coast", "entity_id": "Q935241", "variants": ["Ange Didier Houon"]} +{"canonical": "KG telvo", "country": "Tanzania", "entity_id": "Q94021365", "variants": ["tendo"]} +{"canonical": "D'banj", "country": "Nigeria", "entity_id": "Q944365", "variants": ["Kapella", "Bangalee", "Kokomaster"]} +{"canonical": "Barmani Choge", "country": "Nigeria", "entity_id": "Q94663306", "variants": ["Hajiya Sa'adatu Ahmad"]} +{"canonical": "Ami Faku", "country": "South Africa", "entity_id": "Q95578142", "variants": ["Amanda Nomqhutsu Faku"]} +{"canonical": "Elaine", "country": "South Africa", "entity_id": "Q95728291", "variants": ["Ndivhuwo Elaine Mukheli"]} +{"canonical": "YoungstaCPT", "country": "South Africa", "entity_id": "Q95839715", "variants": ["Riyadh Roberts"]} +{"canonical": "Kaptain Kush", "country": "Nigeria", "entity_id": "Q96107709", "variants": ["Lawrence Godwin Kingsley"]} +{"canonical": "Obaapa Christy", "country": "Ghana", "entity_id": "Q96240477", "variants": ["Christiana Love", "Christiana Twene"]} +{"canonical": "John Blaq", "country": "Uganda", "entity_id": "Q96270510", "variants": ["Kasadha John"]} +{"canonical": "Nana Tuffour", "country": "Ghana", "entity_id": "Q96311327", "variants": ["James Kwaku Tuffour"]} +{"canonical": "Holyfield Ola", "country": "Nigeria", "entity_id": "Q96359425", "variants": ["Skyboy"]} +{"canonical": "J. H. Kwabena Nketia", "country": "Ghana", "entity_id": "Q965420", "variants": ["Joseph H. Kwabena Nketia", "Joseph Hanson Kwabena Nketia", "Kwabena Nketia"]} +{"canonical": "Ceccy Twum", "country": "Ghana", "entity_id": "Q96943475", "variants": ["Ceccy Abena Ampratwum"]} +{"canonical": "Wally Seck", "country": "Senegal", "entity_id": "Q96945267", "variants": ["Wally Ballago Seck"]} +{"canonical": "Sadiq Zazzabi", "country": "Nigeria", "entity_id": "Q96985475", "variants": ["Sadiq Usman Saleh"]} +{"canonical": "Sha Sha", "country": "Zimbabwe", "entity_id": "Q97029562", "variants": ["Charmaine Shamiso Mapimbiro"]} +{"canonical": "Broda Shaggi", "country": "Nigeria", "entity_id": "Q97064578", "variants": ["Animashaun Samuel Perry"]} +{"canonical": "Jonas Gwangwa", "country": "South Africa", "entity_id": "Q971620", "variants": ["Jonas Mosa Gwangwa"]} +{"canonical": "Wambui Katee", "country": "Kenya", "entity_id": "Q97179737", "variants": ["Catherine Wangui Wambui"]} +{"canonical": "Foby", "country": "Tanzania", "entity_id": "Q97253840", "variants": ["Fobby"]} +{"canonical": "Mimi Mars", "country": "Tanzania", "entity_id": "Q97255544", "variants": ["Triple Threat", "Marianne Namshali Mdee"]} +{"canonical": "Speed Darlington", "country": "Nigeria", "entity_id": "Q97271529", "variants": ["Darlington Makaveli Okoye"]} +{"canonical": "Duc-Z", "country": "Cameroon", "entity_id": "Q97277937", "variants": ["Djoumessi Tsague Ulrich Coco"]} +{"canonical": "Marioo", "country": "Tanzania", "entity_id": "Q97487703", "variants": ["Omary Mwanga"]} +{"canonical": "Sir Elvis", "country": "Kenya", "entity_id": "Q97578544", "variants": ["Elvis Otiono", "Sir Elvis Otieno"]} +{"canonical": "Kokui Selormey Hanson", "country": "Ghana", "entity_id": "Q97671367", "variants": ["Kokui", "Kokui Selormey"]} +{"canonical": "Eddie Donkor", "country": "Ghana", "entity_id": "Q97929067", "variants": ["Edward Kofi Donkor"]} +{"canonical": "Zayn Africa", "country": "Nigeria", "entity_id": "Q97959357", "variants": ["Abdulmajid Aliyu", "Abdulmajid Aliyu Zubair"]} +{"canonical": "P2J", "country": "Nigeria", "entity_id": "Q98016557", "variants": ["Pro2jay", "Richard Olowaranti Mbu Isong"]} +{"canonical": "Cindy Thompson", "country": "Ghana", "entity_id": "Q98075718", "variants": ["Cindy Quainoo"]} +{"canonical": "E.K. Nyame", "country": "Ghana", "entity_id": "Q98113920", "variants": ["Emmanuel Kofi Nyame"]} +{"canonical": "King Sunny Adé", "country": "Nigeria", "entity_id": "Q982678", "variants": ["King Sunny Ade", "Chief Sunday Adeniyi Adegeye.", "Sunday Adeniyi"]} +{"canonical": "Femi Kuti", "country": "Nigeria", "entity_id": "Q982872", "variants": ["Olufela Olufemi Anikulapo Kuti"]} +{"canonical": "CKay", "country": "Nigeria", "entity_id": "Q98312451", "variants": ["Chukwuka Chukwuma Ekweani"]} +{"canonical": "Kwame Asare", "country": "Ghana", "entity_id": "Q98429901", "variants": ["Jacob Sam"]} +{"canonical": "Pinky Jay", "country": "Nigeria", "entity_id": "Q98455987", "variants": ["Ifeoma Juliet Okafor"]} +{"canonical": "Abdulhafiz Abdullahi", "country": "Nigeria", "entity_id": "Q98520147", "variants": ["Feezy"]} +{"canonical": "Ahmed Adam", "country": "Ghana", "entity_id": "Q98658486", "variants": ["Mr. Razak", "Mr.Razak"]} +{"canonical": "Nomcebo Zikode", "country": "South Africa", "entity_id": "Q98815370", "variants": ["Nomcebo Nothule Nkwanyana", "Nomcebo Nothule Zikode"]} +{"canonical": "Diarra Sylla", "country": "Senegal", "entity_id": "Q98825033", "variants": ["De-arra Sylla", "Mame Diarra"]} +{"canonical": "D Policy", "country": "Nigeria", "entity_id": "Q98925658", "variants": ["Simba", "Golden Boy", "DP", "Afrobeat Scientist", "D Vibe Monster", "Obakpolor Esemuede"]} +{"canonical": "Gabriel K", "country": "Uganda", "entity_id": "Q99197320", "variants": ["Gabriel Kakuru"]} +{"canonical": "Waheed Waliyulah", "country": "Nigeria", "entity_id": "Q99214018", "variants": ["Awal"]} +{"canonical": "Simmy", "country": "South Africa", "entity_id": "Q99237224", "variants": ["Simphiwe Nhlangulela"]} +{"canonical": "Laycon", "country": "Nigeria", "entity_id": "Q99673245", "variants": ["Olamilekan Massoud Al-Khalifah Agbeleshebioba", "Olamilekan Moshood Agbeleshe"]} +{"canonical": "Nabou", "country": "Ivory Coast", "entity_id": "Q99689051", "variants": ["Seynabou Diop"]} +{"canonical": "Ntsiki Mazwai", "country": "South Africa", "entity_id": "Q99842691", "variants": ["Ntsiki"]} +{"canonical": "Q32849", "country": "Senegal", "entity_id": "Q32849", "variants": ["A-Kon", "El Negreeto"]} +{"canonical": "Bébé Manga", "country": "Cameroon", "entity_id": "Q64494", "variants": ["Bebe Manga"]} +{"canonical": "Stevie Wonder", "country": "Ghana", "entity_id": "Q714", "variants": ["Stevland Hardaway Morris", "Stevland Hardaway Morris Judkins", "Stevland Judkins", "Stevland Morris"]} diff --git a/datasets/data/wikidata_name_pairs.jsonl b/datasets/data/wikidata_name_pairs.jsonl new file mode 100644 index 0000000..d52ace3 --- /dev/null +++ b/datasets/data/wikidata_name_pairs.jsonl @@ -0,0 +1,8156 @@ +{"country": "NG", "family": "Igwe", "given": "Amaechi"} +{"country": "NG", "family": "Yusuf", "given": "Fatima"} +{"country": "NG", "family": "Utondu", "given": "Beatrice"} +{"country": "NG", "family": "Opara", "given": "Charity"} +{"country": "NG", "family": "Afolabi", "given": "Olabisi"} +{"country": "NG", "family": "Mark", "given": "David"} +{"country": "NG", "family": "Babangida", "given": "Haruna"} +{"country": "NG", "family": "Buchi", "given": "Buchi"} +{"country": "NG", "family": "Atta", "given": "Sefi"} +{"country": "NG", "family": "Nnaji", "given": "Genevieve"} +{"country": "NG", "family": "Ukah", "given": "Ugo"} +{"country": "NG", "family": "Chukwunyelu", "given": "Eric"} +{"country": "NG", "family": "Chukwunyelu", "given": "Obinna"} +{"country": "NG", "family": "Okoronkwo", "given": "Solomon"} +{"country": "NG", "family": "Oliseh", "given": "Sekou"} +{"country": "NG", "family": "Balogun", "given": "Leon"} +{"country": "NG", "family": "Dede", "given": "Precious"} +{"country": "NG", "family": "Elias", "given": "Olawale"} +{"country": "NG", "family": "Babatunde", "given": "Babajide"} +{"country": "NG", "family": "Lamey", "given": "Michael"} +{"country": "NG", "family": "Wata", "given": "Eddy"} +{"country": "NG", "family": "Adewale", "given": "Gabriel"} +{"country": "NG", "family": "Okereke", "given": "Stephanie"} +{"country": "NG", "family": "Kubi", "given": "Grace"} +{"country": "NG", "family": "Okoye", "given": "Ebele"} +{"country": "NG", "family": "Mosaku", "given": "Wunmi"} +{"country": "NG", "family": "Mosaku", "given": "Oluwunmi"} +{"country": "NG", "family": "Mosaku", "given": "Olapeju"} +{"country": "NG", "family": "Ede", "given": "Chinedu"} +{"country": "NG", "family": "Adefope", "given": "Henry"} +{"country": "NG", "family": "Suswam", "given": "Peter"} +{"country": "NG", "family": "Apam", "given": "Onyekachi"} +{"country": "NG", "family": "Chima", "given": "Daniel"} +{"country": "NG", "family": "Umoren", "given": "Anselm"} +{"country": "NG", "family": "Aluko", "given": "Sone"} +{"country": "NG", "family": "Obinna", "given": "John"} +{"country": "NG", "family": "Obinna", "given": "Anthony"} +{"country": "NG", "family": "Obinna", "given": "Valentine"} +{"country": "NG", "family": "Ujah", "given": "Anthony"} +{"country": "NG", "family": "Kanu", "given": "Nwankwo"} +{"country": "NG", "family": "Okoro", "given": "Stanley"} +{"country": "NG", "family": "Bello", "given": "Muhammad"} +{"country": "NG", "family": "Okolo", "given": "Thaddeus"} +{"country": "NG", "family": "Okolo", "given": "Jude"} +{"country": "NG", "family": "Sheehan", "given": "Francis"} +{"country": "NG", "family": "Sheehan", "given": "Patrick"} +{"country": "NG", "family": "Arinze", "given": "Francis"} +{"country": "NG", "family": "Jonathan", "given": "Ebele"} +{"country": "NG", "family": "Jonathan", "given": "Goodluck"} +{"country": "NG", "family": "Fashola", "given": "Babatunde"} +{"country": "NG", "family": "Ekpo", "given": "Florence"} +{"country": "NG", "family": "Umoh", "given": "Florence"} +{"country": "NG", "family": "Igboananike", "given": "Kennedy"} +{"country": "NG", "family": "Okoro", "given": "Johannes"} +{"country": "NG", "family": "Omodiagbe", "given": "Darlington"} +{"country": "NG", "family": "Willoughby", "given": "Marvin"} +{"country": "NG", "family": "Okonkwo", "given": "Onyekachi"} +{"country": "NG", "family": "Okafor", "given": "Simon"} +{"country": "NG", "family": "Nwakaeme", "given": "Dickson"} +{"country": "NG", "family": "Ejiofor", "given": "Eric"} +{"country": "NG", "family": "Sodje", "given": "Efe"} +{"country": "NG", "family": "Christopher", "given": "Justice"} +{"country": "NG", "family": "Okoronkwo", "given": "Isaac"} +{"country": "NG", "family": "Utaka", "given": "John"} +{"country": "NG", "family": "Afolabi", "given": "Rabiu"} +{"country": "NG", "family": "Yobo", "given": "Joseph"} +{"country": "NG", "family": "Achebe", "given": "Albert"} +{"country": "NG", "family": "Adenuga", "given": "Joseph"} +{"country": "NG", "family": "Obi", "given": "John"} +{"country": "NG", "family": "Adedeji", "given": "Adebayo"} +{"country": "NG", "family": "Ayegbeni", "given": "Yakubu"} +{"country": "NG", "family": "Martins", "given": "Obafemi"} +{"country": "NG", "family": "Abacha", "given": "Sani"} +{"country": "NG", "family": "Taiwo", "given": "Taye"} +{"country": "NG", "family": "Uche", "given": "Kalu"} +{"country": "NG", "family": "Obinna", "given": "Victor"} +{"country": "NG", "family": "Oyelowo", "given": "David"} +{"country": "NG", "family": "Ujah", "given": "Innocent"} +{"country": "NG", "family": "Kuti", "given": "Funmilayo"} +{"country": "NG", "family": "Adichie", "given": "Ngozi"} +{"country": "NG", "family": "Adichie", "given": "Chimamanda"} +{"country": "NG", "family": "Ajunwa", "given": "Chioma"} +{"country": "NG", "family": "Okparaebo", "given": "Ezinne"} +{"country": "NG", "family": "Ijeh", "given": "Peter"} +{"country": "NG", "family": "Abubakar", "given": "Abd al-Salam"} +{"country": "NG", "family": "Akinradewo", "given": "Foluke"} +{"country": "NG", "family": "Lawal", "given": "Amina"} +{"country": "NG", "family": "Olajuwon", "given": "Hakeem"} +{"country": "NG", "family": "Okonjo", "given": "Ngozi"} +{"country": "NG", "family": "Iweala", "given": "Ngozi"} +{"country": "NG", "family": "Darego", "given": "Agbani"} +{"country": "NG", "family": "Uzoma", "given": "Eke"} +{"country": "NG", "family": "Egbuna", "given": "Nneka"} +{"country": "NG", "family": "Moses", "given": "Victor"} +{"country": "NG", "family": "Onuoha", "given": "Nedum"} +{"country": "NG", "family": "Etuhu", "given": "Dickson"} +{"country": "NG", "family": "Odemwingie", "given": "Peter"} +{"country": "NG", "family": "Anichebe", "given": "Victor"} +{"country": "NG", "family": "Babayaro", "given": "Celestine"} +{"country": "NG", "family": "Ameobi", "given": "Shola"} +{"country": "NG", "family": "Shittu", "given": "Danny"} +{"country": "NG", "family": "Okri", "given": "Ben"} +{"country": "NG", "family": "Ejiofor", "given": "Chiwetel"} +{"country": "NG", "family": "Yekini", "given": "Rashid"} +{"country": "NG", "family": "Edu", "given": "Maurice"} +{"country": "NG", "family": "Lamidi", "given": "Moses"} +{"country": "NG", "family": "Babangida", "given": "Ibrahim"} +{"country": "NG", "family": "Akintola", "given": "Samuel"} +{"country": "NG", "family": "Okigbo", "given": "Christopher"} +{"country": "NG", "family": "Osofisan", "given": "Femi"} +{"country": "NG", "family": "Okotie", "given": "Chris"} +{"country": "NG", "family": "Lawal", "given": "Raheem"} +{"country": "NG", "family": "Haruna", "given": "Lukman"} +{"country": "NG", "family": "Adeleye", "given": "Dele"} +{"country": "NG", "family": "Aliu", "given": "Akim"} +{"country": "NG", "family": "Nwaubani", "given": "Tricia"} +{"country": "NG", "family": "Nwaubani", "given": "Adaobi"} +{"country": "NG", "family": "Sanusi", "given": "Anthony"} +{"country": "NG", "family": "Olisadebe", "given": "Emmanuel"} +{"country": "NG", "family": "Buhari", "given": "Muhammadu"} +{"country": "NG", "family": "Umeh", "given": "Michael"} +{"country": "NG", "family": "Agu", "given": "Festus"} +{"country": "NG", "family": "Sunday", "given": "Stephen"} +{"country": "NG", "family": "Joshua", "given": "Temitope"} +{"country": "NG", "family": "Joshua", "given": "Balogun"} +{"country": "NG", "family": "Ojukwu", "given": "C."} +{"country": "NG", "family": "Bello", "given": "Ahmadu"} +{"country": "NG", "family": "Musa", "given": "Ahmed"} +{"country": "NG", "family": "Morton", "given": "Amaechi"} +{"country": "NG", "family": "Morton", "given": "Cristian"} +{"country": "NG", "family": "Ajayi", "given": "Samuel"} +{"country": "NG", "family": "Agbetu", "given": "Akeem"} +{"country": "NG", "family": "Euba", "given": "Akin"} +{"country": "NG", "family": "Akpomedah", "given": "Cyril"} +{"country": "NG", "family": "Jones", "given": "Keziah"} +{"country": "NG", "family": "Oliseh", "given": "Sunday"} +{"country": "NG", "family": "Chukwuemeka", "given": "Vivian"} +{"country": "NG", "family": "Ekezie", "given": "Ralph"} +{"country": "NG", "family": "Ekezie", "given": "Obinna"} +{"country": "NG", "family": "Emeghara", "given": "Innocent"} +{"country": "NG", "family": "Egharevba", "given": "Frank"} +{"country": "NG", "family": "Mathias", "given": "Emmanuel"} +{"country": "NG", "family": "Makinwa", "given": "Stephen"} +{"country": "NG", "family": "Akpoborie", "given": "Jonathan"} +{"country": "NG", "family": "Onaiyekan", "given": "John"} +{"country": "NG", "family": "Alli", "given": "Yusuf"} +{"country": "NG", "family": "Macaulay", "given": "Herbert"} +{"country": "NG", "family": "Egbunike", "given": "Innocent"} +{"country": "NG", "family": "Kalu", "given": "Orji"} +{"country": "NG", "family": "Ekpo", "given": "Emmanuel"} +{"country": "NG", "family": "Charles", "given": "Obi"} +{"country": "NG", "family": "Ukwuoma", "given": "Augustine"} +{"country": "NG", "family": "Godday", "given": "James"} +{"country": "NG", "family": "Brandt", "given": "Austen"} +{"country": "NG", "family": "Imeh", "given": "Benjamin"} +{"country": "NG", "family": "Udegbe", "given": "Robin"} +{"country": "NG", "family": "Uti", "given": "Sunday"} +{"country": "NG", "family": "Ajibola", "given": "Bola"} +{"country": "NG", "family": "Utaka", "given": "Peter"} +{"country": "NG", "family": "Ighalo", "given": "Odion"} +{"country": "NG", "family": "Promise", "given": "Isaac"} +{"country": "NG", "family": "Oyebanjo", "given": "Daniel"} +{"country": "NG", "family": "Imoh", "given": "Chidi"} +{"country": "NG", "family": "Adejuyigbe", "given": "Kunle"} +{"country": "NG", "family": "Gambari", "given": "Ibrahim"} +{"country": "NG", "family": "Adama", "given": "Modibo"} +{"country": "NG", "family": "Bada", "given": "Sunday"} +{"country": "NG", "family": "Udoh", "given": "Ekpe"} +{"country": "NG", "family": "Udoh", "given": "Friday"} +{"country": "NG", "family": "Udoh", "given": "http://www.wikidata.org/.well-known/genid/70b5d2bb8c7a1038131cc9f9efa3dc52"} +{"country": "NG", "family": "Onaga", "given": "Valentin"} +{"country": "NG", "family": "Umoh", "given": "Raymond"} +{"country": "NG", "family": "Umoh", "given": "Camillus"} +{"country": "NG", "family": "Nwaogu", "given": "Charles"} +{"country": "NG", "family": "Onyeama", "given": "Charles"} +{"country": "NG", "family": "Abani", "given": "Chris"} +{"country": "NG", "family": "Abani", "given": "Christopher"} +{"country": "NG", "family": "Okpala", "given": "Christian"} +{"country": "NG", "family": "Adebola", "given": "Dele"} +{"country": "NG", "family": "Iheanacho", "given": "Ifeoma"} +{"country": "NG", "family": "Ekandem", "given": "Dominic"} +{"country": "NG", "family": "Ekandem", "given": "Ignatius"} +{"country": "NG", "family": "Agu", "given": "Donald"} +{"country": "NG", "family": "Akinsanya", "given": "Dotun"} +{"country": "NG", "family": "Akinwande", "given": "Henry"} +{"country": "NG", "family": "Nwachukwu", "given": "Tony"} +{"country": "NG", "family": "Edicha", "given": "Abel"} +{"country": "NG", "family": "Edicha", "given": "Ocholi"} +{"country": "NG", "family": "Anatsui", "given": "El"} +{"country": "NG", "family": "Iweala", "given": "Uzodinma"} +{"country": "NG", "family": "Opara", "given": "Emeka"} +{"country": "NG", "family": "Hare", "given": "John"} +{"country": "NG", "family": "Hare", "given": "Neville"} +{"country": "NG", "family": "Yusuf", "given": "Muhammad"} +{"country": "NG", "family": "Allen", "given": "Tony"} +{"country": "NG", "family": "Udoka", "given": "Ime"} +{"country": "NG", "family": "Dangote", "given": "Aliko"} +{"country": "NG", "family": "Azeez", "given": "Fatima"} +{"country": "NG", "family": "Azeez", "given": "Titilayo"} +{"country": "NG", "family": "Monye", "given": "Jude"} +{"country": "NG", "family": "Hussaini", "given": "Safiya"} +{"country": "NG", "family": "Ifraimu", "given": "Jinkan"} +{"country": "NG", "family": "Ihemelu", "given": "Ugo"} +{"country": "NG", "family": "Dike", "given": "Paul"} +{"country": "NG", "family": "Balogun", "given": "Bola"} +{"country": "NG", "family": "Olagunju", "given": "David"} +{"country": "NG", "family": "Kadiri", "given": "Alex"} +{"country": "NG", "family": "Agbaje", "given": "Anike"} +{"country": "NG", "family": "Bode", "given": "Bode"} +{"country": "NG", "family": "Clement", "given": "Clement"} +{"country": "NG", "family": "Nwankwo", "given": "Christopher"} +{"country": "NG", "family": "Bello", "given": "Faruk"} +{"country": "NG", "family": "Garba", "given": "Haruna"} +{"country": "NG", "family": "Abubakar", "given": "Haruna"} +{"country": "NG", "family": "Omisore", "given": "Iyiola"} +{"country": "NG", "family": "Kolawole", "given": "James"} +{"country": "NG", "family": "Wood", "given": "Molara"} +{"country": "NG", "family": "Ismail", "given": "Mustapha"} +{"country": "NG", "family": "Ofeimun", "given": "Odia"} +{"country": "NG", "family": "Adedotun", "given": "Phillip"} +{"country": "NG", "family": "Ògúndèjì", "given": "Phillip"} +{"country": "NG", "family": "Adedeji", "given": "Remi"} +{"country": "NG", "family": "Onuegbu", "given": "Kingsley"} +{"country": "NG", "family": "Campbell", "given": "Folarin"} +{"country": "NG", "family": "Nwachukwu", "given": "Fortunatus"} +{"country": "NG", "family": "Ordęga", "given": "Francisca"} +{"country": "NG", "family": "Ugonna", "given": "Frederick"} +{"country": "NG", "family": "Clark", "given": "John"} +{"country": "NG", "family": "Agu", "given": "Gabriel"} +{"country": "NG", "family": "Okara", "given": "Gabriel"} +{"country": "NG", "family": "Oluokun", "given": "Gbenga"} +{"country": "NG", "family": "Dodo", "given": "George"} +{"country": "NG", "family": "Abiola", "given": "Olawale"} +{"country": "NG", "family": "Ofoegbu", "given": "Gloria"} +{"country": "NG", "family": "Gabriel", "given": "Grace"} +{"country": "NG", "family": "Ofodile", "given": "Grace"} +{"country": "NG", "family": "Okpaleke", "given": "Peter"} +{"country": "NG", "family": "Abiola", "given": "Hafsat"} +{"country": "NG", "family": "Zenke", "given": "Simon"} +{"country": "NG", "family": "Abubakar", "given": "Muhammad"} +{"country": "NG", "family": "Anagonye", "given": "Aloysius"} +{"country": "NG", "family": "Fagbemi", "given": "Olaoluwa"} +{"country": "NG", "family": "Fagbemi", "given": "Ebenezar"} +{"country": "NG", "family": "Abbey", "given": "George"} +{"country": "NG", "family": "Udoh", "given": "Kingsley"} +{"country": "NG", "family": "Adamu", "given": "Ibrahim"} +{"country": "NG", "family": "Kaigama", "given": "Ignatius"} +{"country": "NG", "family": "Kaigama", "given": "Ayau"} +{"country": "NG", "family": "Nwosu", "given": "Julius"} +{"country": "NG", "family": "Egharevba", "given": "Jakob"} +{"country": "NG", "family": "Egharevba", "given": "Jacob"} +{"country": "NG", "family": "Daman", "given": "James"} +{"country": "NG", "family": "Rotimi", "given": "Ola"} +{"country": "NG", "family": "Moore", "given": "John"} +{"country": "NG", "family": "Togo", "given": "John"} +{"country": "NG", "family": "Abah", "given": "Joseph"} +{"country": "NG", "family": "Abah", "given": "Enejoh"} +{"country": "NG", "family": "Adefarasin", "given": "Joseph"} +{"country": "NG", "family": "Babalola", "given": "Joseph"} +{"country": "NG", "family": "Olumide", "given": "Joseph"} +{"country": "NG", "family": "Torunarigha", "given": "Junior"} +{"country": "NG", "family": "Olorunsola", "given": "Obiageli"} +{"country": "NG", "family": "Akinsanya", "given": "Kayode"} +{"country": "NG", "family": "Azubuike", "given": "Kelenna"} +{"country": "NG", "family": "Adeleke", "given": "Kenny"} +{"country": "NG", "family": "Braimoh", "given": "Maria"} +{"country": "NG", "family": "Braimoh", "given": "Hajara"} +{"country": "NG", "family": "Akinola", "given": "Peter"} +{"country": "NG", "family": "Omotoso", "given": "Kolë"} +{"country": "NG", "family": "Fortune", "given": "Udo"} +{"country": "NG", "family": "Ekpo", "given": "Margaret"} +{"country": "NG", "family": "Usman", "given": "Mariam"} +{"country": "NG", "family": "Gideon", "given": "Mary"} +{"country": "NG", "family": "King", "given": "Tunde"} +{"country": "NG", "family": "Anyanwu", "given": "Christina"} +{"country": "NG", "family": "Adamu", "given": "Semira"} +{"country": "NG", "family": "Nkwocha", "given": "Perpetua"} +{"country": "NG", "family": "Okoh", "given": "Nicholas"} +{"country": "NG", "family": "Yobo", "given": "Albert"} +{"country": "NG", "family": "Torunarigha", "given": "Ojokojo"} +{"country": "NG", "family": "Dominic", "given": "Rita"} +{"country": "NG", "family": "Abayomi", "given": "Oyinkansola"} +{"country": "NG", "family": "Amata", "given": "Doreen"} +{"country": "NG", "family": "Scott", "given": "Jimmy"} +{"country": "NG", "family": "Godwin", "given": "Samson"} +{"country": "NG", "family": "Ambrose", "given": "Efe"} +{"country": "NG", "family": "Okafor", "given": "Uche"} +{"country": "NG", "family": "Oliseh", "given": "Azubuike"} +{"country": "NG", "family": "Abdul Raheem", "given": "Abdul Raheem"} +{"country": "NG", "family": "Emenike", "given": "Alex"} +{"country": "NG", "family": "Akindele", "given": "Deji"} +{"country": "NG", "family": "Negedu", "given": "Charles"} +{"country": "NG", "family": "Douglas", "given": "Sokari"} +{"country": "NG", "family": "Camp", "given": "Sokari"} +{"country": "NG", "family": "Iroha", "given": "Benedict"} +{"country": "NG", "family": "Okonkwo", "given": "Chibuzor"} +{"country": "NG", "family": "Mamza", "given": "Stephen"} +{"country": "NG", "family": "Mamza", "given": "Dami"} +{"country": "NG", "family": "Ideh", "given": "Susan"} +{"country": "NG", "family": "Ideh", "given": "Funaya"} +{"country": "NG", "family": "Adi", "given": "Fanendo"} +{"country": "NG", "family": "Emenalo", "given": "Michael"} +{"country": "NG", "family": "Kanu", "given": "Christopher"} +{"country": "NG", "family": "Bala", "given": "Ezekiel"} +{"country": "NG", "family": "Nwoko", "given": "Udo"} +{"country": "NG", "family": "Babatunde", "given": "Michel"} +{"country": "NG", "family": "Okeke", "given": "Valerian"} +{"country": "NG", "family": "Siasia", "given": "Samson"} +{"country": "NG", "family": "Adams", "given": "Mozes"} +{"country": "NG", "family": "MacGregor", "given": "William"} +{"country": "NG", "family": "Adamu", "given": "Yakubu"} +{"country": "NG", "family": "Sola", "given": "Steven"} +{"country": "NG", "family": "Yahaya", "given": "Yahaya"} +{"country": "NG", "family": "Awojobi", "given": "Ayodele"} +{"country": "NG", "family": "Babalola", "given": "Solomon"} +{"country": "NG", "family": "Karibi-Whyte", "given": "Adolphus"} +{"country": "NG", "family": "Bassey", "given": "Anthony"} +{"country": "NG", "family": "Adebayo", "given": "Toyin"} +{"country": "NG", "family": "Adebayo", "given": "Olamide"} +{"country": "NG", "family": "Okuonghae", "given": "Greg"} +{"country": "NG", "family": "Orobosa", "given": "Greg"} +{"country": "NG", "family": "Tunde", "given": "Agarawu"} +{"country": "NG", "family": "Benjamin", "given": "Francis"} +{"country": "NG", "family": "Ogwumike", "given": "Joy"} +{"country": "NG", "family": "Ogwumike", "given": "Chiney"} +{"country": "NG", "family": "Aniebo", "given": "Augustine"} +{"country": "NG", "family": "Oboh", "given": "Solomon"} +{"country": "NG", "family": "Mbakwe", "given": "Trevor"} +{"country": "NG", "family": "Okoye", "given": "Stan"} +{"country": "NG", "family": "Malu", "given": "Victor"} +{"country": "NG", "family": "Kanu", "given": "Ndidi"} +{"country": "NG", "family": "Jonathan", "given": "Alaba"} +{"country": "NG", "family": "Davies", "given": "H."} +{"country": "NG", "family": "Gollan", "given": "Henry"} +{"country": "NG", "family": "Hammer", "given": "Ruby"} +{"country": "NG", "family": "Tugwell", "given": "Herbert"} +{"country": "NG", "family": "Chiejine", "given": "Stephanie"} +{"country": "NG", "family": "Chiejine", "given": "Ifeanyichukwu"} +{"country": "NG", "family": "Fagg", "given": "William"} +{"country": "NG", "family": "Fagg", "given": "Buller"} +{"country": "NG", "family": "Igwe", "given": "Kelvin"} +{"country": "NG", "family": "Onwurah", "given": "Ngozi"} +{"country": "NG", "family": "Nwosu", "given": "Humphrey"} +{"country": "NG", "family": "Odita", "given": "Odili"} +{"country": "NG", "family": "Edo", "given": "Ini"} +{"country": "NG", "family": "Iheanacho", "given": "Kelechi"} +{"country": "NG", "family": "Okeke", "given": "Francisca"} +{"country": "NG", "family": "Johnson", "given": "Ginger"} +{"country": "NG", "family": "Adesokan", "given": "Dorcas"} +{"country": "NG", "family": "Adesokan", "given": "Ajoke"} +{"country": "NG", "family": "Atolagbe", "given": "Tosin"} +{"country": "NG", "family": "Damilola", "given": "Tosin"} +{"country": "NG", "family": "Pascal", "given": "Patrick"} +{"country": "NG", "family": "Troost-Ekong", "given": "William"} +{"country": "NG", "family": "Simon", "given": "Moses"} +{"country": "NG", "family": "Shehu", "given": "Abdullah"} +{"country": "NG", "family": "Shehu", "given": "Abdullahi"} +{"country": "NG", "family": "Huo", "given": "Brian"} +{"country": "NG", "family": "Dawodu", "given": "Segun"} +{"country": "NG", "family": "Afolayan", "given": "Kunle"} +{"country": "NG", "family": "Siddiqi", "given": "Kamal"} +{"country": "NG", "family": "Taiwo", "given": "Cornelius"} +{"country": "NG", "family": "Esiri", "given": "Justus"} +{"country": "NG", "family": "Onaolapo", "given": "Joy"} +{"country": "NG", "family": "Hutton", "given": "Rosemary"} +{"country": "NG", "family": "Howe", "given": "Gerard"} +{"country": "NG", "family": "Adenuga", "given": "Mike"} +{"country": "NG", "family": "Banjo", "given": "Victor"} +{"country": "NG", "family": "Hughes", "given": "Brewster"} +{"country": "NG", "family": "Johnson", "given": "Obadiah"} +{"country": "NG", "family": "Marshall", "given": "James"} +{"country": "NG", "family": "King", "given": "Peter"} +{"country": "NG", "family": "Umaru", "given": "Sylvester"} +{"country": "NG", "family": "Onu", "given": "Sylvester"} +{"country": "NG", "family": "Ajakaiye", "given": "Deborah"} +{"country": "NG", "family": "Mbadiwe", "given": "Eddie"} +{"country": "NG", "family": "Dele", "given": "Dele"} +{"country": "NG", "family": "Dele", "given": "Jonathan"} +{"country": "NG", "family": "Abdullahi", "given": "Nana"} +{"country": "NG", "family": "Amoo", "given": "Ray"} +{"country": "NG", "family": "Adeniyi", "given": "James"} +{"country": "NG", "family": "Bare", "given": "Karim"} +{"country": "NG", "family": "Abang", "given": "Mercy"} +{"country": "NG", "family": "Lopez", "given": "Alex"} +{"country": "NG", "family": "Adesokan", "given": "Yakubu"} +{"country": "NG", "family": "Attaochu", "given": "Jeremiah"} +{"country": "NG", "family": "Agholor", "given": "Nelson"} +{"country": "NG", "family": "Ayoola", "given": "Adebisi"} +{"country": "NG", "family": "Peters", "given": "Clarence"} +{"country": "NG", "family": "Omotoso", "given": "Tim"} +{"country": "NG", "family": "Hajian", "given": "Shagaya"} +{"country": "NG", "family": "Okafor", "given": "John"} +{"country": "NG", "family": "Silva", "given": "Joke"} +{"country": "NG", "family": "Norfolk", "given": "Simon"} +{"country": "NG", "family": "Bello", "given": "Michelle"} +{"country": "NG", "family": "Benjamin", "given": "Joseph"} +{"country": "NG", "family": "Una", "given": "Fifi"} +{"country": "NG", "family": "Mbuk", "given": "Iyanya"} +{"country": "NG", "family": "Mbuk", "given": "Onoyom"} +{"country": "NG", "family": "Laoye", "given": "Nikki"} +{"country": "NG", "family": "Adegbite", "given": "Damilola"} +{"country": "NG", "family": "Edwards", "given": "Frank"} +{"country": "NG", "family": "Ansah", "given": "Aziz"} +{"country": "NG", "family": "Ogunbiyi", "given": "Babajide"} +{"country": "NG", "family": "Osotimehin", "given": "Babatunde"} +{"country": "NG", "family": "Gbadamosi", "given": "Bakare"} +{"country": "NG", "family": "Yakubu", "given": "Rahma"} +{"country": "NG", "family": "Yakubu", "given": "Balaraba"} +{"country": "NG", "family": "Muhammad", "given": "Basheer"} +{"country": "NG", "family": "Akinlolú", "given": "Olusegun"} +{"country": "NG", "family": "Umeh", "given": "Becky"} +{"country": "NG", "family": "Adekunle", "given": "Benjamin"} +{"country": "NG", "family": "Dudley", "given": "Billy"} +{"country": "NG", "family": "Johnson", "given": "Billy"} +{"country": "NG", "family": "Alimi", "given": "Bişi"} +{"country": "NG", "family": "Oborududu", "given": "Blessing"} +{"country": "NG", "family": "Benson", "given": "Bobby"} +{"country": "NG", "family": "George", "given": "Bode"} +{"country": "NG", "family": "Thomas", "given": "Bode"} +{"country": "NG", "family": "Aluko", "given": "Bolaji"} +{"country": "NG", "family": "Akinyemi", "given": "Bolaji"} +{"country": "NG", "family": "Ebi", "given": "Onome"} +{"country": "NG", "family": "Kalu", "given": "Rebecca"} +{"country": "NG", "family": "Shekoni", "given": "Maria"} +{"country": "NG", "family": "Shekoni", "given": "Kayo"} +{"country": "NG", "family": "Dike", "given": "Chinedu"} +{"country": "NG", "family": "Sodje", "given": "Bright"} +{"country": "NG", "family": "Uwak", "given": "Cynthia"} +{"country": "NG", "family": "Saraki", "given": "Abubakar"} +{"country": "NG", "family": "Saraki", "given": "Bukola"} +{"country": "NG", "family": "Christopher", "given": "C."} +{"country": "NG", "family": "Brown", "given": "Carlton"} +{"country": "NG", "family": "Acholonu", "given": "Catherine"} +{"country": "NG", "family": "Acholonu", "given": "Obianuju"} +{"country": "NG", "family": "Patterson", "given": "Cecil"} +{"country": "NG", "family": "Phillips", "given": "Charles"} +{"country": "NG", "family": "Ike", "given": "Chika"} +{"country": "NG", "family": "Eboe-Osuji", "given": "Chile"} +{"country": "NG", "family": "Alli", "given": "Chris"} +{"country": "NG", "family": "Okoh", "given": "Chris"} +{"country": "NG", "family": "Okoye", "given": "Christian"} +{"country": "NG", "family": "Dodwell", "given": "Christina"} +{"country": "NG", "family": "Akala", "given": "Christopher"} +{"country": "NG", "family": "Kolade", "given": "Christopher"} +{"country": "NG", "family": "Rotimi", "given": "Christopher"} +{"country": "NG", "family": "Williams", "given": "Christopher"} +{"country": "NG", "family": "Essien-Igbokwe", "given": "Christy"} +{"country": "NG", "family": "Todd", "given": "Clark"} +{"country": "NG", "family": "Bissong", "given": "Clement"} +{"country": "NG", "family": "Asuquo", "given": "Cobham"} +{"country": "NG", "family": "Udoh", "given": "Colin"} +{"country": "NG", "family": "Panther", "given": "Cyril"} +{"country": "NG", "family": "Tijani", "given": "Abass"} +{"country": "NG", "family": "Mohammed", "given": "Dahiru"} +{"country": "NG", "family": "Archibong", "given": "Dan"} +{"country": "NG", "family": "Suleiman", "given": "Dan"} +{"country": "NG", "family": "Okonkwo", "given": "Daniel"} +{"country": "NG", "family": "Nwoko", "given": "Demas"} +{"country": "NG", "family": "Williams", "given": "Denis"} +{"country": "NG", "family": "Edun", "given": "Adenrele Oluwafemi Edun"} +{"country": "NG", "family": "Elliott", "given": "Desmond"} +{"country": "NG", "family": "Eze", "given": "Dino"} +{"country": "NG", "family": "Unachukwu", "given": "Dolly"} +{"country": "NG", "family": "Igwebuike", "given": "Donald"} +{"country": "NG", "family": "Jacob", "given": "Doris"} +{"country": "NG", "family": "Obi", "given": "Ebuka"} +{"country": "NG", "family": "Uchendu", "given": "Ebuka"} +{"country": "NG", "family": "Amana", "given": "Edet"} +{"country": "NG", "family": "Okeke", "given": "Edward"} +{"country": "NG", "family": "Polo", "given": "Edward"} +{"country": "NG", "family": "Barber", "given": "Edward"} +{"country": "NG", "family": "Weng", "given": "Edward"} +{"country": "NG", "family": "Adekogbe", "given": "Elizabeth"} +{"country": "NG", "family": "John", "given": "Emilio"} +{"country": "NG", "family": "Ayoola", "given": "Emmanuel"} +{"country": "NG", "family": "Emmanuel", "given": "Emmanuel"} +{"country": "NG", "family": "Nnadozie", "given": "Emmanuel"} +{"country": "NG", "family": "Ukaegbu", "given": "Emmanuel"} +{"country": "NG", "family": "Njoku", "given": "Eni"} +{"country": "NG", "family": "Enyinnaya", "given": "Harcourt"} +{"country": "NG", "family": "Obuh", "given": "Eric"} +{"country": "NG", "family": "Attah", "given": "Ernest"} +{"country": "NG", "family": "Emenyonu", "given": "Ernest"} +{"country": "NG", "family": "Ojukwu", "given": "Ernest"} +{"country": "NG", "family": "Simon", "given": "Ernest"} +{"country": "NG", "family": "Iyiazu", "given": "Eucharia"} +{"country": "NG", "family": "Mohammed", "given": "Muhammad"} +{"country": "NG", "family": "Mohammed", "given": "Mustapha"} +{"country": "NG", "family": "Liman", "given": "Muhammad"} +{"country": "NG", "family": "Majekodunmi", "given": "Moses"} +{"country": "NG", "family": "Pate", "given": "Muhammad"} +{"country": "NG", "family": "Pate", "given": "Ali"} +{"country": "NG", "family": "Muhammadu", "given": "Junaid"} +{"country": "NG", "family": "Bello", "given": "Mustafa"} +{"country": "NG", "family": "Mostyn", "given": "Nicholas"} +{"country": "NG", "family": "Nicholas", "given": "Nicholas"} +{"country": "NG", "family": "Tobi", "given": "Niki"} +{"country": "NG", "family": "Etim", "given": "Nese"} +{"country": "NG", "family": "Anosike", "given": "O."} +{"country": "NG", "family": "Egbuna", "given": "Obi"} +{"country": "NG", "family": "Okwelume", "given": "Charles"} +{"country": "NG", "family": "Okwelume", "given": "Obinna"} +{"country": "NG", "family": "Obo", "given": "Aba"} +{"country": "NG", "family": "Afolabi", "given": "Oladapo"} +{"country": "NG", "family": "Adénọ́wọ̀", "given": "Olajumoke"} +{"country": "NG", "family": "Kayode", "given": "Olarenwaju"} +{"country": "NG", "family": "Adeola", "given": "Olatunji"} +{"country": "NG", "family": "Oliver", "given": "Oliver"} +{"country": "NG", "family": "Mobisson", "given": "Oliver"} +{"country": "NG", "family": "Jacobs", "given": "Olu"} +{"country": "NG", "family": "Adelekan", "given": "Olugbenga"} +{"country": "NG", "family": "Olopade", "given": "Funmi"} +{"country": "NG", "family": "Tinubu", "given": "Oluremi"} +{"country": "NG", "family": "Osoba", "given": "Olusegun"} +{"country": "NG", "family": "Omotosho", "given": "Omolara"} +{"country": "NG", "family": "Sodje", "given": "Onome"} +{"country": "NG", "family": "Onwenu", "given": "Onyeka"} +{"country": "NG", "family": "Martins", "given": "Orlando"} +{"country": "NG", "family": "Owoh", "given": "Orlando"} +{"country": "NG", "family": "Onyema", "given": "Oscar"} +{"country": "NG", "family": "Iheme", "given": "Osita"} +{"country": "NG", "family": "Salihu", "given": "Salihu"} +{"country": "NG", "family": "Nduka", "given": "Otonti"} +{"country": "NG", "family": "Adejobi", "given": "Oyin"} +{"country": "NG", "family": "Jonathan", "given": "Patience"} +{"country": "NG", "family": "Chukwurah", "given": "Patrick"} +{"country": "NG", "family": "Ọlálérè", "given": "Patrick"} +{"country": "NG", "family": "Sunday", "given": "Patrick"} +{"country": "NG", "family": "Hamilton", "given": "Paul"} +{"country": "NG", "family": "Golding", "given": "Lois"} +{"country": "NG", "family": "Golding", "given": "Peaches"} +{"country": "NG", "family": "Girouard", "given": "Percy"} +{"country": "NG", "family": "Edochie", "given": "Pete"} +{"country": "NG", "family": "Egharevba", "given": "Peter"} +{"country": "NG", "family": "Gideon", "given": "Peter"} +{"country": "NG", "family": "Begho", "given": "Philip"} +{"country": "NG", "family": "Okigbo", "given": "Pius"} +{"country": "NG", "family": "Ramrakha", "given": "Priya"} +{"country": "NG", "family": "Aruna", "given": "Quadri"} +{"country": "NG", "family": "Amarikwa", "given": "Quincy"} +{"country": "NG", "family": "Choudhury", "given": "Raja"} +{"country": "NG", "family": "Njoku", "given": "Raymond"} +{"country": "NG", "family": "Regina", "given": "Regina"} +{"country": "NG", "family": "George", "given": "Regina"} +{"country": "NG", "family": "Kabaka", "given": "Remi"} +{"country": "NG", "family": "Abati", "given": "Reuben"} +{"country": "NG", "family": "Lawson", "given": "Rex"} +{"country": "NG", "family": "Akínjídé", "given": "Richard"} +{"country": "NG", "family": "Famuyiwa", "given": "Rick"} +{"country": "NG", "family": "Rilwan", "given": "Lukman"} +{"country": "NG", "family": "Akpan", "given": "Rita"} +{"country": "NG", "family": "McCullum", "given": "Robert"} +{"country": "NG", "family": "Smith", "given": "Robert"} +{"country": "NG", "family": "Ahmed", "given": "Ruqayyah"} +{"country": "NG", "family": "Umeh", "given": "Sabina"} +{"country": "NG", "family": "Adeniran", "given": "Sade"} +{"country": "NG", "family": "Sagna", "given": "Saeid"} +{"country": "NG", "family": "Nwafor", "given": "Obinna"} +{"country": "NG", "family": "Agba", "given": "Samuel"} +{"country": "NG", "family": "Bassey", "given": "Samuel"} +{"country": "NG", "family": "Bill", "given": "Samuel"} +{"country": "NG", "family": "Edem", "given": "Samuel"} +{"country": "NG", "family": "Fawehinmi", "given": "Samuel"} +{"country": "NG", "family": "Pearse", "given": "Samuel"} +{"country": "NG", "family": "Otedola", "given": "Florence"} +{"country": "NG", "family": "Morgan", "given": "Cynthia"} +{"country": "NG", "family": "Umezulike", "given": "Innocent"} +{"country": "NG", "family": "Ojo", "given": "Ronke"} +{"country": "NG", "family": "Udoh", "given": "Luis"} +{"country": "NG", "family": "Udoh", "given": "Louis"} +{"country": "NG", "family": "Adebowale", "given": "Bayo"} +{"country": "NG", "family": "Aníṣulówó", "given": "Victoria"} +{"country": "NG", "family": "Ibanga", "given": "Esther"} +{"country": "NG", "family": "Njoku", "given": "Ugo"} +{"country": "NG", "family": "Nnodim", "given": "Sarah"} +{"country": "NG", "family": "Steven", "given": "Gabriel"} +{"country": "NG", "family": "Macaulay", "given": "Victoria"} +{"country": "NG", "family": "Mabogunje", "given": "Akin"} +{"country": "NG", "family": "Elijah", "given": "Samuel"} +{"country": "NG", "family": "Maduagwu", "given": "Emmanuel"} +{"country": "NG", "family": "Ezike", "given": "Chris"} +{"country": "NG", "family": "Babatunde", "given": "Gabriel"} +{"country": "NG", "family": "Jakeway", "given": "Derek"} +{"country": "NG", "family": "Oyenuga", "given": "Victor"} +{"country": "NG", "family": "Eze", "given": "Uche"} +{"country": "NG", "family": "Ajomale", "given": "Henry"} +{"country": "NG", "family": "Williams", "given": "James"} +{"country": "NG", "family": "Okonkwo", "given": "Kingsley"} +{"country": "NG", "family": "Bello", "given": "Korede"} +{"country": "NG", "family": "Bello", "given": "Ty"} +{"country": "NG", "family": "Williams", "given": "Elizabeth"} +{"country": "NG", "family": "Anunobi", "given": "Eucharia"} +{"country": "NG", "family": "John", "given": "Elnathan"} +{"country": "NG", "family": "Nweke", "given": "Collins"} +{"country": "NG", "family": "Akinboboye", "given": "Ola"} +{"country": "NG", "family": "Adegbola", "given": "Tunde"} +{"country": "NG", "family": "Adebowale", "given": "Joseph"} +{"country": "NG", "family": "Margaret", "given": "Lola"} +{"country": "NG", "family": "Ovie", "given": "Jim"} +{"country": "NG", "family": "George", "given": "Shan"} +{"country": "NG", "family": "Guite", "given": "Malcolm"} +{"country": "NG", "family": "Adefuye", "given": "Adebowale"} +{"country": "NG", "family": "Barber", "given": "Abayomi"} +{"country": "NG", "family": "Dennis", "given": "Ferdinand"} +{"country": "NG", "family": "Awoniyi", "given": "Taiwo"} +{"country": "NG", "family": "Balogun", "given": "Mahmoud"} +{"country": "NG", "family": "Nwohe Macaulay", "given": "Annie"} +{"country": "NG", "family": "Lindley", "given": "Lindsay"} +{"country": "NG", "family": "Okafor", "given": "Happiness"} +{"country": "NG", "family": "Marcus", "given": "Rosemary"} +{"country": "NG", "family": "Onwumere", "given": "Ngozi"} +{"country": "NG", "family": "Jegede", "given": "Emmanuel"} +{"country": "NG", "family": "Olowu", "given": "Elizabeth"} +{"country": "NG", "family": "Ibrahim", "given": "Blessing"} +{"country": "NG", "family": "Amusan", "given": "Tobi"} +{"country": "NG", "family": "Amusan", "given": "Oluwatobiloba"} +{"country": "NG", "family": "Francis", "given": "Cecilia"} +{"country": "NG", "family": "Kalu", "given": "Stephanie"} +{"country": "NG", "family": "Ibeh", "given": "Bruno"} +{"country": "NG", "family": "Bala", "given": "Aliko"} +{"country": "NG", "family": "Edochie", "given": "Yul"} +{"country": "NG", "family": "Oluwole", "given": "Babafemi"} +{"country": "NG", "family": "Imoudu", "given": "Michael"} +{"country": "NG", "family": "Chijioke", "given": "Chijioke"} +{"country": "NG", "family": "Ehrhardt", "given": "Albert"} +{"country": "NG", "family": "Adewole", "given": "Isaac"} +{"country": "NG", "family": "Williams", "given": "Josephine"} +{"country": "NG", "family": "Okoro", "given": "John"} +{"country": "NG", "family": "Melaiye", "given": "Dino"} +{"country": "NG", "family": "Henshaw", "given": "Samm"} +{"country": "NG", "family": "Owolabi", "given": "Israel"} +{"country": "NG", "family": "Shagaya", "given": "Sim"} +{"country": "NG", "family": "Okediji", "given": "Moyo"} +{"country": "NG", "family": "Obazu", "given": "Sunny"} +{"country": "NG", "family": "Ogbah", "given": "Emmanuel"} +{"country": "NG", "family": "King", "given": "Carol"} +{"country": "NG", "family": "Gbinije", "given": "Michael"} +{"country": "NG", "family": "Okafor", "given": "Chris"} +{"country": "NG", "family": "Njoku", "given": "Jason"} +{"country": "NG", "family": "Meyer", "given": "Maud"} +{"country": "NG", "family": "Falana", "given": "Femi"} +{"country": "NG", "family": "Kayode", "given": "Femi"} +{"country": "NG", "family": "Oke", "given": "Femi"} +{"country": "NG", "family": "Otedola", "given": "Femi"} +{"country": "NG", "family": "Eboh", "given": "Festus"} +{"country": "NG", "family": "Okotie", "given": "Festus"} +{"country": "NG", "family": "Eboh", "given": "Sam"} +{"country": "NG", "family": "Okotie", "given": "Sam"} +{"country": "NG", "family": "Nwapa", "given": "Flora"} +{"country": "NG", "family": "Okaroh", "given": "Francis"} +{"country": "NG", "family": "Nweke", "given": "Frank"} +{"country": "NG", "family": "Williams", "given": "Frederick"} +{"country": "NG", "family": "Olayinka", "given": "Funmilayo"} +{"country": "NG", "family": "Suswam", "given": "Gabriel"} +{"country": "NG", "family": "Aluko", "given": "Gbenga"} +{"country": "NG", "family": "Salu", "given": "Gbenga"} +{"country": "NG", "family": "Olawepo", "given": "Gbenga"} +{"country": "NG", "family": "Akpabio", "given": "George"} +{"country": "NG", "family": "Adebo", "given": "Simeon"} +{"country": "NG", "family": "Moore", "given": "Gerald"} +{"country": "NG", "family": "Taylor", "given": "Gloria"} +{"country": "NG", "family": "Bura", "given": "Zanna"} +{"country": "NG", "family": "Bura", "given": "Goni"} +{"country": "NG", "family": "Williams", "given": "Grace"} +{"country": "NG", "family": "Elewonibi", "given": "Muhammad"} +{"country": "NG", "family": "Elewonibi", "given": "Thomas"} +{"country": "NG", "family": "Elewonibi", "given": "David"} +{"country": "NG", "family": "Smith", "given": "H."} +{"country": "NG", "family": "Maina", "given": "Zainab"} +{"country": "NG", "family": "Alao", "given": "Halima"} +{"country": "NG", "family": "Zayyad", "given": "Hamza"} +{"country": "NG", "family": "Doda", "given": "Haruna"} +{"country": "NG", "family": "Hassan", "given": "Hassan"} +{"country": "NG", "family": "Paul", "given": "Helen"} +{"country": "NG", "family": "Dickson", "given": "Henry"} +{"country": "NG", "family": "McCallum", "given": "Henry"} +{"country": "NG", "family": "Ezeh", "given": "Henry"} +{"country": "NG", "family": "Makinwa", "given": "Henry"} +{"country": "NG", "family": "Nwosu", "given": "Henry"} +{"country": "NG", "family": "Townsend", "given": "Henry"} +{"country": "NG", "family": "Bruce", "given": "Henry"} +{"country": "NG", "family": "Hezekiah", "given": "Oluwafemi"} +{"country": "NG", "family": "Dabo", "given": "Ibrahim"} +{"country": "NG", "family": "Prince", "given": "Henry"} +{"country": "NG", "family": "Sankara", "given": "Mamadou"} +{"country": "NG", "family": "Onyefulu", "given": "Ifeoma"} +{"country": "NG", "family": "Okwara", "given": "Ikenna"} +{"country": "NG", "family": "Lawal", "given": "Shane"} +{"country": "NG", "family": "Ogbonnaya", "given": "Oliver"} +{"country": "NG", "family": "Mohammed", "given": "İsa"} +{"country": "NG", "family": "Ekpo", "given": "Isaac"} +{"country": "NG", "family": "Ayuk", "given": "Isabella"} +{"country": "NG", "family": "Idonije", "given": "Israel"} +{"country": "NG", "family": "Herrera", "given": "Remigio"} +{"country": "NG", "family": "Johnson", "given": "J."} +{"country": "NG", "family": "Okafor", "given": "Jahlil"} +{"country": "NG", "family": "Johnson", "given": "James"} +{"country": "NG", "family": "Robertson", "given": "James"} +{"country": "NG", "family": "Robertson", "given": "Wilson"} +{"country": "NG", "family": "Wall", "given": "Jane"} +{"country": "NG", "family": "Gana", "given": "Jerry"} +{"country": "NG", "family": "Yakubu", "given": "Jibril"} +{"country": "NG", "family": "Nwobodo", "given": "James"} +{"country": "NG", "family": "Veenstra", "given": "Johanna"} +{"country": "NG", "family": "Glover", "given": "John"} +{"country": "NG", "family": "John", "given": "John"} +{"country": "NG", "family": "Taylor", "given": "John"} +{"country": "NG", "family": "Akinyemi", "given": "Johnathan"} +{"country": "NG", "family": "Akahan", "given": "Joseph"} +{"country": "NG", "family": "Thompson", "given": "Joseph"} +{"country": "NG", "family": "Nwafor", "given": "Joseph"} +{"country": "NG", "family": "Orji", "given": "Joseph"} +{"country": "NG", "family": "Taiwo", "given": "Joseph"} +{"country": "NG", "family": "Tarka", "given": "Joseph"} +{"country": "NG", "family": "Idowu-Fearon", "given": "Josiah"} +{"country": "NG", "family": "Maduabuchi", "given": "Josiah"} +{"country": "NG", "family": "Majekodunmi", "given": "Joshua"} +{"country": "NG", "family": "Emodi", "given": "Joy"} +{"country": "NG", "family": "Aminu", "given": "M."} +{"country": "NG", "family": "Aminu", "given": "Jibril"} +{"country": "NG", "family": "Otubanjo", "given": "Yusuf"} +{"country": "NG", "family": "Ezenwa", "given": "Ikechukwu"} +{"country": "NG", "family": "James", "given": "Monday"} +{"country": "NG", "family": "Alabi", "given": "Solomon"} +{"country": "NG", "family": "Uzoh", "given": "Ben"} +{"country": "NG", "family": "Emeagwali", "given": "Philip"} +{"country": "NG", "family": "Nwankpa", "given": "Godfrey"} +{"country": "NG", "family": "Okoduwa", "given": "Emmanuel"} +{"country": "NG", "family": "Metu", "given": "Joseph"} +{"country": "NG", "family": "Metu", "given": "Obinna"} +{"country": "NG", "family": "Olajuwon", "given": "Abi"} +{"country": "NG", "family": "Adedeji", "given": "Michael"} +{"country": "NG", "family": "Osazuwa", "given": "Agnes"} +{"country": "NG", "family": "Bulus", "given": "Jimmy"} +{"country": "NG", "family": "Hicks", "given": "Antwon"} +{"country": "NG", "family": "Onyema", "given": "Elvis"} +{"country": "NG", "family": "Abdulrahman", "given": "Muhammad"} +{"country": "NG", "family": "Ake", "given": "Claude"} +{"country": "NG", "family": "Chukwu", "given": "Christian"} +{"country": "NG", "family": "Taylor", "given": "Damilola"} +{"country": "NG", "family": "Duke", "given": "Donald"} +{"country": "NG", "family": "Asamoah-Frimpong", "given": "Eric"} +{"country": "NG", "family": "Onyia", "given": "Josephine"} +{"country": "NG", "family": "Uzoenyi", "given": "Ejike"} +{"country": "NG", "family": "Kuti", "given": "Oluseun"} +{"country": "NG", "family": "Umelo", "given": "Grace"} +{"country": "NG", "family": "Ibekwe", "given": "Debbie"} +{"country": "NG", "family": "Ibekwe", "given": "Ifunanya"} +{"country": "NG", "family": "Ojeikere", "given": "Okhai"} +{"country": "NG", "family": "Ojeikere", "given": "J."} +{"country": "NG", "family": "Otah", "given": "Jeff"} +{"country": "NG", "family": "Gabriel", "given": "Reuben"} +{"country": "NG", "family": "Shehu", "given": "Abdulkadir"} +{"country": "NG", "family": "Ogwumike", "given": "Nneka"} +{"country": "NG", "family": "Thomas", "given": "Olayinka"} +{"country": "NG", "family": "Ola", "given": "Daniel"} +{"country": "NG", "family": "Owoh", "given": "Nkem"} +{"country": "NG", "family": "Oruche", "given": "Richard"} +{"country": "NG", "family": "Tomlinson", "given": "Richard"} +{"country": "NG", "family": "Ogunkoya", "given": "Sean"} +{"country": "NG", "family": "Peters", "given": "Shina"} +{"country": "NG", "family": "Kollington", "given": "Abdul Razak"} +{"country": "NG", "family": "Kollington", "given": "Ayinla"} +{"country": "NG", "family": "Bassey", "given": "Hogan"} +{"country": "NG", "family": "Nwakaeme", "given": "Anthony"} +{"country": "NG", "family": "Danjuma", "given": "Muhammad"} +{"country": "NG", "family": "Audu", "given": "Abubakar"} +{"country": "NG", "family": "Attah", "given": "Victor"} +{"country": "NG", "family": "Haruna", "given": "Boni"} +{"country": "NG", "family": "Obi", "given": "Peter"} +{"country": "NG", "family": "Tinubu", "given": "Ahmed"} +{"country": "NG", "family": "Tinubu", "given": "Bola"} +{"country": "NG", "family": "Theodore", "given": "Theodore"} +{"country": "NG", "family": "Effiong", "given": "Philip"} +{"country": "NG", "family": "Hassan", "given": "Ibrahim"} +{"country": "NG", "family": "Adefarati", "given": "Adebayo"} +{"country": "NG", "family": "Omagbemi", "given": "Victor"} +{"country": "NG", "family": "Wabara", "given": "Abiola"} +{"country": "NG", "family": "Johnson", "given": "Ademola"} +{"country": "NG", "family": "Opara", "given": "Adolphus"} +{"country": "NG", "family": "Omotosho", "given": "Akin"} +{"country": "NG", "family": "Okafor", "given": "Amarachi"} +{"country": "NG", "family": "Silva", "given": "Olabisi"} +{"country": "NG", "family": "Deniran", "given": "Victor"} +{"country": "NG", "family": "Obi", "given": "Christian"} +{"country": "NG", "family": "Eni", "given": "Emmanuel"} +{"country": "NG", "family": "Ademola", "given": "Felix"} +{"country": "NG", "family": "Isaac", "given": "Henry"} +{"country": "NG", "family": "Enyinnaya", "given": "Hugo"} +{"country": "NG", "family": "George", "given": "Isaac"} +{"country": "NG", "family": "Afolabi", "given": "Jacob"} +{"country": "NG", "family": "Harbor", "given": "Jean"} +{"country": "NG", "family": "Lessor", "given": "Jonathan"} +{"country": "NG", "family": "Kerry", "given": "Matilda"} +{"country": "NG", "family": "Abbas", "given": "Mohamed"} +{"country": "NG", "family": "Dike", "given": "Ndidi"} +{"country": "NG", "family": "Okore", "given": "Nnenna"} +{"country": "NG", "family": "Okorafor", "given": "Nnedi"} +{"country": "NG", "family": "Babatunde", "given": "Ibrahim"} +{"country": "NG", "family": "Banjo", "given": "Olawunmi"} +{"country": "NG", "family": "Oguibe", "given": "Olu"} +{"country": "NG", "family": "Nkanga", "given": "Otobong"} +{"country": "NG", "family": "Davies", "given": "Nike"} +{"country": "NG", "family": "Ebor", "given": "Grace"} +{"country": "NG", "family": "Toplis", "given": "Chioma"} +{"country": "NG", "family": "Buraimoh", "given": "Lanre"} +{"country": "NG", "family": "Williams", "given": "Eric"} +{"country": "NG", "family": "Adedeji", "given": "Olamide"} +{"country": "NG", "family": "Nnodim", "given": "Blossom"} +{"country": "NG", "family": "Omojuwa", "given": "Japheth"} +{"country": "NG", "family": "Ofoyen", "given": "Charles"} +{"country": "NG", "family": "Dinwiddie", "given": "Spencer"} +{"country": "NG", "family": "Ejim", "given": "Melvin"} +{"country": "NG", "family": "Chikere", "given": "Henry"} +{"country": "NG", "family": "Chikere", "given": "Osita"} +{"country": "NG", "family": "Gold", "given": "Rosalyn"} +{"country": "NG", "family": "Onifade", "given": "Sadiq"} +{"country": "NG", "family": "Tagbajumi", "given": "Marco"} +{"country": "NG", "family": "Balogun", "given": "Ayodeji"} +{"country": "NG", "family": "Mozie", "given": "Ugo"} +{"country": "NG", "family": "Adeleke", "given": "Seyi"} +{"country": "NG", "family": "Adeleke", "given": "David"} +{"country": "NG", "family": "Williams", "given": "Olajide"} +{"country": "NG", "family": "Olatunji", "given": "Olajide"} +{"country": "NG", "family": "Williams", "given": "Olayinka"} +{"country": "NG", "family": "Olatunji", "given": "Olayinka"} +{"country": "NG", "family": "Okoli", "given": "Sean"} +{"country": "NG", "family": "Dessers", "given": "Cyril"} +{"country": "NG", "family": "Friday", "given": "Fred"} +{"country": "NG", "family": "Audu", "given": "Judith"} +{"country": "NG", "family": "Ude", "given": "Diana"} +{"country": "NG", "family": "Ude", "given": "Ifeoma"} +{"country": "NG", "family": "George", "given": "Patience"} +{"country": "NG", "family": "Ogbu", "given": "Moses"} +{"country": "NG", "family": "Makanjuola", "given": "Habib"} +{"country": "NG", "family": "Braimoh", "given": "Suleiman"} +{"country": "NG", "family": "Effah", "given": "Belinda"} +{"country": "NG", "family": "Ekubo", "given": "Alexis"} +{"country": "NG", "family": "Ibeanu", "given": "Okechukwu"} +{"country": "NG", "family": "Idiata", "given": "Samson"} +{"country": "NG", "family": "Lawal", "given": "Babatunde"} +{"country": "NG", "family": "Etebo", "given": "Peter"} +{"country": "NG", "family": "Johnson", "given": "Ray"} +{"country": "NG", "family": "Ọládoyè", "given": "Taiwo"} +{"country": "NG", "family": "Olejeme", "given": "Ngozi"} +{"country": "NG", "family": "Ejiofor", "given": "Linda"} +{"country": "NG", "family": "Oluchi", "given": "Sylvia"} +{"country": "NG", "family": "Dawes", "given": "Neville"} +{"country": "NG", "family": "Shay", "given": "Seyi"} +{"country": "NG", "family": "Nwankwo", "given": "Simeon"} +{"country": "NG", "family": "Sunday", "given": "Esther"} +{"country": "NG", "family": "Chinda", "given": "Monalisa"} +{"country": "NG", "family": "Eze", "given": "Chelsea"} +{"country": "NG", "family": "Isa", "given": "Sheriff"} +{"country": "NG", "family": "Brown", "given": "Ola"} +{"country": "NG", "family": "Orekunrin", "given": "Ola"} +{"country": "NG", "family": "Brown", "given": "Olamide"} +{"country": "NG", "family": "Orekunrin", "given": "Olamide"} +{"country": "NG", "family": "Jacobs", "given": "Femi"} +{"country": "NG", "family": "Akande", "given": "Dakoré"} +{"country": "NG", "family": "Samuel", "given": "Monday"} +{"country": "NG", "family": "Uko", "given": "Ikechi"} +{"country": "NG", "family": "Obasi", "given": "Godwin"} +{"country": "NG", "family": "Makinwa", "given": "Toke"} +{"country": "NG", "family": "Coker", "given": "Folake"} +{"country": "NG", "family": "Makanju", "given": "Victor"} +{"country": "NG", "family": "Makanju", "given": "Gbolahan"} +{"country": "NG", "family": "Orlando", "given": "John"} +{"country": "NG", "family": "Bach", "given": "Lilian"} +{"country": "NG", "family": "Adeleye", "given": "Bisi"} +{"country": "NG", "family": "Akinbobola", "given": "Ariyike"} +{"country": "NG", "family": "Ogulu", "given": "Damini"} +{"country": "NG", "family": "Johnson", "given": "Bola"} +{"country": "NG", "family": "Fawole", "given": "Oyeyemi"} +{"country": "NG", "family": "Makun", "given": "Ayo"} +{"country": "NG", "family": "Omoregie", "given": "Sunny"} +{"country": "NG", "family": "Benjamin", "given": "Ada"} +{"country": "NG", "family": "Banner", "given": "Anna"} +{"country": "NG", "family": "Okeke", "given": "Daniella"} +{"country": "NG", "family": "Akínbò", "given": "Eniola"} +{"country": "NG", "family": "Abubakar", "given": "Abu Bakr"} +{"country": "NG", "family": "Abubakar", "given": "Abbas"} +{"country": "NG", "family": "Maxwell", "given": "James"} +{"country": "NG", "family": "Maxwell", "given": "Crawford"} +{"country": "NG", "family": "Nwosu", "given": "Ashley"} +{"country": "NG", "family": "Dede", "given": "Sam"} +{"country": "NG", "family": "Denby", "given": "Nichole"} +{"country": "NG", "family": "Kwashi", "given": "Benjamin"} +{"country": "NG", "family": "Oyeyemi", "given": "Modupe"} +{"country": "NG", "family": "Abalo", "given": "Sunday"} +{"country": "NG", "family": "Ezeonu", "given": "Ngozi"} +{"country": "NG", "family": "Akintola", "given": "Bimbo"} +{"country": "NG", "family": "Akins", "given": "Tyron"} +{"country": "NG", "family": "Ipadeola", "given": "Tádé"} +{"country": "NG", "family": "Manuel", "given": "Bimbo"} +{"country": "NG", "family": "Johnson", "given": "Samuel"} +{"country": "NG", "family": "Manuwa", "given": "Samuel"} +{"country": "NG", "family": "Oboh", "given": "Samuel"} +{"country": "NG", "family": "Okoye", "given": "Samuel"} +{"country": "NG", "family": "Bajah", "given": "Samuel"} +{"country": "NG", "family": "Dantata", "given": "Sanusi"} +{"country": "NG", "family": "Adebisi", "given": "Sarah"} +{"country": "NG", "family": "Edu", "given": "Shafi"} +{"country": "NG", "family": "Ekpe", "given": "Simeon"} +{"country": "NG", "family": "Adeyemi", "given": "Smart"} +{"country": "NG", "family": "Tat", "given": "Solomon"} +{"country": "NG", "family": "Thomas", "given": "Stella"} +{"country": "NG", "family": "Chukwuma", "given": "Stephen"} +{"country": "NG", "family": "Amos", "given": "Stephen"} +{"country": "NG", "family": "Rotimi", "given": "Sunday"} +{"country": "NG", "family": "Abdurrahman", "given": "Suraj"} +{"country": "NG", "family": "Peters", "given": "Susan"} +{"country": "NG", "family": "Sylvester", "given": "Sylvester"} +{"country": "NG", "family": "Ugoh", "given": "Sylvester"} +{"country": "NG", "family": "Doherty", "given": "T."} +{"country": "NG", "family": "Hanna", "given": "Tariq"} +{"country": "NG", "family": "Okafor", "given": "Rosemary"} +{"country": "NG", "family": "Jackson", "given": "Thomas"} +{"country": "NG", "family": "Allen", "given": "Timothy"} +{"country": "NG", "family": "Oluehi", "given": "Tochukwu"} +{"country": "NG", "family": "Jonsson", "given": "Tony"} +{"country": "NG", "family": "Alabi", "given": "Tope"} +{"country": "NG", "family": "Falola", "given": "Toyin"} +{"country": "NG", "family": "Falola", "given": "Omoyeni"} +{"country": "NG", "family": "Odutola", "given": "Toyin"} +{"country": "NG", "family": "Yar'adua", "given": "Turai"} +{"country": "NG", "family": "Agbo", "given": "Uche"} +{"country": "NG", "family": "Nduka", "given": "Uche"} +{"country": "NG", "family": "Oha", "given": "Ugo"} +{"country": "NG", "family": "Okoye", "given": "Ugo"} +{"country": "NG", "family": "Usman", "given": "Usman"} +{"country": "KE", "family": "Chesire", "given": "Joseph"} +{"country": "KE", "family": "Sumgong", "given": "Jemima"} +{"country": "KE", "family": "Mutai", "given": "Geoffrey"} +{"country": "KE", "family": "Owuor", "given": "Yvonne"} +{"country": "KE", "family": "Malot", "given": "Leah"} +{"country": "KE", "family": "Kirop", "given": "Helena"} +{"country": "KE", "family": "Omwanza", "given": "Beatrice"} +{"country": "KE", "family": "Barsosio", "given": "Florence"} +{"country": "KE", "family": "Cheruiyot", "given": "Rose"} +{"country": "KE", "family": "Rotich", "given": "Lucas"} +{"country": "KE", "family": "Korir", "given": "Julius"} +{"country": "KE", "family": "Kiptum", "given": "Anitha"} +{"country": "KE", "family": "Ng'ang'a", "given": "Anna"} +{"country": "KE", "family": "Kosgei", "given": "Anne"} +{"country": "KE", "family": "Nyokas", "given": "Anne"} +{"country": "KE", "family": "Ireri", "given": "Anthony"} +{"country": "KE", "family": "Muheria", "given": "Anthony"} +{"country": "KE", "family": "Biwott", "given": "Simon"} +{"country": "KE", "family": "Mutai", "given": "Emmanuel"} +{"country": "KE", "family": "Kiprugut", "given": "Wilson"} +{"country": "KE", "family": "Kiprugut", "given": "Chuma"} +{"country": "KE", "family": "Kiprugut", "given": "Arap"} +{"country": "KE", "family": "Rotich", "given": "Lydia"} +{"country": "KE", "family": "Shang", "given": "Lucas"} +{"country": "KE", "family": "Kipsang", "given": "William"} +{"country": "KE", "family": "Kogo", "given": "Benjamin"} +{"country": "KE", "family": "Kiprop", "given": "Wilson"} +{"country": "KE", "family": "Kitur", "given": "Samson"} +{"country": "KE", "family": "Obama", "given": "Barack"} +{"country": "KE", "family": "Mbugua", "given": "Samuel"} +{"country": "KE", "family": "Origi", "given": "Arnold"} +{"country": "KE", "family": "Shah", "given": "Kiran"} +{"country": "KE", "family": "Rop", "given": "Rodgers"} +{"country": "KE", "family": "Kirui", "given": "Paul"} +{"country": "KE", "family": "Kiplagat", "given": "William"} +{"country": "KE", "family": "Kosgei", "given": "Japhet"} +{"country": "KE", "family": "Kirui", "given": "Ismael"} +{"country": "KE", "family": "Kipchirchir", "given": "Alex"} +{"country": "KE", "family": "Cheruiyot", "given": "Evans"} +{"country": "KE", "family": "Koech", "given": "Paul"} +{"country": "KE", "family": "Rono", "given": "Henry"} +{"country": "KE", "family": "Kosgei", "given": "Reuben"} +{"country": "KE", "family": "Dunford", "given": "Jason"} +{"country": "KE", "family": "Ruto", "given": "Paul"} +{"country": "KE", "family": "Obama", "given": "Auma"} +{"country": "KE", "family": "Surani", "given": "Azim"} +{"country": "KE", "family": "Rudisha", "given": "David"} +{"country": "KE", "family": "Kitum", "given": "Timothy"} +{"country": "KE", "family": "Kemboi", "given": "Ezekiel"} +{"country": "KE", "family": "Mutai", "given": "Abel"} +{"country": "KE", "family": "Kirui", "given": "Abel"} +{"country": "KE", "family": "Kiprotich", "given": "Wilson"} +{"country": "KE", "family": "Cheruiyot", "given": "Vivian"} +{"country": "KE", "family": "Jeptoo", "given": "Priscah"} +{"country": "KE", "family": "Yego", "given": "Alfred"} +{"country": "KE", "family": "Kipchoge", "given": "Eliud"} +{"country": "KE", "family": "Soi", "given": "Edwin"} +{"country": "KE", "family": "Kogo", "given": "Micah"} +{"country": "KE", "family": "Leakey", "given": "Seymour"} +{"country": "KE", "family": "Leakey", "given": "Bazett"} +{"country": "KE", "family": "Wanjiru", "given": "Samuel"} +{"country": "KE", "family": "Keino", "given": "Kipchoge"} +{"country": "KE", "family": "Maathai", "given": "Wangari"} +{"country": "KE", "family": "Okolloh", "given": "Ory"} +{"country": "KE", "family": "Rotich", "given": "Juliana"} +{"country": "KE", "family": "Odinga", "given": "Raila"} +{"country": "KE", "family": "Kimetto", "given": "Dennis"} +{"country": "KE", "family": "Jepchirchir", "given": "Sarah"} +{"country": "KE", "family": "Cheruiyot", "given": "Kipkoech"} +{"country": "KE", "family": "Cheywa", "given": "Milcah"} +{"country": "KE", "family": "Koech", "given": "Isiah"} +{"country": "KE", "family": "Okoth", "given": "Zacchaeus"} +{"country": "KE", "family": "Limo", "given": "Richard"} +{"country": "KE", "family": "Kirui", "given": "Catherine"} +{"country": "KE", "family": "Chepkirui", "given": "Joyce"} +{"country": "KE", "family": "Kiplagat", "given": "Edna"} +{"country": "KE", "family": "Gitau", "given": "Daniel"} +{"country": "KE", "family": "Moi", "given": "Daniel"} +{"country": "KE", "family": "Moi", "given": "Arap"} +{"country": "KE", "family": "Ruto", "given": "William"} +{"country": "KE", "family": "Kibiwot", "given": "Viola"} +{"country": "KE", "family": "Langat", "given": "Nancy"} +{"country": "KE", "family": "Jepkorir", "given": "Eunice"} +{"country": "KE", "family": "Masai", "given": "Linet"} +{"country": "KE", "family": "Jepkosgei", "given": "Janeth"} +{"country": "KE", "family": "Loroupe", "given": "Tegla"} +{"country": "KE", "family": "Kemboi", "given": "Simon"} +{"country": "KE", "family": "Barsosio", "given": "Sally"} +{"country": "KE", "family": "Jeptoo", "given": "Rita"} +{"country": "KE", "family": "Chepchumba", "given": "Joyce"} +{"country": "KE", "family": "Kosgei", "given": "Salina"} +{"country": "KE", "family": "Chepchumba", "given": "Pamela"} +{"country": "KE", "family": "Kiplagat", "given": "Silas"} +{"country": "KE", "family": "Wainaina", "given": "Angela"} +{"country": "KE", "family": "Kimutai", "given": "Japheth"} +{"country": "KE", "family": "Mariga", "given": "McDonald"} +{"country": "KE", "family": "Frere", "given": "Richard"} +{"country": "KE", "family": "Leakey", "given": "Richard"} +{"country": "KE", "family": "Frere", "given": "Erskine"} +{"country": "KE", "family": "Leakey", "given": "Erskine"} +{"country": "KE", "family": "Froome", "given": "Christopher"} +{"country": "KE", "family": "Gathegi", "given": "Edi"} +{"country": "KE", "family": "Chebii", "given": "Abraham"} +{"country": "KE", "family": "Lagat", "given": "Elijah"} +{"country": "KE", "family": "Kiprop", "given": "Fred"} +{"country": "KE", "family": "Chelanga", "given": "Joshua"} +{"country": "KE", "family": "Rono", "given": "Peter"} +{"country": "KE", "family": "Shaheen", "given": "Saif"} +{"country": "KE", "family": "Kebenei", "given": "Wilson"} +{"country": "KE", "family": "Kiptanui", "given": "Moses"} +{"country": "KE", "family": "Ngugi", "given": "John"} +{"country": "KE", "family": "Komen", "given": "Daniel"} +{"country": "KE", "family": "Sirma", "given": "Susan"} +{"country": "KE", "family": "Rono", "given": "Daniel"} +{"country": "KE", "family": "Kibet", "given": "Luke"} +{"country": "KE", "family": "Herrmann", "given": "Edgar"} +{"country": "KE", "family": "Mugo", "given": "Naomi"} +{"country": "KE", "family": "Keter", "given": "Erick"} +{"country": "KE", "family": "Kiprop", "given": "Agnes"} +{"country": "KE", "family": "Kipkemoi", "given": "Gladys"} +{"country": "KE", "family": "Shaw", "given": "Simon"} +{"country": "KE", "family": "Cherono", "given": "Mercy"} +{"country": "KE", "family": "Kilel", "given": "Caroline"} +{"country": "KE", "family": "Wanjiru", "given": "Grace"} +{"country": "KE", "family": "Timbilil", "given": "Alice"} +{"country": "KE", "family": "Obiri", "given": "Hellen"} +{"country": "KE", "family": "Wanjiku", "given": "Mercy"} +{"country": "KE", "family": "Kibet", "given": "Hilda"} +{"country": "KE", "family": "Mehta", "given": "Chandrasekhar"} +{"country": "KE", "family": "Mehta", "given": "Shekhar"} +{"country": "KE", "family": "Kariuki", "given": "Julius"} +{"country": "KE", "family": "Korir", "given": "Wesley"} +{"country": "KE", "family": "Chebet", "given": "Wilson"} +{"country": "KE", "family": "Biwott", "given": "Amos"} +{"country": "KE", "family": "Tanui", "given": "William"} +{"country": "KE", "family": "Leakey", "given": "Maeve"} +{"country": "KE", "family": "Masai", "given": "Edith"} +{"country": "KE", "family": "Kimutai", "given": "David"} +{"country": "KE", "family": "Chebet", "given": "Emily"} +{"country": "KE", "family": "Mutu", "given": "Wangechi"} +{"country": "KE", "family": "Andersson", "given": "Isabella"} +{"country": "KE", "family": "Cherop", "given": "Sharon"} +{"country": "KE", "family": "Momanyi", "given": "Grace"} +{"country": "KE", "family": "Chelimo", "given": "Nicholas"} +{"country": "KE", "family": "Chelimo", "given": "Richard"} +{"country": "KE", "family": "Wanyama", "given": "Victor"} +{"country": "KE", "family": "Tanui", "given": "Moses"} +{"country": "KE", "family": "Roy", "given": "Deep"} +{"country": "KE", "family": "Gitahi", "given": "Julius"} +{"country": "KE", "family": "Kimani", "given": "Lucia"} +{"country": "KE", "family": "Kimani", "given": "Lucija"} +{"country": "KE", "family": "Ogot", "given": "Grace"} +{"country": "KE", "family": "Keter", "given": "Joseph"} +{"country": "KE", "family": "Njue", "given": "John"} +{"country": "KE", "family": "Tanui", "given": "Paul"} +{"country": "KE", "family": "Limo", "given": "Benjamin"} +{"country": "KE", "family": "Oliech", "given": "Dennis"} +{"country": "KE", "family": "Ndereba", "given": "Anastasia"} +{"country": "KE", "family": "Njeri", "given": "Pauline"} +{"country": "KE", "family": "Mutai", "given": "Mark"} +{"country": "KE", "family": "Kiptoo", "given": "Mark"} +{"country": "KE", "family": "Omar", "given": "Aboud"} +{"country": "KE", "family": "Odera", "given": "Victor"} +{"country": "KE", "family": "Munga", "given": "Victor"} +{"country": "KE", "family": "Kinyua", "given": "Patrick"} +{"country": "KE", "family": "Bundi", "given": "Emmanuel"} +{"country": "KE", "family": "Mbugua", "given": "Paul"} +{"country": "KE", "family": "Odera", "given": "Philip"} +{"country": "KE", "family": "Sawe", "given": "Julius"} +{"country": "KE", "family": "Slade", "given": "Humphrey"} +{"country": "KE", "family": "Kosgei", "given": "Mike"} +{"country": "KE", "family": "Jepchirchir", "given": "Justina"} +{"country": "KE", "family": "Kwemoi", "given": "Rodgers"} +{"country": "KE", "family": "Nyambura", "given": "Virginia"} +{"country": "KE", "family": "Gicharu", "given": "Simon"} +{"country": "KE", "family": "Trotter", "given": "Charles"} +{"country": "KE", "family": "Preston", "given": "Vic"} +{"country": "KE", "family": "Fernandes", "given": "Brendan"} +{"country": "KE", "family": "Njoroge", "given": "Patrick"} +{"country": "KE", "family": "Din", "given": "Gina"} +{"country": "KE", "family": "Mutungi", "given": "Irene"} +{"country": "KE", "family": "Cheptai", "given": "Irene"} +{"country": "KE", "family": "Cheptai", "given": "Chepet"} +{"country": "KE", "family": "Cheruiyot", "given": "Timothy"} +{"country": "KE", "family": "Lagat", "given": "Viola"} +{"country": "KE", "family": "Nawowuna", "given": "Alice"} +{"country": "KE", "family": "Kipkemboi", "given": "Margaret"} +{"country": "KE", "family": "Kemboi", "given": "Clement"} +{"country": "KE", "family": "Kadogo", "given": "Eunice"} +{"country": "KE", "family": "Ruto", "given": "Rachel"} +{"country": "KE", "family": "Hassan", "given": "Sarah"} +{"country": "KE", "family": "Douglas-Hamilton", "given": "Oria"} +{"country": "KE", "family": "Silva", "given": "Hazel"} +{"country": "KE", "family": "Makokha", "given": "Jacqueline"} +{"country": "KE", "family": "Osier", "given": "Faith"} +{"country": "KE", "family": "Chelimo", "given": "Kevin"} +{"country": "KE", "family": "Ogola", "given": "Brian"} +{"country": "KE", "family": "Miloyo", "given": "Emma"} +{"country": "KE", "family": "Martins", "given": "Dino"} +{"country": "KE", "family": "Kibet", "given": "Raymond"} +{"country": "KE", "family": "Kiarie", "given": "Dominic"} +{"country": "KE", "family": "Koech", "given": "Edwin"} +{"country": "KE", "family": "Bett", "given": "Kipyegon"} +{"country": "KE", "family": "Langat", "given": "Geoffrey"} +{"country": "KE", "family": "Collins", "given": "Steve"} +{"country": "KE", "family": "Kuria", "given": "Moses"} +{"country": "KE", "family": "Adan", "given": "Fatuma"} +{"country": "KE", "family": "Makuto", "given": "Violet"} +{"country": "KE", "family": "Wanjiru", "given": "Catherine"} +{"country": "KE", "family": "Mbugua", "given": "Janet"} +{"country": "KE", "family": "Kihoro", "given": "Patricia"} +{"country": "KE", "family": "Jepchirchir", "given": "Peres"} +{"country": "KE", "family": "Limo", "given": "Cynthia"} +{"country": "KE", "family": "Kiptoo", "given": "Edwin"} +{"country": "KE", "family": "Yego", "given": "Philip"} +{"country": "KE", "family": "Virani", "given": "Mounir"} +{"country": "KE", "family": "Ruto", "given": "David"} +{"country": "KE", "family": "Cheromei", "given": "Joseph"} +{"country": "KE", "family": "Penn", "given": "Edward"} +{"country": "KE", "family": "Chepchumba", "given": "Viola"} +{"country": "KE", "family": "Yego", "given": "Solomon"} +{"country": "KE", "family": "Odinga", "given": "Rosemary"} +{"country": "KE", "family": "Kiprop", "given": "Richard"} +{"country": "KE", "family": "Onyango", "given": "Sarah"} +{"country": "KE", "family": "Wanjiru", "given": "Evelyn"} +{"country": "KE", "family": "Chepkwony", "given": "Julius"} +{"country": "KE", "family": "Ongwae", "given": "Tylor"} +{"country": "KE", "family": "Can", "given": "Yasemin"} +{"country": "KE", "family": "Chepkoech", "given": "Beatrice"} +{"country": "KE", "family": "Akdağ", "given": "Meryem"} +{"country": "KE", "family": "Chepkirui", "given": "Sheila"} +{"country": "KE", "family": "Chesang", "given": "Agnes"} +{"country": "KE", "family": "Chepngeno", "given": "Jackline"} +{"country": "KE", "family": "Jepkosgei", "given": "Jocelyn"} +{"country": "KE", "family": "Bor", "given": "Hillary"} +{"country": "KE", "family": "Chelimo", "given": "Paul"} +{"country": "KE", "family": "Patel", "given": "Raju"} +{"country": "KE", "family": "Salpeter", "given": "Lonah"} +{"country": "KE", "family": "Chemtai", "given": "Lonah"} +{"country": "KE", "family": "Salpeter", "given": "Korlima"} +{"country": "KE", "family": "Chemtai", "given": "Korlima"} +{"country": "KE", "family": "Rotich", "given": "Mike"} +{"country": "KE", "family": "Busienei", "given": "Selah"} +{"country": "KE", "family": "Francis", "given": "Peter"} +{"country": "KE", "family": "Adema", "given": "Biko"} +{"country": "KE", "family": "Chemweno", "given": "Mary"} +{"country": "KE", "family": "Wahome", "given": "Alice"} +{"country": "KE", "family": "Lelo", "given": "Francis"} +{"country": "KE", "family": "Modi", "given": "Pranlal"} +{"country": "KE", "family": "Fernandes", "given": "Jacinto"} +{"country": "KE", "family": "Kosgei", "given": "Matthew"} +{"country": "KE", "family": "Kirwa", "given": "Gilbert"} +{"country": "KE", "family": "Musyoki", "given": "Mike"} +{"country": "KE", "family": "Musyoki", "given": "Michael"} +{"country": "KE", "family": "Ricciardi", "given": "Mirella"} +{"country": "KE", "family": "Kandie", "given": "Samson"} +{"country": "KE", "family": "Kwambai", "given": "Irene"} +{"country": "KE", "family": "Tanui", "given": "James"} +{"country": "KE", "family": "Kiptum", "given": "Joseph"} +{"country": "KE", "family": "Mbithi", "given": "Joseph"} +{"country": "KE", "family": "Nderitu", "given": "Joseph"} +{"country": "KE", "family": "Kiptoo", "given": "Julius"} +{"country": "KE", "family": "Shang", "given": "Julius"} +{"country": "KE", "family": "Tanui", "given": "Philip"} +{"country": "KE", "family": "Kimani", "given": "Kevin"} +{"country": "KE", "family": "Shang", "given": "Silas"} +{"country": "KE", "family": "Brown", "given": "Leslie"} +{"country": "KE", "family": "Chelimo", "given": "Rose"} +{"country": "KE", "family": "Obiero", "given": "Mercy"} +{"country": "KE", "family": "Kibet", "given": "Patrick"} +{"country": "KE", "family": "Ruto", "given": "Patrick"} +{"country": "KE", "family": "Kipruto", "given": "Sammy"} +{"country": "KE", "family": "Jepkoech", "given": "Monica"} +{"country": "KE", "family": "Masai", "given": "Moses"} +{"country": "KE", "family": "Kemboi", "given": "Nicholas"} +{"country": "KE", "family": "Gicharu", "given": "Benson"} +{"country": "KE", "family": "Kariuki", "given": "Paul"} +{"country": "KE", "family": "Kirui", "given": "Peter"} +{"country": "KE", "family": "Chebet", "given": "Peter"} +{"country": "KE", "family": "Subira", "given": "Philip"} +{"country": "KE", "family": "Anyolo", "given": "Philip"} +{"country": "KE", "family": "Subira", "given": "Arnold"} +{"country": "KE", "family": "Anyolo", "given": "Arnold"} +{"country": "KE", "family": "Kirui", "given": "Philip"} +{"country": "KE", "family": "Chepkwony", "given": "Richard"} +{"country": "KE", "family": "Kipketer", "given": "Sammy"} +{"country": "KE", "family": "Sanga", "given": "Philip"} +{"country": "KE", "family": "Rotich", "given": "Titus"} +{"country": "KE", "family": "Kioko", "given": "Joseph"} +{"country": "KE", "family": "Kioko", "given": "Urbanus"} +{"country": "KE", "family": "Cheseret", "given": "William"} +{"country": "KE", "family": "Oh", "given": "Wilson"} +{"country": "KE", "family": "Jepkemoi", "given": "Winnie"} +{"country": "KE", "family": "Keino", "given": "Joseph"} +{"country": "KE", "family": "Whiteside", "given": "Alan"} +{"country": "KE", "family": "Kirui", "given": "Alex"} +{"country": "KE", "family": "Douglas-Hamilton", "given": "Saba"} +{"country": "KE", "family": "Spoerry", "given": "Anne"} +{"country": "KE", "family": "Origi", "given": "Mike"} +{"country": "KE", "family": "Kiprotich", "given": "Abraham"} +{"country": "KE", "family": "Seda", "given": "Job"} +{"country": "KE", "family": "Ogot", "given": "Bethwell"} +{"country": "KE", "family": "Onyango", "given": "Brian"} +{"country": "KE", "family": "Tundo", "given": "Carl"} +{"country": "KE", "family": "Chumba", "given": "Sammy"} +{"country": "KE", "family": "Taher", "given": "Tareq"} +{"country": "KE", "family": "Cecil", "given": "Eric"} +{"country": "KE", "family": "Mdawida", "given": "William"} +{"country": "KE", "family": "Mdawida", "given": "Fadhili"} +{"country": "KE", "family": "Chepng'etich", "given": "Faith"} +{"country": "KE", "family": "Mohammed", "given": "Jamal"} +{"country": "KE", "family": "Chimera", "given": "Rocha"} +{"country": "KE", "family": "Odhiambo", "given": "George"} +{"country": "KE", "family": "Wamuyu", "given": "Gladys"} +{"country": "KE", "family": "Edmunds", "given": "Glen"} +{"country": "KE", "family": "Omondi", "given": "James"} +{"country": "KE", "family": "Kinyor", "given": "Job"} +{"country": "KE", "family": "Onyango", "given": "Lucas"} +{"country": "KE", "family": "Maury", "given": "Margaret"} +{"country": "KE", "family": "Ogola", "given": "Margaret"} +{"country": "KE", "family": "Nowicki", "given": "Nick"} +{"country": "KE", "family": "Hughes", "given": "Peter"} +{"country": "KE", "family": "Shang", "given": "Philip"} +{"country": "KE", "family": "Hillyar", "given": "Robin"} +{"country": "KE", "family": "Odhiambo", "given": "Thomas"} +{"country": "KE", "family": "Ouma", "given": "Morris"} +{"country": "KE", "family": "Solomon", "given": "Adam"} +{"country": "KE", "family": "Olum", "given": "Lawrence"} +{"country": "KE", "family": "Juma", "given": "Wycliffe"} +{"country": "KE", "family": "Kipkemboi", "given": "Nicholas"} +{"country": "KE", "family": "Olita", "given": "Joseph"} +{"country": "KE", "family": "Mazrui", "given": "Ali"} +{"country": "KE", "family": "Awori", "given": "Moody"} +{"country": "KE", "family": "Abura", "given": "Achieng"} +{"country": "KE", "family": "Duale", "given": "Aden"} +{"country": "KE", "family": "Ghulam", "given": "Shamsu"} +{"country": "KE", "family": "Khan", "given": "H."} +{"country": "KE", "family": "Hassanali", "given": "Shiraz"} +{"country": "KE", "family": "Maini", "given": "Vijai"} +{"country": "KE", "family": "Martins", "given": "Lavina"} +{"country": "KE", "family": "Sabastian", "given": "Lavina"} +{"country": "KE", "family": "Githitu", "given": "Joseph"} +{"country": "KE", "family": "Githitu", "given": "Matheri"} +{"country": "KE", "family": "Muthoni", "given": "Sheila"} +{"country": "KE", "family": "Noormohamed", "given": "Shamin"} +{"country": "KE", "family": "Shah", "given": "K."} +{"country": "KE", "family": "Shah", "given": "N."} +{"country": "KE", "family": "Rasul", "given": "Amjid"} +{"country": "KE", "family": "Nderitu", "given": "Duncan"} +{"country": "KE", "family": "Kerimah", "given": "Irene"} +{"country": "KE", "family": "Gudhka", "given": "Anjali"} +{"country": "KE", "family": "Charania", "given": "S."} +{"country": "KE", "family": "Kipketer", "given": "Gideon"} +{"country": "KE", "family": "Kibet", "given": "Ivy"} +{"country": "KE", "family": "Korir", "given": "Nicholas"} +{"country": "KE", "family": "Mbugua", "given": "Robert"} +{"country": "KE", "family": "Githii", "given": "Monica"} +{"country": "KE", "family": "Nzambu", "given": "Jasmin"} +{"country": "KE", "family": "Manda", "given": "Tom"} +{"country": "KE", "family": "Kihara", "given": "Simon"} +{"country": "KE", "family": "Wamalwa", "given": "Edith"} +{"country": "KE", "family": "Joshi", "given": "Christine"} +{"country": "KE", "family": "Juma", "given": "Fatma"} +{"country": "KE", "family": "Narasimhan", "given": "Satish"} +{"country": "KE", "family": "Langat", "given": "Winny"} +{"country": "KE", "family": "Chepngeno", "given": "Winny"} +{"country": "KE", "family": "Kimutai", "given": "Kennedy"} +{"country": "KE", "family": "Juma", "given": "Richard"} +{"country": "KE", "family": "Kemboi", "given": "Edward"} +{"country": "KE", "family": "Odhiambo", "given": "Vivian"} +{"country": "KE", "family": "Kibor", "given": "William"} +{"country": "KE", "family": "Bett", "given": "Willy"} +{"country": "KE", "family": "Were", "given": "Mary"} +{"country": "KE", "family": "Gichuhi", "given": "Lucy"} +{"country": "KE", "family": "Gichuhi", "given": "Muringo"} +{"country": "KE", "family": "Okello", "given": "Thomas"} +{"country": "KE", "family": "Okumu", "given": "Joseph"} +{"country": "KE", "family": "Ouma", "given": "Ezra"} +{"country": "KE", "family": "Ouma", "given": "Ahmed"} +{"country": "KE", "family": "Stephens", "given": "Lydia"} +{"country": "KE", "family": "Korir", "given": "Emmanuel"} +{"country": "KE", "family": "Lesuuda", "given": "Josephine"} +{"country": "KE", "family": "Kamau", "given": "Rebecca"} +{"country": "KE", "family": "Anyango", "given": "Jane"} +{"country": "KE", "family": "Chelimo", "given": "Joan"} +{"country": "KE", "family": "Melly", "given": "Joan"} +{"country": "KE", "family": "Kirui", "given": "David"} +{"country": "KE", "family": "Kibet", "given": "Elkanah"} +{"country": "KE", "family": "Waweru", "given": "Evelyn"} +{"country": "KE", "family": "Mugambi", "given": "George"} +{"country": "KE", "family": "Otieno", "given": "Melissa"} +{"country": "KE", "family": "Otieno", "given": "Georgia"} +{"country": "KE", "family": "Chepng'etich", "given": "Janeth"} +{"country": "KE", "family": "Komen", "given": "Brian"} +{"country": "KE", "family": "Wanjiku", "given": "Sofiya"} +{"country": "KE", "family": "Jepleting", "given": "Nancy"} +{"country": "KE", "family": "Aila", "given": "Peter"} +{"country": "KE", "family": "Mwaniki", "given": "Peter"} +{"country": "KE", "family": "Lelei", "given": "John"} +{"country": "KE", "family": "Shaw", "given": "Michael"} +{"country": "KE", "family": "Silvester", "given": "John"} +{"country": "KE", "family": "Mwaura", "given": "Stephen"} +{"country": "KE", "family": "Abdalla", "given": "Abdalla"} +{"country": "KE", "family": "Cherotich", "given": "Lillian"} +{"country": "KE", "family": "Otieno", "given": "Geoffrey"} +{"country": "KE", "family": "Njuguna", "given": "Diana"} +{"country": "KE", "family": "Wafula", "given": "Martin"} +{"country": "KE", "family": "Mutia", "given": "Daniel"} +{"country": "KE", "family": "Njeri", "given": "Peter"} +{"country": "KE", "family": "Ogolla", "given": "Francis"} +{"country": "KE", "family": "Chepngeno", "given": "Cintia"} +{"country": "KE", "family": "Ewart", "given": "Esther"} +{"country": "KE", "family": "Kassam", "given": "R."} +{"country": "KE", "family": "Kirui", "given": "Joshua"} +{"country": "KE", "family": "Cheruiyot", "given": "Joshua"} +{"country": "KE", "family": "Kamau", "given": "Moses"} +{"country": "KE", "family": "Moraa", "given": "Sarah"} +{"country": "KE", "family": "Chacha", "given": "Margret"} +{"country": "KE", "family": "Jepkemoi", "given": "Emmy"} +{"country": "KE", "family": "Wilson", "given": "Stanley"} +{"country": "KE", "family": "Barasa", "given": "Deborah"} +{"country": "KE", "family": "Wanjiru", "given": "Mercy"} +{"country": "KE", "family": "Kimani", "given": "Peter"} +{"country": "KE", "family": "Samba", "given": "Betty"} +{"country": "KE", "family": "Otieno", "given": "Magdalina"} +{"country": "KE", "family": "Fowler", "given": "Oliver"} +{"country": "KE", "family": "Soi", "given": "Catherine"} +{"country": "KE", "family": "Wambua", "given": "Catherine"} +{"country": "KE", "family": "Soi", "given": "Robert"} +{"country": "KE", "family": "Omole", "given": "Booker"} +{"country": "KE", "family": "Okumu", "given": "Monica"} +{"country": "KE", "family": "Kimaina", "given": "Gladys"} +{"country": "KE", "family": "Kimaina", "given": "Jerop"} +{"country": "KE", "family": "Salim", "given": "Roshan"} +{"country": "KE", "family": "Githinji", "given": "Marie"} +{"country": "KE", "family": "Wanyonyi", "given": "Violet"} +{"country": "KE", "family": "Gitonga", "given": "David"} +{"country": "KE", "family": "Kipsang", "given": "Lynne"} +{"country": "KE", "family": "Onyango", "given": "Vivian"} +{"country": "KE", "family": "Karanja", "given": "Tracy"} +{"country": "KE", "family": "Koech", "given": "Phanuel"} +{"country": "KE", "family": "Varese", "given": "Shakira"} +{"country": "KE", "family": "Raja", "given": "Radha"} +{"country": "KE", "family": "Kotecha", "given": "Sneha"} +{"country": "KE", "family": "Ouko", "given": "Austin"} +{"country": "KE", "family": "Opondo", "given": "Margaret"} +{"country": "KE", "family": "Korir", "given": "Valentine"} +{"country": "KE", "family": "Okumu", "given": "Elizabeth"} +{"country": "KE", "family": "Wanjiku", "given": "Maryann"} +{"country": "KE", "family": "Adera", "given": "Eugene"} +{"country": "KE", "family": "Ayodi", "given": "Job"} +{"country": "KE", "family": "Rotich", "given": "Clara"} +{"country": "KE", "family": "Okoth", "given": "Fidel"} +{"country": "KE", "family": "Odhiambo", "given": "Rachael"} +{"country": "KE", "family": "Njoroge", "given": "Samuel"} +{"country": "KE", "family": "Nyamai", "given": "Erick"} +{"country": "KE", "family": "Ojiambo", "given": "Sanda"} +{"country": "KE", "family": "Kibera", "given": "Leonard"} +{"country": "KE", "family": "Stutchbury", "given": "Joannah"} +{"country": "KE", "family": "Warui", "given": "Charles"} +{"country": "KE", "family": "Hinga", "given": "Teresia"} +{"country": "KE", "family": "Kipchumba", "given": "Daniel"} +{"country": "KE", "family": "Kimani", "given": "Sarah"} +{"country": "KE", "family": "Wambui", "given": "Foi"} +{"country": "KE", "family": "O'Connor", "given": "Celeste"} +{"country": "KE", "family": "Majimbo", "given": "Elsa"} +{"country": "KE", "family": "Wambui", "given": "Catherine"} +{"country": "KE", "family": "Makokha", "given": "Vivian"} +{"country": "KE", "family": "Airo", "given": "Mercy"} +{"country": "KE", "family": "Kinyua", "given": "Kaari"} +{"country": "KE", "family": "Karl", "given": "Esther"} +{"country": "KE", "family": "Karl", "given": "Stephanie"} +{"country": "KE", "family": "Oyugi", "given": "Michael"} +{"country": "KE", "family": "Oyugi", "given": "Okoth"} +{"country": "KE", "family": "Demba", "given": "Rodgers"} +{"country": "KE", "family": "Kirui", "given": "Henry"} +{"country": "KE", "family": "Obiero", "given": "David"} +{"country": "KE", "family": "Maina", "given": "Betty"} +{"country": "KE", "family": "Kamau", "given": "Catherine"} +{"country": "KE", "family": "Odero", "given": "Albert"} +{"country": "KE", "family": "Wanjiru", "given": "Florence"} +{"country": "KE", "family": "Chemweno", "given": "Wilson"} +{"country": "KE", "family": "Musa", "given": "Saad"} +{"country": "KE", "family": "Kariuki", "given": "Jemimah"} +{"country": "KE", "family": "Otieno", "given": "Michael"} +{"country": "KE", "family": "Kyuma", "given": "Bernard"} +{"country": "KE", "family": "Kyuma", "given": "Nzuki"} +{"country": "KE", "family": "Mombo", "given": "Esther"} +{"country": "KE", "family": "Vincent", "given": "http://www.wikidata.org/.well-known/genid/beb2b7c7c851dd87d29410f1b8053831"} +{"country": "KE", "family": "Alexander", "given": "Reginald"} +{"country": "KE", "family": "Odero", "given": "James"} +{"country": "KE", "family": "Odero", "given": "Roberts"} +{"country": "KE", "family": "Odero", "given": "Patrick"} +{"country": "KE", "family": "Kaunda", "given": "Josphat"} +{"country": "KE", "family": "http://www.wikidata.org/.well-known/genid/25884cc2881146f83dfc437ec86a4781", "given": "Josphat"} +{"country": "KE", "family": "Maina", "given": "Grace"} +{"country": "KE", "family": "Jones", "given": "Brian"} +{"country": "KE", "family": "Jones", "given": "Ouko"} +{"country": "KE", "family": "Koome", "given": "Martha"} +{"country": "KE", "family": "Monks", "given": "Diana"} +{"country": "KE", "family": "Korir", "given": "Naomi"} +{"country": "KE", "family": "Otieno", "given": "Janet"} +{"country": "KE", "family": "Ebenyo", "given": "Daniel"} +{"country": "KE", "family": "Masai", "given": "Samwel"} +{"country": "KE", "family": "Kipruto", "given": "Collins"} +{"country": "KE", "family": "Makokha", "given": "Gaudencia"} +{"country": "KE", "family": "Meja", "given": "Henry"} +{"country": "KE", "family": "Too", "given": "Naomi"} +{"country": "KE", "family": "Too", "given": "Naomie"} +{"country": "KE", "family": "Wambui", "given": "Leah"} +{"country": "KE", "family": "Okumu", "given": "Judith"} +{"country": "KE", "family": "Mann", "given": "Rhodia"} +{"country": "KE", "family": "Muthoni", "given": "Teresa"} +{"country": "KE", "family": "Muthoni", "given": "Teresiah"} +{"country": "KE", "family": "Wanyonyi", "given": "Emmanuel"} +{"country": "KE", "family": "Evans", "given": "Audrey"} +{"country": "KE", "family": "Faden", "given": "Audrey"} +{"country": "KE", "family": "Evans", "given": "Joy"} +{"country": "KE", "family": "Faden", "given": "Joy"} +{"country": "KE", "family": "Abass", "given": "Jihan"} +{"country": "KE", "family": "Mwaura", "given": "Carol"} +{"country": "KE", "family": "Njeru", "given": "Joyce"} +{"country": "KE", "family": "Kibuwa", "given": "Samuel"} +{"country": "KE", "family": "Kibuwa", "given": "Paulo"} +{"country": "KE", "family": "Ruffo", "given": "Christopher"} +{"country": "KE", "family": "Shongwe", "given": "Anne"} +{"country": "KE", "family": "Awori", "given": "Jeremy"} +{"country": "KE", "family": "Ndegwa", "given": "Timothy"} +{"country": "KE", "family": "Ercolano", "given": "Pina"} +{"country": "KE", "family": "Fabisch", "given": "Jonah"} +{"country": "KE", "family": "Wahome", "given": "Sylvia"} +{"country": "KE", "family": "Okowa", "given": "Phoebe"} +{"country": "KE", "family": "Ngugi", "given": "Lynn"} +{"country": "KE", "family": "Kadima", "given": "Mark"} +{"country": "KE", "family": "Osogo", "given": "John"} +{"country": "KE", "family": "Endo", "given": "Patti"} +{"country": "KE", "family": "Keller", "given": "Philip"} +{"country": "KE", "family": "Keller", "given": "Weldon"} +{"country": "KE", "family": "Majala", "given": "Doreen"} +{"country": "KE", "family": "Wangari", "given": "Mary"} +{"country": "KE", "family": "Onyango", "given": "Adelle"} +{"country": "KE", "family": "Chesire", "given": "Elizabeth"} +{"country": "KE", "family": "Wambui", "given": "Lucy"} +{"country": "KE", "family": "Kariuki", "given": "Symon"} +{"country": "KE", "family": "Kariuki", "given": "Kellen"} +{"country": "KE", "family": "Madhani", "given": "Safina"} +{"country": "KE", "family": "Cherono", "given": "Lawrence"} +{"country": "KE", "family": "Dixit", "given": "Mitra"} +{"country": "KE", "family": "Dixit", "given": "Vishva"} +{"country": "KE", "family": "Abbas", "given": "Jamila"} +{"country": "KE", "family": "Mutahi", "given": "Flora"} +{"country": "KE", "family": "Rono", "given": "Vincent"} +{"country": "KE", "family": "Chepng'etich", "given": "Florence"} +{"country": "KE", "family": "Gitau", "given": "Faith"} +{"country": "KE", "family": "Kones", "given": "Beatrice"} +{"country": "KE", "family": "Obara", "given": "Eve"} +{"country": "KE", "family": "Nyamai", "given": "Rachael"} +{"country": "KE", "family": "Njoroge", "given": "Mary"} +{"country": "KE", "family": "Makokha", "given": "Justus"} +{"country": "KE", "family": "Kihara", "given": "Jayne"} +{"country": "KE", "family": "Koyi", "given": "John"} +{"country": "KE", "family": "Cheruiyot", "given": "Aaron"} +{"country": "KE", "family": "Juma", "given": "Monica"} +{"country": "KE", "family": "Tanui", "given": "Susan"} +{"country": "KE", "family": "Kamau", "given": "Charles"} +{"country": "KE", "family": "Steenbergen", "given": "Kristel"} +{"country": "KE", "family": "Nyakundi", "given": "Robert"} +{"country": "KE", "family": "Buchbinder", "given": "David"} +{"country": "KE", "family": "Armitage", "given": "Michael"} +{"country": "KE", "family": "Kinyamal", "given": "Wycliffe"} +{"country": "KE", "family": "Chepng'etich", "given": "Ruth"} +{"country": "KE", "family": "Kosgei", "given": "Brigid"} +{"country": "KE", "family": "Kosgei", "given": "Cynthia"} +{"country": "KE", "family": "Fennessy", "given": "Rena"} +{"country": "KE", "family": "Ismail", "given": "Asha"} +{"country": "KE", "family": "Kola", "given": "Caroline"} +{"country": "KE", "family": "Kigen", "given": "Benjamin"} +{"country": "KE", "family": "Opondo", "given": "Daniel"} +{"country": "KE", "family": "Mburu", "given": "Yvonne"} +{"country": "KE", "family": "Okoth", "given": "Winnie"} +{"country": "KE", "family": "Lokedi", "given": "Sharon"} +{"country": "KE", "family": "Lyall", "given": "John"} +{"country": "KE", "family": "Gitau", "given": "Evelyn"} +{"country": "KE", "family": "Onyango", "given": "George"} +{"country": "KE", "family": "Onyango", "given": "Calleb"} +{"country": "KE", "family": "Omino", "given": "Troy"} +{"country": "KE", "family": "Bett", "given": "Leonard"} +{"country": "KE", "family": "Givens", "given": "Fiona"} +{"country": "KE", "family": "Kahumbu", "given": "Paula"} +{"country": "KE", "family": "Abdalla", "given": "Khadija"} +{"country": "KE", "family": "Zulu", "given": "Alice"} +{"country": "KE", "family": "Zulu", "given": "Kalonzo"} +{"country": "KE", "family": "Ali", "given": "Halima"} +{"country": "KE", "family": "Adan", "given": "Halima"} +{"country": "KE", "family": "Chebet", "given": "Beatrice"} +{"country": "KE", "family": "Owiti", "given": "Miriam"} +{"country": "KE", "family": "Omamo", "given": "Caroline"} +{"country": "KE", "family": "Kariuki", "given": "Susan"} +{"country": "KE", "family": "Mohammed", "given": "Safia"} +{"country": "KE", "family": "Chumba", "given": "Eunice"} +{"country": "KE", "family": "Cherop", "given": "Miriam"} +{"country": "KE", "family": "Hicks", "given": "Christina"} +{"country": "KE", "family": "Mabura", "given": "Lily"} +{"country": "KE", "family": "Mabura", "given": "G."} +{"country": "KE", "family": "Mabura", "given": "N."} +{"country": "KE", "family": "Mungai", "given": "Anne"} +{"country": "KE", "family": "Chirchir", "given": "Jackie"} +{"country": "KE", "family": "Kimani", "given": "Samuel"} +{"country": "KE", "family": "Nderitu", "given": "Alice"} +{"country": "KE", "family": "Kiptum", "given": "Abraham"} +{"country": "KE", "family": "Maina", "given": "Connie"} +{"country": "KE", "family": "Maina", "given": "Felix"} +{"country": "KE", "family": "Ireri", "given": "Margaret"} +{"country": "KE", "family": "Waweru", "given": "Patrick"} +{"country": "KE", "family": "Okumu", "given": "Stephen"} +{"country": "KE", "family": "Wambui", "given": "Brenda"} +{"country": "KE", "family": "Maina", "given": "George"} +{"country": "KE", "family": "Korir", "given": "Barnabas"} +{"country": "KE", "family": "Kimutai", "given": "Benjamin"} +{"country": "KE", "family": "Kiptoo", "given": "Benjamin"} +{"country": "KE", "family": "Lele", "given": "Boniface"} +{"country": "KE", "family": "Bitok", "given": "Paul"} +{"country": "KE", "family": "Kipkoech", "given": "Paul"} +{"country": "KE", "family": "Biwott", "given": "Paul"} +{"country": "KE", "family": "Ouko", "given": "Robert"} +{"country": "KE", "family": "Chebet", "given": "Joseph"} +{"country": "KE", "family": "Rotich", "given": "Caroline"} +{"country": "KE", "family": "Duncan", "given": "Ian"} +{"country": "KE", "family": "Rudisha", "given": "Daniel"} +{"country": "KE", "family": "Cheruiyot", "given": "David"} +{"country": "KE", "family": "Kariuki", "given": "David"} +{"country": "KE", "family": "Doughty", "given": "Mike"} +{"country": "KE", "family": "Ndungu", "given": "Samuel"} +{"country": "KE", "family": "Korir", "given": "Shedrack"} +{"country": "KE", "family": "Carberry", "given": "Juanita"} +{"country": "KE", "family": "Komen", "given": "Edwin"} +{"country": "KE", "family": "Kiptoo", "given": "Joel"} +{"country": "KE", "family": "Trzebinski", "given": "Rowland"} +{"country": "KE", "family": "Trzebinski", "given": "Antoni"} +{"country": "KE", "family": "Trzebinski", "given": "Tonio"} +{"country": "KE", "family": "Rono", "given": "Georgina"} +{"country": "KE", "family": "Meli", "given": "Elijah"} +{"country": "KE", "family": "Rono", "given": "Elly"} +{"country": "KE", "family": "Kipruto", "given": "Silas"} +{"country": "KE", "family": "Wainaina", "given": "Eric"} +{"country": "KE", "family": "Korir", "given": "Sammy"} +{"country": "KE", "family": "Mutua", "given": "Joseph"} +{"country": "KE", "family": "Kiprotich", "given": "Nixon"} +{"country": "KE", "family": "Koech", "given": "Peter"} +{"country": "KE", "family": "Wanjiru", "given": "Esther"} +{"country": "KE", "family": "Monley", "given": "Eva"} +{"country": "KE", "family": "Kwambai", "given": "James"} +{"country": "KE", "family": "Kariuki", "given": "John"} +{"country": "KE", "family": "Langat", "given": "Philip"} +{"country": "KE", "family": "Rotich", "given": "James"} +{"country": "KE", "family": "Kipsang", "given": "Joseph"} +{"country": "KE", "family": "Hussein", "given": "Ibrahim"} +{"country": "KE", "family": "Kiprop", "given": "Francis"} +{"country": "KE", "family": "Gituku", "given": "Fred"} +{"country": "KE", "family": "Kosgei", "given": "Rose"} +{"country": "KE", "family": "Kimani", "given": "Samwel"} +{"country": "KE", "family": "Kimani", "given": "Mushai"} +{"country": "KE", "family": "Waters", "given": "Seren"} +{"country": "KE", "family": "Muriuki", "given": "Silas"} +{"country": "KE", "family": "Machage", "given": "Sospeter"} +{"country": "KE", "family": "Mathenge", "given": "Stanley"} +{"country": "KE", "family": "Kilonzo", "given": "Stella"} +{"country": "KE", "family": "Cholmondeley", "given": "Gilbert"} +{"country": "KE", "family": "Cholmondeley", "given": "Thomas"} +{"country": "KE", "family": "Cholmondeley", "given": "Patrick"} +{"country": "KE", "family": "Barasa", "given": "Violet"} +{"country": "KE", "family": "Kabira", "given": "Wanjiku"} +{"country": "KE", "family": "Taragon", "given": "Wilfred"} +{"country": "KE", "family": "Kipkorir", "given": "William"} +{"country": "KE", "family": "Komen", "given": "Willy"} +{"country": "KE", "family": "Marshall", "given": "Fran"} +{"country": "KE", "family": "Shaban", "given": "Adam"} +{"country": "KE", "family": "Makuto", "given": "Asha"} +{"country": "KE", "family": "Rotich", "given": "Edinah"} +{"country": "KE", "family": "Melly", "given": "Edwin"} +{"country": "KE", "family": "Makuto", "given": "Everlyne"} +{"country": "KE", "family": "Kirui", "given": "Gilbert"} +{"country": "KE", "family": "Kwemoi", "given": "Ronald"} +{"country": "KE", "family": "Onyango", "given": "Sammy"} +{"country": "KE", "family": "Kosgei", "given": "Joseph"} +{"country": "KE", "family": "Horner", "given": "Michael"} +{"country": "KE", "family": "Rotich", "given": "Henry"} +{"country": "KE", "family": "Oga", "given": "Wander"} +{"country": "KE", "family": "Modi", "given": "Hitesh"} +{"country": "KE", "family": "Karimi", "given": "Martha"} +{"country": "KE", "family": "Yego", "given": "Hillary"} +{"country": "KE", "family": "Koech", "given": "Bernard"} +{"country": "KE", "family": "Rotich", "given": "Ferguson"} +{"country": "KE", "family": "Kaya", "given": "Stanley"} +{"country": "KE", "family": "Kaya", "given": "Ali"} +{"country": "KE", "family": "Cowie", "given": "Mervyn"} +{"country": "KE", "family": "Chesang", "given": "Reuben"} +{"country": "KE", "family": "Joseph", "given": "Mercy"} +{"country": "KE", "family": "Joseph", "given": "Mwethya"} +{"country": "KE", "family": "Kariuki", "given": "Isaac"} +{"country": "KE", "family": "Walker", "given": "Jane"} +{"country": "KE", "family": "Birgen", "given": "Bethwell"} +{"country": "KE", "family": "Obama", "given": "Malik"} +{"country": "KE", "family": "Obama", "given": "George"} +{"country": "KE", "family": "Mungai", "given": "Joseph"} +{"country": "KE", "family": "Ngugi", "given": "Mary"} +{"country": "KE", "family": "Angara", "given": "Joseph"} +{"country": "KE", "family": "Awori", "given": "Maria"} +{"country": "KE", "family": "Abuom", "given": "Agnes"} +{"country": "KE", "family": "Aliir", "given": "Aliir"} +{"country": "KE", "family": "Cheruiyot", "given": "Charles"} +{"country": "KE", "family": "Mutua", "given": "Alfred"} +{"country": "KE", "family": "Chege", "given": "Sabina"} +{"country": "KE", "family": "Wanjiru", "given": "Sabina"} +{"country": "KE", "family": "Kimani", "given": "Harry"} +{"country": "KE", "family": "Shah", "given": "Amar"} +{"country": "KE", "family": "Wambui", "given": "Nancy"} +{"country": "KE", "family": "Alube", "given": "Anitah"} +{"country": "KE", "family": "Bushuru", "given": "Anitah"} +{"country": "KE", "family": "Kipketer", "given": "Alfred"} +{"country": "KE", "family": "Rengeruk", "given": "Lilian"} +{"country": "KE", "family": "Kirkland", "given": "Mike"} +{"country": "KE", "family": "Omondi", "given": "Joyce"} +{"country": "KE", "family": "Omondi", "given": "Kevin"} +{"country": "KE", "family": "Mieno", "given": "Humphrey"} +{"country": "KE", "family": "Birdi", "given": "Sonia"} +{"country": "KE", "family": "Kenyatta", "given": "Margaret"} +{"country": "KE", "family": "Range", "given": "Marwa"} +{"country": "KE", "family": "Wachira", "given": "Nicholas"} +{"country": "KE", "family": "Mogaka", "given": "Evans"} +{"country": "KE", "family": "Ali", "given": "Fatuma"} +{"country": "KE", "family": "Wambui", "given": "Margaret"} +{"country": "KE", "family": "Frank", "given": "Matthew"} +{"country": "KE", "family": "Northrop", "given": "Margaret"} +{"country": "KE", "family": "Langat", "given": "Sammy"} +{"country": "KE", "family": "Mbugua", "given": "Audrey"} +{"country": "KE", "family": "Kimani", "given": "Joseph"} +{"country": "KE", "family": "Paul", "given": "Willy"} +{"country": "KE", "family": "Were", "given": "Jesse"} +{"country": "KE", "family": "Brunlehner", "given": "Sylvia"} +{"country": "KE", "family": "Rodrigues", "given": "Veronica"} +{"country": "KE", "family": "Bett", "given": "Nicholas"} +{"country": "KE", "family": "Songok", "given": "James"} +{"country": "KE", "family": "Mohammed", "given": "Aden"} +{"country": "KE", "family": "Hassan", "given": "Ahmed"} +{"country": "KE", "family": "Mohamed", "given": "Amina"} +{"country": "KE", "family": "Ali", "given": "Anna"} +{"country": "KE", "family": "Odhiambo", "given": "Elisha"} +{"country": "KE", "family": "Odhiambo", "given": "Stephen"} +{"country": "KE", "family": "Kane", "given": "Ben"} +{"country": "KE", "family": "Kiptoo", "given": "Jane"} +{"country": "KE", "family": "McKenzie", "given": "Bruce"} +{"country": "KE", "family": "Chepchumba", "given": "Salome"} +{"country": "KE", "family": "Wainaina", "given": "Catherine"} +{"country": "KE", "family": "Mumbi", "given": "Charity"} +{"country": "KE", "family": "Lugano", "given": "Charles"} +{"country": "KE", "family": "Nyamai", "given": "Charles"} +{"country": "KE", "family": "Odera", "given": "Crispine"} +{"country": "KE", "family": "Oywecha", "given": "Christopher"} +{"country": "KE", "family": "Ndambuki", "given": "Daniel"} +{"country": "KE", "family": "Dunford", "given": "David"} +{"country": "KE", "family": "Gateri", "given": "David"} +{"country": "KE", "family": "Waweru", "given": "David"} +{"country": "KE", "family": "Were", "given": "David"} +{"country": "KE", "family": "Rebelo", "given": "Dominic"} +{"country": "KE", "family": "Pringle", "given": "Don"} +{"country": "KE", "family": "Odanga", "given": "Donald"} +{"country": "KE", "family": "Muthoni", "given": "Dorcas"} +{"country": "KE", "family": "Odinga", "given": "Ida"} +{"country": "KE", "family": "Tanui", "given": "Elisha"} +{"country": "KE", "family": "Kirui", "given": "Eliud"} +{"country": "KE", "family": "Otieno", "given": "Eric"} +{"country": "KE", "family": "Sum", "given": "Eunice"} +{"country": "KE", "family": "Ashira", "given": "Evans"} +{"country": "KE", "family": "Macharia", "given": "Faith"} +{"country": "KE", "family": "Wainaina", "given": "Fidelis"} +{"country": "KE", "family": "Otieno", "given": "Francis"} +{"country": "KE", "family": "Ouma", "given": "Francis"} +{"country": "KE", "family": "Trzebinski", "given": "Gabriela"} +{"country": "KE", "family": "Kinuthia", "given": "Ibrahim"} +{"country": "KE", "family": "Mogaka", "given": "Irene"} +{"country": "KE", "family": "Beauttah", "given": "James"} +{"country": "KE", "family": "Wanjiku", "given": "Jane"} +{"country": "KE", "family": "Wanja", "given": "Janet"} +{"country": "KE", "family": "Santos", "given": "Jerry"} +{"country": "KE", "family": "Koech", "given": "John"} +{"country": "KE", "family": "Nzenze", "given": "John"} +{"country": "KE", "family": "Kibor", "given": "Joseph"} +{"country": "KE", "family": "Kones", "given": "Julius"} +{"country": "KE", "family": "Kones", "given": "Kipyegon"} +{"country": "KE", "family": "Mutinda", "given": "Julius"} +{"country": "KE", "family": "Kipkemoi", "given": "Kenneth"} +{"country": "KE", "family": "Wyre", "given": "Kevin"} +{"country": "KE", "family": "Chege", "given": "Laban"} +{"country": "KE", "family": "Korir", "given": "Laban"} +{"country": "KE", "family": "Kigen", "given": "Luka"} +{"country": "KE", "family": "Wallace", "given": "Marjorie"} +{"country": "KE", "family": "Wambui", "given": "Mary"} +{"country": "KE", "family": "Baraza", "given": "Mike"} +{"country": "KE", "family": "Özbilen", "given": "Mike"} +{"country": "KE", "family": "Kigen", "given": "Mike"} +{"country": "KE", "family": "Özbilen", "given": "Kaan"} +{"country": "KE", "family": "Kigen", "given": "Kaan"} +{"country": "KE", "family": "Sonko", "given": "Mike"} +{"country": "KE", "family": "Alango", "given": "Mildred"} +{"country": "KE", "family": "Were", "given": "Miriam"} +{"country": "KE", "family": "Gatheru", "given": "Mugo"} +{"country": "KE", "family": "Biwott", "given": "Nicholas"} +{"country": "KE", "family": "Okoth", "given": "Nick"} +{"country": "KE", "family": "Marlin", "given": "Olga"} +{"country": "KE", "family": "Ahmed", "given": "Omar"} +{"country": "KE", "family": "Muite", "given": "Paul"} +{"country": "KE", "family": "Cooke", "given": "Peter"} +{"country": "KE", "family": "Hooper", "given": "Peter"} +{"country": "KE", "family": "Odhiambo", "given": "Peter"} +{"country": "KE", "family": "Leakey", "given": "Philip"} +{"country": "KE", "family": "Kinuthia", "given": "Ruth"} +{"country": "KE", "family": "Cherono", "given": "Eva"} +{"country": "KE", "family": "Obunga", "given": "Harold"} +{"country": "KE", "family": "Maina", "given": "Maurice"} +{"country": "KE", "family": "Mutai", "given": "Beatrice"} +{"country": "KE", "family": "Dula", "given": "Peter"} +{"country": "KE", "family": "Oduor", "given": "Clarke"} +{"country": "KE", "family": "Amunga", "given": "Nancie"} +{"country": "KE", "family": "Bürmen", "given": "Barbara"} +{"country": "KE", "family": "Mbithi", "given": "Rebecca"} +{"country": "KE", "family": "Cherono", "given": "Fancy"} +{"country": "KE", "family": "Trapnell", "given": "Colin"} +{"country": "KE", "family": "Trapnell", "given": "Graham"} +{"country": "KE", "family": "Mohamed", "given": "Abdi"} +{"country": "KE", "family": "Tabichi", "given": "Peter"} +{"country": "KE", "family": "Mutua", "given": "Veronica"} +{"country": "KE", "family": "Waithaka", "given": "Stanley"} +{"country": "KE", "family": "Awiti", "given": "Prisca"} +{"country": "KE", "family": "Valani", "given": "Naila"} +{"country": "KE", "family": "Chemtai", "given": "Esther"} +{"country": "KE", "family": "Moraa", "given": "Mary"} +{"country": "KE", "family": "Wambui", "given": "jackline"} +{"country": "KE", "family": "Ndungu", "given": "Geoffrey"} +{"country": "KE", "family": "Kuria", "given": "Mary"} +{"country": "KE", "family": "Cherono", "given": "Joan"} +{"country": "KE", "family": "Jepkosgei", "given": "Nelly"} +{"country": "KE", "family": "Ahmed", "given": "Fardosa"} +{"country": "KE", "family": "Brunlehner", "given": "Maria"} +{"country": "KE", "family": "Wanyama", "given": "Mercy"} +{"country": "KE", "family": "Okoth", "given": "Belinda"} +{"country": "KE", "family": "Kennedy", "given": "Micheal"} +{"country": "KE", "family": "Thomas", "given": "Maureen"} +{"country": "KE", "family": "Ojiambo", "given": "Josephine"} +{"country": "KE", "family": "Gitahi", "given": "Mercy"} +{"country": "KE", "family": "Krop", "given": "Jacob"} +{"country": "KE", "family": "Kimeli", "given": "Nicholas"} +{"country": "KE", "family": "Wanjiru", "given": "Rosemary"} +{"country": "KE", "family": "Singh", "given": "Harvinder"} +{"country": "KE", "family": "Marwa", "given": "Harvinder"} +{"country": "KE", "family": "Sang", "given": "Rosemary"} +{"country": "KE", "family": "Kipruto", "given": "Amos"} +{"country": "KE", "family": "Bukeko", "given": "Charles"} +{"country": "KE", "family": "Omumbo", "given": "Judith"} +{"country": "KE", "family": "Omumbo", "given": "Judy"} +{"country": "KE", "family": "Sahle", "given": "Eunice"} +{"country": "KE", "family": "Murungi", "given": "Lucy"} +{"country": "KE", "family": "Chomba", "given": "Susan"} +{"country": "KE", "family": "Gachagua", "given": "Clifton"} +{"country": "KE", "family": "Hewett", "given": "Peter"} +{"country": "KE", "family": "Trzebinski", "given": "Anna"} +{"country": "KE", "family": "Mbuta", "given": "Jennifer"} +{"country": "KE", "family": "Kipchumba", "given": "Vincent"} +{"country": "KE", "family": "Koech", "given": "Nancy"} +{"country": "KE", "family": "Koech", "given": "Davy"} +{"country": "KE", "family": "Maina", "given": "David"} +{"country": "KE", "family": "Nderitu", "given": "Julius"} +{"country": "KE", "family": "Mungai", "given": "Samson"} +{"country": "KE", "family": "Elizabeth", "given": "Elizabeth"} +{"country": "KE", "family": "Wanjiru", "given": "Elizabeth"} +{"country": "KE", "family": "Tanui", "given": "Kelvin"} +{"country": "KE", "family": "Gatere", "given": "Tatu"} +{"country": "KE", "family": "Ireri", "given": "Gideon"} +{"country": "KE", "family": "Kiprop", "given": "Stephen"} +{"country": "KE", "family": "Otieno", "given": "Leonard"} +{"country": "KE", "family": "Kipsang", "given": "Abel"} +{"country": "KE", "family": "Kiprugut", "given": "Boaz"} +{"country": "KE", "family": "Onyango", "given": "Clayton"} +{"country": "KE", "family": "Mutuku", "given": "Paul"} +{"country": "KE", "family": "Muigai", "given": "Makenna"} +{"country": "KE", "family": "Khamis", "given": "Fathiya"} +{"country": "KE", "family": "Wanyama", "given": "Conrad"} +{"country": "KE", "family": "Waringa", "given": "Idah"} +{"country": "ZA", "family": "Mandela", "given": "Nelson"} +{"country": "ZA", "family": "Orlikowski", "given": "Wanda"} +{"country": "ZA", "family": "de Raadt", "given": "Theo"} +{"country": "ZA", "family": "Glasenberg", "given": "Ivan"} +{"country": "ZA", "family": "van den Bergh", "given": "Gert"} +{"country": "ZA", "family": "Basson", "given": "Christiaan"} +{"country": "ZA", "family": "Winslow", "given": "Charles"} +{"country": "ZA", "family": "Winslow", "given": "Lyndhurst"} +{"country": "ZA", "family": "Tutu", "given": "Desmond"} +{"country": "ZA", "family": "Coetzee", "given": "John"} +{"country": "ZA", "family": "Theiler", "given": "Max"} +{"country": "ZA", "family": "Gordimer", "given": "Nadine"} +{"country": "ZA", "family": "Jooste", "given": "Pamela"} +{"country": "ZA", "family": "Hewitt", "given": "Bob"} +{"country": "ZA", "family": "Curren", "given": "Kevin"} +{"country": "ZA", "family": "Huber", "given": "Liezel"} +{"country": "ZA", "family": "Kriek", "given": "Johan"} +{"country": "ZA", "family": "Vosloo", "given": "Gerhard"} +{"country": "ZA", "family": "Zuma", "given": "Jacob"} +{"country": "ZA", "family": "Brandt", "given": "Lesley-Ann"} +{"country": "ZA", "family": "Perls", "given": "Friedrich"} +{"country": "ZA", "family": "Perls", "given": "Salomon"} +{"country": "ZA", "family": "Bolus", "given": "Margaret"} +{"country": "ZA", "family": "Bolus", "given": "Harriet"} +{"country": "ZA", "family": "Bolus", "given": "Louisa"} +{"country": "ZA", "family": "Vonk", "given": "Hans"} +{"country": "ZA", "family": "Schwarz", "given": "Harry"} +{"country": "ZA", "family": "Schwarz", "given": "Heinz"} +{"country": "ZA", "family": "Brown", "given": "Arran"} +{"country": "ZA", "family": "Merensky", "given": "Hans"} +{"country": "ZA", "family": "Sagan", "given": "Leontine"} +{"country": "ZA", "family": "Schlesinger", "given": "Leontine"} +{"country": "ZA", "family": "Theron", "given": "Charlize"} +{"country": "ZA", "family": "Carpendale", "given": "Victor"} +{"country": "ZA", "family": "Carpendale", "given": "Howard"} +{"country": "ZA", "family": "Schweickerdt", "given": "Herold"} +{"country": "ZA", "family": "Arnold", "given": "Marc"} +{"country": "ZA", "family": "Trotter", "given": "Gideon"} +{"country": "ZA", "family": "Botha", "given": "Johan"} +{"country": "ZA", "family": "Cooke", "given": "Ronnie"} +{"country": "ZA", "family": "Mbeki", "given": "Thabo"} +{"country": "ZA", "family": "Kallenbach", "given": "Hermann"} +{"country": "ZA", "family": "Heidenfeld", "given": "Wolfgang"} +{"country": "ZA", "family": "Morake", "given": "Lebohang"} +{"country": "ZA", "family": "Coetzee", "given": "Jeff"} +{"country": "ZA", "family": "Strauss", "given": "Adriaan"} +{"country": "ZA", "family": "Brabetz", "given": "Christina"} +{"country": "ZA", "family": "Skewes", "given": "Stanley"} +{"country": "ZA", "family": "Cameron", "given": "Edwin"} +{"country": "ZA", "family": "Lambie", "given": "Patrick"} +{"country": "ZA", "family": "Courtenay", "given": "Bryce"} +{"country": "ZA", "family": "Jordaan", "given": "Theuns"} +{"country": "ZA", "family": "Logan", "given": "Lara"} +{"country": "ZA", "family": "Steenkamp", "given": "Gurthrö"} +{"country": "ZA", "family": "Matthews", "given": "Zachariah"} +{"country": "ZA", "family": "Achmat", "given": "Zackie"} +{"country": "ZA", "family": "Harrison", "given": "P."} +{"country": "ZA", "family": "George", "given": "David"} +{"country": "ZA", "family": "Makeba", "given": "Miriam"} +{"country": "ZA", "family": "Terre'Blanche", "given": "Eugène"} +{"country": "ZA", "family": "Schreiner", "given": "Albertina"} +{"country": "ZA", "family": "Schreiner", "given": "Emily"} +{"country": "ZA", "family": "Schreiner", "given": "Olive"} +{"country": "ZA", "family": "de Klerk", "given": "Frederik"} +{"country": "ZA", "family": "Botha", "given": "Louis"} +{"country": "ZA", "family": "Abramson", "given": "Larry"} +{"country": "ZA", "family": "Suzman", "given": "Helena"} +{"country": "ZA", "family": "Suzman", "given": "Helen"} +{"country": "ZA", "family": "Summers", "given": "Roger"} +{"country": "ZA", "family": "Maggs", "given": "Tony"} +{"country": "ZA", "family": "Pretorius", "given": "Jackie"} +{"country": "ZA", "family": "Lederle", "given": "Neville"} +{"country": "ZA", "family": "Keizan", "given": "Eddie"} +{"country": "ZA", "family": "Driver", "given": "Paddy"} +{"country": "ZA", "family": "Harris", "given": "Mike"} +{"country": "ZA", "family": "Scheckter", "given": "Ian"} +{"country": "ZA", "family": "Scheckter", "given": "Jody"} +{"country": "ZA", "family": "Murray", "given": "Gordon"} +{"country": "ZA", "family": "Blignaut", "given": "Alex"} +{"country": "ZA", "family": "Eiselen", "given": "Werner"} +{"country": "ZA", "family": "Gabriel", "given": "Paul"} +{"country": "ZA", "family": "Motsepe", "given": "Patrice"} +{"country": "ZA", "family": "Steyn", "given": "François"} +{"country": "ZA", "family": "Mokoena", "given": "Aaron"} +{"country": "ZA", "family": "Pienaar", "given": "Louis"} +{"country": "ZA", "family": "Williams", "given": "Cecil"} +{"country": "ZA", "family": "Meyer", "given": "Deon"} +{"country": "ZA", "family": "Barnard", "given": "Christiaan"} +{"country": "ZA", "family": "Neethling", "given": "Christiaan"} +{"country": "ZA", "family": "Nash", "given": "Steve"} +{"country": "ZA", "family": "Pienaar", "given": "Steven"} +{"country": "ZA", "family": "Marais", "given": "Jessica"} +{"country": "ZA", "family": "Geyer", "given": "Dean"} +{"country": "ZA", "family": "Pistorius", "given": "Leonard"} +{"country": "ZA", "family": "Pistorius", "given": "Oscar"} +{"country": "ZA", "family": "Pistorius", "given": "Carl"} +{"country": "ZA", "family": "Ramone", "given": "Philip"} +{"country": "ZA", "family": "Mandela", "given": "Zindziwa"} +{"country": "ZA", "family": "Tshabalala", "given": "Siphiwe"} +{"country": "ZA", "family": "Grimaldi", "given": "Charlene"} +{"country": "ZA", "family": "Luthuli", "given": "Albert"} +{"country": "ZA", "family": "Luthuli", "given": "John"} +{"country": "ZA", "family": "González", "given": "Mark"} +{"country": "ZA", "family": "Biko", "given": "Stephen"} +{"country": "ZA", "family": "Biko", "given": "Steve"} +{"country": "ZA", "family": "Dikgacoi", "given": "Kagisho"} +{"country": "ZA", "family": "Parker", "given": "Bernard"} +{"country": "ZA", "family": "Abrahams", "given": "Peter"} +{"country": "ZA", "family": "Maseko", "given": "Zola"} +{"country": "ZA", "family": "Budd", "given": "Zola"} +{"country": "ZA", "family": "Maliekal", "given": "Jacob"} +{"country": "ZA", "family": "Damon", "given": "Jérôme"} +{"country": "ZA", "family": "Cormack", "given": "Allan"} +{"country": "ZA", "family": "Shuttleworth", "given": "Mark"} +{"country": "ZA", "family": "Wicomb", "given": "Charlotte"} +{"country": "ZA", "family": "Wicomb", "given": "Zoë"} +{"country": "ZA", "family": "Baartman", "given": "Sara"} +{"country": "ZA", "family": "Baartman", "given": "Sarah"} +{"country": "ZA", "family": "Baartman", "given": "Saartjie"} +{"country": "ZA", "family": "Coetzer", "given": "Amanda"} +{"country": "ZA", "family": "Swanepoel", "given": "Candice"} +{"country": "ZA", "family": "Swanepoel", "given": "Susan"} +{"country": "ZA", "family": "Brenner", "given": "Sydney"} +{"country": "ZA", "family": "Scheepers", "given": "Chanelle"} +{"country": "ZA", "family": "Renault", "given": "Mary"} +{"country": "ZA", "family": "Wilson", "given": "Desiré"} +{"country": "ZA", "family": "Krige", "given": "Alice"} +{"country": "ZA", "family": "Krige", "given": "Maud"} +{"country": "ZA", "family": "Mandela", "given": "Winnie"} +{"country": "ZA", "family": "Machel", "given": "Graça"} +{"country": "ZA", "family": "Grandin", "given": "Natalie"} +{"country": "ZA", "family": "McGregor", "given": "Chris"} +{"country": "ZA", "family": "Pillay", "given": "Navanethem"} +{"country": "ZA", "family": "Mkhize", "given": "Lawrence"} +{"country": "ZA", "family": "Masekela", "given": "Hugh"} +{"country": "ZA", "family": "Ackerman", "given": "Raymond"} +{"country": "ZA", "family": "Richardson", "given": "Kevin"} +{"country": "ZA", "family": "Langeveldt", "given": "Lee"} +{"country": "ZA", "family": "Bouwer", "given": "Alba"} +{"country": "ZA", "family": "Krog", "given": "Antje"} +{"country": "ZA", "family": "Dumas", "given": "Marlene"} +{"country": "ZA", "family": "Davidtz", "given": "Embeth"} +{"country": "ZA", "family": "Heyns", "given": "Penelope"} +{"country": "ZA", "family": "Meyer", "given": "Elana"} +{"country": "ZA", "family": "Maree", "given": "Helen"} +{"country": "ZA", "family": "Zille", "given": "Helen"} +{"country": "ZA", "family": "Fairbank", "given": "Rosalyn"} +{"country": "ZA", "family": "Carter", "given": "Kevin"} +{"country": "ZA", "family": "Marlin", "given": "Calvin"} +{"country": "ZA", "family": "Brand", "given": "Esther"} +{"country": "ZA", "family": "Jones", "given": "Charles"} +{"country": "ZA", "family": "Jones", "given": "Alfred"} +{"country": "ZA", "family": "Jones", "given": "Trevor"} +{"country": "ZA", "family": "Mey", "given": "Karin"} +{"country": "ZA", "family": "Mey", "given": "Melis"} +{"country": "ZA", "family": "Suzman", "given": "Janet"} +{"country": "ZA", "family": "Connell", "given": "Elizabeth"} +{"country": "ZA", "family": "Tambo", "given": "Adelaide"} +{"country": "ZA", "family": "September", "given": "Dulcie"} +{"country": "ZA", "family": "Khumalo", "given": "Sibongile"} +{"country": "ZA", "family": "Uys", "given": "Johannes"} +{"country": "ZA", "family": "Uys", "given": "Jacobus"} +{"country": "ZA", "family": "Vlok", "given": "Adriaan"} +{"country": "ZA", "family": "Sing", "given": "Lynn"} +{"country": "ZA", "family": "Ferreira", "given": "Wayne"} +{"country": "ZA", "family": "Johnson", "given": "Gavin"} +{"country": "ZA", "family": "Hart", "given": "Susanne"} +{"country": "ZA", "family": "Hart", "given": "Sue"} +{"country": "ZA", "family": "Cloete", "given": "Stuart"} +{"country": "ZA", "family": "Zaugg", "given": "Adrian"} +{"country": "ZA", "family": "Impey", "given": "Daryl"} +{"country": "ZA", "family": "Mulder", "given": "Japie"} +{"country": "ZA", "family": "Sefolosha", "given": "Thabo"} +{"country": "ZA", "family": "Plato", "given": "Dan"} +{"country": "ZA", "family": "Dube", "given": "Lucky"} +{"country": "ZA", "family": "Schoeman", "given": "Roland"} +{"country": "ZA", "family": "Matthews", "given": "John"} +{"country": "ZA", "family": "Matthews", "given": "David"} +{"country": "ZA", "family": "Pringle", "given": "Thomas"} +{"country": "ZA", "family": "Swart", "given": "C."} +{"country": "ZA", "family": "Swart", "given": "R."} +{"country": "ZA", "family": "Brink", "given": "André"} +{"country": "ZA", "family": "Brink", "given": "Philippus"} +{"country": "ZA", "family": "du Preez", "given": "Fourie"} +{"country": "ZA", "family": "Raeburn", "given": "Michael"} +{"country": "ZA", "family": "Chaplin", "given": "Terence"} +{"country": "ZA", "family": "Chaplin", "given": "William"} +{"country": "ZA", "family": "Mulder", "given": "Cornelius"} +{"country": "ZA", "family": "Calvert", "given": "Robert"} +{"country": "ZA", "family": "Meer", "given": "Fatima"} +{"country": "ZA", "family": "du Plessis", "given": "François"} +{"country": "ZA", "family": "Ishiwatari", "given": "Daisuke"} +{"country": "ZA", "family": "Sichel", "given": "Herbert"} +{"country": "ZA", "family": "Miller", "given": "Esther"} +{"country": "ZA", "family": "Heine", "given": "Esther"} +{"country": "ZA", "family": "Miller", "given": "Bobbie"} +{"country": "ZA", "family": "Heine", "given": "Bobbie"} +{"country": "ZA", "family": "Kloss", "given": "Ilana"} +{"country": "ZA", "family": "Collen", "given": "Lindsey"} +{"country": "ZA", "family": "Joseph", "given": "Helen"} +{"country": "ZA", "family": "Bieber", "given": "Jodi"} +{"country": "ZA", "family": "Mntambo", "given": "Nandipha"} +{"country": "ZA", "family": "Rose", "given": "Tracey"} +{"country": "ZA", "family": "Heerden", "given": "Elrio"} +{"country": "ZA", "family": "Passamonte", "given": "Francesca"} +{"country": "ZA", "family": "Passamonte", "given": "Chantal"} +{"country": "ZA", "family": "Blum", "given": "Peter"} +{"country": "ZA", "family": "Walker", "given": "Edgar"} +{"country": "ZA", "family": "Walker", "given": "Reginald"} +{"country": "ZA", "family": "Mokoena", "given": "Godfrey"} +{"country": "ZA", "family": "Swart", "given": "Carla"} +{"country": "ZA", "family": "Hood", "given": "Gavin"} +{"country": "ZA", "family": "Robb", "given": "Evelyn"} +{"country": "ZA", "family": "Hasenjäger", "given": "Evelyn"} +{"country": "ZA", "family": "Robb", "given": "Daphne"} +{"country": "ZA", "family": "Hasenjäger", "given": "Daphne"} +{"country": "ZA", "family": "Robb", "given": "Lilian"} +{"country": "ZA", "family": "Hasenjäger", "given": "Lilian"} +{"country": "ZA", "family": "Clark", "given": "Marjorie"} +{"country": "ZA", "family": "Bakkes", "given": "Margaret"} +{"country": "ZA", "family": "Zoid", "given": "Karen"} +{"country": "ZA", "family": "Prinsloo", "given": "Sandra"} +{"country": "ZA", "family": "Rafael", "given": "Sylvia"} +{"country": "ZA", "family": "Dana", "given": "Simphiwe"} +{"country": "ZA", "family": "Schlebusch", "given": "Alwyn"} +{"country": "ZA", "family": "Malherbe", "given": "Arnaud"} +{"country": "ZA", "family": "Poewe", "given": "Sarah"} +{"country": "ZA", "family": "Jackson", "given": "Cyril"} +{"country": "ZA", "family": "First", "given": "Ruth"} +{"country": "ZA", "family": "Jonker", "given": "Ingrid"} +{"country": "ZA", "family": "Head", "given": "Bessie"} +{"country": "ZA", "family": "Grae", "given": "Jean"} +{"country": "ZA", "family": "Schuurman", "given": "Renée"} +{"country": "ZA", "family": "Charlton", "given": "Dave"} +{"country": "ZA", "family": "Pasio", "given": "Ashleigh"} +{"country": "ZA", "family": "Dundee", "given": "Sean"} +{"country": "ZA", "family": "Stern", "given": "Irma"} +{"country": "ZA", "family": "Nofal", "given": "Emil"} +{"country": "ZA", "family": "Wilmot", "given": "Lorrie"} +{"country": "ZA", "family": "Burger", "given": "Schalk"} +{"country": "ZA", "family": "Barber", "given": "Glynis"} +{"country": "ZA", "family": "Agliotti", "given": "Marilyn"} +{"country": "ZA", "family": "Stewart", "given": "Dale"} +{"country": "ZA", "family": "Verwoerd", "given": "Hendrik"} +{"country": "ZA", "family": "Vosloo", "given": "Arnold"} +{"country": "ZA", "family": "Anderson", "given": "Kevin"} +{"country": "ZA", "family": "Booth", "given": "Matthew"} +{"country": "ZA", "family": "le Clos", "given": "Chad"} +{"country": "ZA", "family": "Nomvete", "given": "Siyabonga"} +{"country": "ZA", "family": "Davids", "given": "Lance"} +{"country": "ZA", "family": "Musk", "given": "Elon"} +{"country": "ZA", "family": "Musk", "given": "Reeve"} +{"country": "ZA", "family": "Abdurahman", "given": "Abdullah"} +{"country": "ZA", "family": "Haron", "given": "Abdullah"} +{"country": "ZA", "family": "Brand", "given": "Abdullah"} +{"country": "ZA", "family": "Ibrahim", "given": "Abdullah"} +{"country": "ZA", "family": "Brand", "given": "Johannes"} +{"country": "ZA", "family": "Ibrahim", "given": "Johannes"} +{"country": "ZA", "family": "Brand", "given": "Adolph"} +{"country": "ZA", "family": "Ibrahim", "given": "Adolph"} +{"country": "ZA", "family": "Van der Burgh", "given": "Cameron"} +{"country": "ZA", "family": "Gabuza", "given": "Abel"} +{"country": "ZA", "family": "Mkhatshwa", "given": "Smangaliso"} +{"country": "ZA", "family": "Stanley", "given": "Richard"} +{"country": "ZA", "family": "Payn", "given": "Graham"} +{"country": "ZA", "family": "du Plessis", "given": "Jannie"} +{"country": "ZA", "family": "Roberts", "given": "Austin"} +{"country": "ZA", "family": "Fortune", "given": "Quinton"} +{"country": "ZA", "family": "Papert", "given": "Seymour"} +{"country": "ZA", "family": "Papert", "given": "Aubrey"} +{"country": "ZA", "family": "Bekker", "given": "Daniel"} +{"country": "ZA", "family": "Winckler", "given": "Heinrich"} +{"country": "ZA", "family": "Winckler", "given": "Carl"} +{"country": "ZA", "family": "Winckler", "given": "Heinz"} +{"country": "ZA", "family": "De Vries", "given": "Casper"} +{"country": "ZA", "family": "Hertzog", "given": "Albert"} +{"country": "ZA", "family": "Syster", "given": "Ian"} +{"country": "ZA", "family": "Thys", "given": "Gert"} +{"country": "ZA", "family": "Fortes", "given": "Meyer"} +{"country": "ZA", "family": "Swift", "given": "Alfred"} +{"country": "ZA", "family": "Fowler", "given": "Robert"} +{"country": "ZA", "family": "Robinson", "given": "Raymond"} +{"country": "ZA", "family": "Robinson", "given": "Ray"} +{"country": "ZA", "family": "Schapera", "given": "Isaac"} +{"country": "ZA", "family": "Radebe", "given": "Lucas"} +{"country": "ZA", "family": "Glasser", "given": "Adam"} +{"country": "ZA", "family": "Lange", "given": "Malcolm"} +{"country": "ZA", "family": "Bergin", "given": "Sean"} +{"country": "ZA", "family": "Valcke", "given": "Jérôme"} +{"country": "ZA", "family": "Hertzog", "given": "James"} +{"country": "ZA", "family": "Hertzog", "given": "Barry"} +{"country": "ZA", "family": "Smith", "given": "Wilbur"} +{"country": "ZA", "family": "Smith", "given": "Addison"} +{"country": "ZA", "family": "Strijdom", "given": "Johannes"} +{"country": "ZA", "family": "Venter", "given": "Jaco"} +{"country": "ZA", "family": "Hunter", "given": "Robert"} +{"country": "ZA", "family": "Marais", "given": "Marais"} +{"country": "ZA", "family": "Broom", "given": "Robert"} +{"country": "ZA", "family": "Tambo", "given": "Oliver"} +{"country": "ZA", "family": "Tomson", "given": "Shaun"} +{"country": "ZA", "family": "Paton", "given": "Alan Stewart"} +{"country": "ZA", "family": "Innes", "given": "Robert"} +{"country": "ZA", "family": "Innes", "given": "Thorburn"} +{"country": "ZA", "family": "Breytenbach", "given": "Breyten"} +{"country": "ZA", "family": "Rabin", "given": "Charles"} +{"country": "ZA", "family": "Rabin", "given": "Trevor"} +{"country": "ZA", "family": "Crous", "given": "Piet"} +{"country": "ZA", "family": "Botha", "given": "Adriaan"} +{"country": "ZA", "family": "Immelman", "given": "Trevor"} +{"country": "ZA", "family": "Harmse", "given": "Chris"} +{"country": "ZA", "family": "Sisulu", "given": "Albertina"} +{"country": "ZA", "family": "Phoenix", "given": "Tanit"} +{"country": "ZA", "family": "Allan", "given": "Jani"} +{"country": "ZA", "family": "Harrison", "given": "Joan"} +{"country": "ZA", "family": "Breytenbach", "given": "Jan"} +{"country": "ZA", "family": "Player", "given": "Gary"} +{"country": "ZA", "family": "MacArthur", "given": "Ken"} +{"country": "ZA", "family": "Joubert", "given": "Piet"} +{"country": "ZA", "family": "Roberts", "given": "Kate"} +{"country": "ZA", "family": "Masondo", "given": "Amos"} +{"country": "ZA", "family": "Carnell", "given": "Bradley"} +{"country": "ZA", "family": "Arendse", "given": "Andre"} +{"country": "ZA", "family": "Wood", "given": "Harry"} +{"country": "ZA", "family": "Feinstein", "given": "Andrew"} +{"country": "ZA", "family": "Mehrtens", "given": "Andrew"} +{"country": "ZA", "family": "Murray", "given": "Andrew"} +{"country": "ZA", "family": "Behr", "given": "Mark"} +{"country": "ZA", "family": "Surman", "given": "Andrew"} +{"country": "ZA", "family": "Venter", "given": "André"} +{"country": "ZA", "family": "Price", "given": "Sandra"} +{"country": "ZA", "family": "Galgut", "given": "Damon"} +{"country": "ZA", "family": "Visser", "given": "Andries"} +{"country": "ZA", "family": "Potgieter", "given": "Andries"} +{"country": "ZA", "family": "Potgieter", "given": "Hendrik"} +{"country": "ZA", "family": "Treurnicht", "given": "Andries"} +{"country": "ZA", "family": "Vermaak", "given": "Yvonne"} +{"country": "ZA", "family": "Ngoyi", "given": "Lillian"} +{"country": "ZA", "family": "Dougherty", "given": "Michele"} +{"country": "ZA", "family": "Ferreira", "given": "Ellis"} +{"country": "ZA", "family": "Copley", "given": "Sharlto"} +{"country": "ZA", "family": "Smal", "given": "Gert"} +{"country": "ZA", "family": "Van Zyl", "given": "Louis"} +{"country": "ZA", "family": "Van Zyl", "given": "Jacobus"} +{"country": "ZA", "family": "Sacks", "given": "Ruth"} +{"country": "ZA", "family": "Viljoen", "given": "Annari"} +{"country": "ZA", "family": "Stevens", "given": "Greer"} +{"country": "ZA", "family": "Spence", "given": "Malcolm"} +{"country": "ZA", "family": "Josephs", "given": "Janice"} +{"country": "ZA", "family": "Engelbrecht", "given": "Kim"} +{"country": "ZA", "family": "Goldstone", "given": "Richard"} +{"country": "ZA", "family": "Kaplan", "given": "Dena"} +{"country": "ZA", "family": "Botha", "given": "Gary"} +{"country": "ZA", "family": "Hume", "given": "Gavin"} +{"country": "ZA", "family": "Bester", "given": "Willie"} +{"country": "ZA", "family": "Goldreich", "given": "Arthur"} +{"country": "ZA", "family": "Le Roux", "given": "Isabel"} +{"country": "ZA", "family": "Stander", "given": "Charles"} +{"country": "ZA", "family": "Stander", "given": "André"} +{"country": "ZA", "family": "Uys", "given": "Antoinette"} +{"country": "ZA", "family": "Hewitt", "given": "John"} +{"country": "ZA", "family": "Edwards", "given": "Claire"} +{"country": "ZA", "family": "Edwards", "given": "Michelle"} +{"country": "ZA", "family": "Haines", "given": "Jessica"} +{"country": "ZA", "family": "Byrne", "given": "Rory"} +{"country": "ZA", "family": "Napier", "given": "Wilfrid"} +{"country": "ZA", "family": "Bremer", "given": "Karl"} +{"country": "ZA", "family": "Shaikh", "given": "Shamima"} +{"country": "ZA", "family": "Olivier", "given": "Wynand"} +{"country": "ZA", "family": "Kistner", "given": "Wolfram"} +{"country": "ZA", "family": "Parkin", "given": "Mike"} +{"country": "ZA", "family": "Parkin", "given": "Terence"} +{"country": "ZA", "family": "Farewell", "given": "Francis"} +{"country": "ZA", "family": "Taylor", "given": "Wayne"} +{"country": "ZA", "family": "Schwartzel", "given": "Charlie"} +{"country": "ZA", "family": "Naidoo", "given": "Beverley"} +{"country": "ZA", "family": "Lill", "given": "Darren"} +{"country": "ZA", "family": "Xuma", "given": "Alfred"} +{"country": "ZA", "family": "Oliver", "given": "Edward"} +{"country": "ZA", "family": "Kruger", "given": "James"} +{"country": "ZA", "family": "Kruger", "given": "Thomas"} +{"country": "ZA", "family": "Harrington", "given": "Lee"} +{"country": "ZA", "family": "Tlali", "given": "Miriam"} +{"country": "ZA", "family": "Strydom", "given": "Amanda"} +{"country": "ZA", "family": "Scholtz", "given": "Andrew"} +{"country": "ZA", "family": "Jonker", "given": "Marius"} +{"country": "ZA", "family": "Wentzel", "given": "Marco"} +{"country": "ZA", "family": "Smit", "given": "Bertus"} +{"country": "ZA", "family": "Baker", "given": "Eleanor"} +{"country": "ZA", "family": "Ayres", "given": "Thomas"} +{"country": "ZA", "family": "Dommisse", "given": "Hermien"} +{"country": "ZA", "family": "Verwey", "given": "Bobby"} +{"country": "ZA", "family": "Scheckter", "given": "Toby"} +{"country": "ZA", "family": "Teixeira", "given": "Tony"} +{"country": "ZA", "family": "Thompson", "given": "Tracey"} +{"country": "ZA", "family": "van Wyk", "given": "Abraham"} +{"country": "ZA", "family": "van Wyk", "given": "Erasmus"} +{"country": "ZA", "family": "Ferguson", "given": "William"} +{"country": "ZA", "family": "Botha", "given": "Tyler"} +{"country": "ZA", "family": "Nhleko", "given": "Toni"} +{"country": "ZA", "family": "Karen", "given": "Anna"} +{"country": "ZA", "family": "Murray", "given": "John"} +{"country": "ZA", "family": "Boucher", "given": "Candice"} +{"country": "ZA", "family": "Hall", "given": "Megan"} +{"country": "ZA", "family": "Rauch", "given": "Laurika"} +{"country": "ZA", "family": "Cole", "given": "Bobby"} +{"country": "ZA", "family": "Joubert", "given": "Elsa"} +{"country": "ZA", "family": "Townsend", "given": "Darian"} +{"country": "ZA", "family": "Bland", "given": "John"} +{"country": "ZA", "family": "Woolcock", "given": "Waylon"} +{"country": "ZA", "family": "Viljoen", "given": "Constand"} +{"country": "ZA", "family": "Pienaar", "given": "Ruan"} +{"country": "ZA", "family": "Viljoen", "given": "Willem"} +{"country": "ZA", "family": "Viljoen", "given": "Abraham"} +{"country": "ZA", "family": "Dobie", "given": "Wilma"} +{"country": "ZA", "family": "Prade", "given": "Wilma"} +{"country": "ZA", "family": "Somma", "given": "Davide"} +{"country": "ZA", "family": "Mulroy", "given": "Garth"} +{"country": "ZA", "family": "Jackson", "given": "Willem"} +{"country": "ZA", "family": "Coelen", "given": "Penelope"} +{"country": "ZA", "family": "Nzama", "given": "Cyril"} +{"country": "ZA", "family": "Weichardt", "given": "Louis"} +{"country": "ZA", "family": "Phillips", "given": "Alan"} +{"country": "ZA", "family": "Parsons", "given": "Alan"} +{"country": "ZA", "family": "Coetzee", "given": "Tansey"} +{"country": "ZA", "family": "Cronin", "given": "Alfred"} +{"country": "ZA", "family": "Duggan", "given": "Alfred"} +{"country": "ZA", "family": "Ngobeni", "given": "Clifford"} +{"country": "ZA", "family": "Ferreira", "given": "Jeanette"} +{"country": "ZA", "family": "Hayes", "given": "Dale"} +{"country": "ZA", "family": "Gunning", "given": "Boudewijn"} +{"country": "ZA", "family": "Gunning", "given": "Jan"} +{"country": "ZA", "family": "Gunning", "given": "Willem"} +{"country": "ZA", "family": "Wilson", "given": "Francis"} +{"country": "ZA", "family": "Motaung", "given": "Sizwe"} +{"country": "ZA", "family": "Botha", "given": "Leon"} +{"country": "ZA", "family": "Kriel", "given": "Anneline"} +{"country": "ZA", "family": "Kirsten", "given": "Gary"} +{"country": "ZA", "family": "Brand", "given": "Quintin"} +{"country": "ZA", "family": "Aston", "given": "Ferdy"} +{"country": "ZA", "family": "Simpson", "given": "Stephen"} +{"country": "ZA", "family": "Vermaak", "given": "Ian"} +{"country": "ZA", "family": "Basson", "given": "Jean"} +{"country": "ZA", "family": "Tshabalala", "given": "Vincent"} +{"country": "ZA", "family": "Nhlapo", "given": "Tumelo"} +{"country": "ZA", "family": "Basson", "given": "Annelie"} +{"country": "ZA", "family": "Botes", "given": "Annelie"} +{"country": "ZA", "family": "February", "given": "Alexander"} +{"country": "ZA", "family": "February", "given": "Vernon"} +{"country": "ZA", "family": "Pocock", "given": "David"} +{"country": "ZA", "family": "Gerber", "given": "Danie"} +{"country": "ZA", "family": "Kuiper", "given": "Taco"} +{"country": "ZA", "family": "Aiken", "given": "Thomas"} +{"country": "ZA", "family": "Palmer", "given": "Ian"} +{"country": "ZA", "family": "Smith", "given": "William"} +{"country": "ZA", "family": "Ferreira", "given": "Anton"} +{"country": "ZA", "family": "Fischer", "given": "Abraham"} +{"country": "ZA", "family": "Badenhorst", "given": "Adri"} +{"country": "ZA", "family": "Jacobs", "given": "Adrian"} +{"country": "ZA", "family": "Channing", "given": "Alan"} +{"country": "ZA", "family": "Skene", "given": "Alan"} +{"country": "ZA", "family": "Heerden", "given": "Alan"} +{"country": "ZA", "family": "van den Berg", "given": "Albert"} +{"country": "ZA", "family": "Pavlov", "given": "Alex"} +{"country": "ZA", "family": "Heath", "given": "Alexander"} +{"country": "ZA", "family": "Preller", "given": "Alexis"} +{"country": "ZA", "family": "Neave", "given": "Alida"} +{"country": "ZA", "family": "Haagner", "given": "Karl"} +{"country": "ZA", "family": "Haagner", "given": "Alwin"} +{"country": "ZA", "family": "Wessels", "given": "Robert"} +{"country": "ZA", "family": "Snyman", "given": "Andre"} +{"country": "ZA", "family": "Aitken", "given": "Andrew"} +{"country": "ZA", "family": "MacLean", "given": "Andrew"} +{"country": "ZA", "family": "Thomson", "given": "James"} +{"country": "ZA", "family": "Thomson", "given": "Andrew"} +{"country": "ZA", "family": "Wilson", "given": "Andrew"} +{"country": "ZA", "family": "Bekker", "given": "Andries"} +{"country": "ZA", "family": "Darvall", "given": "Denise"} +{"country": "ZA", "family": "Smith", "given": "Pauline"} +{"country": "ZA", "family": "Aschenborn", "given": "Uli"} +{"country": "ZA", "family": "Scholefield", "given": "Alan"} +{"country": "ZA", "family": "Vladislavich", "given": "Ivan"} +{"country": "ZA", "family": "Rudd", "given": "Bevil"} +{"country": "ZA", "family": "Freitag", "given": "Jacques"} +{"country": "ZA", "family": "Darren", "given": "Kurt"} +{"country": "ZA", "family": "Hani", "given": "Chris"} +{"country": "ZA", "family": "Louw", "given": "Eric"} +{"country": "ZA", "family": "Buthelezi", "given": "Mangosuthu"} +{"country": "ZA", "family": "Brislin", "given": "Stephen"} +{"country": "ZA", "family": "Cooper", "given": "David"} +{"country": "ZA", "family": "Smith", "given": "Ann"} +{"country": "ZA", "family": "Parsons", "given": "Ann"} +{"country": "ZA", "family": "Gordhan", "given": "Pravin"} +{"country": "ZA", "family": "Botha", "given": "Roelof"} +{"country": "ZA", "family": "Botha", "given": "Frederik"} +{"country": "ZA", "family": "Oosthuizen", "given": "Louis"} +{"country": "ZA", "family": "Bain", "given": "Thomas"} +{"country": "ZA", "family": "Clegg", "given": "Jonathan"} +{"country": "ZA", "family": "Clegg", "given": "Paul"} +{"country": "ZA", "family": "Arneil", "given": "Steve"} +{"country": "ZA", "family": "Williams", "given": "Danny"} +{"country": "ZA", "family": "Wolpe", "given": "Joseph"} +{"country": "ZA", "family": "Landsman", "given": "Anne"} +{"country": "ZA", "family": "Tovey", "given": "Neil"} +{"country": "ZA", "family": "Goldblatt", "given": "David"} +{"country": "ZA", "family": "Cech", "given": "Donovan"} +{"country": "ZA", "family": "Fischer", "given": "Louis"} +{"country": "ZA", "family": "Dodds", "given": "Thomas"} +{"country": "ZA", "family": "Killeen", "given": "Len"} +{"country": "ZA", "family": "Drysdale", "given": "Eric"} +{"country": "ZA", "family": "Drysdale", "given": "Cliff"} +{"country": "ZA", "family": "Drysdale", "given": "Clifford"} +{"country": "ZA", "family": "Adams", "given": "David"} +{"country": "ZA", "family": "Kriel", "given": "Anton"} +{"country": "ZA", "family": "Cronje", "given": "Pieter"} +{"country": "ZA", "family": "Cronje", "given": "Piet"} +{"country": "ZA", "family": "Cronje", "given": "Arnoldus"} +{"country": "ZA", "family": "Gardiner", "given": "Margaret"} +{"country": "ZA", "family": "Rupert", "given": "Anton"} +{"country": "ZA", "family": "Rabinowitz", "given": "Philip"} +{"country": "ZA", "family": "James", "given": "Butch"} +{"country": "ZA", "family": "Brink", "given": "Robby"} +{"country": "ZA", "family": "Brink", "given": "Robbie"} +{"country": "ZA", "family": "Fugard", "given": "Athol"} +{"country": "ZA", "family": "Kinkead", "given": "Samuel"} +{"country": "ZA", "family": "Fry", "given": "Stephen"} +{"country": "ZA", "family": "Goldblatt", "given": "Peter"} +{"country": "ZA", "family": "Price", "given": "Nick"} +{"country": "ZA", "family": "Mulder", "given": "Chris"} +{"country": "ZA", "family": "Jones", "given": "Watkin"} +{"country": "ZA", "family": "Gould", "given": "Morgan"} +{"country": "ZA", "family": "Evans", "given": "Brett"} +{"country": "ZA", "family": "Godwin", "given": "Neville"} +{"country": "ZA", "family": "Botha", "given": "Stoffel"} +{"country": "ZA", "family": "Hougaard", "given": "Derick"} +{"country": "ZA", "family": "Cullinan", "given": "Thomas"} +{"country": "ZA", "family": "Lister", "given": "Moira"} +{"country": "ZA", "family": "Issa", "given": "Pierre"} +{"country": "ZA", "family": "Carson", "given": "James"} +{"country": "ZA", "family": "Carson", "given": "Stewart"} +{"country": "ZA", "family": "Williams", "given": "Mark"} +{"country": "ZA", "family": "Manuel", "given": "Trevor"} +{"country": "ZA", "family": "De Wet", "given": "Carel"} +{"country": "ZA", "family": "Kaplan", "given": "Ariel"} +{"country": "ZA", "family": "Stoltz", "given": "Conrad"} +{"country": "ZA", "family": "Stevens", "given": "Austin"} +{"country": "ZA", "family": "Schoeman", "given": "Stephanus"} +{"country": "ZA", "family": "Rhode", "given": "Robin"} +{"country": "ZA", "family": "Beukes", "given": "Lauren"} +{"country": "ZA", "family": "Davel", "given": "Harry"} +{"country": "ZA", "family": "Davel", "given": "Henry"} +{"country": "ZA", "family": "Naudé", "given": "Frederick"} +{"country": "ZA", "family": "Naudé", "given": "Christiaan"} +{"country": "ZA", "family": "Naudé", "given": "Beyers"} +{"country": "ZA", "family": "Kentridge", "given": "William"} +{"country": "ZA", "family": "Leipoldt", "given": "Fred"} +{"country": "ZA", "family": "Leipoldt", "given": "Louis"} +{"country": "ZA", "family": "Leipoldt", "given": "Christian"} +{"country": "ZA", "family": "Pietersen", "given": "Joe"} +{"country": "ZA", "family": "Barnard", "given": "Harcourt"} +{"country": "ZA", "family": "Barnard", "given": "Keppel"} +{"country": "ZA", "family": "Boucher", "given": "Mark"} +{"country": "ZA", "family": "Spence", "given": "Patrick"} +{"country": "ZA", "family": "Le Roux", "given": "Hendrik"} +{"country": "ZA", "family": "Hurter", "given": "Marius"} +{"country": "ZA", "family": "Corbett", "given": "Marius"} +{"country": "ZA", "family": "Lazarus", "given": "Arnold"} +{"country": "ZA", "family": "Scheckter", "given": "Tomas"} +{"country": "ZA", "family": "Fiasconaro", "given": "Marcello"} +{"country": "ZA", "family": "Alport", "given": "Arthur"} +{"country": "ZA", "family": "Alport", "given": "Cecil"} +{"country": "ZA", "family": "Wolpert", "given": "Lewis"} +{"country": "ZA", "family": "Clark", "given": "Tim"} +{"country": "ZA", "family": "Rotem", "given": "Reuven"} +{"country": "ZA", "family": "Beck", "given": "Aletta"} +{"country": "ZA", "family": "Cassie", "given": "Monique"} +{"country": "ZA", "family": "Glass", "given": "Linzi"} +{"country": "ZA", "family": "Milne", "given": "Brad"} +{"country": "ZA", "family": "Moses", "given": "Brad"} +{"country": "ZA", "family": "Phillips", "given": "Brad"} +{"country": "ZA", "family": "Holland", "given": "Heidi"} +{"country": "ZA", "family": "Vaughan", "given": "Bradford"} +{"country": "ZA", "family": "August", "given": "Bradley"} +{"country": "ZA", "family": "Barnes", "given": "Bradley"} +{"country": "ZA", "family": "Player", "given": "Bradley"} +{"country": "ZA", "family": "Ritson", "given": "Bradley"} +{"country": "ZA", "family": "Pettersson", "given": "Tina"} +{"country": "ZA", "family": "Pieters", "given": "Brandon"} +{"country": "ZA", "family": "Williams", "given": "Brandon"} +{"country": "ZA", "family": "O'Mara", "given": "Bridgid"} +{"country": "ZA", "family": "Gourley", "given": "Brenda"} +{"country": "ZA", "family": "Williams", "given": "Brenda"} +{"country": "ZA", "family": "Young", "given": "Brendan"} +{"country": "ZA", "family": "Adams", "given": "Brendon"} +{"country": "ZA", "family": "Stirton", "given": "Brent"} +{"country": "ZA", "family": "Bailey", "given": "Brett"} +{"country": "ZA", "family": "Kebble", "given": "Brett"} +{"country": "ZA", "family": "Schultz", "given": "Brett"} +{"country": "ZA", "family": "Thompson", "given": "Brett"} +{"country": "ZA", "family": "Best", "given": "Brian"} +{"country": "ZA", "family": "Loots", "given": "Mandy"} +{"country": "ZA", "family": "McMillan", "given": "Brian"} +{"country": "ZA", "family": "Menell", "given": "Brian"} +{"country": "ZA", "family": "Murray", "given": "Brian"} +{"country": "ZA", "family": "Bell", "given": "Brian"} +{"country": "ZA", "family": "Peterson", "given": "Brian"} +{"country": "ZA", "family": "Mabaso", "given": "Kopano"} +{"country": "ZA", "family": "Matlwa", "given": "Kopano"} +{"country": "ZA", "family": "Radebe", "given": "Bridgette"} +{"country": "ZA", "family": "Harris", "given": "Juan"} +{"country": "ZA", "family": "Clarke", "given": "Bruce"} +{"country": "ZA", "family": "Dalling", "given": "Bruce"} +{"country": "ZA", "family": "Fordyce", "given": "Bruce"} +{"country": "ZA", "family": "Gordon", "given": "Bruce"} +{"country": "ZA", "family": "Jacobs", "given": "Bruce"} +{"country": "ZA", "family": "Murray", "given": "Bruce"} +{"country": "ZA", "family": "Murray", "given": "Ronald"} +{"country": "ZA", "family": "Murray", "given": "George"} +{"country": "ZA", "family": "Roberts", "given": "Bruce"} +{"country": "ZA", "family": "Warner", "given": "Bruce"} +{"country": "ZA", "family": "Schonstein", "given": "Patricia"} +{"country": "ZA", "family": "Bester", "given": "Madge"} +{"country": "ZA", "family": "Ngcuka", "given": "Bulelani"} +{"country": "ZA", "family": "Vukwana", "given": "Bulelani"} +{"country": "ZA", "family": "Reid", "given": "Bunny"} +{"country": "ZA", "family": "Francis", "given": "Burton"} +{"country": "ZA", "family": "O'Brien", "given": "Burton"} +{"country": "ZA", "family": "Steyn", "given": "Butch"} +{"country": "ZA", "family": "Bekker", "given": "Byron"} +{"country": "ZA", "family": "McGuigan", "given": "Byron"} +{"country": "ZA", "family": "Henkel", "given": "Caesar"} +{"country": "ZA", "family": "Cohen", "given": "Stanley"} +{"country": "ZA", "family": "Visagie", "given": "Callie"} +{"country": "ZA", "family": "Kadi", "given": "Calvin"} +{"country": "ZA", "family": "Jacobs", "given": "Cameron"} +{"country": "ZA", "family": "McIntosh", "given": "Cameron"} +{"country": "ZA", "family": "Lill", "given": "Candice"} +{"country": "ZA", "family": "Neethling", "given": "Candice"} +{"country": "ZA", "family": "Morgan", "given": "Candice"} +{"country": "ZA", "family": "Bradfield", "given": "Carl"} +{"country": "ZA", "family": "Davis", "given": "Carl"} +{"country": "ZA", "family": "Wegner", "given": "Carl"} +{"country": "ZA", "family": "Gagiano", "given": "Carlo"} +{"country": "ZA", "family": "Scott", "given": "Carlo"} +{"country": "ZA", "family": "Joyce", "given": "Carol"} +{"country": "ZA", "family": "Taylor", "given": "Catherine"} +{"country": "ZA", "family": "O'Dowd", "given": "Cathy"} +{"country": "ZA", "family": "Afrika", "given": "Cecil"} +{"country": "ZA", "family": "Higgs", "given": "Cecil"} +{"country": "ZA", "family": "Baker", "given": "Cecil"} +{"country": "ZA", "family": "Margo", "given": "Cecil"} +{"country": "ZA", "family": "Moss", "given": "Cecil"} +{"country": "ZA", "family": "Skotnes", "given": "Cecil"} +{"country": "ZA", "family": "Thompson", "given": "Cecil"} +{"country": "ZA", "family": "Bowes", "given": "Chad"} +{"country": "ZA", "family": "Harpur", "given": "Chad"} +{"country": "ZA", "family": "Keegan", "given": "Chad"} +{"country": "ZA", "family": "Simmonds", "given": "Chanel"} +{"country": "ZA", "family": "van den Berg", "given": "Charl"} +{"country": "ZA", "family": "Smith", "given": "Charlene"} +{"country": "ZA", "family": "Breedt", "given": "Nico"} +{"country": "ZA", "family": "Pretorius", "given": "Nicolaas"} +{"country": "ZA", "family": "Smit", "given": "Nicolaas"} +{"country": "ZA", "family": "Farquharson", "given": "Norman"} +{"country": "ZA", "family": "Rosenthal", "given": "Edward"} +{"country": "ZA", "family": "Rosenthal", "given": "Norman"} +{"country": "ZA", "family": "Jordaan", "given": "Norman"} +{"country": "ZA", "family": "Curran", "given": "Kevin"} +{"country": "ZA", "family": "Richardson", "given": "Dave"} +{"country": "ZA", "family": "Le Roux", "given": "Ollie"} +{"country": "ZA", "family": "Richardson", "given": "Richie"} +{"country": "ZA", "family": "Le Roux", "given": "Pieter"} +{"country": "ZA", "family": "Marcus", "given": "Gill"} +{"country": "ZA", "family": "Scott", "given": "Peter"} +{"country": "ZA", "family": "Barnard", "given": "Pat"} +{"country": "ZA", "family": "Bosch", "given": "Paul"} +{"country": "ZA", "family": "Nash", "given": "Paul"} +{"country": "ZA", "family": "Roos", "given": "Paul"} +{"country": "ZA", "family": "Wannenburg", "given": "Pedrie"} +{"country": "ZA", "family": "Rubens", "given": "Percival"} +{"country": "ZA", "family": "Yutar", "given": "Percy"} +{"country": "ZA", "family": "Grant", "given": "Peter"} +{"country": "ZA", "family": "Marais", "given": "Peter"} +{"country": "ZA", "family": "Marais", "given": "Petrus"} +{"country": "ZA", "family": "van der Westhuizen", "given": "Peter"} +{"country": "ZA", "family": "Abramovitz", "given": "Gerald"} +{"country": "ZA", "family": "Hauman", "given": "Petrus"} +{"country": "ZA", "family": "Buys", "given": "Philip"} +{"country": "ZA", "family": "Burger", "given": "Philipp"} +{"country": "ZA", "family": "Lemmer", "given": "Philipp"} +{"country": "ZA", "family": "Spies", "given": "Phillip"} +{"country": "ZA", "family": "Joubert", "given": "Pierre"} +{"country": "ZA", "family": "Greyling", "given": "Piet"} +{"country": "ZA", "family": "Grobler", "given": "Pieter"} +{"country": "ZA", "family": "Hendriks", "given": "Pieter"} +{"country": "ZA", "family": "Louw", "given": "Pieter"} +{"country": "ZA", "family": "Muller", "given": "Pieter"} +{"country": "ZA", "family": "Rossouw", "given": "Pieter"} +{"country": "ZA", "family": "Meiring", "given": "Sheila"} +{"country": "ZA", "family": "Fugard", "given": "Sheila"} +{"country": "ZA", "family": "Davids", "given": "Quinton"} +{"country": "ZA", "family": "Larson", "given": "Raoul"} +{"country": "ZA", "family": "Lawrence", "given": "Reginald"} +{"country": "ZA", "family": "Potgieter", "given": "Bradley"} +{"country": "ZA", "family": "Jordaan", "given": "Danny"} +{"country": "ZA", "family": "Botha", "given": "Riaan"} +{"country": "ZA", "family": "Dummer", "given": "Richard"} +{"country": "ZA", "family": "Dummer", "given": "Arnold"} +{"country": "ZA", "family": "Linde", "given": "Rob"} +{"country": "ZA", "family": "Louw", "given": "Rob"} +{"country": "ZA", "family": "Fleck", "given": "Robbie"} +{"country": "ZA", "family": "Buchanan", "given": "Ferdinand"} +{"country": "ZA", "family": "Meyer", "given": "Roelf"} +{"country": "ZA", "family": "Bernard", "given": "Roland"} +{"country": "ZA", "family": "Geldenhuys", "given": "Ross"} +{"country": "ZA", "family": "Bedford", "given": "Marie"} +{"country": "ZA", "family": "Russell", "given": "Kathleen"} +{"country": "ZA", "family": "Hart", "given": "Roy"} +{"country": "ZA", "family": "Kruger", "given": "Ruben"} +{"country": "ZA", "family": "Coetzee", "given": "Rudi"} +{"country": "ZA", "family": "Bennett", "given": "Russell"} +{"country": "ZA", "family": "Gerber", "given": "Sam"} +{"country": "ZA", "family": "Botha", "given": "Sandra"} +{"country": "ZA", "family": "Louw", "given": "Sandra"} +{"country": "ZA", "family": "Brits", "given": "Schalk"} +{"country": "ZA", "family": "Spedding", "given": "Scott"} +{"country": "ZA", "family": "Zimmerman", "given": "Scott"} +{"country": "ZA", "family": "Mullins", "given": "Sergio"} +{"country": "ZA", "family": "Payne", "given": "Shaun"} +{"country": "ZA", "family": "Vries", "given": "Sherwin"} +{"country": "ZA", "family": "Nel", "given": "Norman"} +{"country": "ZA", "family": "Nel", "given": "Stefan"} +{"country": "ZA", "family": "Gerber", "given": "Stephan"} +{"country": "ZA", "family": "Naidu", "given": "Stephen"} +{"country": "ZA", "family": "Komphela", "given": "Steve"} +{"country": "ZA", "family": "Meyer", "given": "Steve"} +{"country": "ZA", "family": "Hall", "given": "Steven"} +{"country": "ZA", "family": "Wilken", "given": "Stewart"} +{"country": "ZA", "family": "Abbott", "given": "Stuart"} +{"country": "ZA", "family": "Gordon", "given": "Norman"} +{"country": "ZA", "family": "Stewart", "given": "Anthea"} +{"country": "ZA", "family": "Stewart", "given": "Dorine"} +{"country": "ZA", "family": "McKenzie", "given": "Neil"} +{"country": "ZA", "family": "Wessels", "given": "Kepler"} +{"country": "ZA", "family": "Fletcher", "given": "Duncan"} +{"country": "ZA", "family": "Harris", "given": "Paul"} +{"country": "ZA", "family": "Parnell", "given": "Wayne"} +{"country": "ZA", "family": "Begbie", "given": "Denis"} +{"country": "ZA", "family": "Rhodes", "given": "Jonty"} +{"country": "ZA", "family": "Peterson", "given": "Robin"} +{"country": "ZA", "family": "Stofberg", "given": "Theuns"} +{"country": "ZA", "family": "Smith", "given": "Charles"} +{"country": "ZA", "family": "Back", "given": "Charles"} +{"country": "ZA", "family": "Barlow", "given": "Charles"} +{"country": "ZA", "family": "Burke", "given": "Charles"} +{"country": "ZA", "family": "Michell", "given": "Charles"} +{"country": "ZA", "family": "Michell", "given": "Collier"} +{"country": "ZA", "family": "Bell", "given": "Charles"} +{"country": "ZA", "family": "Moss", "given": "Edward"} +{"country": "ZA", "family": "Moss", "given": "Charles"} +{"country": "ZA", "family": "Fichardt", "given": "Charles"} +{"country": "ZA", "family": "Finlayson", "given": "Charles"} +{"country": "ZA", "family": "Mullins", "given": "Charles"} +{"country": "ZA", "family": "Hime", "given": "Charles"} +{"country": "ZA", "family": "Jeffreys", "given": "Charles"} +{"country": "ZA", "family": "Manning", "given": "Charles"} +{"country": "ZA", "family": "Manning", "given": "Anthony"} +{"country": "ZA", "family": "Manning", "given": "Woodward"} +{"country": "ZA", "family": "Mills", "given": "Charles"} +{"country": "ZA", "family": "O'Brien", "given": "Charles"} +{"country": "ZA", "family": "Pearse", "given": "Charles"} +{"country": "ZA", "family": "Prince", "given": "Charles"} +{"country": "ZA", "family": "Saunders", "given": "Charles"} +{"country": "ZA", "family": "Teversham", "given": "Charles"} +{"country": "ZA", "family": "Vintcent", "given": "Charles"} +{"country": "ZA", "family": "Williams", "given": "Charles"} +{"country": "ZA", "family": "van Onselen", "given": "Charles"} +{"country": "ZA", "family": "Frank", "given": "Charlie"} +{"country": "ZA", "family": "Minnaar", "given": "Chase"} +{"country": "ZA", "family": "Watson", "given": "Daniel"} +{"country": "ZA", "family": "Adair", "given": "Cherry"} +{"country": "ZA", "family": "Carolus", "given": "Cheryl"} +{"country": "ZA", "family": "Rey", "given": "Cheryl"} +{"country": "ZA", "family": "Aberdein", "given": "Chris"} +{"country": "ZA", "family": "Alcock", "given": "Chris"} +{"country": "ZA", "family": "Barnard", "given": "Chris"} +{"country": "ZA", "family": "Davis", "given": "Chris"} +{"country": "ZA", "family": "Duckworth", "given": "Chris"} +{"country": "ZA", "family": "Fallows", "given": "Chris"} +{"country": "ZA", "family": "Goldie", "given": "Chris"} +{"country": "ZA", "family": "Hibbert", "given": "Chris"} +{"country": "ZA", "family": "Hurter", "given": "Chris"} +{"country": "ZA", "family": "Letcher", "given": "Chris"} +{"country": "ZA", "family": "Morris", "given": "Chris"} +{"country": "ZA", "family": "Swanepoel", "given": "Chris"} +{"country": "ZA", "family": "Wang", "given": "Chris"} +{"country": "ZA", "family": "Wilkins", "given": "Chris"} +{"country": "ZA", "family": "Bosker", "given": "Christelle"} +{"country": "ZA", "family": "Roets", "given": "Christiaan"} +{"country": "ZA", "family": "Begg", "given": "Christian"} +{"country": "ZA", "family": "Platt", "given": "Christine"} +{"country": "ZA", "family": "Smith", "given": "Christo"} +{"country": "ZA", "family": "Heyns", "given": "Christof"} +{"country": "ZA", "family": "Brand", "given": "Christoffel"} +{"country": "ZA", "family": "Burger", "given": "Christopher"} +{"country": "ZA", "family": "Gabriel", "given": "Christopher"} +{"country": "ZA", "family": "Harison", "given": "Christopher"} +{"country": "ZA", "family": "Hyman", "given": "Christopher"} +{"country": "ZA", "family": "Thompson", "given": "Christopher"} +{"country": "ZA", "family": "Brown", "given": "Cindy"} +{"country": "ZA", "family": "Eksteen", "given": "Cindy"} +{"country": "ZA", "family": "Cowan", "given": "Claire"} +{"country": "ZA", "family": "Johnston", "given": "Claire"} +{"country": "ZA", "family": "Abbott", "given": "Clare"} +{"country": "ZA", "family": "Carter", "given": "Claude"} +{"country": "ZA", "family": "Fuller", "given": "Claude"} +{"country": "ZA", "family": "Henderson", "given": "Claude"} +{"country": "ZA", "family": "Newberry", "given": "Claude"} +{"country": "ZA", "family": "Henkel", "given": "Claudia"} +{"country": "ZA", "family": "Johnson", "given": "Clement"} +{"country": "ZA", "family": "Robertson", "given": "Clement"} +{"country": "ZA", "family": "Durandt", "given": "Cliff"} +{"country": "ZA", "family": "Davis", "given": "Clifford"} +{"country": "ZA", "family": "Fein", "given": "Clinton"} +{"country": "ZA", "family": "Marius", "given": "Clinton"} +{"country": "ZA", "family": "Marsh", "given": "Clinton"} +{"country": "ZA", "family": "Eksteen", "given": "Clive"} +{"country": "ZA", "family": "Dixon", "given": "Clive"} +{"country": "ZA", "family": "Rice", "given": "Clive"} +{"country": "ZA", "family": "Wilkinson", "given": "Clive"} +{"country": "ZA", "family": "Reinach", "given": "Cobus"} +{"country": "ZA", "family": "Grobbelaar", "given": "Cobus"} +{"country": "ZA", "family": "Breytenbach", "given": "Coenraad"} +{"country": "ZA", "family": "Alexander", "given": "Cole"} +{"country": "ZA", "family": "Banton", "given": "Colin"} +{"country": "ZA", "family": "Bland", "given": "Colin"} +{"country": "ZA", "family": "Bundy", "given": "Colin"} +{"country": "ZA", "family": "Duff", "given": "Colin"} +{"country": "ZA", "family": "Greenwood", "given": "Colin"} +{"country": "ZA", "family": "Legum", "given": "Colin"} +{"country": "ZA", "family": "Wesley", "given": "Colin"} +{"country": "ZA", "family": "Higgs", "given": "Colleen"} +{"country": "ZA", "family": "Fouché", "given": "George"} +{"country": "ZA", "family": "Blue", "given": "Elvis"} +{"country": "ZA", "family": "Hendricks", "given": "Conrad"} +{"country": "ZA", "family": "Hoffmann", "given": "Conrad"} +{"country": "ZA", "family": "Larrabee", "given": "Constance"} +{"country": "ZA", "family": "Cullinan", "given": "Cormac"} +{"country": "ZA", "family": "Watson", "given": "André"} +{"country": "ZA", "family": "Flower", "given": "Andy"} +{"country": "ZA", "family": "Turner", "given": "Andy"} +{"country": "ZA", "family": "Leonard", "given": "Anton"} +{"country": "ZA", "family": "Hugo", "given": "Jean"} +{"country": "ZA", "family": "Clarke", "given": "Ashley"} +{"country": "ZA", "family": "Stent", "given": "Sydney"} +{"country": "ZA", "family": "Viljoen", "given": "Ingrid"} +{"country": "ZA", "family": "Williams", "given": "Avril"} +{"country": "ZA", "family": "Swart", "given": "Balie"} +{"country": "ZA", "family": "Hogan", "given": "Barbara"} +{"country": "ZA", "family": "Britz", "given": "Barend"} +{"country": "ZA", "family": "Lategan", "given": "Barry"} +{"country": "ZA", "family": "Brink", "given": "Edwin"} +{"country": "ZA", "family": "Brink", "given": "George"} +{"country": "ZA", "family": "Goldstein", "given": "Warren"} +{"country": "ZA", "family": "Schoeman", "given": "Ben"} +{"country": "ZA", "family": "Amos", "given": "Daniel"} +{"country": "ZA", "family": "de Jager", "given": "Benjamin"} +{"country": "ZA", "family": "de Jager", "given": "Frederick"} +{"country": "ZA", "family": "Le Roux", "given": "Bernard"} +{"country": "ZA", "family": "Kipling", "given": "Bert"} +{"country": "ZA", "family": "Reed", "given": "Stanley"} +{"country": "ZA", "family": "Swanepoel", "given": "Bertus"} +{"country": "ZA", "family": "Bartlett", "given": "Beryl"} +{"country": "ZA", "family": "Mould", "given": "Beverly"} +{"country": "ZA", "family": "Vertue", "given": "Margaret"} +{"country": "ZA", "family": "Skinner", "given": "Jonty"} +{"country": "ZA", "family": "Conradie", "given": "Bolla"} +{"country": "ZA", "family": "Melville", "given": "Stephen"} +{"country": "ZA", "family": "van Straaten", "given": "Braam"} +{"country": "ZA", "family": "Kirk", "given": "Brenda"} +{"country": "ZA", "family": "Carelse", "given": "Brent"} +{"country": "ZA", "family": "Russell", "given": "Brent"} +{"country": "ZA", "family": "Wilkinson", "given": "Brett"} +{"country": "ZA", "family": "Liebenberg", "given": "Brian"} +{"country": "ZA", "family": "Mitchell", "given": "Brian"} +{"country": "ZA", "family": "Stein", "given": "Brian"} +{"country": "ZA", "family": "Cuypers", "given": "Brigitte"} +{"country": "ZA", "family": "Smith", "given": "Scotty"} +{"country": "ZA", "family": "Baiocchi", "given": "Hugh"} +{"country": "ZA", "family": "Davies", "given": "Claude"} +{"country": "ZA", "family": "Van den Heever", "given": "Christiaan"} +{"country": "ZA", "family": "Del Fava", "given": "Carlo"} +{"country": "ZA", "family": "Thomson", "given": "Christopher"} +{"country": "ZA", "family": "Erskine", "given": "Chad"} +{"country": "ZA", "family": "Hellaby", "given": "Charles"} +{"country": "ZA", "family": "Hellaby", "given": "William"} +{"country": "ZA", "family": "Stallard", "given": "Charles"} +{"country": "ZA", "family": "Malan", "given": "Charles"} +{"country": "ZA", "family": "Malan", "given": "Wynand"} +{"country": "ZA", "family": "Ackermann", "given": "Chris"} +{"country": "ZA", "family": "Koch", "given": "Chris"} +{"country": "ZA", "family": "Liebenberg", "given": "Chris"} +{"country": "ZA", "family": "McBride", "given": "Chris"} +{"country": "ZA", "family": "Rossouw", "given": "Chris"} +{"country": "ZA", "family": "Scholtz", "given": "Christiaan"} +{"country": "ZA", "family": "Liebenberg", "given": "Christiaan"} +{"country": "ZA", "family": "Stewart", "given": "Christian"} +{"country": "ZA", "family": "Bezuidenhout", "given": "Christo"} +{"country": "ZA", "family": "Shapiro", "given": "Jonathan"} +{"country": "ZA", "family": "Walker", "given": "Clarence"} +{"country": "ZA", "family": "Dry", "given": "Claude"} +{"country": "ZA", "family": "Wake", "given": "Clive"} +{"country": "ZA", "family": "Basson", "given": "Coenraad"} +{"country": "ZA", "family": "Eglin", "given": "Colin"} +{"country": "ZA", "family": "Steyn", "given": "Colin"} +{"country": "ZA", "family": "Viljoen", "given": "Colin"} +{"country": "ZA", "family": "Van Zyl", "given": "Lizzie"} +{"country": "ZA", "family": "Campbell", "given": "Roy"} +{"country": "ZA", "family": "Barnard", "given": "Conrad"} +{"country": "ZA", "family": "Jantjes", "given": "Conrad"} +{"country": "ZA", "family": "Fredericks", "given": "Cornel"} +{"country": "ZA", "family": "Davidson", "given": "Craig"} +{"country": "ZA", "family": "Joubert", "given": "Craig"} +{"country": "ZA", "family": "Malherbe", "given": "D."} +{"country": "ZA", "family": "Retief", "given": "Daan"} +{"country": "ZA", "family": "De Villiers", "given": "Benjamin"} +{"country": "ZA", "family": "De Villiers", "given": "Abraham"} +{"country": "ZA", "family": "Williams", "given": "Dai"} +{"country": "ZA", "family": "O'Meara", "given": "Dan"} +{"country": "ZA", "family": "Pienaar", "given": "Daniel"} +{"country": "ZA", "family": "Rossouw", "given": "Danie"} +{"country": "ZA", "family": "de Jager", "given": "Danie"} +{"country": "ZA", "family": "Muller", "given": "Daniel"} +{"country": "ZA", "family": "Steyn", "given": "Daniel"} +{"country": "ZA", "family": "Boonzaier", "given": "Cornelis"} +{"country": "ZA", "family": "Boonzaier", "given": "Daniël"} +{"country": "ZA", "family": "Nell", "given": "Darron"} +{"country": "ZA", "family": "Eccles", "given": "David"} +{"country": "ZA", "family": "Kemp", "given": "Dirk"} +{"country": "ZA", "family": "Chamberlain", "given": "Dirkie"} +{"country": "ZA", "family": "Rieser", "given": "Dolf"} +{"country": "ZA", "family": "Hendricks", "given": "Dominic"} +{"country": "ZA", "family": "Armand", "given": "Don"} +{"country": "GH", "family": "Morris", "given": "Stevland"} +{"country": "GH", "family": "Judkins", "given": "Stevland"} +{"country": "GH", "family": "Hardaway", "given": "Stevland"} +{"country": "GH", "family": "Annan", "given": "Kofi"} +{"country": "GH", "family": "Depay", "given": "Memphis"} +{"country": "GH", "family": "Nkrumah", "given": "Kwame"} +{"country": "GH", "family": "Appiah", "given": "James"} +{"country": "GH", "family": "Appiah", "given": "Kwesi"} +{"country": "GH", "family": "Kingston", "given": "Kofi"} +{"country": "GH", "family": "Mensah", "given": "Jonathan"} +{"country": "GH", "family": "Mahama", "given": "John"} +{"country": "GH", "family": "Limann", "given": "Hilla"} +{"country": "GH", "family": "Rawlings", "given": "Jerry"} +{"country": "GH", "family": "Kuffour", "given": "John"} +{"country": "GH", "family": "Mills", "given": "John"} +{"country": "GH", "family": "Busia", "given": "Kofi"} +{"country": "GH", "family": "Quaison", "given": "Robin"} +{"country": "GH", "family": "Baffoe", "given": "Anthony"} +{"country": "GH", "family": "Bossman", "given": "Francis"} +{"country": "GH", "family": "Balotelli", "given": "Mario"} +{"country": "GH", "family": "Boateng", "given": "Kevin-Prince"} +{"country": "GH", "family": "Duncan", "given": "Alfred"} +{"country": "GH", "family": "Du Bois", "given": "Edward"} +{"country": "GH", "family": "Du Bois", "given": "William"} +{"country": "GH", "family": "Du Bois", "given": "Burghardt"} +{"country": "GH", "family": "Hagan", "given": "George"} +{"country": "GH", "family": "Nelson", "given": "Azumah"} +{"country": "GH", "family": "Busia", "given": "Akosua"} +{"country": "GH", "family": "Desailly", "given": "Marcel"} +{"country": "GH", "family": "Sulley", "given": "Mukhtar"} +{"country": "GH", "family": "Appiah", "given": "Stephen"} +{"country": "GH", "family": "Paintsil", "given": "John"} +{"country": "GH", "family": "Kingson", "given": "Richard"} +{"country": "GH", "family": "Gyan", "given": "Asamoah"} +{"country": "GH", "family": "Sutherland", "given": "Efua"} +{"country": "GH", "family": "Asamoah", "given": "Kwadwo"} +{"country": "GH", "family": "Boateng", "given": "Derek"} +{"country": "GH", "family": "Popoola", "given": "Aaron"} +{"country": "GH", "family": "Iddi", "given": "Abdul-Ganiyu"} +{"country": "GH", "family": "Iddi", "given": "Abdul-Yakuni"} +{"country": "GH", "family": "Frimpong", "given": "Emmanuel"} +{"country": "GH", "family": "Adu", "given": "Freddy"} +{"country": "GH", "family": "Adiyiah", "given": "Dominic"} +{"country": "GH", "family": "Mensah", "given": "John"} +{"country": "GH", "family": "Amoah", "given": "Matthew"} +{"country": "GH", "family": "Annan", "given": "Anthony"} +{"country": "GH", "family": "Adjei", "given": "Samuel"} +{"country": "GH", "family": "Waris", "given": "'Abd al-Majid"} +{"country": "GH", "family": "Amoah", "given": "Charles"} +{"country": "GH", "family": "Schlupp", "given": "Jeffrey"} +{"country": "GH", "family": "Cordy", "given": "Michael"} +{"country": "GH", "family": "Saïd", "given": "Said"} +{"country": "GH", "family": "Quashigah", "given": "Emmanuel"} +{"country": "GH", "family": "Quashigah", "given": "Courage"} +{"country": "GH", "family": "Ayew", "given": "Abedi"} +{"country": "GH", "family": "Ollennu", "given": "Raphael"} +{"country": "GH", "family": "Tago", "given": "Prince"} +{"country": "GH", "family": "Vorsah", "given": "Isaac"} +{"country": "GH", "family": "Aziz", "given": "Joseph"} +{"country": "GH", "family": "Addy", "given": "Lee"} +{"country": "GH", "family": "Inkoom", "given": "Samuel"} +{"country": "GH", "family": "Kwarasey", "given": "Adam"} +{"country": "GH", "family": "Addo", "given": "Eric"} +{"country": "GH", "family": "Ankrah", "given": "Joseph"} +{"country": "GH", "family": "Ayew", "given": "Jordan"} +{"country": "GH", "family": "Duah", "given": "Kwaku"} +{"country": "GH", "family": "Nyarko", "given": "Alex"} +{"country": "GH", "family": "Abeyie", "given": "Timothy"} +{"country": "GH", "family": "Danquah", "given": "Joseph"} +{"country": "GH", "family": "Yeboah", "given": "Anthony"} +{"country": "GH", "family": "Rizk", "given": "Fathia"} +{"country": "GH", "family": "Poku", "given": "Kwadwo"} +{"country": "GH", "family": "Barusso", "given": "Ahmed"} +{"country": "GH", "family": "Serwaa", "given": "Akosua"} +{"country": "GH", "family": "Kuenyehia", "given": "Akua"} +{"country": "GH", "family": "Addo", "given": "Daniel"} +{"country": "GH", "family": "Anim", "given": "Vida"} +{"country": "GH", "family": "Simpson", "given": "Margaret"} +{"country": "GH", "family": "Darko", "given": "Amma"} +{"country": "GH", "family": "Dery", "given": "Ambrose"} +{"country": "GH", "family": "Agogo", "given": "Junior"} +{"country": "GH", "family": "Mugabe", "given": "Sally"} +{"country": "GH", "family": "Mensah", "given": "Peter"} +{"country": "GH", "family": "Addo", "given": "Otto"} +{"country": "GH", "family": "Acheampong", "given": "Ignatius"} +{"country": "GH", "family": "Nikoi", "given": "Amon"} +{"country": "GH", "family": "Asamoah", "given": "Derek"} +{"country": "GH", "family": "Owusu", "given": "Andrew"} +{"country": "GH", "family": "Addae", "given": "Bright"} +{"country": "GH", "family": "Adjei", "given": "Daniel"} +{"country": "GH", "family": "Affutu", "given": "Kudjoe"} +{"country": "GH", "family": "Ayew", "given": "André"} +{"country": "GH", "family": "Mensah", "given": "Robert"} +{"country": "GH", "family": "Boateng", "given": "Nelson"} +{"country": "GH", "family": "Cripps", "given": "Peggy"} +{"country": "GH", "family": "Takyi", "given": "Charles"} +{"country": "GH", "family": "Turkson", "given": "Peter"} +{"country": "GH", "family": "Boateng", "given": "Robert"} +{"country": "GH", "family": "al-Hassan", "given": "Karim"} +{"country": "GH", "family": "Wiredu", "given": "Kwasi"} +{"country": "GH", "family": "Deku", "given": "Anthony"} +{"country": "GH", "family": "Afful", "given": "Harrison"} +{"country": "GH", "family": "Yankey", "given": "Diana"} +{"country": "GH", "family": "Moses", "given": "Arthur"} +{"country": "GH", "family": "Addy", "given": "David"} +{"country": "GH", "family": "Palmer-Buckle", "given": "Charles"} +{"country": "GH", "family": "Palmer-Buckle", "given": "Gabriel"} +{"country": "GH", "family": "Jackson", "given": "Jackson"} +{"country": "GH", "family": "Agyemang", "given": "Louis"} +{"country": "GH", "family": "Gbeho", "given": "Victor"} +{"country": "GH", "family": "Pimpong", "given": "Razak"} +{"country": "GH", "family": "Abu", "given": "Muhammad"} +{"country": "GH", "family": "Boye", "given": "John"} +{"country": "GH", "family": "Oduro", "given": "Dominic"} +{"country": "GH", "family": "Akuffo", "given": "Frederick"} +{"country": "GH", "family": "Addo", "given": "Nana"} +{"country": "GH", "family": "Annan", "given": "Kojo"} +{"country": "GH", "family": "Quartey", "given": "Clement"} +{"country": "GH", "family": "Osei", "given": "Asante"} +{"country": "GH", "family": "Osei", "given": "Reginald"} +{"country": "GH", "family": "Osei", "given": "Yaw"} +{"country": "GH", "family": "Dwomoh", "given": "Benjamin"} +{"country": "GH", "family": "Polley", "given": "Prince"} +{"country": "GH", "family": "Lawson", "given": "Augustus"} +{"country": "GH", "family": "Bayor", "given": "Adwoa"} +{"country": "GH", "family": "Blay", "given": "George"} +{"country": "GH", "family": "Kwei", "given": "Ayi"} +{"country": "GH", "family": "Armah", "given": "Ayi"} +{"country": "GH", "family": "Zakari", "given": "Aziz"} +{"country": "GH", "family": "Asare", "given": "Nana"} +{"country": "GH", "family": "Seidu", "given": "Osman"} +{"country": "GH", "family": "Seidu", "given": "Baba"} +{"country": "GH", "family": "Gyan", "given": "Baffour"} +{"country": "GH", "family": "Kwakye", "given": "Benjamin"} +{"country": "GH", "family": "Bartels", "given": "Kwamena"} +{"country": "GH", "family": "Mensah", "given": "Tettey"} +{"country": "GH", "family": "Mensah", "given": "Emmanuel"} +{"country": "GH", "family": "Busby", "given": "Margaret"} +{"country": "GH", "family": "Gyamfi", "given": "Matthew"} +{"country": "GH", "family": "Oquaye", "given": "Mike"} +{"country": "GH", "family": "Oquaye", "given": "Aaron"} +{"country": "GH", "family": "Adamu", "given": "Baba"} +{"country": "GH", "family": "Nyarko", "given": "Patrick"} +{"country": "GH", "family": "Dogboe", "given": "Isaac"} +{"country": "GH", "family": "Ampomah", "given": "Owusu-Dartey"} +{"country": "GH", "family": "Addai", "given": "Patrick"} +{"country": "GH", "family": "Ackon", "given": "Richard"} +{"country": "GH", "family": "Adjetey", "given": "Peter"} +{"country": "GH", "family": "Angkyier", "given": "Peter"} +{"country": "GH", "family": "Iddi", "given": "Baba"} +{"country": "GH", "family": "Williams", "given": "Francis"} +{"country": "GH", "family": "Awoonor", "given": "Francis"} +{"country": "GH", "family": "Williams", "given": "A."} +{"country": "GH", "family": "Awoonor", "given": "A."} +{"country": "GH", "family": "Williams", "given": "R."} +{"country": "GH", "family": "Awoonor", "given": "R."} +{"country": "GH", "family": "Brempong", "given": "Ransford"} +{"country": "GH", "family": "Van Dam", "given": "Jerry"} +{"country": "GH", "family": "Yeboah", "given": "Samuel"} +{"country": "GH", "family": "Owusu", "given": "Mike"} +{"country": "GH", "family": "Benson", "given": "Owusu-Dartey"} +{"country": "GH", "family": "Ahinful", "given": "Augustine"} +{"country": "GH", "family": "Boateng", "given": "Stephen"} +{"country": "GH", "family": "Asare", "given": "Isaac"} +{"country": "GH", "family": "Aborah", "given": "Stanley"} +{"country": "GH", "family": "Tagoe", "given": "Theresa"} +{"country": "GH", "family": "Mensah", "given": "Thomas"} +{"country": "GH", "family": "Odoi", "given": "Denis"} +{"country": "GH", "family": "Adjei", "given": "Lawrence"} +{"country": "GH", "family": "Agyemang", "given": "Patrick"} +{"country": "GH", "family": "Gyan", "given": "King"} +{"country": "GH", "family": "Mills", "given": "Leonard"} +{"country": "GH", "family": "Myles-Mills", "given": "Leonard"} +{"country": "GH", "family": "Agyei", "given": "Daniel Kofi"} +{"country": "GH", "family": "Moro", "given": "Ibrahim"} +{"country": "GH", "family": "Obodai", "given": "Anthony"} +{"country": "GH", "family": "Hammond", "given": "Elvis"} +{"country": "GH", "family": "Kyerematen", "given": "Alan"} +{"country": "GH", "family": "Kyerematen", "given": "John"} +{"country": "GH", "family": "Bagbin", "given": "Alban"} +{"country": "GH", "family": "Boahen", "given": "Albert"} +{"country": "GH", "family": "Adu", "given": "Albert"} +{"country": "GH", "family": "Ocran", "given": "Albert"} +{"country": "GH", "family": "Ocran", "given": "Kwesi"} +{"country": "GH", "family": "Ampomah", "given": "Alberta"} +{"country": "GH", "family": "Grant", "given": "Alfred"} +{"country": "GH", "family": "Awal", "given": "Muhammad"} +{"country": "GH", "family": "Awal", "given": "Mohamed"} +{"country": "GH", "family": "Owusu", "given": "Daniel"} +{"country": "GH", "family": "Laryea", "given": "Gabriel"} +{"country": "GH", "family": "Quartey", "given": "Jonathan"} +{"country": "GH", "family": "Acquah", "given": "Afriyie"} +{"country": "GH", "family": "Acheampong", "given": "Ben"} +{"country": "GH", "family": "Boateng", "given": "Richard"} +{"country": "GH", "family": "Acheampong", "given": "Frank"} +{"country": "GH", "family": "Gyamfi", "given": "Charles"} +{"country": "GH", "family": "Cofie", "given": "Isaac"} +{"country": "GH", "family": "Appiah", "given": "Emmanuel"} +{"country": "GH", "family": "Kubi", "given": "Emmanuel"} +{"country": "GH", "family": "Obeng", "given": "Ernest"} +{"country": "GH", "family": "Koranteng", "given": "Eugene"} +{"country": "GH", "family": "Odoi", "given": "Frank"} +{"country": "GH", "family": "Adoboli", "given": "Kweku"} +{"country": "GH", "family": "al-Hassan", "given": "George"} +{"country": "GH", "family": "al-Hassan", "given": "Jair"} +{"country": "GH", "family": "Aryeetey", "given": "George"} +{"country": "GH", "family": "Aryeetey", "given": "Billy"} +{"country": "GH", "family": "Aryeetey", "given": "Nii"} +{"country": "GH", "family": "Nketia", "given": "Augustine"} +{"country": "GH", "family": "Yakubu", "given": "Hawa"} +{"country": "GH", "family": "Benson", "given": "John"} +{"country": "GH", "family": "Eshun", "given": "John"} +{"country": "GH", "family": "Myles-Mills", "given": "John"} +{"country": "GH", "family": "Vicker", "given": "Joseph"} +{"country": "GH", "family": "Edusei", "given": "Daniel"} +{"country": "GH", "family": "Atuahene", "given": "Eric"} +{"country": "GH", "family": "Tetteh", "given": "Abd al-Aziz"} +{"country": "GH", "family": "Kofi", "given": "Osei"} +{"country": "GH", "family": "Mensah", "given": "Philomena"} +{"country": "GH", "family": "Ola", "given": "Daniel"} +{"country": "GH", "family": "Asante", "given": "Ernest"} +{"country": "GH", "family": "Addo", "given": "Paul"} +{"country": "GH", "family": "Boateng", "given": "Benjamin"} +{"country": "GH", "family": "Njoku", "given": "William"} +{"country": "GH", "family": "Ahmed", "given": "Abd al-Karīm"} +{"country": "GH", "family": "Glover", "given": "Emmanuel"} +{"country": "GH", "family": "Glover", "given": "Ablade"} +{"country": "GH", "family": "Owusu", "given": "Akosua"} +{"country": "GH", "family": "Asare", "given": "Angela"} +{"country": "GH", "family": "Kwami", "given": "George"} +{"country": "GH", "family": "Kwami", "given": "Atta"} +{"country": "GH", "family": "Abass", "given": "Awudu"} +{"country": "GH", "family": "Accam", "given": "David"} +{"country": "GH", "family": "Osei", "given": "Emmanuel"} +{"country": "GH", "family": "Sowah", "given": "Ernst"} +{"country": "GH", "family": "Sowah", "given": "Ernest"} +{"country": "GH", "family": "Hughes", "given": "George"} +{"country": "GH", "family": "Donkor", "given": "Godfried"} +{"country": "GH", "family": "Mensah", "given": "Anthony"} +{"country": "GH", "family": "Hagan", "given": "Ebenezer"} +{"country": "GH", "family": "Arday", "given": "Samuel"} +{"country": "GH", "family": "Addo", "given": "Joseph"} +{"country": "GH", "family": "Dwomoh", "given": "Irene"} +{"country": "GH", "family": "Cudjoe", "given": "James"} +{"country": "GH", "family": "Opoku", "given": "Jordan"} +{"country": "GH", "family": "al-Hassan", "given": "Kalif"} +{"country": "GH", "family": "Quaye", "given": "Abdullah"} +{"country": "GH", "family": "Adama", "given": "Osumanu"} +{"country": "GH", "family": "Adams", "given": "Dennis"} +{"country": "GH", "family": "Adams", "given": "Charles"} +{"country": "GH", "family": "Grant", "given": "Kimberley"} +{"country": "GH", "family": "Dankwah", "given": "Aaron"} +{"country": "GH", "family": "Osman", "given": "Abdul"} +{"country": "GH", "family": "Hammond", "given": "Abel"} +{"country": "GH", "family": "Morgan", "given": "Ablade"} +{"country": "GH", "family": "Abankwah", "given": "Adelaide"} +{"country": "GH", "family": "Frimpong", "given": "Akwasi"} +{"country": "GH", "family": "Agyemang", "given": "Albert"} +{"country": "GH", "family": "Kotey", "given": "Alfred"} +{"country": "GH", "family": "Vanderpuije", "given": "Alfred"} +{"country": "GH", "family": "Fuseini", "given": "Ali"} +{"country": "GH", "family": "Konadu", "given": "Samuel"} +{"country": "GH", "family": "Tetteh", "given": "Emmanuel"} +{"country": "GH", "family": "Ansah", "given": "Aziz"} +{"country": "GH", "family": "Casely-Hayford", "given": "Beattie"} +{"country": "GH", "family": "Fadi", "given": "Benjamin"} +{"country": "GH", "family": "Bortey", "given": "Bernard"} +{"country": "GH", "family": "Kuffour", "given": "Bice"} +{"country": "GH", "family": "Bazawule", "given": "Samuel"} +{"country": "GH", "family": "Lokko", "given": "Lesley"} +{"country": "GH", "family": "Lincoln", "given": "Charles"} +{"country": "GH", "family": "Lincoln", "given": "Eric"} +{"country": "GH", "family": "Amoah", "given": "Cecilia"} +{"country": "GH", "family": "Gyan", "given": "Cecilia"} +{"country": "GH", "family": "Adongo", "given": "Richmond"} +{"country": "GH", "family": "Edwards", "given": "Opi"} +{"country": "GH", "family": "Lamptey", "given": "Cynthia"} +{"country": "GH", "family": "Clerk", "given": "Jane"} +{"country": "GH", "family": "Afriyie", "given": "Francis"} +{"country": "GH", "family": "Ayat", "given": "Kirani"} +{"country": "GH", "family": "Osei", "given": "Afua"} +{"country": "GH", "family": "Kyerematen", "given": "Angela"} +{"country": "GH", "family": "Ashley", "given": "Abigail"} +{"country": "GH", "family": "Adjetey", "given": "David"} +{"country": "GH", "family": "Appiah", "given": "Leticia"} +{"country": "GH", "family": "Bossman", "given": "Richmond"} +{"country": "GH", "family": "Mensah", "given": "Yaw"} +{"country": "GH", "family": "Dosoo", "given": "Dzigbordi"} +{"country": "GH", "family": "Bonac", "given": "William"} +{"country": "GH", "family": "Akoto", "given": "Kwame"} +{"country": "GH", "family": "Dadzie", "given": "Elizabeth"} +{"country": "GH", "family": "Opoku", "given": "Edward"} +{"country": "GH", "family": "Mawuli", "given": "Stephanie"} +{"country": "GH", "family": "Migbodzi", "given": "Eyram"} +{"country": "GH", "family": "Boateng", "given": "Gloria"} +{"country": "GH", "family": "Atipaka", "given": "Annabel"} +{"country": "GH", "family": "Atipaka", "given": "Grace"} +{"country": "GH", "family": "Serwaa", "given": "Clara"} +{"country": "GH", "family": "Serwaa", "given": "Maame"} +{"country": "GH", "family": "Baah", "given": "Michael"} +{"country": "GH", "family": "Opoku", "given": "Michael"} +{"country": "GH", "family": "Gyamfi", "given": "Mercy"} +{"country": "GH", "family": "Trebarh", "given": "Mawuena"} +{"country": "GH", "family": "Marfo", "given": "Eugene"} +{"country": "GH", "family": "Marfo", "given": "Kwame"} +{"country": "GH", "family": "Dwamena", "given": "Dennis"} +{"country": "GH", "family": "Dwamena", "given": "Nana"} +{"country": "GH", "family": "Semenyo", "given": "Antoine"} +{"country": "GH", "family": "Semenyo", "given": "Serlom"} +{"country": "GH", "family": "Addison", "given": "Philip"} +{"country": "GH", "family": "Awuah", "given": "Matilda"} +{"country": "GH", "family": "Kumah", "given": "John"} +{"country": "GH", "family": "Siaw", "given": "Stephen"} +{"country": "GH", "family": "Kwakwa", "given": "Victoria"} +{"country": "GH", "family": "Neequaye", "given": "Anita"} +{"country": "GH", "family": "Dotsey", "given": "Cynthia"} +{"country": "GH", "family": "Mumin", "given": "Salma"} +{"country": "GH", "family": "Abot", "given": "Jojo"} +{"country": "GH", "family": "Amarteifio", "given": "Nicole"} +{"country": "GH", "family": "Danku", "given": "Kafui"} +{"country": "GH", "family": "Amartey", "given": "Abednego"} +{"country": "GH", "family": "Salifu", "given": "Abdul Hafiz"} +{"country": "GH", "family": "Ofosu", "given": "Felix"} +{"country": "GH", "family": "Boateng", "given": "Kwaku"} +{"country": "GH", "family": "Cobbinah", "given": "Winful"} +{"country": "GH", "family": "Mensah", "given": "Jean"} +{"country": "GH", "family": "Owusu", "given": "Elisha"} +{"country": "GH", "family": "Ekeh", "given": "Christabel"} +{"country": "GH", "family": "Senyo", "given": "Reuben"} +{"country": "GH", "family": "Baidoo", "given": "Michael"} +{"country": "GH", "family": "Yeboah", "given": "Kelvin"} +{"country": "GH", "family": "Kaba", "given": "Kevin"} +{"country": "GH", "family": "Antonio", "given": "Martin"} +{"country": "GH", "family": "Sampson", "given": "Caroline"} +{"country": "GH", "family": "Polley", "given": "Robin"} +{"country": "GH", "family": "Ofori", "given": "Alex"} +{"country": "GH", "family": "Owusu", "given": "Alex"} +{"country": "GH", "family": "Opoku", "given": "Albert"} +{"country": "GH", "family": "Kudus", "given": "Muhammad"} +{"country": "GH", "family": "Salifu", "given": "Samson"} +{"country": "GH", "family": "Adjorlolo", "given": "Kofi"} +{"country": "GH", "family": "Duncan", "given": "David"} +{"country": "GH", "family": "Kwarteng", "given": "Moritz"} +{"country": "GH", "family": "Pfeiffer", "given": "Patric"} +{"country": "GH", "family": "Gordon", "given": "Christopher"} +{"country": "GH", "family": "Asiedu", "given": "Akofa"} +{"country": "GH", "family": "Asiedu", "given": "Edjeani"} +{"country": "GH", "family": "Mensah", "given": "Betty"} +{"country": "GH", "family": "Crosby", "given": "Betty"} +{"country": "GH", "family": "Nkansah", "given": "Mavis"} +{"country": "GH", "family": "Boadu", "given": "Mavis"} +{"country": "GH", "family": "Adomako", "given": "Eureka"} +{"country": "GH", "family": "Gafah", "given": "Benedicta"} +{"country": "GH", "family": "Bonsrah", "given": "Nancy"} +{"country": "GH", "family": "Klutse", "given": "Nana"} +{"country": "GH", "family": "Dei", "given": "Adwoa"} +{"country": "GH", "family": "Lamptey", "given": "Jonathan"} +{"country": "GH", "family": "Lamptey", "given": "Kwesi"} +{"country": "GH", "family": "Morrison", "given": "Cynthia"} +{"country": "GH", "family": "Quansah", "given": "Naana"} +{"country": "GH", "family": "Akosah-Bempah", "given": "Nana"} +{"country": "GH", "family": "Dompreh", "given": "Frank"} +{"country": "GH", "family": "Addo", "given": "Wendy"} +{"country": "GH", "family": "Acquah", "given": "Oliver"} +{"country": "GH", "family": "Acquah", "given": "Sam"} +{"country": "GH", "family": "Boye", "given": "Edward"} +{"country": "GH", "family": "Foley", "given": "Robert"} +{"country": "GH", "family": "France", "given": "Henry"} +{"country": "GH", "family": "Mingle", "given": "Alex"} +{"country": "GH", "family": "Nkansah", "given": "Emmanuel"} +{"country": "GH", "family": "Nkansah", "given": "Kwesi"} +{"country": "GH", "family": "Wilson", "given": "Joseph"} +{"country": "GH", "family": "De Sosoo", "given": "Anita"} +{"country": "GH", "family": "Acheampong", "given": "Rebecca"} +{"country": "GH", "family": "Djiku", "given": "Alexander"} +{"country": "GH", "family": "Hammond", "given": "Tahir"} +{"country": "GH", "family": "Boateng", "given": "Emmanuel"} +{"country": "GH", "family": "Nartey", "given": "Eddie"} +{"country": "GH", "family": "Owusu", "given": "Janet"} +{"country": "GH", "family": "Cudjoe", "given": "Joseph"} +{"country": "GH", "family": "Asante", "given": "Gideon"} +{"country": "GH", "family": "Attoh", "given": "Chris"} +{"country": "GH", "family": "Mensah", "given": "Ivan"} +{"country": "GH", "family": "Addae", "given": "Ivan"} +{"country": "GH", "family": "Appiah", "given": "Abena"} +{"country": "GH", "family": "Akainyah", "given": "Nelly"} +{"country": "GH", "family": "Luckassen", "given": "Derrick"} +{"country": "GH", "family": "Naah", "given": "Divine"} +{"country": "GH", "family": "Naah", "given": "Yelsarmba"} +{"country": "GH", "family": "Mawuli", "given": "Evelyn"} +{"country": "GH", "family": "Andam", "given": "Aba"} +{"country": "GH", "family": "Mansu", "given": "Israella"} +{"country": "GH", "family": "Quarcoo", "given": "Patrick"} +{"country": "GH", "family": "Akpo", "given": "James"} +{"country": "GH", "family": "Asante", "given": "Juliet"} +{"country": "GH", "family": "Williams", "given": "Iñaki"} +{"country": "GH", "family": "Mensah", "given": "Joe"} +{"country": "GH", "family": "Nketia", "given": "Asiedu"} +{"country": "GH", "family": "Muntari", "given": "Muhammad"} +{"country": "GH", "family": "Mensah", "given": "Solomon"} +{"country": "GH", "family": "Nyarko", "given": "Solomon"} +{"country": "GH", "family": "Donkor", "given": "Yaw"} +{"country": "GH", "family": "Donkor", "given": "Emmanuel"} +{"country": "GH", "family": "Botwe", "given": "Evelyn"} +{"country": "GH", "family": "Aryeetey", "given": "Abraham"} +{"country": "GH", "family": "Bah", "given": "Samuel"} +{"country": "GH", "family": "Safo", "given": "Kwadwo"} +{"country": "GH", "family": "Ahenkorah", "given": "Deborah"} +{"country": "GH", "family": "Lamptey", "given": "Joseph"} +{"country": "GH", "family": "Tali", "given": "Yakubu"} +{"country": "GH", "family": "Johnson", "given": "Kwame"} +{"country": "GH", "family": "Johnson", "given": "Robert"} +{"country": "GH", "family": "Mahama", "given": "Ibrahim"} +{"country": "GH", "family": "Mahamah", "given": "Ibrahim"} +{"country": "GH", "family": "Mensah", "given": "Moses"} +{"country": "GH", "family": "Agyinasare", "given": "Charles"} +{"country": "GH", "family": "Mills", "given": "Ernestina"} +{"country": "GH", "family": "Lamptey", "given": "Odartei"} +{"country": "GH", "family": "Kpeda", "given": "Vera"} +{"country": "GH", "family": "Hyde", "given": "Peace"} +{"country": "GH", "family": "Boakye", "given": "Thomas"} +{"country": "GH", "family": "Watson", "given": "Eddie"} +{"country": "GH", "family": "Manu", "given": "Stephen"} +{"country": "GH", "family": "Ofori-Atta", "given": "Ken"} +{"country": "GH", "family": "Sowah", "given": "Godson"} +{"country": "GH", "family": "Yeboah", "given": "Yaw"} +{"country": "GH", "family": "Ampadu", "given": "Kwame"} +{"country": "GH", "family": "Ampadu", "given": "Nana"} +{"country": "GH", "family": "Mensah", "given": "Francisca"} +{"country": "GH", "family": "Oteng", "given": "Francisca"} +{"country": "GH", "family": "Paintsil", "given": "Seth"} +{"country": "GH", "family": "Osei", "given": "Charlotte"} +{"country": "GH", "family": "Ababio", "given": "Joyce"} +{"country": "GH", "family": "Sackey", "given": "Alberta"} +{"country": "GH", "family": "Anti", "given": "Gifty"} +{"country": "GH", "family": "Ocansey", "given": "Grace"} +{"country": "GH", "family": "Kojo", "given": "Pappy"} +{"country": "GH", "family": "Amoah", "given": "Belinda"} +{"country": "GH", "family": "Osei", "given": "Francis"} +{"country": "GH", "family": "Osei", "given": "Teddy"} +{"country": "GH", "family": "Ben Abdallah", "given": "Muhammad"} +{"country": "GH", "family": "Mensah", "given": "Naa"} +{"country": "GH", "family": "Gyaman", "given": "Beatrice"} +{"country": "GH", "family": "Owusu", "given": "Prince"} +{"country": "GH", "family": "Dadzie", "given": "Francis"} +{"country": "GH", "family": "Bossman", "given": "Anna"} +{"country": "GH", "family": "Beecham", "given": "Joe"} +{"country": "GH", "family": "Obeng", "given": "Letitia"} +{"country": "GH", "family": "Ofori", "given": "Susan"} +{"country": "GH", "family": "Owusu", "given": "Samuel"} +{"country": "GH", "family": "Simpson", "given": "Mabel"} +{"country": "GH", "family": "Mann", "given": "Charles"} +{"country": "GH", "family": "Sarfo", "given": "Sarah"} +{"country": "GH", "family": "Agyapong", "given": "Akosua"} +{"country": "GH", "family": "Frimpong", "given": "Hilda"} +{"country": "GH", "family": "Eke", "given": "Nadia"} +{"country": "GH", "family": "Attah", "given": "Abraham"} +{"country": "GH", "family": "Boakye", "given": "Portia"} +{"country": "GH", "family": "Perényi", "given": "Brigitte"} +{"country": "GH", "family": "Brew", "given": "Ebenezer"} +{"country": "GH", "family": "Antwi", "given": "Kwame"} +{"country": "GH", "family": "Manso", "given": "Deloris"} +{"country": "GH", "family": "Frimpong", "given": "Deloris"} +{"country": "GH", "family": "Braimah", "given": "Alhassan"} +{"country": "GH", "family": "Dankwa", "given": "Edith"} +{"country": "GH", "family": "Lartey", "given": "Joe"} +{"country": "GH", "family": "Lawson", "given": "Emmanuel"} +{"country": "GH", "family": "Gomashie", "given": "Dzifa"} +{"country": "GH", "family": "Ray", "given": "Adonis"} +{"country": "GH", "family": "Bonsu", "given": "Osei"} +{"country": "GH", "family": "Yeboah", "given": "Godwin"} +{"country": "GH", "family": "Osei", "given": "Derick"} +{"country": "GH", "family": "Boateng", "given": "Charles"} +{"country": "GH", "family": "Grahl", "given": "John"} +{"country": "GH", "family": "Sarfo", "given": "Derrick"} +{"country": "GH", "family": "Tei", "given": "Sandister"} +{"country": "GH", "family": "Appiah", "given": "Jorge"} +{"country": "GH", "family": "Asiedu", "given": "Elizabeth"} +{"country": "GH", "family": "Asare", "given": "David"} +{"country": "GH", "family": "Pratt", "given": "Kwesi"} +{"country": "GH", "family": "Boakye", "given": "Anthony"} +{"country": "GH", "family": "Boakye", "given": "Bridget"} +{"country": "GH", "family": "Da Silva", "given": "Veronica"} +{"country": "GH", "family": "Manu", "given": "Ama"} +{"country": "GH", "family": "Manu", "given": "Bianca"} +{"country": "GH", "family": "Tetteh", "given": "Yvette"} +{"country": "GH", "family": "Williams", "given": "Kwami"} +{"country": "GH", "family": "Hussein", "given": "Ahmed"} +{"country": "GH", "family": "Williams", "given": "Joshua"} +{"country": "GH", "family": "Kojo", "given": "Joel"} +{"country": "GH", "family": "Nyantakyi", "given": "Prince"} +{"country": "GH", "family": "Yaro", "given": "Ibrahim"} +{"country": "GH", "family": "Patterson", "given": "Elizabeth"} +{"country": "GH", "family": "Adeleye", "given": "Gabriel"} +{"country": "GH", "family": "Acheampong", "given": "Richard"} +{"country": "GH", "family": "Gyetuah", "given": "John"} +{"country": "GH", "family": "Amoako", "given": "Andrew"} +{"country": "GH", "family": "Kankam", "given": "Kennedy"} +{"country": "GH", "family": "Ibrahim", "given": "Ahmed"} +{"country": "GH", "family": "Appiah", "given": "Andy"} +{"country": "GH", "family": "Sekyere", "given": "Benjamin"} +{"country": "GH", "family": "Brobbey", "given": "Bright"} +{"country": "GH", "family": "Forson", "given": "Cassiel"} +{"country": "GH", "family": "Aboagye", "given": "Daniel"} +{"country": "GH", "family": "Napare", "given": "Dominic"} +{"country": "GH", "family": "Hayford", "given": "Ekow"} +{"country": "GH", "family": "Opoku", "given": "Evans"} +{"country": "GH", "family": "Codjoe", "given": "Francis"} +{"country": "GH", "family": "Manu", "given": "Francis"} +{"country": "GH", "family": "Addo", "given": "Yaw"} +{"country": "GH", "family": "Kini", "given": "Geoffrey"} +{"country": "GH", "family": "Oduro", "given": "George"} +{"country": "GH", "family": "Quartey", "given": "Henry"} +{"country": "GH", "family": "Fordjour", "given": "John"} +{"country": "GH", "family": "Adu", "given": "Johnson"} +{"country": "GH", "family": "Okyere", "given": "Kofi"} +{"country": "GH", "family": "Asemanyi", "given": "Kojo"} +{"country": "GH", "family": "Kwabena", "given": "Kwabena"} +{"country": "GH", "family": "Sarpong", "given": "Kwaku"} +{"country": "GH", "family": "Adjei", "given": "Kwame"} +{"country": "GH", "family": "Afriyie", "given": "Nana"} +{"country": "GH", "family": "Boakye-Yiadom", "given": "Patrick"} +{"country": "GH", "family": "Basoah", "given": "Philip"} +{"country": "GH", "family": "Alem", "given": "Robert"} +{"country": "GH", "family": "Mills", "given": "Samuel"} +{"country": "GH", "family": "Adamu", "given": "Suleiman"} +{"country": "GH", "family": "Ntim", "given": "Augustine"} +{"country": "GH", "family": "Ntim", "given": "Collins"} +{"country": "GH", "family": "Gyamfi", "given": "Emmanuel"} +{"country": "GH", "family": "Opoku", "given": "Eric"} +{"country": "GH", "family": "Adongo", "given": "Isaac"} +{"country": "GH", "family": "Amoakohene", "given": "Kofi"} +{"country": "GH", "family": "Appiah", "given": "Kojo"} +{"country": "GH", "family": "Kubi", "given": "Kojo"} +{"country": "GH", "family": "Aidoo", "given": "William"} +{"country": "GH", "family": "Toure", "given": "Nasser"} +{"country": "GH", "family": "Braimah", "given": "Muhammad"} +{"country": "GH", "family": "Bawa", "given": "Muhammad"} +{"country": "GH", "family": "Amankwah", "given": "Collins"} +{"country": "GH", "family": "al-Hassan", "given": "Lydia"} +{"country": "GH", "family": "Eshun", "given": "Ethel"} +{"country": "GH", "family": "Amankwah", "given": "Helen"} +{"country": "GH", "family": "Hagan", "given": "Priscilla"} +{"country": "GH", "family": "Asiedu", "given": "Anderson"} +{"country": "GH", "family": "Ayensu", "given": "Aisha"} +{"country": "GH", "family": "Amuzu", "given": "Anne"} +{"country": "GH", "family": "Provencal", "given": "Oscar"} +{"country": "GH", "family": "Ansah", "given": "Kofi"} +{"country": "GH", "family": "Ansah", "given": "Owusu-Dartey"} +{"country": "GH", "family": "Hesse", "given": "Afua"} +{"country": "GH", "family": "Adjei", "given": "Elizabeth"} +{"country": "GH", "family": "Dogbe", "given": "Elizabeth"} +{"country": "GH", "family": "Morgan", "given": "Benny"} +{"country": "GH", "family": "Quarshie", "given": "Veronica"} +{"country": "GH", "family": "Quarshie", "given": "Veronika"} +{"country": "GH", "family": "Forson", "given": "Habiba"} +{"country": "GH", "family": "Atta", "given": "Habiba"} +{"country": "GH", "family": "Dugan", "given": "Abena"} +{"country": "GH", "family": "Asamoah", "given": "Kofi"} +{"country": "GH", "family": "Butler", "given": "Robert"} +{"country": "GH", "family": "Nuamah", "given": "Fred"} +{"country": "GH", "family": "Gyan", "given": "Ruth"} +{"country": "GH", "family": "Darkwa", "given": "Ruth"} +{"country": "GH", "family": "Opoku", "given": "Sandra"} +{"country": "GH", "family": "Yakubu", "given": "Issah"} +{"country": "GH", "family": "Mends", "given": "Eva"} +{"country": "GH", "family": "Owusu", "given": "Leonard"} +{"country": "GH", "family": "Sackey", "given": "Percy"} +{"country": "GH", "family": "Ankor", "given": "Anita"} +{"country": "GH", "family": "Königsdörffer", "given": "Ransford"} +{"country": "GH", "family": "Königsdörffer", "given": "Yeboah"} +{"country": "GH", "family": "Owusu", "given": "Claudia"} +{"country": "GH", "family": "Eshun", "given": "Kuukua"} +{"country": "GH", "family": "Boafo", "given": "Amoako"} +{"country": "GH", "family": "Marfo", "given": "Kevin"} +{"country": "GH", "family": "Torkornoo", "given": "Gertrude"} +{"country": "GH", "family": "Johnson", "given": "Avril"} +{"country": "GH", "family": "Mosi", "given": "Lydia"} +{"country": "GH", "family": "Muhammed", "given": "Ibrahim"} +{"country": "GH", "family": "Nanja", "given": "Sanja"} +{"country": "GH", "family": "Addo", "given": "Grace"} +{"country": "GH", "family": "Mensah", "given": "Martin"} +{"country": "GH", "family": "Asamoah", "given": "Vincent"} +{"country": "GH", "family": "Bening", "given": "Ahmed"} +{"country": "GH", "family": "Asamoah", "given": "Ofosu"} +{"country": "GH", "family": "Yakubu", "given": "Yakubu"} +{"country": "GH", "family": "Danladi", "given": "Ibrahim"} +{"country": "GH", "family": "Acquah", "given": "Deborah"} +{"country": "GH", "family": "Sesi", "given": "Isaac"} +{"country": "GH", "family": "Dadzie", "given": "Perpetua"} +{"country": "GH", "family": "Sapong", "given": "John"} +{"country": "GH", "family": "Amoah", "given": "Pearl"} +{"country": "GH", "family": "Davis", "given": "Kenturah"} +{"country": "GH", "family": "Grace", "given": "Efe"} +{"country": "GH", "family": "Sarfo", "given": "Gloria"} +{"country": "GH", "family": "Nkansah", "given": "Rosamond"} +{"country": "GH", "family": "Agyemang", "given": "Nana Ama"} +{"country": "GH", "family": "Asiedu", "given": "Mercy"} +{"country": "GH", "family": "Manu", "given": "Kwaku"} +{"country": "GH", "family": "Yeboah", "given": "Akwasi"} +{"country": "GH", "family": "Bekoe", "given": "Veronica"} +{"country": "GH", "family": "Ofori", "given": "Malik"} +{"country": "GH", "family": "Lebene", "given": "Victoria"} +{"country": "GH", "family": "Aryeetey", "given": "Rebecca"} +{"country": "GH", "family": "Boakye", "given": "Augustine"} +{"country": "GH", "family": "Amarteifio", "given": "Evelyn"} +{"country": "GH", "family": "Crabbe", "given": "Mercy"} +{"country": "GH", "family": "Donkor", "given": "Felix"} +{"country": "GH", "family": "Van-Garshong", "given": "Jeremie"} +{"country": "GH", "family": "Mensah", "given": "Precious"} +{"country": "GH", "family": "Ofori", "given": "Pamela"} +{"country": "GH", "family": "Boateng", "given": "Pamela"} +{"country": "GH", "family": "Iddrisu", "given": "Mariam"} +{"country": "GH", "family": "Muslim", "given": "Shamima"} +{"country": "GH", "family": "Jawula", "given": "Fatima"} +{"country": "GH", "family": "Adam", "given": "Susana"} +{"country": "GH", "family": "Seidu", "given": "Doris"} +{"country": "GH", "family": "Yakubu", "given": "Cecilia"} +{"country": "GH", "family": "Boon", "given": "Alice"} +{"country": "GH", "family": "Tedam", "given": "Catherine"} +{"country": "GH", "family": "Blay", "given": "Ama"} +{"country": "GH", "family": "Dwumfour", "given": "Randy"} +{"country": "GH", "family": "Anane", "given": "William"} +{"country": "GH", "family": "Ocran", "given": "Freda"} +{"country": "GH", "family": "Andoh", "given": "Francis"} +{"country": "GH", "family": "Turkson", "given": "Bernard"} +{"country": "GH", "family": "Chinery", "given": "Beatrice"} +{"country": "GH", "family": "Danquah", "given": "Eric"} +{"country": "GH", "family": "Twene", "given": "Christiana"} +{"country": "GH", "family": "Koranteng", "given": "Cecilia"} +{"country": "GH", "family": "Annan", "given": "Christian"} +{"country": "GH", "family": "Annan", "given": "Kwesi"} +{"country": "GH", "family": "Collins", "given": "Dauda"} +{"country": "GH", "family": "Mantey", "given": "Constance"} +{"country": "GH", "family": "Heward-Mills", "given": "Dag"} +{"country": "GH", "family": "Coleman", "given": "Daniel"} +{"country": "GH", "family": "Hansen", "given": "David"} +{"country": "GH", "family": "Davidson", "given": "David"} +{"country": "GH", "family": "Ofei", "given": "David"} +{"country": "GH", "family": "Appiah", "given": "Dennis"} +{"country": "GH", "family": "Buckle", "given": "Desmond"} +{"country": "GH", "family": "Addy", "given": "Ebenezer"} +{"country": "GH", "family": "Ekuban", "given": "Ebenezer"} +{"country": "GH", "family": "Andoh", "given": "Ebo"} +{"country": "GH", "family": "Obeng", "given": "Eddie"} +{"country": "GH", "family": "Adjaho", "given": "Edward"} +{"country": "GH", "family": "Mantey", "given": "Edward"} +{"country": "GH", "family": "Ayensu", "given": "Edward"} +{"country": "GH", "family": "Ayensu", "given": "Solomon"} +{"country": "GH", "family": "Gyimah", "given": "Edwin"} +{"country": "GH", "family": "Baker", "given": "Efua"} +{"country": "GH", "family": "Short", "given": "Emile"} +{"country": "GH", "family": "Adjei", "given": "Eric"} +{"country": "GH", "family": "Lee", "given": "Eric"} +{"country": "GH", "family": "Sackey", "given": "Eric"} +{"country": "GH", "family": "Koffie", "given": "Francis"} +{"country": "GH", "family": "Aryeetey", "given": "Ernest"} +{"country": "GH", "family": "Frimpong", "given": "Evans"} +{"country": "GH", "family": "Mensah", "given": "Evans"} +{"country": "GH", "family": "Ansah", "given": "Ezekiel"} +{"country": "GH", "family": "Dadson", "given": "Florence"} +{"country": "GH", "family": "Boateng", "given": "Francis"} +{"country": "GH", "family": "Amenu", "given": "Francis"} +{"country": "GH", "family": "Coffie", "given": "Francis"} +{"country": "GH", "family": "Mensah", "given": "Francis"} +{"country": "GH", "family": "Boateng", "given": "Frank"} +{"country": "GH", "family": "Kamalu", "given": "Frank"} +{"country": "GH", "family": "Oppong", "given": "Frank"} +{"country": "GH", "family": "Nkrumah", "given": "Gamal"} +{"country": "GH", "family": "Boakye", "given": "George"} +{"country": "GH", "family": "Darko", "given": "George"} +{"country": "GH", "family": "Abdullai", "given": "Zakaria"} +{"country": "GH", "family": "Amartey", "given": "Daniel"} +{"country": "GH", "family": "Addy", "given": "Gifty"} +{"country": "GH", "family": "Yeboah", "given": "Godfred"} +{"country": "GH", "family": "Karikari", "given": "Godfred"} +{"country": "GH", "family": "Tetteh", "given": "Hanna"} +{"country": "GH", "family": "Afriyie", "given": "Hannah"} +{"country": "GH", "family": "Sawyerr", "given": "Harry"} +{"country": "GH", "family": "Konadu", "given": "Maxwell"} +{"country": "GH", "family": "Boakye", "given": "Isaac"} +{"country": "GH", "family": "Boadu", "given": "James"} +{"country": "GH", "family": "Yawson", "given": "Janet"} +{"country": "GH", "family": "Collins", "given": "John"} +{"country": "GH", "family": "Smith", "given": "John"} +{"country": "GH", "family": "Dumas", "given": "Joselyn"} +{"country": "GH", "family": "Afful", "given": "Joseph"} +{"country": "GH", "family": "Boateng", "given": "Joseph"} +{"country": "GH", "family": "Smith", "given": "Joseph"} +{"country": "GH", "family": "Smith", "given": "Henry"} +{"country": "GH", "family": "Boateng", "given": "Joshua"} +{"country": "GH", "family": "Otto", "given": "Joshua"} +{"country": "GH", "family": "Owusu", "given": "Joshua"} +{"country": "GH", "family": "Ibrahim", "given": "Juliet"} +{"country": "GH", "family": "Akrofi", "given": "Justice"} +{"country": "GH", "family": "Issah", "given": "Kamal"} +{"country": "GH", "family": "Andam", "given": "Kenneth"} +{"country": "GH", "family": "Asamoah", "given": "Kenneth"} +{"country": "GH", "family": "Mensah", "given": "Kevin"} +{"country": "GH", "family": "Osei", "given": "Kevin"} +{"country": "GH", "family": "Ofosu", "given": "Kingsley"} +{"country": "GH", "family": "Maxwell", "given": "Koby"} +{"country": "GH", "family": "Frimpong", "given": "Kwabena"} +{"country": "GH", "family": "Boateng", "given": "Kwabena"} +{"country": "GH", "family": "Arhin", "given": "Kwame"} +{"country": "GH", "family": "Andam", "given": "Kwesi"} +{"country": "GH", "family": "Armah", "given": "Kwesi"} +{"country": "GH", "family": "Brew", "given": "Henry"} +{"country": "GH", "family": "Brew", "given": "Osborne"} +{"country": "GH", "family": "Brew", "given": "Kwesi"} +{"country": "GH", "family": "Dickson", "given": "Kwesi"} +{"country": "GH", "family": "Prah", "given": "Kwesi"} +{"country": "GH", "family": "Tetteh", "given": "Lawrence"} +{"country": "GH", "family": "Adjah", "given": "Lawrence"} +{"country": "GH", "family": "Ken-Kwofie", "given": "Louis"} +{"country": "GH", "family": "Forson", "given": "Lydia"} +{"country": "GH", "family": "Agyemang", "given": "Mabel"} +{"country": "GH", "family": "Aidoo", "given": "Joseph"} +{"country": "GH", "family": "Yawson", "given": "Helen"} +{"country": "GH", "family": "Mensah", "given": "Herbert"} +{"country": "GH", "family": "Owusu", "given": "Ursula"} +{"country": "GH", "family": "Hansen", "given": "Yawa"} +{"country": "GH", "family": "Anto", "given": "Kofi"} +{"country": "GH", "family": "Adjei", "given": "Alexander"} +{"country": "GH", "family": "Kotei", "given": "James"} +{"country": "GH", "family": "Mettle", "given": "Joe"} +{"country": "GH", "family": "Morrison", "given": "Bernard"} +{"country": "GH", "family": "Nketiah", "given": "Richmond"} +{"country": "GH", "family": "Agyepong", "given": "Thomas"} +{"country": "GH", "family": "Baeta", "given": "Annie"} +{"country": "GH", "family": "Agyepong", "given": "Irene"} +{"country": "GH", "family": "Tetteh", "given": "Benjamin"} +{"country": "GH", "family": "Ati-Zigi", "given": "Lawrence"} +{"country": "GH", "family": "Dwamena", "given": "Raphael"} +{"country": "GH", "family": "Acheampong", "given": "Gemma"} +{"country": "GH", "family": "Suleman", "given": "Samira"} +{"country": "GH", "family": "Attipoe", "given": "Philip"} +{"country": "GH", "family": "Donkor", "given": "Kwabena"} +{"country": "GH", "family": "Armah", "given": "Grace"} +{"country": "GH", "family": "Mensah", "given": "Mary"} +{"country": "GH", "family": "Quartey", "given": "Cynthia"} +{"country": "GH", "family": "Wiredu", "given": "Doris"} +{"country": "GH", "family": "Erskine", "given": "Anita"} +{"country": "GH", "family": "Dadson", "given": "Hannah"} +{"country": "GH", "family": "Kudjoe", "given": "Hannah"} +{"country": "GH", "family": "Ibrahim", "given": "Faiza"} +{"country": "GH", "family": "Yaro", "given": "Joshua"} +{"country": "GH", "family": "Owusu", "given": "Elsie"} +{"country": "GH", "family": "Nartey", "given": "Samuel"} +{"country": "GH", "family": "Hesse", "given": "Mary"} +{"country": "GH", "family": "Chinery", "given": "Mary"} +{"country": "GH", "family": "Ampem", "given": "Nana"} +{"country": "GH", "family": "Serwaa", "given": "Nana"} +{"country": "GH", "family": "Ampem", "given": "Kobi"} +{"country": "GH", "family": "Serwaa", "given": "Kobi"} +{"country": "GH", "family": "Ampem", "given": "Afia"} +{"country": "GH", "family": "Serwaa", "given": "Afia"} +{"country": "GH", "family": "Busia", "given": "Abena"} +{"country": "GH", "family": "Nkrumah", "given": "Ama"} +{"country": "GH", "family": "Mensah", "given": "Barbara"} +{"country": "GH", "family": "Mensah", "given": "Rose"} +{"country": "GH", "family": "Sowa", "given": "Theo"} +{"country": "GH", "family": "Danquah", "given": "Meri"} +{"country": "GH", "family": "Mercer", "given": "James"} +{"country": "GH", "family": "Bartels", "given": "Francis"} +{"country": "GH", "family": "Kotey", "given": "Amon"} +{"country": "GH", "family": "Bakari", "given": "Grace"} +{"country": "GH", "family": "Boye", "given": "Sylvia"} +{"country": "GH", "family": "Ennin", "given": "Richie"} +{"country": "GH", "family": "Donkor", "given": "Akua"} +{"country": "GH", "family": "Quist", "given": "Lucy"} +{"country": "GH", "family": "Anamoah", "given": "Aba"} +{"country": "GH", "family": "Anamoah", "given": "Nana"} +{"country": "GH", "family": "Sutherland", "given": "Esi"} +{"country": "GH", "family": "Moses", "given": "Charles"} +{"country": "GH", "family": "Sykes", "given": "Samuel"} +{"country": "GH", "family": "Odoi", "given": "Samuel"} +{"country": "GH", "family": "Danso", "given": "Kwaku"} +{"country": "GH", "family": "Boafo", "given": "Kwaku"} +{"country": "GH", "family": "Danso", "given": "Alex"} +{"country": "GH", "family": "Boafo", "given": "Alex"} +{"country": "GH", "family": "Odonkor", "given": "Johanna"} +{"country": "GH", "family": "Mercer", "given": "Thomas"} +{"country": "GH", "family": "Lê", "given": "Phú"} +{"country": "GH", "family": "Jones", "given": "Derrick"} +{"country": "GH", "family": "al-Hassan", "given": "Roland"} +{"country": "GH", "family": "Amankwah", "given": "Alex"} +{"country": "GH", "family": "Cofie", "given": "Ethel"} +{"country": "GH", "family": "Selby", "given": "Kofi"} +{"country": "GH", "family": "Aryene", "given": "Paul"} +{"country": "GH", "family": "Bentil", "given": "Benjamin"} +{"country": "GH", "family": "Amematekpor", "given": "Maureen"} +{"country": "GH", "family": "Attah", "given": "Ayşe"} +{"country": "GH", "family": "Tetteh", "given": "Samuel"} +{"country": "GH", "family": "Tsegah", "given": "Francis"} +{"country": "GH", "family": "James", "given": "James"} +{"country": "GH", "family": "Bonsu", "given": "Emmanuel"} +{"country": "GH", "family": "Owusu", "given": "Emmanuel"} +{"country": "GH", "family": "Boateng", "given": "Edmund"} +{"country": "GH", "family": "Andoh", "given": "Doreen"} +{"country": "GH", "family": "Aranha", "given": "Maria"} +{"country": "GH", "family": "Aranha", "given": "Felipa"} +{"country": "GH", "family": "Yeboah", "given": "Paul"} +{"country": "GH", "family": "Limann", "given": "Fulera"} +{"country": "GH", "family": "Egyir", "given": "Janet"} +{"country": "GH", "family": "Eshun", "given": "Linda"} +{"country": "GH", "family": "Mensah", "given": "Gideon"} +{"country": "GH", "family": "Benson", "given": "Stephanie"} +{"country": "GH", "family": "Williams", "given": "George"} +{"country": "GH", "family": "Semakor", "given": "Samuel"} +{"country": "GH", "family": "Semakor", "given": "Glenn"} +{"country": "GH", "family": "Ofori", "given": "Lawrence"} +{"country": "GH", "family": "Agyemang", "given": "Valentina"} +{"country": "GH", "family": "Agyemang", "given": "Afia"} +{"country": "GH", "family": "Bamford", "given": "Diana"} +{"country": "GH", "family": "Amoako", "given": "Christine"} +{"country": "GH", "family": "Swatson", "given": "Audrey"} +{"country": "GH", "family": "Osei", "given": "Sika"} +{"country": "GH", "family": "Yeboah", "given": "Scofray"} +{"country": "GH", "family": "Fuseini", "given": "Ayisha"} +{"country": "GH", "family": "Hagan", "given": "Emmanuel"} +{"country": "GH", "family": "Acquah", "given": "Betty"} +{"country": "GH", "family": "Boateng", "given": "Ernest"} +{"country": "GH", "family": "Boateng", "given": "A."} +{"country": "GH", "family": "Barley", "given": "Ivy"} +{"country": "GH", "family": "Brobbey", "given": "Emelia"} +{"country": "GH", "family": "Ameka", "given": "Felix"} +{"country": "GH", "family": "Addardey", "given": "Belinda"} +{"country": "GH", "family": "Gardner", "given": "James"} +{"country": "GH", "family": "Darko", "given": "Michael"} +{"country": "GH", "family": "Hesse", "given": "Virginia"} +{"country": "GH", "family": "Jacks", "given": "Ethel"} +{"country": "GH", "family": "Asamoah", "given": "Samuel"} +{"country": "GH", "family": "Coleman", "given": "Ellen"} +{"country": "GH", "family": "Asantewaa", "given": "Grace"} +{"country": "GH", "family": "Odamtten", "given": "George"} +{"country": "GH", "family": "Quashigah", "given": "Ivan"} +{"country": "GH", "family": "Addy", "given": "Kathleen"} +{"country": "GH", "family": "Jackson", "given": "Bernard"} +{"country": "GH", "family": "Ansah", "given": "Evelyn"} +{"country": "GH", "family": "Kobla", "given": "Joseph"} +{"country": "GH", "family": "Asante", "given": "Richard"} +{"country": "GH", "family": "Nkansah", "given": "Marian"} +{"country": "GH", "family": "Adu", "given": "Dennis"} +{"country": "GH", "family": "Lartey", "given": "Solomon"} +{"country": "GH", "family": "Andrews", "given": "Ebenezer"} +{"country": "GH", "family": "Botwe", "given": "Emmanuel"} +{"country": "GH", "family": "Abitty", "given": "Jennifer"} +{"country": "GH", "family": "Bentum", "given": "Stella"} +{"country": "GH", "family": "Crossland", "given": "Ophelia"} +{"country": "GH", "family": "Doe", "given": "Daniel"} +{"country": "GH", "family": "Kwadwo", "given": "Leroy"} +{"country": "GH", "family": "Sibo", "given": "Kwasi"} +{"country": "GH", "family": "Kyeremeh", "given": "Godson"} +{"country": "GH", "family": "Agyeman", "given": "Priscilla"} +{"country": "GH", "family": "Campbell", "given": "Jean"} +{"country": "GH", "family": "Campbell", "given": "Lucy"} +{"country": "GH", "family": "Amoah", "given": "Joseph"} +{"country": "GH", "family": "Yawson", "given": "John"} +{"country": "GH", "family": "Zage", "given": "Ursula"} +{"country": "GH", "family": "Zage", "given": "Zita"} +{"country": "GH", "family": "Poku", "given": "Kwame"} +{"country": "GH", "family": "Hamilton", "given": "Diana"} +{"country": "GH", "family": "Sarpong", "given": "Akua"} +{"country": "GH", "family": "Azamati", "given": "Benjamin"} +{"country": "GH", "family": "Amoah", "given": "Abena"} +{"country": "GH", "family": "Hemans", "given": "Isaac"} +{"country": "GH", "family": "Suzuki", "given": "Zion"} +{"country": "GH", "family": "Opoku", "given": "Vida"} +{"country": "GH", "family": "Opoku", "given": "Jerome"} +{"country": "GH", "family": "Busia", "given": "Ama"} +{"country": "GH", "family": "Abdul-Samad", "given": "Salis"} +{"country": "GH", "family": "Asare", "given": "Mavis"} +{"country": "GH", "family": "Yeboah", "given": "Rose"} +{"country": "GH", "family": "Amoako", "given": "Alice"} +{"country": "GH", "family": "Opare", "given": "Jessica"} +{"country": "GH", "family": "Saforo", "given": "Jessica"} +{"country": "GH", "family": "Kuma", "given": "Anita"} +{"country": "GH", "family": "Abiola", "given": "Marufatu"} +{"country": "GH", "family": "Ngissah", "given": "Roselyn"} +{"country": "GH", "family": "Gardiner", "given": "James"} +{"country": "GH", "family": "Krupp", "given": "Umar"} +{"country": "GH", "family": "Tachie", "given": "Kate"} +{"country": "GH", "family": "Abah", "given": "Prisca"} +{"country": "GH", "family": "Köhn", "given": "Derrick"} +{"country": "GH", "family": "Addo", "given": "Akua"} +{"country": "GH", "family": "Awadzi", "given": "Elsie"} +{"country": "GH", "family": "Mainoo", "given": "Joseph"} +{"country": "GH", "family": "Danquah", "given": "Martin"} +{"country": "GH", "family": "Mensah", "given": "Atta"} +{"country": "GH", "family": "Agyeman", "given": "Albert"} +{"country": "GH", "family": "Koranteng", "given": "Mary"} +{"country": "GH", "family": "Konadu", "given": "Gifty"} +{"country": "GH", "family": "Cudjoe", "given": "Jennifer"} +{"country": "GH", "family": "Addae", "given": "Christopher"} +{"country": "GH", "family": "Sarfo", "given": "Francis"} +{"country": "GH", "family": "Twum", "given": "Ceccy"} +{"country": "GH", "family": "Duut", "given": "Emmanuel"} +{"country": "GH", "family": "Hanson", "given": "Akosua"} +{"country": "GH", "family": "Adams", "given": "Saddick"} +{"country": "GH", "family": "Adu", "given": "Prince"} +{"country": "GH", "family": "Adu", "given": "Kwabena"} +{"country": "GH", "family": "Dartey", "given": "Doris"} +{"country": "GH", "family": "Winkler", "given": "Berthold"} +{"country": "GH", "family": "Selormey", "given": "Kokui"} +{"country": "GH", "family": "Campbell", "given": "Andrew"} +{"country": "GH", "family": "Asante", "given": "Alberta"} +{"country": "GH", "family": "Baah", "given": "Rose"} +{"country": "GH", "family": "Darko", "given": "Rita"} +{"country": "GH", "family": "Bediako", "given": "Ernest"} +{"country": "GH", "family": "Sarpong", "given": "Nana"} +{"country": "GH", "family": "Sarpong", "given": "Yaa"} +{"country": "GH", "family": "Okine", "given": "Priscilla"} +{"country": "GH", "family": "Adams", "given": "Grace"} +{"country": "GH", "family": "Addai", "given": "Linda"} +{"country": "GH", "family": "Afriyie", "given": "Deborah"} +{"country": "GH", "family": "Appiah", "given": "Veronica"} +{"country": "GH", "family": "Asante", "given": "Rebecca"} +{"country": "GH", "family": "Otoo", "given": "Margaret"} +{"country": "GH", "family": "Yiadom", "given": "Cynthia"} +{"country": "GH", "family": "Anima", "given": "Naomi"} +{"country": "GH", "family": "Neequaye", "given": "Gladys"} +{"country": "GH", "family": "Antwi", "given": "Regina"} +{"country": "GH", "family": "Kolli", "given": "Ivy"} +{"country": "GH", "family": "Anane", "given": "Belinda"} +{"country": "TZ", "family": "Kikwete", "given": "Jakaya"} +{"country": "TZ", "family": "Pinda", "given": "Mizengo"} +{"country": "TZ", "family": "Membe", "given": "Bernard"} +{"country": "TZ", "family": "Ikangaa", "given": "Juma"} +{"country": "TZ", "family": "Rugambwa", "given": "Laurean"} +{"country": "TZ", "family": "Ruwa’ichi", "given": "Jude"} +{"country": "TZ", "family": "Ruwa’ichi", "given": "Thadaeus"} +{"country": "TZ", "family": "Pengo", "given": "Polycarp"} +{"country": "TZ", "family": "Nyerere", "given": "Julius"} +{"country": "TZ", "family": "Nyambui", "given": "Suleiman"} +{"country": "TZ", "family": "Ljungqvist", "given": "Ida"} +{"country": "TZ", "family": "Sumaye", "given": "Frederick"} +{"country": "TZ", "family": "Gurnah", "given": "Abd al-Razzaq"} +{"country": "TZ", "family": "Gurnah", "given": "Abdulrazak"} +{"country": "TZ", "family": "Karume", "given": "Abeid"} +{"country": "TZ", "family": "Mkapa", "given": "Benjamin"} +{"country": "TZ", "family": "Kitereza", "given": "Aniceti"} +{"country": "TZ", "family": "Thabeet", "given": "Hasheem"} +{"country": "TZ", "family": "Mwinyi", "given": "Ali"} +{"country": "TZ", "family": "Marwa", "given": "Dickson"} +{"country": "TZ", "family": "Msuri", "given": "John"} +{"country": "TZ", "family": "Lowassa", "given": "Edward"} +{"country": "TZ", "family": "Karume", "given": "Amani"} +{"country": "TZ", "family": "Mongella", "given": "Gertrude"} +{"country": "TZ", "family": "Tibaijuka", "given": "Anna"} +{"country": "TZ", "family": "Migiro", "given": "Rose"} +{"country": "TZ", "family": "Migiro", "given": "Asha"} +{"country": "TZ", "family": "Bayi", "given": "Filbert"} +{"country": "TZ", "family": "Bayo", "given": "Zebedayo"} +{"country": "TZ", "family": "Sipe", "given": "Andrea"} +{"country": "TZ", "family": "Msuya", "given": "Cleopa"} +{"country": "TZ", "family": "Haule", "given": "Joseph"} +{"country": "TZ", "family": "Joseph", "given": "Restytuta"} +{"country": "TZ", "family": "Rugambwa", "given": "Protase"} +{"country": "TZ", "family": "Isuja", "given": "Matthias"} +{"country": "TZ", "family": "Sulle", "given": "Martin"} +{"country": "TZ", "family": "Warioba", "given": "Joseph"} +{"country": "TZ", "family": "Kezilahabi", "given": "Euphrase"} +{"country": "TZ", "family": "Mrwanda", "given": "Danny"} +{"country": "TZ", "family": "Shein", "given": "Ali"} +{"country": "TZ", "family": "Malecela", "given": "John"} +{"country": "TZ", "family": "Poulsen", "given": "Yussuf"} +{"country": "TZ", "family": "Tingatinga", "given": "Edward"} +{"country": "TZ", "family": "Katesigwa", "given": "Banuelia"} +{"country": "TZ", "family": "Mabula", "given": "Bernard"} +{"country": "TZ", "family": "Isengwe", "given": "Christopher"} +{"country": "TZ", "family": "Ulimwengu", "given": "Thomas"} +{"country": "TZ", "family": "Kamwelu", "given": "Nelly"} +{"country": "TZ", "family": "Shija", "given": "Matthew"} +{"country": "TZ", "family": "Salim", "given": "Salim"} +{"country": "TZ", "family": "Sokoine", "given": "Edward"} +{"country": "TZ", "family": "Mapunda", "given": "Emmanuel"} +{"country": "TZ", "family": "Moshi", "given": "Stefano"} +{"country": "TZ", "family": "Naasi", "given": "Fabiano"} +{"country": "TZ", "family": "Zawose", "given": "Hukwe"} +{"country": "TZ", "family": "Kawawa", "given": "Rashidi"} +{"country": "TZ", "family": "Shahanga", "given": "Alfredo"} +{"country": "TZ", "family": "Kilaini", "given": "Method"} +{"country": "TZ", "family": "Lilanga", "given": "George"} +{"country": "TZ", "family": "Mwasikwabhila", "given": "John"} +{"country": "TZ", "family": "Nyaisonga", "given": "John"} +{"country": "TZ", "family": "Mwasikwabhila", "given": "Gervas"} +{"country": "TZ", "family": "Nyaisonga", "given": "Gervas"} +{"country": "TZ", "family": "Bayo", "given": "Getuli"} +{"country": "TZ", "family": "Shahanga", "given": "Gidamis"} +{"country": "TZ", "family": "Makamba", "given": "January"} +{"country": "TZ", "family": "Wakil", "given": "Idris"} +{"country": "TZ", "family": "Massawe", "given": "Isaac"} +{"country": "TZ", "family": "Massawe", "given": "Amani"} +{"country": "TZ", "family": "Kateka", "given": "James"} +{"country": "TZ", "family": "Ako", "given": "Benedict"} +{"country": "TZ", "family": "Johansson", "given": "Barbro"} +{"country": "TZ", "family": "Mkuchika", "given": "George"} +{"country": "TZ", "family": "Nagu", "given": "Mary"} +{"country": "TZ", "family": "Kombani", "given": "Celina"} +{"country": "TZ", "family": "Mwinyi", "given": "Hussein"} +{"country": "TZ", "family": "Chiza", "given": "Christopher"} +{"country": "TZ", "family": "Maghembe", "given": "Jumanne"} +{"country": "TZ", "family": "Nchimbi", "given": "Emmanuel"} +{"country": "TZ", "family": "Magufuli", "given": "John"} +{"country": "TZ", "family": "Mwakyembe", "given": "Harrison"} +{"country": "TZ", "family": "Kajege", "given": "Charles"} +{"country": "TZ", "family": "Keenja", "given": "Charles"} +{"country": "TZ", "family": "Mtikila", "given": "Christopher"} +{"country": "TZ", "family": "Chami", "given": "Cyril"} +{"country": "TZ", "family": "David", "given": "David"} +{"country": "TZ", "family": "Chilolo", "given": "Diana"} +{"country": "TZ", "family": "Kamala", "given": "Diodorus"} +{"country": "TZ", "family": "Msekela", "given": "James"} +{"country": "TZ", "family": "Odhiambo", "given": "Eddie"} +{"country": "TZ", "family": "Batenga", "given": "Elizabeth"} +{"country": "TZ", "family": "Kabaka", "given": "Gaudentia"} +{"country": "TZ", "family": "Polino", "given": "Emilian"} +{"country": "TZ", "family": "Mwambulukutu", "given": "Emmanuel"} +{"country": "TZ", "family": "Katagira", "given": "Eustace"} +{"country": "TZ", "family": "Bakar", "given": "Faida"} +{"country": "TZ", "family": "Fereji", "given": "Fatma"} +{"country": "TZ", "family": "Ali", "given": "Fatma"} +{"country": "TZ", "family": "Mussa", "given": "Faustine"} +{"country": "TZ", "family": "Banyikwa", "given": "Feetham"} +{"country": "TZ", "family": "Bura", "given": "Felister"} +{"country": "TZ", "family": "Chami", "given": "Felix"} +{"country": "TZ", "family": "Mukangara", "given": "Fenella"} +{"country": "TZ", "family": "Mbowe", "given": "Freeman"} +{"country": "TZ", "family": "Mahanga", "given": "Milton"} +{"country": "TZ", "family": "Mahenge", "given": "Binilith"} +{"country": "TZ", "family": "Malima", "given": "Adam"} +{"country": "TZ", "family": "Kayombo", "given": "Gaudence"} +{"country": "TZ", "family": "Lwenge", "given": "Gerson"} +{"country": "TZ", "family": "Cheyo", "given": "Gideon"} +{"country": "TZ", "family": "Teu", "given": "Gregory"} +{"country": "TZ", "family": "Mberwa", "given": "Hadji"} +{"country": "TZ", "family": "Kigwangalla", "given": "Hamisi"} +{"country": "TZ", "family": "Murji", "given": "Hasnain"} +{"country": "TZ", "family": "Kigwalilo", "given": "Hassan"} +{"country": "TZ", "family": "Khatib", "given": "Hassan"} +{"country": "TZ", "family": "Ghaisa", "given": "Hawa"} +{"country": "TZ", "family": "Chana", "given": "Hazara"} +{"country": "TZ", "family": "Hemed", "given": "Hemed"} +{"country": "TZ", "family": "Mntangi", "given": "Herbert"} +{"country": "TZ", "family": "Marwa", "given": "Joseph"} +{"country": "TZ", "family": "Azzan", "given": "Idd"} +{"country": "TZ", "family": "Ladhu", "given": "Ismail"} +{"country": "TZ", "family": "Issa", "given": "Issa"} +{"country": "TZ", "family": "Mapunda", "given": "Ivo"} +{"country": "TZ", "family": "Kahama", "given": "Janet"} +{"country": "TZ", "family": "Mbene", "given": "Janet"} +{"country": "TZ", "family": "Chiligati", "given": "John"} +{"country": "TZ", "family": "Cheyo", "given": "John"} +{"country": "TZ", "family": "Akukweti", "given": "Juma"} +{"country": "TZ", "family": "Kapuya", "given": "Juma"} +{"country": "TZ", "family": "Mwapachu", "given": "Juma"} +{"country": "TZ", "family": "Khalifa", "given": "Khalifa"} +{"country": "TZ", "family": "Ameir", "given": "Kheri"} +{"country": "TZ", "family": "Stirling", "given": "Dominic"} +{"country": "TZ", "family": "Stirling", "given": "Leader"} +{"country": "TZ", "family": "Himid", "given": "Lubaina"} +{"country": "TZ", "family": "Baldini", "given": "Luisa"} +{"country": "TZ", "family": "Moshi", "given": "Magdalena"} +{"country": "TZ", "family": "Maalim", "given": "Mahadhi"} +{"country": "TZ", "family": "Majaliwa", "given": "Kassim"} +{"country": "TZ", "family": "Mbarawa", "given": "Makame"} +{"country": "TZ", "family": "Hewa", "given": "Maria"} +{"country": "TZ", "family": "Kasembe", "given": "Mariam"} +{"country": "TZ", "family": "Mwandosya", "given": "Mark"} +{"country": "TZ", "family": "Chikawe", "given": "Mathias"} +{"country": "TZ", "family": "Emmanuel", "given": "Meryce"} +{"country": "TZ", "family": "Kadika", "given": "Mgeni"} +{"country": "TZ", "family": "Bilal", "given": "Mohamed"} +{"country": "TZ", "family": "Dewji", "given": "Muhammad"} +{"country": "TZ", "family": "Mbilinyi", "given": "Joseph"} +{"country": "TZ", "family": "Mbilinyi", "given": "Osmund"} +{"country": "TZ", "family": "Khatib", "given": "Muhammad"} +{"country": "TZ", "family": "Jecha", "given": "Mwadini"} +{"country": "TZ", "family": "Bafadhili", "given": "Nuru"} +{"country": "TZ", "family": "Hoogan", "given": "Parmukh"} +{"country": "TZ", "family": "Degera", "given": "Paschal"} +{"country": "TZ", "family": "Chokala", "given": "Patrick"} +{"country": "TZ", "family": "Bomani", "given": "Paul"} +{"country": "TZ", "family": "Silima", "given": "Pereira"} +{"country": "TZ", "family": "Kabuye", "given": "Phares"} +{"country": "TZ", "family": "Msekwa", "given": "Pius"} +{"country": "TZ", "family": "Adhia", "given": "Richa"} +{"country": "TZ", "family": "Juma", "given": "Riziki"} +{"country": "TZ", "family": "Aziz", "given": "Rostam"} +{"country": "TZ", "family": "Salum", "given": "Saada"} +{"country": "TZ", "family": "Arfi", "given": "Said"} +{"country": "TZ", "family": "Farrah", "given": "Saleh"} +{"country": "TZ", "family": "Khalfan", "given": "Salim"} +{"country": "TZ", "family": "Khamis", "given": "Salim"} +{"country": "TZ", "family": "Kikwete", "given": "Salma"} +{"country": "TZ", "family": "Ntiro", "given": "Sam"} +{"country": "TZ", "family": "Chitalilo", "given": "Samuel"} +{"country": "TZ", "family": "Sitta", "given": "Samuel"} +{"country": "TZ", "family": "Iddi", "given": "Seif"} +{"country": "TZ", "family": "Hamad", "given": "Seif"} +{"country": "TZ", "family": "Rashidi", "given": "Seif"} +{"country": "TZ", "family": "Mvungi", "given": "Sengondo"} +{"country": "TZ", "family": "Nahodha", "given": "Shamsi"} +{"country": "TZ", "family": "Juma", "given": "Shoka"} +{"country": "TZ", "family": "Kawambwa", "given": "Shukuru"} +{"country": "TZ", "family": "Kaboyonga", "given": "Siraju"} +{"country": "TZ", "family": "Simba", "given": "Sophia"} +{"country": "TZ", "family": "Muhongo", "given": "Sospeter"} +{"country": "TZ", "family": "Galinoma", "given": "Stephen"} +{"country": "TZ", "family": "Masele", "given": "Stephen"} +{"country": "TZ", "family": "Mwalimu", "given": "Ummy"} +{"country": "TZ", "family": "Kawawa", "given": "Vita"} +{"country": "TZ", "family": "Shija", "given": "William"} +{"country": "TZ", "family": "Lukuvi", "given": "William"} +{"country": "TZ", "family": "Mgimwa", "given": "William"} +{"country": "TZ", "family": "Issa", "given": "Yahya"} +{"country": "TZ", "family": "Kevela", "given": "Stanley"} +{"country": "TZ", "family": "Gama", "given": "Zainab"} +{"country": "TZ", "family": "Meghji", "given": "Zakia"} +{"country": "TZ", "family": "Ndugai", "given": "Job"} +{"country": "TZ", "family": "Slaa", "given": "Wilbrod"} +{"country": "TZ", "family": "Dewji", "given": "Hasnain"} +{"country": "TZ", "family": "Simbachawene", "given": "George"} +{"country": "TZ", "family": "Genzabuke", "given": "Josephine"} +{"country": "TZ", "family": "Khamis", "given": "Mwajuma"} +{"country": "TZ", "family": "Kabwe", "given": "Zitto"} +{"country": "TZ", "family": "Msakila", "given": "Charles"} +{"country": "TZ", "family": "Emmanuel", "given": "Marcellina"} +{"country": "TZ", "family": "Mhagama", "given": "Jenista"} +{"country": "TZ", "family": "Amour", "given": "Salmin"} +{"country": "TZ", "family": "Mtemvu", "given": "Abbas"} +{"country": "TZ", "family": "Marombwa", "given": "Abdul"} +{"country": "TZ", "family": "Abdallah", "given": "Abubakar"} +{"country": "TZ", "family": "Mwanri", "given": "Aggrey"} +{"country": "TZ", "family": "Shabiby", "given": "Ahmed"} +{"country": "TZ", "family": "Salum", "given": "Ahmed"} +{"country": "TZ", "family": "Salim", "given": "Ali"} +{"country": "TZ", "family": "Temba", "given": "Amani"} +{"country": "TZ", "family": "Shellukindo", "given": "Beatrice"} +{"country": "TZ", "family": "Losurutia", "given": "Benedict"} +{"country": "TZ", "family": "Malangalila", "given": "Benito"} +{"country": "TZ", "family": "Mpesya", "given": "Benson"} +{"country": "TZ", "family": "Sakila", "given": "Bujiku"} +{"country": "TZ", "family": "Ligallama", "given": "Castor"} +{"country": "TZ", "family": "Wangwe", "given": "Chacha"} +{"country": "TZ", "family": "Mlingwa", "given": "Charles"} +{"country": "TZ", "family": "Mgonja", "given": "Chedieli"} +{"country": "TZ", "family": "Sendeka", "given": "Christopher"} +{"country": "TZ", "family": "Mollel", "given": "Elisa"} +{"country": "TZ", "family": "Luhahula", "given": "Emmanuel"} +{"country": "TZ", "family": "Mabina", "given": "Ernest"} +{"country": "TZ", "family": "Madeje", "given": "Ephraim"} +{"country": "TZ", "family": "Kilasi", "given": "Esterina"} +{"country": "TZ", "family": "Maige", "given": "Ezekiel"} +{"country": "TZ", "family": "Maghimbi", "given": "Fatuma"} +{"country": "TZ", "family": "Rwilomba", "given": "Faustine"} +{"country": "TZ", "family": "Limbu", "given": "Festus"} +{"country": "TZ", "family": "Mpanda", "given": "Ferdinand"} +{"country": "TZ", "family": "Tungu", "given": "Fred"} +{"country": "TZ", "family": "Kimbita", "given": "Fuya"} +{"country": "TZ", "family": "Lubeleje", "given": "George"} +{"country": "TZ", "family": "Zambi", "given": "Godfrey"} +{"country": "TZ", "family": "Sigonda", "given": "Guido"} +{"country": "TZ", "family": "Tahir", "given": "Hafidh"} +{"country": "TZ", "family": "Kagasheki", "given": "Khamis"} +{"country": "TZ", "family": "Mwenegoha", "given": "Hamza"} +{"country": "TZ", "family": "Chibulunje", "given": "Hezekiah"} +{"country": "TZ", "family": "Mtulia", "given": "Idris"} +{"country": "TZ", "family": "Moe", "given": "Jay"} +{"country": "TZ", "family": "Sumari", "given": "Jeremiah"} +{"country": "TZ", "family": "Shibuda", "given": "John"} +{"country": "TZ", "family": "Lwanji", "given": "John"} +{"country": "TZ", "family": "Ngasongwa", "given": "Juma"} +{"country": "TZ", "family": "Killimbah", "given": "Juma"} +{"country": "TZ", "family": "Njwayo", "given": "Juma"} +{"country": "TZ", "family": "N'hunga", "given": "Juma"} +{"country": "TZ", "family": "Mporogomyi", "given": "Kilontsi"} +{"country": "TZ", "family": "Masha", "given": "Lawrence"} +{"country": "TZ", "family": "Mayenga", "given": "Lucy"} +{"country": "TZ", "family": "Selelii", "given": "Lucas"} +{"country": "TZ", "family": "Mwanazila", "given": "Ludovick"} +{"country": "TZ", "family": "Mpina", "given": "Luhaga"} +{"country": "TZ", "family": "Komba", "given": "Lucy"} +{"country": "TZ", "family": "Msambya", "given": "Manju"} +{"country": "TZ", "family": "Msindai", "given": "Mgana"} +{"country": "TZ", "family": "Soud", "given": "Muhammad"} +{"country": "TZ", "family": "Sinani", "given": "Muhammad"} +{"country": "TZ", "family": "Mussa", "given": "Mossy"} +{"country": "TZ", "family": "Mudhihir", "given": "Mudhihir"} +{"country": "TZ", "family": "Msomi", "given": "Mwinchoum"} +{"country": "TZ", "family": "Karamagi", "given": "Nazir"} +{"country": "TZ", "family": "Mkono", "given": "Nimrod"} +{"country": "TZ", "family": "Mussa", "given": "Omari"} +{"country": "TZ", "family": "Kwaangw'", "given": "Omar"} +{"country": "TZ", "family": "Kimiti", "given": "Paul"} +{"country": "TZ", "family": "Msolla", "given": "Peter"} +{"country": "TZ", "family": "Serukamba", "given": "Peter"} +{"country": "TZ", "family": "Ndesamburo", "given": "Philemon"} +{"country": "TZ", "family": "Nyami", "given": "Ponsiano"} +{"country": "TZ", "family": "Mwalyosi", "given": "Raphael"} +{"country": "TZ", "family": "Mrope", "given": "Raynald"} +{"country": "TZ", "family": "Chegeni", "given": "Raphael"} +{"country": "TZ", "family": "Ndassa", "given": "Richard"} +{"country": "TZ", "family": "Nyaulawa", "given": "Richard"} +{"country": "TZ", "family": "Mlaki", "given": "Rita"} +{"country": "TZ", "family": "Msafiri", "given": "Ruth"} +{"country": "TZ", "family": "Nkumba", "given": "Said"} +{"country": "TZ", "family": "Mohamed", "given": "Salim"} +{"country": "TZ", "family": "Mbatia", "given": "Salome"} +{"country": "TZ", "family": "Salum", "given": "Salum"} +{"country": "TZ", "family": "Telele", "given": "Kaika"} +{"country": "TZ", "family": "Ng'itu", "given": "Sigfrid"} +{"country": "TZ", "family": "Wasira", "given": "Stephen"} +{"country": "TZ", "family": "Kumchaya", "given": "Suleiman"} +{"country": "TZ", "family": "Ntimizi", "given": "Tatu"} +{"country": "TZ", "family": "Pandu", "given": "Ussi"} +{"country": "TZ", "family": "Manyinyi", "given": "Vedastus"} +{"country": "TZ", "family": "Mwambalaswa", "given": "Victor"} +{"country": "TZ", "family": "Shelukindo", "given": "William"} +{"country": "TZ", "family": "Kusila", "given": "William"} +{"country": "TZ", "family": "Ngeleja", "given": "William"} +{"country": "TZ", "family": "Vulu", "given": "Zaynab"} +{"country": "TZ", "family": "Maulid", "given": "Zubeir"} +{"country": "TZ", "family": "Bendera", "given": "Joel"} +{"country": "TZ", "family": "Daftari", "given": "Maua"} +{"country": "TZ", "family": "Ngwilizi", "given": "Hassan"} +{"country": "TZ", "family": "Mohamed", "given": "Hamad"} +{"country": "TZ", "family": "Nundu", "given": "Omari"} +{"country": "TZ", "family": "Mahiga", "given": "Augustine"} +{"country": "TZ", "family": "Mwaiposa", "given": "Eugen"} +{"country": "TZ", "family": "Mkulo", "given": "Mustafa"} +{"country": "TZ", "family": "Chifupa", "given": "Amina"} +{"country": "TZ", "family": "Shah", "given": "Abdulkarim"} +{"country": "TZ", "family": "Seif", "given": "Ali"} +{"country": "TZ", "family": "Malecela", "given": "Anne"} +{"country": "TZ", "family": "Ali", "given": "Amina"} +{"country": "TZ", "family": "Khamis", "given": "Hemed"} +{"country": "TZ", "family": "Sykes", "given": "Ally"} +{"country": "TZ", "family": "Apiyo", "given": "Timothy"} +{"country": "TZ", "family": "Birraux", "given": "Joseph-Marie"} +{"country": "TZ", "family": "Jamal", "given": "Amir"} +{"country": "TZ", "family": "Malima", "given": "Kighoma"} +{"country": "TZ", "family": "Kolimba", "given": "Horace"} +{"country": "TZ", "family": "Gama", "given": "Lawrence"} +{"country": "TZ", "family": "Bwanamdogo", "given": "Saidi"} +{"country": "TZ", "family": "Mramba", "given": "Basil"} +{"country": "TZ", "family": "Yona", "given": "Daniel"} +{"country": "TZ", "family": "Mwakyusa", "given": "David"} +{"country": "TZ", "family": "Missanga", "given": "Mohamed"} +{"country": "TZ", "family": "Shekifu", "given": "Henry"} +{"country": "TZ", "family": "Laizer", "given": "Mike"} +{"country": "TZ", "family": "Laizer", "given": "Michael"} +{"country": "TZ", "family": "Mkapa", "given": "Dunstan"} +{"country": "TZ", "family": "Shayo", "given": "Leonard"} +{"country": "TZ", "family": "Keissy", "given": "Ally"} +{"country": "TZ", "family": "Ali", "given": "Juma"} +{"country": "TZ", "family": "Kahigi", "given": "Kulikoyela"} +{"country": "TZ", "family": "Kasulumbayi", "given": "Sylvester"} +{"country": "TZ", "family": "Khamis", "given": "Kheir"} +{"country": "TZ", "family": "Mwanjale", "given": "Luckson"} +{"country": "TZ", "family": "Pamba", "given": "Saleh"} +{"country": "TZ", "family": "Akunaay", "given": "Mustapha"} +{"country": "TZ", "family": "Abdallah", "given": "Rashid"} +{"country": "TZ", "family": "Abood", "given": "Abdulaziz"} +{"country": "TZ", "family": "Badwel", "given": "Omary"} +{"country": "TZ", "family": "Ali", "given": "Abdallah"} +{"country": "TZ", "family": "Ali", "given": "Mbarouk"} +{"country": "TZ", "family": "Amar", "given": "Hussein"} +{"country": "TZ", "family": "Amer", "given": "Abdulsalaam"} +{"country": "TZ", "family": "Ameir", "given": "Abdallah"} +{"country": "TZ", "family": "Mteketa", "given": "Abdul"} +{"country": "TZ", "family": "Mfutakamba", "given": "Athuman"} +{"country": "TZ", "family": "Nkya", "given": "Lucy"} +{"country": "TZ", "family": "Zungu", "given": "Mussa"} +{"country": "TZ", "family": "Rage", "given": "Ismail"} +{"country": "TZ", "family": "Suleiman", "given": "Haroun"} +{"country": "TZ", "family": "Chambiri", "given": "Kisyeri"} +{"country": "TZ", "family": "Komba", "given": "John"} +{"country": "TZ", "family": "Mwambu", "given": "Salome"} +{"country": "TZ", "family": "Mallole", "given": "David"} +{"country": "TZ", "family": "Mnyaa", "given": "Mohamed"} +{"country": "TZ", "family": "Kibona", "given": "Aliko"} +{"country": "TZ", "family": "Lembeli", "given": "James"} +{"country": "TZ", "family": "Ngonyani", "given": "Stephen"} +{"country": "TZ", "family": "Sanga", "given": "Deo"} +{"country": "TZ", "family": "Sanya", "given": "Muhammad"} +{"country": "TZ", "family": "Huvisa", "given": "Terezya"} +{"country": "TZ", "family": "Kafumu", "given": "Dalaly"} +{"country": "TZ", "family": "Kebwe", "given": "Stephen"} +{"country": "TZ", "family": "Max", "given": "Donald"} +{"country": "TZ", "family": "Said", "given": "Said"} +{"country": "TZ", "family": "Barwany", "given": "Salum"} +{"country": "TZ", "family": "Bwanausi", "given": "Jerome"} +{"country": "TZ", "family": "Kalogeris", "given": "Innocent"} +{"country": "TZ", "family": "Kilufi", "given": "Modestus"} +{"country": "TZ", "family": "Mitambo", "given": "Faith"} +{"country": "TZ", "family": "Mussa", "given": "Mussa"} +{"country": "TZ", "family": "Kitwanga", "given": "Charles"} +{"country": "TZ", "family": "Makani", "given": "Ramo"} +{"country": "TZ", "family": "Malocha", "given": "Ignas"} +{"country": "TZ", "family": "Mipata", "given": "Desderius"} +{"country": "TZ", "family": "Hassan", "given": "Samia"} +{"country": "TZ", "family": "Suluhu", "given": "Samia"} +{"country": "TZ", "family": "Tax", "given": "Stergomena"} +{"country": "TZ", "family": "Bungara", "given": "Selemani"} +{"country": "TZ", "family": "Jabu", "given": "Waride"} +{"country": "TZ", "family": "Mtutura", "given": "Mtutura"} +{"country": "TZ", "family": "Omar", "given": "Rashid"} +{"country": "TZ", "family": "Shao", "given": "Joseph"} +{"country": "TZ", "family": "Tizeba", "given": "Charles"} +{"country": "TZ", "family": "Salim", "given": "Masoud"} +{"country": "TZ", "family": "Shamis", "given": "Haroub"} +{"country": "TZ", "family": "Clement", "given": "Amina"} +{"country": "TZ", "family": "Jaddy", "given": "Jaddy"} +{"country": "TZ", "family": "Kombo", "given": "Kombo"} +{"country": "TZ", "family": "Lugola", "given": "Alphaxard"} +{"country": "TZ", "family": "Mgimwa", "given": "Mahmoud"} +{"country": "TZ", "family": "Mohammed", "given": "Rajab"} +{"country": "TZ", "family": "Natse", "given": "Israel"} +{"country": "TZ", "family": "Turky", "given": "Salim"} +{"country": "TZ", "family": "Hamad", "given": "Hamad"} +{"country": "TZ", "family": "Khamis", "given": "Yussuf"} +{"country": "TZ", "family": "Mbatia", "given": "James"} +{"country": "TZ", "family": "Koka", "given": "Silvestry"} +{"country": "TZ", "family": "Mabumba", "given": "Sylvester"} +{"country": "TZ", "family": "Msigwa", "given": "Peter"} +{"country": "TZ", "family": "Nassir", "given": "Yusuph"} +{"country": "TZ", "family": "Zedi", "given": "Selemani"} +{"country": "TZ", "family": "Buyogera", "given": "Agripina"} +{"country": "TZ", "family": "Juma", "given": "Juma"} +{"country": "TZ", "family": "Masele", "given": "Augustino"} +{"country": "TZ", "family": "Airo", "given": "Lameck"} +{"country": "TZ", "family": "Kitandula", "given": "Dunstan"} +{"country": "TZ", "family": "Hirani", "given": "Mansoor"} +{"country": "TZ", "family": "Mansoor", "given": "Mansoor"} +{"country": "TZ", "family": "Hirani", "given": "Shanif"} +{"country": "TZ", "family": "Mansoor", "given": "Shanif"} +{"country": "TZ", "family": "Opulukwa", "given": "Meshack"} +{"country": "TZ", "family": "Kakoso", "given": "Moshi"} +{"country": "TZ", "family": "Kandege", "given": "Sinkamba"} +{"country": "TZ", "family": "Lissu", "given": "Tundu"} +{"country": "TZ", "family": "Cheka", "given": "Francis"} +{"country": "TZ", "family": "Kigola", "given": "Mendrad"} +{"country": "TZ", "family": "Ndugulile", "given": "Faustine"} +{"country": "TZ", "family": "Soni", "given": "Jitu"} +{"country": "TZ", "family": "Zubeir", "given": "Said"} +{"country": "TZ", "family": "Jumaa", "given": "Hamoud"} +{"country": "TZ", "family": "Makani", "given": "Julie"} +{"country": "TZ", "family": "Nyalandu", "given": "Lazaro"} +{"country": "TZ", "family": "Bukwimba", "given": "Lolesia"} +{"country": "TZ", "family": "Machemli", "given": "Salvatory"} +{"country": "TZ", "family": "Makalla", "given": "Amos"} +{"country": "TZ", "family": "Sumar", "given": "Shaffin"} +{"country": "TZ", "family": "Filikunjombe", "given": "Deo"} +{"country": "TZ", "family": "Lusinde", "given": "Joseph"} +{"country": "TZ", "family": "Lusinde", "given": "Livingstone"} +{"country": "TZ", "family": "Mbassa", "given": "Antony"} +{"country": "TZ", "family": "Mulugo", "given": "Philipo"} +{"country": "TZ", "family": "Nkamia", "given": "Juma"} +{"country": "TZ", "family": "Saleh", "given": "Ramadan / Ramadhan"} +{"country": "TZ", "family": "Masauni", "given": "Hamad"} +{"country": "TZ", "family": "Hilaly", "given": "Aeshi"} +{"country": "TZ", "family": "Jafo", "given": "Selemani"} +{"country": "TZ", "family": "Ngwali", "given": "Ahmed"} +{"country": "TZ", "family": "Nyerere", "given": "Vincent"} +{"country": "TZ", "family": "Kairuki", "given": "Angellah"} +{"country": "TZ", "family": "Kiwia", "given": "Highness"} +{"country": "TZ", "family": "Nyangwine", "given": "Nyambari"} +{"country": "TZ", "family": "Mdee", "given": "Halima"} +{"country": "TZ", "family": "Wenje", "given": "Ezekia"} +{"country": "TZ", "family": "Suleiman", "given": "Suleiman"} +{"country": "TZ", "family": "Mtanda", "given": "Saidi"} +{"country": "TZ", "family": "Machali", "given": "Moses"} +{"country": "TZ", "family": "Mgimwa", "given": "Godfrey"} +{"country": "TZ", "family": "Kafulila", "given": "David"} +{"country": "TZ", "family": "Khamis", "given": "Sadifa"} +{"country": "TZ", "family": "Silinde", "given": "David"} +{"country": "TZ", "family": "Mkosamali", "given": "Felix"} +{"country": "TZ", "family": "Kinana", "given": "Abdulrahman"} +{"country": "TZ", "family": "Mangungu", "given": "Murtuza"} +{"country": "TZ", "family": "Mbilinyi", "given": "Simon"} +{"country": "TZ", "family": "Mella", "given": "Paul"} +{"country": "TZ", "family": "Mella", "given": "Ignace"} +{"country": "TZ", "family": "Mkapa", "given": "Anna"} +{"country": "TZ", "family": "Mnyika", "given": "John"} +{"country": "TZ", "family": "Mshama", "given": "Assumpter"} +{"country": "TZ", "family": "Mwijage", "given": "Charles"} +{"country": "TZ", "family": "Mwinyi", "given": "Abdullah"} +{"country": "TZ", "family": "Nassari", "given": "Joshua"} +{"country": "TZ", "family": "Nnauye", "given": "Nape"} +{"country": "TZ", "family": "Ntabaliba", "given": "Albert"} +{"country": "TZ", "family": "Ntukamazina", "given": "Deogratias"} +{"country": "TZ", "family": "Nyerere", "given": "Maria"} +{"country": "TZ", "family": "Omar", "given": "Suleiman"} +{"country": "TZ", "family": "Lyamba", "given": "Clemence"} +{"country": "TZ", "family": "Mhina", "given": "Laus"} +{"country": "TZ", "family": "Mbega", "given": "Monica"} +{"country": "TZ", "family": "Maneno", "given": "Ramadhani"} +{"country": "TZ", "family": "Rweikiza", "given": "Jason"} +{"country": "TZ", "family": "Saadalla", "given": "Abdulla"} +{"country": "TZ", "family": "Edward", "given": "Albert"} +{"country": "TZ", "family": "Mtema", "given": "Regia"} +{"country": "TZ", "family": "Singh", "given": "Anup"} +{"country": "TZ", "family": "Pellegrino", "given": "Amahl"} +{"country": "TZ", "family": "Bernard", "given": "Carolyne"} +{"country": "TZ", "family": "Brown", "given": "Roland"} +{"country": "TZ", "family": "Sangu", "given": "Liberatus"} +{"country": "TZ", "family": "Mapunda", "given": "Edward"} +{"country": "TZ", "family": "Lulida", "given": "Riziki"} +{"country": "TZ", "family": "Mrema", "given": "Felix"} +{"country": "TZ", "family": "Mfaki", "given": "Mariam"} +{"country": "TZ", "family": "Juma", "given": "Ismail"} +{"country": "TZ", "family": "Marmo", "given": "Philip"} +{"country": "TZ", "family": "Mero", "given": "Modest"} +{"country": "TZ", "family": "Rwakatare", "given": "Gertrude"} +{"country": "TZ", "family": "Magufuli", "given": "Janeth"} +{"country": "TZ", "family": "Possi", "given": "Abdallah"} +{"country": "TZ", "family": "Joseph", "given": "Jane"} +{"country": "TZ", "family": "Laizer", "given": "Richard"} +{"country": "TZ", "family": "Ndalichako", "given": "Joyce"} +{"country": "TZ", "family": "Junior", "given": "Bob"} +{"country": "TZ", "family": "Kaluwa", "given": "Bonnah"} +{"country": "TZ", "family": "Heche", "given": "John"} +{"country": "TZ", "family": "Sargeant", "given": "Juliet"} +{"country": "TZ", "family": "Ramadhani", "given": "Sara"} +{"country": "TZ", "family": "Mwegelo", "given": "Jokate"} +{"country": "TZ", "family": "Fernandes", "given": "Benjamin"} +{"country": "TZ", "family": "Kanji", "given": "Yasmin"} +{"country": "TZ", "family": "Mbelwa", "given": "Joseph"} +{"country": "TZ", "family": "Chiplukar", "given": "Raju"} +{"country": "TZ", "family": "Jobanputra", "given": "Arun"} +{"country": "TZ", "family": "Shah", "given": "Mukesh"} +{"country": "TZ", "family": "Hassan", "given": "Juma"} +{"country": "TZ", "family": "Selemani", "given": "Fatma"} +{"country": "TZ", "family": "Jumaa", "given": "Nassra"} +{"country": "TZ", "family": "Ahmed", "given": "Fuad"} +{"country": "TZ", "family": "Chiplunkar", "given": "Rajeev"} +{"country": "TZ", "family": "Mabula", "given": "Angeline"} +{"country": "TZ", "family": "Matiko", "given": "Esther"} +{"country": "TZ", "family": "Chihota", "given": "Norman"} +{"country": "TZ", "family": "Thomas", "given": "Tudd"} +{"country": "TZ", "family": "Kolimba", "given": "Susan"} +{"country": "TZ", "family": "Kolimba", "given": "Suzan"} +{"country": "TZ", "family": "Joshi", "given": "Mehul"} +{"country": "TZ", "family": "Juma", "given": "Mohamed"} +{"country": "TZ", "family": "Juma", "given": "Mselem"} +{"country": "TZ", "family": "Thomas", "given": "Daniel"} +{"country": "TZ", "family": "Bulembo", "given": "Abdallah"} +{"country": "TZ", "family": "Kabudi", "given": "Palamagamba"} +{"country": "TZ", "family": "Ruge", "given": "Catherine"} +{"country": "TZ", "family": "Joseph", "given": "Joel"} +{"country": "TZ", "family": "Joseph", "given": "Vicent"} +{"country": "TZ", "family": "Simon", "given": "Angelo"} +{"country": "TZ", "family": "Taratibu", "given": "Haruna"} +{"country": "TZ", "family": "Ali", "given": "Jamal"} +{"country": "TZ", "family": "Akibar", "given": "Ajali"} +{"country": "TZ", "family": "Abdallah", "given": "Hamida"} +{"country": "TZ", "family": "Alex", "given": "Stella"} +{"country": "TZ", "family": "Ali", "given": "Khamis"} +{"country": "TZ", "family": "Ali", "given": "Khadija"} +{"country": "TZ", "family": "Ameir", "given": "Wanu"} +{"country": "TZ", "family": "Amon", "given": "Saul"} +{"country": "TZ", "family": "Oscar", "given": "Rwegasira"} +{"country": "TZ", "family": "Bulaya", "given": "Ester"} +{"country": "TZ", "family": "Jussa", "given": "Jaffar"} +{"country": "TZ", "family": "Bakar", "given": "Zainabu"} +{"country": "TZ", "family": "Owenya", "given": "Lucy"} +{"country": "TZ", "family": "Kabati", "given": "Ritta"} +{"country": "TZ", "family": "Kangoye", "given": "Maria"} +{"country": "TZ", "family": "Paresso", "given": "Cecilia"} +{"country": "TZ", "family": "Paulo", "given": "Issaay"} +{"country": "TZ", "family": "Mgaya", "given": "Neema"} +{"country": "TZ", "family": "Mwalongo", "given": "Edward"} +{"country": "TZ", "family": "Maselle", "given": "Susanne"} +{"country": "TZ", "family": "Kakunda", "given": "Joseph"} +{"country": "TZ", "family": "Chagulla", "given": "Josephine"} +{"country": "TZ", "family": "Chatanda", "given": "Mary"} +{"country": "TZ", "family": "Gekul", "given": "Pauline"} +{"country": "TZ", "family": "Waitara", "given": "Mwita"} +{"country": "TZ", "family": "Aboud", "given": "Khadija"} +{"country": "TZ", "family": "Mwanjelwa", "given": "Mary"} +{"country": "TZ", "family": "Gidarya", "given": "Anna"} +{"country": "TZ", "family": "Getere", "given": "Boniphace"} +{"country": "TZ", "family": "Holle", "given": "Augustine"} +{"country": "TZ", "family": "Hongoli", "given": "Joram"} +{"country": "TZ", "family": "Hussein", "given": "Yussuf"} +{"country": "TZ", "family": "Giga", "given": "Najma"} +{"country": "TZ", "family": "Gulamali", "given": "Khamis"} +{"country": "TZ", "family": "Ishengoma", "given": "Christine"} +{"country": "TZ", "family": "Japhary", "given": "Raphael"} +{"country": "TZ", "family": "Issa", "given": "Khalifa"} +{"country": "TZ", "family": "Ibrahim", "given": "Hassanali"} +{"country": "TZ", "family": "Hamad", "given": "Azza"} +{"country": "TZ", "family": "Hamad", "given": "Juma"} +{"country": "TZ", "family": "Haonga", "given": "Pascal"} +{"country": "TZ", "family": "Hasunga", "given": "Japhet"} +{"country": "TZ", "family": "Hija", "given": "Juma"} +{"country": "TZ", "family": "John", "given": "Emmanuel"} +{"country": "TZ", "family": "Khamis", "given": "Ali"} +{"country": "TZ", "family": "Chakoma", "given": "Hawa"} +{"country": "TZ", "family": "Khamis", "given": "Fakharia"} +{"country": "TZ", "family": "Chande", "given": "Lathifah"} +{"country": "TZ", "family": "Bashe", "given": "Hussein"} +{"country": "TZ", "family": "Khatib", "given": "Mohamed"} +{"country": "TZ", "family": "Bashungwa", "given": "Innocent"} +{"country": "TZ", "family": "Ayoub", "given": "Jaku"} +{"country": "TZ", "family": "Bawazir", "given": "Mbaraka"} +{"country": "TZ", "family": "Aweso", "given": "Jumaa"} +{"country": "TZ", "family": "Bilago", "given": "Kasuku"} +{"country": "TZ", "family": "Chumi", "given": "Cosato"} +{"country": "TZ", "family": "Bilakwate", "given": "Innocent"} +{"country": "TZ", "family": "Biteko", "given": "Doto"} +{"country": "TZ", "family": "Chuachua", "given": "Rashid"} +{"country": "TZ", "family": "Tambwe", "given": "Munde"} +{"country": "TZ", "family": "Bobali", "given": "Hamidu"} +{"country": "TZ", "family": "Tendega", "given": "Grace"} +{"country": "TZ", "family": "Theonest", "given": "Anatropia"} +{"country": "TZ", "family": "Toufiq", "given": "Fatma"} +{"country": "TZ", "family": "Chikota", "given": "Abdallah"} +{"country": "TZ", "family": "Bunga", "given": "Jasmine"} +{"country": "TZ", "family": "Dau", "given": "Mbaraka"} +{"country": "TZ", "family": "Tweve", "given": "Rose"} +{"country": "TZ", "family": "Ulega", "given": "Abdallah"} +{"country": "TZ", "family": "Umbulla", "given": "Martha"} +{"country": "TZ", "family": "Ungando", "given": "Ally"} +{"country": "TZ", "family": "Vuai", "given": "Khamis"} +{"country": "TZ", "family": "Peneza", "given": "Upendo"} +{"country": "TZ", "family": "Kyaruzi", "given": "Vedastus"} +{"country": "TZ", "family": "Albert", "given": "Charles"} +{"country": "TZ", "family": "Chacha", "given": "Marwa"} +{"country": "TZ", "family": "Gama", "given": "Leonidas"} +{"country": "TZ", "family": "Laizer", "given": "Julius"} +{"country": "TZ", "family": "Komba", "given": "Yosepher"} +{"country": "TZ", "family": "Makamba", "given": "Salome"} +{"country": "TZ", "family": "Makamba", "given": "Wycliffe"} +{"country": "TZ", "family": "Nchemba", "given": "Mwigulu"} +{"country": "TZ", "family": "Mbogo", "given": "Richard"} +{"country": "TZ", "family": "King", "given": "Norman"} +{"country": "TZ", "family": "Tumiotto", "given": "Sonia"} +{"country": "TZ", "family": "von Hassel", "given": "Gertrud"} +{"country": "TZ", "family": "Brown", "given": "Peter"} +{"country": "TZ", "family": "Mwakyusa", "given": "Raymond"} +{"country": "TZ", "family": "Mwakyusa", "given": "Shaban"} +{"country": "TZ", "family": "Pol", "given": "Ben"} +{"country": "TZ", "family": "Lameck", "given": "Lucy"} +{"country": "TZ", "family": "Mgonja", "given": "Mary"} +{"country": "TZ", "family": "Amir", "given": "Zainab"} +{"country": "TZ", "family": "Jensen", "given": "Lisa"} +{"country": "TZ", "family": "Wolper", "given": "Jacqueline"} +{"country": "TZ", "family": "Manning", "given": "Julie"} +{"country": "TZ", "family": "Edwards", "given": "Marion"} +{"country": "TZ", "family": "Donoghue", "given": "Marion"} +{"country": "TZ", "family": "Paulsen", "given": "Ritha"} +{"country": "TZ", "family": "Msuya", "given": "Joyce"} +{"country": "TZ", "family": "Geay", "given": "Gabriel"} +{"country": "TZ", "family": "Tale", "given": "Hamisi"} +{"country": "TZ", "family": "Singh", "given": "A."} +{"country": "TZ", "family": "Abed", "given": "Ali"} +{"country": "TZ", "family": "Hussein", "given": "Ali"} +{"country": "TZ", "family": "Shah", "given": "Atish"} +{"country": "TZ", "family": "Divecha", "given": "Bhupendra"} +{"country": "TZ", "family": "Sodangar", "given": "Birju"} +{"country": "TZ", "family": "Mosha", "given": "Esther"} +{"country": "TZ", "family": "Din", "given": "Firoz"} +{"country": "TZ", "family": "Mwanahawu", "given": "H."} +{"country": "TZ", "family": "Mawoko", "given": "Hassanali"} +{"country": "TZ", "family": "Mawoko", "given": "Haji"} +{"country": "TZ", "family": "Sadru", "given": "Ibrahim"} +{"country": "TZ", "family": "Doshi", "given": "Jayprakash"} +{"country": "TZ", "family": "Kathod", "given": "K."} +{"country": "TZ", "family": "Rathod", "given": "Kailas"} +{"country": "TZ", "family": "Alibhai", "given": "M."} +{"country": "TZ", "family": "Noormohamed", "given": "M."} +{"country": "TZ", "family": "Dias", "given": "Martha"} +{"country": "TZ", "family": "Divecha", "given": "Mohan"} +{"country": "TZ", "family": "Nathwani", "given": "Mukesh"} +{"country": "TZ", "family": "Juma", "given": "Nassor"} +{"country": "TZ", "family": "Rawal", "given": "Nilesh"} +{"country": "TZ", "family": "Sangani", "given": "Nishit"} +{"country": "TZ", "family": "Somani", "given": "Parag"} +{"country": "TZ", "family": "Divecha", "given": "Raju"} +{"country": "TZ", "family": "Chiplunkar", "given": "S."} +{"country": "TZ", "family": "Evevhi", "given": "D."} +{"country": "TZ", "family": "Evevhi", "given": "S."} +{"country": "TZ", "family": "Ali", "given": "Mohamed"} +{"country": "TZ", "family": "Ali", "given": "D."} +{"country": "TZ", "family": "Ali", "given": "S."} +{"country": "TZ", "family": "Kayumali", "given": "Shahnawaz"} +{"country": "TZ", "family": "Juma", "given": "Sharifa"} +{"country": "TZ", "family": "Rajani", "given": "Sheetal"} +{"country": "TZ", "family": "Divecha", "given": "Suresh"} +{"country": "TZ", "family": "Rajani", "given": "Sweta"} +{"country": "TZ", "family": "Cota", "given": "Victor"} +{"country": "TZ", "family": "Godfrey", "given": "Cecilia"} +{"country": "TZ", "family": "Shayo", "given": "Theresa"} +{"country": "TZ", "family": "Maeda", "given": "Aina"} +{"country": "TZ", "family": "Adolf", "given": "Emily"} +{"country": "TZ", "family": "Kessy", "given": "Saida"} +{"country": "TZ", "family": "Gerald", "given": "Miriam"} +{"country": "TZ", "family": "Emmanuel", "given": "Genevieve"} +{"country": "TZ", "family": "Sebastian", "given": "Sylvia"} +{"country": "TZ", "family": "Mhina", "given": "Margaret"} +{"country": "TZ", "family": "Juma", "given": "Mariam"} +{"country": "TZ", "family": "Wisse", "given": "John"} +{"country": "TZ", "family": "Chiza", "given": "Zubeir"} +{"country": "TZ", "family": "Saulo", "given": "Emmy"} +{"country": "TZ", "family": "Maleko", "given": "Esther"} +{"country": "TZ", "family": "Lang", "given": "Julia"} +{"country": "TZ", "family": "Tarimo", "given": "Noel"} +{"country": "TZ", "family": "Tarimo", "given": "Elizabeth"} +{"country": "TZ", "family": "Mbiku", "given": "Deogratias"} +{"country": "TZ", "family": "Karoli", "given": "Atanasia"} +{"country": "TZ", "family": "Tarimo", "given": "Atanasia"} +{"country": "TZ", "family": "Yohana", "given": "Lawii"} +{"country": "TZ", "family": "Yohana", "given": "Lawi"} +{"country": "TZ", "family": "Kess", "given": "Alphonse"} +{"country": "TZ", "family": "Kheir", "given": "Omar"} +{"country": "TZ", "family": "Meena", "given": "Colin"} +{"country": "TZ", "family": "Bryceson", "given": "Derek"} +{"country": "TZ", "family": "Juma", "given": "Richard"} +{"country": "TZ", "family": "Juma", "given": "Zawadi"} +{"country": "TZ", "family": "Kimaryo", "given": "Scholastica"} +{"country": "TZ", "family": "Lema", "given": "Joyce"} +{"country": "TZ", "family": "Juma", "given": "Aisha"} +{"country": "TZ", "family": "Mohamed", "given": "Zainabu"} +{"country": "TZ", "family": "Jackson", "given": "Eva"} +{"country": "TZ", "family": "Mrema", "given": "Lucia"} +{"country": "TZ", "family": "Ambani", "given": "Timothy"} +{"country": "TZ", "family": "Manji", "given": "Yusuf"} +{"country": "TZ", "family": "Amani", "given": "Frida"} +{"country": "TZ", "family": "Damas", "given": "Angela"} +{"country": "TZ", "family": "Said", "given": "Omary"} +{"country": "TZ", "family": "Mao", "given": "Shana"} +{"country": "TZ", "family": "Lema", "given": "Deborah"} +{"country": "TZ", "family": "Juma", "given": "Denzel"} +{"country": "TZ", "family": "Pamba", "given": "Jordan"} +{"country": "TZ", "family": "Warioba", "given": "Sophia"} +{"country": "TZ", "family": "Omary", "given": "Neema"} +{"country": "TZ", "family": "Malangalila", "given": "Michael"} +{"country": "TZ", "family": "Laizer", "given": "Elizabeth"} +{"country": "TZ", "family": "Mollel", "given": "Evaline"} +{"country": "TZ", "family": "Simba", "given": "Rahma"} +{"country": "TZ", "family": "Mhina", "given": "Rehema"} +{"country": "TZ", "family": "Bakari", "given": "Salum"} +{"country": "TZ", "family": "Mabula", "given": "Samson"} +{"country": "TZ", "family": "James", "given": "Joseph"} +{"country": "TZ", "family": "Frank", "given": "Clinton"} +{"country": "TZ", "family": "Mollel", "given": "Sesilia"} +{"country": "TZ", "family": "Mollel", "given": "Happy"} +{"country": "TZ", "family": "Mollel", "given": "Anna"} +{"country": "TZ", "family": "Mollel", "given": "Catherine"} +{"country": "TZ", "family": "Mollel", "given": "Paulina"} +{"country": "TZ", "family": "Laizer", "given": "Neema"} +{"country": "TZ", "family": "Ndayishimiye", "given": "Philippe"} +{"country": "TZ", "family": "Jongintaba", "given": "Yahya"} +{"country": "TZ", "family": "Salim", "given": "Fatuma"} +{"country": "TZ", "family": "Ramadhani", "given": "Samson"} +{"country": "TZ", "family": "Kimbisa", "given": "Adam"} +{"country": "TZ", "family": "Burra", "given": "John"} +{"country": "TZ", "family": "Shivji", "given": "Shiraz"} +{"country": "TZ", "family": "Khalfan", "given": "Nizār"} +{"country": "TZ", "family": "Kimaryo", "given": "Rogatus"} +{"country": "TZ", "family": "Ngalalekumtwa", "given": "Tarcisius"} +{"country": "TZ", "family": "Sheriff", "given": "Abdul"} +{"country": "TZ", "family": "Jumbe", "given": "Aboud"} +{"country": "TZ", "family": "Bocco", "given": "John"} +{"country": "TZ", "family": "Samatta", "given": "Mbwana"} +{"country": "TZ", "family": "Kambona", "given": "Oscar"} +{"country": "TZ", "family": "Abeid", "given": "Bahati"} +{"country": "TZ", "family": "Abdallah", "given": "Anna"} +{"country": "TZ", "family": "Juma", "given": "Omar"} +{"country": "TZ", "family": "Abdallah", "given": "Maida"} +{"country": "TZ", "family": "Abdallah", "given": "Mohamed"} +{"country": "TZ", "family": "Abdulaziz", "given": "Muhammad"} +{"country": "TZ", "family": "Lipumba", "given": "Ibrahim"} +{"country": "TZ", "family": "Turner", "given": "Myles"} +{"country": "TZ", "family": "Kigoda", "given": "Abdallah"} +{"country": "TZ", "family": "Khatib", "given": "Abdisalaam"} +{"country": "TZ", "family": "Babu", "given": "Abdulrahman"} +{"country": "TZ", "family": "Bakary", "given": "Abubakar"} +{"country": "TZ", "family": "Yussuf", "given": "Adi"} +{"country": "TZ", "family": "Diria", "given": "Ahmed"} +{"country": "TZ", "family": "Kigoda", "given": "Aisha"} +{"country": "TZ", "family": "Rontos", "given": "Alex"} +{"country": "TZ", "family": "Ali", "given": "Ali"} +{"country": "TZ", "family": "Ame", "given": "Ame"} +{"country": "TZ", "family": "Ameir", "given": "Ameir"} +{"country": "TZ", "family": "Chenge", "given": "Andrew"} +{"country": "TZ", "family": "Chaurembo", "given": "Ania"} +{"country": "TZ", "family": "Komu", "given": "Anna"} +{"country": "TZ", "family": "Senkoro", "given": "Anna"} +{"country": "TZ", "family": "Makinda", "given": "Anne"} +{"country": "TZ", "family": "Makinda", "given": "Anna"} +{"country": "TZ", "family": "Diallo", "given": "Anthony"} +{"country": "TZ", "family": "Jecha", "given": "Asha"} +{"country": "TZ", "family": "Janguo", "given": "Athumani"} +{"country": "TZ", "family": "Mrema", "given": "Augustine"} +{"country": "TZ", "family": "Ally", "given": "Aziza"} +{"country": "TZ", "family": "Blandes", "given": "Gosbert"} +{"country": "TZ", "family": "Faki", "given": "Bakari"} +{"country": "TZ", "family": "Burian", "given": "Batilda"} +{"country": "TZ", "family": "Lema", "given": "Godbless"} +{"country": "TZ", "family": "Mwaba", "given": "David"} +{"country": "TZ", "family": "Kamm", "given": "Maria"} +{"country": "TZ", "family": "Mapunda", "given": "Grace"} +{"country": "TZ", "family": "Paul", "given": "Irene"} +{"country": "TZ", "family": "Gupta", "given": "Elizabeth"} +{"country": "TZ", "family": "Francis", "given": "Joel"} +{"country": "TZ", "family": "Anna", "given": "Anna"} +{"country": "TZ", "family": "Adhero", "given": "Isaac"} +{"country": "TZ", "family": "http://www.wikidata.org/.well-known/genid/fe8b071bd8e610bcdbc5b30bbfd3d2d1", "given": "Vicent"} +{"country": "TZ", "family": "Kay", "given": "Zara"} +{"country": "TZ", "family": "Kawawa", "given": "Sofia"} +{"country": "TZ", "family": "http://www.wikidata.org/.well-known/genid/e99e5cc64dba249fe8ba36d46d8c20b6", "given": "Abel"} +{"country": "TZ", "family": "Msimbe", "given": "Lazarus"} +{"country": "TZ", "family": "Msimbe", "given": "Vitalis"} +{"country": "TZ", "family": "Da Silva", "given": "Stephen"} +{"country": "TZ", "family": "Mendes", "given": "Benedict"} +{"country": "TZ", "family": "Chisonga", "given": "Hilary"} +{"country": "TZ", "family": "Hirji", "given": "Karim"} +{"country": "TZ", "family": "Nermend", "given": "Kesra"} +{"country": "TZ", "family": "Ali", "given": "Meena"} +{"country": "TZ", "family": "Mrema", "given": "Elizabeth"} +{"country": "TZ", "family": "Leo", "given": "Judith"} +{"country": "TZ", "family": "Matiko", "given": "Joseph"} +{"country": "TZ", "family": "Martin", "given": "Peter"} +{"country": "TZ", "family": "Martin", "given": "Martin"} +{"country": "TZ", "family": "Strauss", "given": "Shanna"} +{"country": "TZ", "family": "Tarimo", "given": "Irene"} +{"country": "TZ", "family": "Tarimo", "given": "Aurelia"} +{"country": "TZ", "family": "Ramadhani", "given": "Augustino"} +{"country": "TZ", "family": "Mdee", "given": "Marianne"} +{"country": "TZ", "family": "Heilman", "given": "Victoria"} +{"country": "TZ", "family": "Monko", "given": "Marco"} +{"country": "TZ", "family": "Kente", "given": "Wenceslaus"} +{"country": "TZ", "family": "Kente", "given": "Rweyabura"} +{"country": "TZ", "family": "Kente", "given": "Willibard"} +{"country": "TZ", "family": "Mwanga", "given": "Omary"} +{"country": "TZ", "family": "Shaibu", "given": "Abdallah"} +{"country": "TZ", "family": "Saidi", "given": "Augustine"} +{"country": "TZ", "family": "Godfrey", "given": "Paulo"} +{"country": "TZ", "family": "Issa", "given": "Fatuma"} +{"country": "TZ", "family": "Muganda", "given": "Godfrey"} +{"country": "TZ", "family": "Juma", "given": "Antonio"} +{"country": "TZ", "family": "Msuya", "given": "Ezekiel"} +{"country": "TZ", "family": "Msuya", "given": "Flower"} +{"country": "TZ", "family": "Magufuli", "given": "Jesca"} +{"country": "TZ", "family": "Gwajima", "given": "Dorothy"} +{"country": "TZ", "family": "Dewji", "given": "Fatema"} +{"country": "TZ", "family": "Tarimo", "given": "Isidor"} +{"country": "TZ", "family": "Masondole", "given": "Simon"} +{"country": "TZ", "family": "Gonzalez", "given": "Barbara"} +{"country": "TZ", "family": "Gonzalez", "given": "Jaime"} +{"country": "TZ", "family": "Kamungo", "given": "Bernard"} +{"country": "TZ", "family": "Lupinga", "given": "Muhammad"} +{"country": "TZ", "family": "Maleko", "given": "Jilly"} +{"country": "TZ", "family": "Mwaka", "given": "Andrea"} +{"country": "TZ", "family": "Cosmas", "given": "Cosmas"} +{"country": "TZ", "family": "Mwanga", "given": "gladness"} +{"country": "TZ", "family": "Mwanga", "given": "George"} +{"country": "TZ", "family": "Donisi", "given": "Minja"} +{"country": "TZ", "family": "Bilali", "given": "Amina"} +{"country": "TZ", "family": "Shija", "given": "Janeth"} +{"country": "TZ", "family": "Job", "given": "Dickson"} +{"country": "TZ", "family": "Pisa", "given": "Wolfgang"} +{"country": "TZ", "family": "Minja", "given": "Jimmy"} +{"country": "TZ", "family": "Latham", "given": "Michael"} +{"country": "TZ", "family": "Tarimo", "given": "Aquiline"} +{"country": "TZ", "family": "Pinda", "given": "Tunu"} +{"country": "TZ", "family": "Tundu Lissu", "given": "Tundu"} +{"country": "UG", "family": "Kiprotich", "given": "Stephen"} +{"country": "UG", "family": "Amin", "given": "Idi"} +{"country": "UG", "family": "Dada", "given": "Idi"} +{"country": "UG", "family": "Museveni", "given": "Yoweri"} +{"country": "UG", "family": "Mbabazi", "given": "Amama"} +{"country": "UG", "family": "Kutesa", "given": "Sam"} +{"country": "UG", "family": "Kony", "given": "Joseph"} +{"country": "UG", "family": "Bhimji", "given": "Zarina"} +{"country": "UG", "family": "Wogute", "given": "Abraham"} +{"country": "UG", "family": "Kisekka", "given": "Samson"} +{"country": "UG", "family": "Malinga", "given": "Alex"} +{"country": "UG", "family": "Lewis", "given": "Phillip"} +{"country": "UG", "family": "Okello", "given": "Tito"} +{"country": "UG", "family": "Awori", "given": "Aggrey"} +{"country": "UG", "family": "Mehta", "given": "Chandrasekhar"} +{"country": "UG", "family": "Mehta", "given": "Shekhar"} +{"country": "UG", "family": "Lule", "given": "Yusuf"} +{"country": "UG", "family": "Kiwanuka", "given": "Benedicto"} +{"country": "UG", "family": "Kato", "given": "David"} +{"country": "UG", "family": "Lwanga", "given": "Charles"} +{"country": "UG", "family": "Ogola", "given": "Francis"} +{"country": "UG", "family": "Kaggwa", "given": "Apolo"} +{"country": "UG", "family": "Brooks", "given": "Wilson"} +{"country": "UG", "family": "Sekagya", "given": "Ibrahim"} +{"country": "UG", "family": "Oder", "given": "Arthur"} +{"country": "UG", "family": "Kayongo-Mutumba", "given": "Martin"} +{"country": "UG", "family": "Kalule", "given": "Ayub"} +{"country": "UG", "family": "Mamdani", "given": "Mahmoud"} +{"country": "UG", "family": "Onyango", "given": "Denis"} +{"country": "UG", "family": "Oryema", "given": "Geoffrey"} +{"country": "UG", "family": "Kizito", "given": "Joseph"} +{"country": "UG", "family": "Ekiring", "given": "Edwin"} +{"country": "UG", "family": "Obbo", "given": "Emmanuel"} +{"country": "UG", "family": "Orombi", "given": "Henry"} +{"country": "UG", "family": "Orombi", "given": "Luke"} +{"country": "UG", "family": "Kiwánuka", "given": "Joseph"} +{"country": "UG", "family": "Bainomugisha", "given": "Lambert"} +{"country": "UG", "family": "Odongo", "given": "James"} +{"country": "UG", "family": "Wapakhabulo", "given": "James"} +{"country": "UG", "family": "Lunkuse", "given": "Jamila"} +{"country": "UG", "family": "Kaggwa", "given": "Baptist"} +{"country": "UG", "family": "Kaggwa", "given": "John"} +{"country": "UG", "family": "Kakubi", "given": "Baptist"} +{"country": "UG", "family": "Kakubi", "given": "John"} +{"country": "UG", "family": "Zziwa", "given": "Joseph Anthony"} +{"country": "UG", "family": "Rugunda", "given": "Ruhakana"} +{"country": "UG", "family": "Ali", "given": "Moses"} +{"country": "UG", "family": "Gibson", "given": "Richard"} +{"country": "UG", "family": "Awori", "given": "Thelma"} +{"country": "UG", "family": "Kiplagat", "given": "Benjamin"} +{"country": "UG", "family": "Edwards", "given": "Cornelius"} +{"country": "UG", "family": "Okwi", "given": "Emmanuel"} +{"country": "UG", "family": "Bukenya", "given": "Gilbert"} +{"country": "UG", "family": "Guma Mbaho Mwine", "given": "Ntare"} +{"country": "UG", "family": "Mutesi", "given": "Phiona"} +{"country": "UG", "family": "Mawejje", "given": "Tony"} +{"country": "UG", "family": "Musani", "given": "Rose"} +{"country": "UG", "family": "Mwenda", "given": "Andrew"} +{"country": "UG", "family": "Tucker", "given": "Alfred"} +{"country": "UG", "family": "Musoke", "given": "Allan"} +{"country": "UG", "family": "Wapakhabulo", "given": "Angelina"} +{"country": "UG", "family": "Kigozi", "given": "Maggie"} +{"country": "UG", "family": "Kigozi", "given": "Margaret"} +{"country": "UG", "family": "Simeon", "given": "Arthur"} +{"country": "UG", "family": "Mukasa", "given": "Ashe"} +{"country": "UG", "family": "Kajara", "given": "Aston"} +{"country": "UG", "family": "Wabudeya", "given": "Beatrice"} +{"country": "UG", "family": "Ssentamu", "given": "Robert"} +{"country": "UG", "family": "Baingana", "given": "Doreen"} +{"country": "UG", "family": "Duke", "given": "Oliver"} +{"country": "UG", "family": "Duke", "given": "Brian"} +{"country": "UG", "family": "Duke", "given": "Lyndhurst"} +{"country": "UG", "family": "Kavuma", "given": "Catherine"} +{"country": "UG", "family": "Ondoa", "given": "Christine"} +{"country": "UG", "family": "Stuart", "given": "Cyril"} +{"country": "UG", "family": "Arinaitwe", "given": "Davis"} +{"country": "UG", "family": "Semwanga", "given": "Edward"} +{"country": "UG", "family": "Tumwine", "given": "Elly"} +{"country": "UG", "family": "Damji", "given": "Faraḥ"} +{"country": "UG", "family": "Okello", "given": "Francis"} +{"country": "UG", "family": "Nsubuga", "given": "Frank"} +{"country": "UG", "family": "Kagwa", "given": "Gaetano"} +{"country": "UG", "family": "Kirya", "given": "George"} +{"country": "UG", "family": "Kirya", "given": "Barnabas"} +{"country": "UG", "family": "Ssali", "given": "Godfrey"} +{"country": "UG", "family": "Birungi", "given": "Grace"} +{"country": "UG", "family": "Kavuma", "given": "Habib"} +{"country": "UG", "family": "Epstein", "given": "Helen"} +{"country": "UG", "family": "Kyemba", "given": "Henry"} +{"country": "UG", "family": "Clarke", "given": "Ian"} +{"country": "UG", "family": "Bukenya", "given": "Ivan"} +{"country": "UG", "family": "Kasirye", "given": "Jamil"} +{"country": "UG", "family": "Museveni", "given": "Janet"} +{"country": "UG", "family": "Ssentamu", "given": "John"} +{"country": "UG", "family": "Willis", "given": "John"} +{"country": "UG", "family": "Lwanga", "given": "Jonah"} +{"country": "UG", "family": "Kabagambe", "given": "Joseph"} +{"country": "UG", "family": "Lubega", "given": "Joseph"} +{"country": "UG", "family": "Mulenga", "given": "Joseph"} +{"country": "UG", "family": "Simpson", "given": "James"} +{"country": "UG", "family": "Biira", "given": "Joy"} +{"country": "UG", "family": "Serwanga", "given": "Kato"} +{"country": "UG", "family": "Obiri", "given": "Yeboah"} +{"country": "UG", "family": "Segawa", "given": "Lawrence"} +{"country": "UG", "family": "Ebdon", "given": "Les"} +{"country": "UG", "family": "Brown", "given": "Leslie"} +{"country": "UG", "family": "Zziwa", "given": "Margaret"} +{"country": "UG", "family": "Kiwanuka", "given": "Maria"} +{"country": "UG", "family": "Kiwanuka", "given": "Mathias"} +{"country": "UG", "family": "Nsimbi", "given": "Michael"} +{"country": "UG", "family": "Nsimbi", "given": "Micheal"} +{"country": "UG", "family": "Kasule", "given": "Owen"} +{"country": "UG", "family": "Kayemba", "given": "Patrick"} +{"country": "UG", "family": "Byaruhanga", "given": "Peter"} +{"country": "UG", "family": "Byarugaba", "given": "Richard"} +{"country": "UG", "family": "Kayanja", "given": "Robert"} +{"country": "UG", "family": "Kirya", "given": "Alex"} +{"country": "UG", "family": "Saleh", "given": "Salim"} +{"country": "UG", "family": "Male", "given": "Solomon"} +{"country": "UG", "family": "Kiguli", "given": "Susan"} +{"country": "UG", "family": "Tamale", "given": "Sylvia"} +{"country": "UG", "family": "Ghaffur", "given": "Tarique"} +{"country": "UG", "family": "Nyombi", "given": "William"} +{"country": "UG", "family": "Thembo", "given": "William"} +{"country": "UG", "family": "Nyombi", "given": "George"} +{"country": "UG", "family": "Thembo", "given": "George"} +{"country": "UG", "family": "Wangusa", "given": "Timothy"} +{"country": "UG", "family": "Brown", "given": "Yasmin"} +{"country": "UG", "family": "Alibhai", "given": "Yasmin"} +{"country": "UG", "family": "Dhaira", "given": "Abel"} +{"country": "UG", "family": "Dhaira", "given": "Abbey"} +{"country": "UG", "family": "Jackson", "given": "David"} +{"country": "UG", "family": "Byarugaba", "given": "Vicky"} +{"country": "UG", "family": "Lobo", "given": "William"} +{"country": "UG", "family": "Kalungi", "given": "Henry"} +{"country": "UG", "family": "Rubara", "given": "John Baptist"} +{"country": "UG", "family": "Bashobora", "given": "John Baptist"} +{"country": "UG", "family": "Opio", "given": "John"} +{"country": "UG", "family": "Ouma", "given": "Matthias"} +{"country": "UG", "family": "Okumu", "given": "Peter"} +{"country": "UG", "family": "Pereira", "given": "Polycarp"} +{"country": "UG", "family": "Ruganda", "given": "John"} +{"country": "UG", "family": "Inyumba", "given": "Aloisie"} +{"country": "UG", "family": "Miles", "given": "Peter"} +{"country": "UG", "family": "Tukire", "given": "Wilson"} +{"country": "UG", "family": "Davies", "given": "Brandon"} +{"country": "UG", "family": "Edema", "given": "Patrick"} +{"country": "UG", "family": "Ssunna", "given": "Brian"} +{"country": "UG", "family": "Bangi", "given": "Bridget"} +{"country": "UG", "family": "Bangi", "given": "Shamim"} +{"country": "UG", "family": "Nankabirwa", "given": "Margaret"} +{"country": "UG", "family": "Najjuka", "given": "Gloria"} +{"country": "UG", "family": "Najjuka", "given": "Catherine"} +{"country": "UG", "family": "Nakalyango", "given": "Daisy"} +{"country": "UG", "family": "Wavamunno", "given": "Gordon"} +{"country": "UG", "family": "Gutti", "given": "Andrew"} +{"country": "UG", "family": "Coutinho", "given": "Alex"} +{"country": "UG", "family": "Kayanja", "given": "Elly"} +{"country": "UG", "family": "Kakooza", "given": "James"} +{"country": "UG", "family": "Wanyama", "given": "Franco"} +{"country": "UG", "family": "Ikpeazu", "given": "Uche"} +{"country": "UG", "family": "Evans", "given": "Christopher"} +{"country": "UG", "family": "Ongwen", "given": "Dominic"} +{"country": "UG", "family": "Makubuya", "given": "James"} +{"country": "UG", "family": "Petty", "given": "Perry"} +{"country": "UG", "family": "Semwanga", "given": "Joseph"} +{"country": "UG", "family": "Kavuma", "given": "Steven"} +{"country": "UG", "family": "Salim", "given": "Jamal"} +{"country": "UG", "family": "Clarke", "given": "Barbara"} +{"country": "UG", "family": "Holdsworth", "given": "Barbara"} +{"country": "UG", "family": "Makumbi", "given": "Jennifer"} +{"country": "UG", "family": "Birungi", "given": "Barbara"} +{"country": "UG", "family": "Onziema", "given": "Julian"} +{"country": "UG", "family": "Onziema", "given": "Pepe"} +{"country": "UG", "family": "Hirji", "given": "Karim"} +{"country": "UG", "family": "Cheptegei", "given": "Joshua"} +{"country": "UG", "family": "Zirimu", "given": "Pio"} +{"country": "UG", "family": "Mutai", "given": "Solomon"} +{"country": "UG", "family": "Lamola", "given": "Alphonse"} +{"country": "UG", "family": "Batambuze", "given": "Shafik"} +{"country": "UG", "family": "Mukiibi", "given": "Ronald"} +{"country": "UG", "family": "Akol", "given": "Doris"} +{"country": "UG", "family": "Kavuma", "given": "Sam"} +{"country": "UG", "family": "Kansiime", "given": "Anne"} +{"country": "UG", "family": "Herman", "given": "Herman"} +{"country": "UG", "family": "Horn", "given": "Jessica"} +{"country": "UG", "family": "Sanyu", "given": "Cindy"} +{"country": "UG", "family": "Ntale", "given": "Irene"} +{"country": "UG", "family": "Babirye", "given": "Judith"} +{"country": "UG", "family": "Masagazi", "given": "Fred"} +{"country": "UG", "family": "Kabuye", "given": "Christine"} +{"country": "UG", "family": "Ogwal", "given": "Barbara"} +{"country": "UG", "family": "Ogwal", "given": "Cecilia"} +{"country": "UG", "family": "Kamya", "given": "Caroline"} +{"country": "UG", "family": "Anena", "given": "Harriet"} +{"country": "UG", "family": "Kayondo", "given": "Leila"} +{"country": "UG", "family": "Kirya", "given": "Maurice"} +{"country": "UG", "family": "Kasi", "given": "Fabian"} +{"country": "UG", "family": "Owor", "given": "Raphael"} +{"country": "UG", "family": "Owori", "given": "Sylvia"} +{"country": "UG", "family": "Adroa", "given": "Kay"} +{"country": "UG", "family": "Kaggwa", "given": "Julius"} +{"country": "UG", "family": "Díaz", "given": "Francisco"} +{"country": "UG", "family": "Malinga", "given": "Henry"} +{"country": "UG", "family": "Shariff", "given": "Yasmin"} +{"country": "UG", "family": "Akol", "given": "Rose"} +{"country": "UG", "family": "Keogh", "given": "Danny"} +{"country": "UG", "family": "Oloya", "given": "Cornelius"} +{"country": "UG", "family": "Abe", "given": "Gillian"} +{"country": "UG", "family": "Abe", "given": "Stacey"} +{"country": "UG", "family": "Cheptegei", "given": "Rebecca"} +{"country": "UG", "family": "Kibet", "given": "Samuel"} +{"country": "UG", "family": "Kwemoi", "given": "Andrew"} +{"country": "UG", "family": "Nabunya", "given": "Lydia"} +{"country": "UG", "family": "Opoka", "given": "Eric"} +{"country": "UG", "family": "Mukasa", "given": "Joseph"} +{"country": "UG", "family": "Aguti", "given": "Sarah"} +{"country": "UG", "family": "Nakajjigo", "given": "Esther"} +{"country": "UG", "family": "Segawa", "given": "Sulaiman"} +{"country": "UG", "family": "Kasule", "given": "Ibrahim"} +{"country": "UG", "family": "Ssebuufu", "given": "Frank"} +{"country": "UG", "family": "Lorot", "given": "Lawrence"} +{"country": "UG", "family": "Kobugabe", "given": "Husina"} +{"country": "UG", "family": "Naluwooza", "given": "Tracy"} +{"country": "UG", "family": "Wanagalya", "given": "Israel"} +{"country": "UG", "family": "Watambala", "given": "Karim"} +{"country": "UG", "family": "Wanagaliya", "given": "Daniel"} +{"country": "UG", "family": "Wanyana", "given": "Sharifah"} +{"country": "UG", "family": "Kibombo", "given": "Alice"} +{"country": "UG", "family": "Okedi", "given": "John"} +{"country": "UG", "family": "Meza", "given": "Faustino"} +{"country": "UG", "family": "Jemutai", "given": "Leonard"} +{"country": "UG", "family": "Kibet", "given": "Rogers"} +{"country": "UG", "family": "Robinson", "given": "Paige"} +{"country": "UG", "family": "Vorpahl", "given": "Leslie"} +{"country": "UG", "family": "Samari", "given": "Samari"} +{"country": "UG", "family": "Birungi", "given": "Simpson"} +{"country": "UG", "family": "Kayondo", "given": "Evarist"} +{"country": "UG", "family": "Lubega", "given": "Charlie"} +{"country": "UG", "family": "Kansiime", "given": "Frank"} +{"country": "UG", "family": "Aimable", "given": "Aimable"} +{"country": "UG", "family": "Jackson", "given": "Colgate"} +{"country": "UG", "family": "Chigudu", "given": "Hope"} +{"country": "UG", "family": "Dradriga", "given": "Tom"} +{"country": "UG", "family": "Murungi", "given": "May"} +{"country": "UG", "family": "Mutebi", "given": "Ronald"} +{"country": "UG", "family": "Owiny", "given": "Hakim"} +{"country": "UG", "family": "Nsibirwa", "given": "Susan"} +{"country": "UG", "family": "Imanishimwe", "given": "Ritah"} +{"country": "UG", "family": "Adoli", "given": "Catullo"} +{"country": "UG", "family": "Asiimwe", "given": "Ritah"} +{"country": "UG", "family": "Ajok", "given": "Lucy"} +{"country": "UG", "family": "Kibet", "given": "Dan"} +{"country": "UG", "family": "Matovu", "given": "John"} +{"country": "UG", "family": "Asiimwe", "given": "Godfrey"} +{"country": "UG", "family": "Kakooza", "given": "Josephine"} +{"country": "UG", "family": "Ejiet", "given": "Austin"} +{"country": "UG", "family": "Jjagwe", "given": "Kevin"} +{"country": "UG", "family": "Aluong", "given": "Helena"} +{"country": "UG", "family": "Simpson", "given": "Richard"} +{"country": "UG", "family": "Serato", "given": "Nicholas"} +{"country": "UG", "family": "Male", "given": "Hassan"} +{"country": "UG", "family": "Chemutai", "given": "Belinda"} +{"country": "UG", "family": "Kaggwa", "given": "Simon"} +{"country": "UG", "family": "Watambala", "given": "Abdul"} +{"country": "UG", "family": "Watambala", "given": "Abdulkarim"} +{"country": "UG", "family": "Kateregga", "given": "Geoffrey"} +{"country": "UG", "family": "Manzi", "given": "Allan"} +{"country": "UG", "family": "Batanyenda", "given": "Gaetano"} +{"country": "UG", "family": "Kisekka", "given": "Frank"} +{"country": "UG", "family": "Walugembe", "given": "John"} +{"country": "UG", "family": "Musani", "given": "Richard"} +{"country": "UG", "family": "Orem", "given": "Jackson"} +{"country": "UG", "family": "Amongi", "given": "Betty"} +{"country": "UG", "family": "Engola", "given": "Charles"} +{"country": "UG", "family": "Byarugaba", "given": "Clare"} +{"country": "UG", "family": "Lubega", "given": "Edrisa"} +{"country": "UG", "family": "Mutebi", "given": "Norman"} +{"country": "UG", "family": "Hoppers", "given": "Catherine"} +{"country": "UG", "family": "Odora", "given": "Catherine"} +{"country": "UG", "family": "Chesang", "given": "Stella"} +{"country": "UG", "family": "Chemutai", "given": "Peruth"} +{"country": "UG", "family": "Capradossi", "given": "Elio"} +{"country": "UG", "family": "Nabawesi", "given": "Sauda"} +{"country": "UG", "family": "Ssozi", "given": "Fiona"} +{"country": "UG", "family": "Ssozi", "given": "Catherine"} +{"country": "UG", "family": "Luziika", "given": "Helen"} +{"country": "UG", "family": "Nakamya", "given": "Annet"} +{"country": "UG", "family": "Olowu", "given": "Pius"} +{"country": "UG", "family": "Kasirye", "given": "Brian"} +{"country": "UG", "family": "Senono", "given": "Davies"} +{"country": "UG", "family": "Nakiyemba", "given": "Aisha"} +{"country": "UG", "family": "Pinto", "given": "Manuel"} +{"country": "UG", "family": "Mamdani", "given": "Kwame"} +{"country": "UG", "family": "Mamdani", "given": "Zohran"} +{"country": "UG", "family": "Shaban", "given": "Muhammad"} +{"country": "UG", "family": "Mbowa", "given": "Rose"} +{"country": "UG", "family": "Sibbick", "given": "Peter"} +{"country": "UG", "family": "Sibbick", "given": "Toby"} +{"country": "UG", "family": "Mukasa", "given": "Victor"} +{"country": "UG", "family": "Mukasa", "given": "Juliet"} +{"country": "UG", "family": "Otto", "given": "Edward"} +{"country": "UG", "family": "Chebet", "given": "Esther"} +{"country": "UG", "family": "Jemutai", "given": "Albert"} +{"country": "UG", "family": "Shida", "given": "Leni"} +{"country": "UG", "family": "Musani", "given": "Mary"} +{"country": "UG", "family": "Kaija", "given": "Barbara"} +{"country": "UG", "family": "Kiplangat", "given": "Victor"} +{"country": "UG", "family": "Jones", "given": "Stephen"} +{"country": "UG", "family": "Akello", "given": "Lucy"} +{"country": "UG", "family": "Makumbi", "given": "James"} +{"country": "UG", "family": "Diana", "given": "Hajara"} +{"country": "UG", "family": "Diana", "given": "Namukwaya"} +{"country": "UG", "family": "Kagimu", "given": "Charles"} +{"country": "UG", "family": "Lubega", "given": "Alice"} +{"country": "UG", "family": "Lubega", "given": "Florence"} +{"country": "UG", "family": "Muwanga", "given": "Bernard"} +{"country": "UG", "family": "Muwanga", "given": "Benard"} +{"country": "UG", "family": "Ntiro", "given": "Sarah"} +{"country": "UG", "family": "Opong", "given": "Robinson"} +{"country": "UG", "family": "Ayeko", "given": "Joel"} +{"country": "UG", "family": "Kasumba", "given": "Jane"} +{"country": "UG", "family": "Mwaka", "given": "Victoria"} +{"country": "UG", "family": "Sesanga", "given": "Jerry"} +{"country": "UG", "family": "Kirya", "given": "Timothy"} +{"country": "UG", "family": "Newman", "given": "Angela"} +{"country": "UG", "family": "Mutumba", "given": "Yvette"} +{"country": "UG", "family": "Okello", "given": "Allan"} +{"country": "UG", "family": "Kazibwe", "given": "Lawrence"} +{"country": "UG", "family": "Kissa", "given": "Stephen"} +{"country": "UG", "family": "Bayo", "given": "Fahad"} +{"country": "UG", "family": "Obbo", "given": "Christine"} +{"country": "UG", "family": "Matsiko", "given": "Winnie"} +{"country": "UG", "family": "Komuhangi", "given": "Winnie"} +{"country": "UG", "family": "Matsiko", "given": "Winifred"} +{"country": "UG", "family": "Komuhangi", "given": "Winifred"} +{"country": "UG", "family": "Matsiko", "given": "Masiko"} +{"country": "UG", "family": "Komuhangi", "given": "Masiko"} +{"country": "UG", "family": "Odongo", "given": "Sandra"} +{"country": "UG", "family": "Musoke", "given": "Esther"} +{"country": "UG", "family": "Nabunya", "given": "Gloria"} +{"country": "UG", "family": "Akita", "given": "Herbert"} +{"country": "UG", "family": "Muwonge", "given": "Harrison"} +{"country": "UG", "family": "Chebet", "given": "Janet"} +{"country": "UG", "family": "Akol", "given": "Sarah"} +{"country": "UG", "family": "Achieng", "given": "Brenda"} +{"country": "UG", "family": "Tumwine", "given": "Sarah"} +{"country": "UG", "family": "Kansiime", "given": "Joan"} +{"country": "UG", "family": "Kabugho", "given": "Prossy"} +{"country": "UG", "family": "Owinyi", "given": "Augustus"} +{"country": "UG", "family": "Muyanja", "given": "Amos"} +{"country": "UG", "family": "Owomugisha", "given": "Assumpta"} +{"country": "UG", "family": "Swaburuh", "given": "Abdul"} +{"country": "UG", "family": "Ssempiri", "given": "Abdul"} +{"country": "UG", "family": "Orech", "given": "James"} +{"country": "UG", "family": "Taha", "given": "Mona"} +{"country": "UG", "family": "Katana", "given": "Francis"} +{"country": "UG", "family": "Matovu", "given": "Muhammad"} +{"country": "UG", "family": "Odongo", "given": "Theresa"} +{"country": "UG", "family": "Oduka", "given": "Theresa"} +{"country": "UG", "family": "Kyeyune", "given": "Ivan"} +{"country": "UG", "family": "Kasule", "given": "Ismail"} +{"country": "UG", "family": "Kasirye", "given": "Gillian"} +{"country": "UG", "family": "Mukasa", "given": "Sarah"} +{"country": "UG", "family": "Namara", "given": "Ann"} +{"country": "UG", "family": "Nakate", "given": "Lilian"} +{"country": "UG", "family": "Hope", "given": "Hope"} +{"country": "UG", "family": "Ssali", "given": "Harriet"} +{"country": "UG", "family": "Ssekitooleko", "given": "Rodney"} +{"country": "UG", "family": "Bäseke", "given": "Fred"} +{"country": "UG", "family": "Isingoma", "given": "Patrick"} +{"country": "UG", "family": "Mugabe", "given": "Moses"} +{"country": "UG", "family": "Kankunda", "given": "Amos"} +{"country": "UG", "family": "Kiwanuka", "given": "Abdallah"} +{"country": "UG", "family": "Kungu", "given": "Samuel"} +{"country": "UG", "family": "Lubega", "given": "George"} +{"country": "UG", "family": "Makumbi", "given": "Henry"} +{"country": "UG", "family": "Matovu", "given": "Emmanuel"} +{"country": "UG", "family": "Mutebi", "given": "Benard"} +{"country": "UG", "family": "Ogwal", "given": "Joseph"} +{"country": "UG", "family": "Ojok", "given": "Andrew"} +{"country": "UG", "family": "Okello", "given": "Charles"} +{"country": "UG", "family": "Okello", "given": "Patrick"} +{"country": "UG", "family": "Okotie", "given": "Boniface"} +{"country": "UG", "family": "Opolot", "given": "Simon"} +{"country": "UG", "family": "Oryema", "given": "Simon"} +{"country": "UG", "family": "Ouma", "given": "Willy"} +{"country": "UG", "family": "Kizito", "given": "Sarah"} +{"country": "UG", "family": "Matsiko", "given": "David"} +{"country": "UG", "family": "Mukasa", "given": "Edward"} +{"country": "UG", "family": "Asiimwe", "given": "Eunice"} +{"country": "UG", "family": "Kabugho", "given": "Stella"} +{"country": "UG", "family": "Ninsiima", "given": "John"} +{"country": "UG", "family": "Kigozi", "given": "Martin"} +{"country": "UG", "family": "Lule", "given": "James"} +{"country": "UG", "family": "Kalungi", "given": "Maureen"} +{"country": "UG", "family": "Businge", "given": "Andrew"} +{"country": "UG", "family": "Nakitto", "given": "Prisca"} +{"country": "UG", "family": "Sabiti", "given": "Joseph"} +{"country": "UG", "family": "Kungu", "given": "Adam"} +{"country": "UG", "family": "Tendo", "given": "Steven"} +{"country": "UG", "family": "Mbabazi", "given": "Rahma"} +{"country": "UG", "family": "Lucký", "given": "Rahma"} +{"country": "UG", "family": "Byaruhanga", "given": "Sudhir"} +{"country": "UG", "family": "Lubega", "given": "Edward"} +{"country": "UG", "family": "Nsubuga", "given": "Michael"} +{"country": "UG", "family": "Nassaka", "given": "Flavia"} +{"country": "UG", "family": "Gonza", "given": "Gonzaga"} +{"country": "UG", "family": "Okello", "given": "Peter"} +{"country": "UG", "family": "Sewankambo", "given": "Wyclef"} +{"country": "UG", "family": "Nsubuga", "given": "Ismail"} +{"country": "UG", "family": "Lwanga", "given": "Martin"} +{"country": "UG", "family": "Muyanja", "given": "İbrahim"} +{"country": "UG", "family": "Anena", "given": "Prisca"} +{"country": "UG", "family": "Sanyu", "given": "Penelope"} +{"country": "UG", "family": "Kabugho", "given": "Maryline"} +{"country": "UG", "family": "Muwonge", "given": "Samuel"} +{"country": "UG", "family": "Menguele", "given": "Landry"} +{"country": "UG", "family": "Mbabazi", "given": "Gladys"} +{"country": "UG", "family": "Evelyn", "given": "Everlyn"} +{"country": "UG", "family": "Ajio", "given": "Lillian"} +{"country": "UG", "family": "Macartney", "given": "James"} +{"country": "UG", "family": "Macartney", "given": "Fergus"} +{"country": "UG", "family": "Chebet", "given": "Rachael"} +{"country": "UG", "family": "Nsubuga", "given": "Haruna"} +{"country": "UG", "family": "Kizito", "given": "Mary"} +{"country": "UG", "family": "Nakate", "given": "Vanessa"} +{"country": "UG", "family": "Wasswa", "given": "Geofrey"} +{"country": "UG", "family": "Byarugaba", "given": "Denis"} +{"country": "UG", "family": "Hamson", "given": "Denis"} +{"country": "UG", "family": "Masaba", "given": "Paul"} +{"country": "UG", "family": "Makumbi", "given": "Godfrey"} +{"country": "UG", "family": "Chelimo", "given": "Oscar"} +{"country": "UG", "family": "Kyamanywa", "given": "Nathan"} +{"country": "UG", "family": "Nabwiso", "given": "Matthew"} +{"country": "UG", "family": "Nabwiso", "given": "Mathew"} +{"country": "UG", "family": "Kayondo", "given": "Naomi"} +{"country": "UG", "family": "Siya", "given": "Aggrey"} +{"country": "UG", "family": "Kirabo", "given": "Annet"} +{"country": "UG", "family": "Wasswa", "given": "William"} +{"country": "UG", "family": "Asiimwe", "given": "George"} +{"country": "UG", "family": "Nsubuga", "given": "Dunstan"} +{"country": "UG", "family": "Nabatanzi", "given": "Alice"} +{"country": "UG", "family": "Namuyimba", "given": "Shana"} +{"country": "UG", "family": "Nyende", "given": "Louis"} +{"country": "UG", "family": "Lakhani", "given": "Salma"} +{"country": "UG", "family": "Saben", "given": "Barbara"} +{"country": "UG", "family": "Boase", "given": "Alice"} +{"country": "UG", "family": "Gashumba", "given": "Sheila"} +{"country": "UG", "family": "Shirazi", "given": "Natasha"} +{"country": "UG", "family": "Kabagambe", "given": "Anne"} +{"country": "UG", "family": "Byarugaba", "given": "Nadine"} +{"country": "UG", "family": "Noble", "given": "Kathleen"} +{"country": "UG", "family": "Mwesigwa", "given": "Elizabeth"} +{"country": "UG", "family": "Blaak", "given": "Mirjam"} +{"country": "UG", "family": "Mayes", "given": "Jordin"} +{"country": "UG", "family": "Miller", "given": "Dane"} +{"country": "UG", "family": "Akori", "given": "Beatrice"} +{"country": "UG", "family": "Oliva", "given": "Oliva"} +{"country": "UG", "family": "Mugisa Margaret Muhanga", "given": "Margaret"} +{"country": "UG", "family": "Mugisa Margaret Muhanga", "given": "Annet"} +{"country": "UG", "family": "Saúda", "given": "Kauma"} +{"country": "UG", "family": "Afoyochan", "given": "Esther"} +{"country": "UG", "family": "Taban", "given": "Sharifah"} +{"country": "UG", "family": "Driwaru", "given": "Jennifer"} +{"country": "UG", "family": "Aber", "given": "Lilian"} +{"country": "UG", "family": "Birungi", "given": "Carolyn"} +{"country": "UG", "family": "Namutebi", "given": "Imelda"} +{"country": "UG", "family": "Okello", "given": "Paul"} +{"country": "UG", "family": "Aliganyira", "given": "Joseph"} +{"country": "UG", "family": "Kayemba", "given": "Geofrey"} +{"country": "UG", "family": "Amani", "given": "Oliva"} +{"country": "UG", "family": "Lule", "given": "Yasin"} +{"country": "UG", "family": "Awori", "given": "Regina"} +{"country": "UG", "family": "Nakisuvi", "given": "Theresa"} +{"country": "UG", "family": "Matovu", "given": "Victor"} +{"country": "UG", "family": "Zziwa", "given": "Keiran"} +{"country": "UG", "family": "Kaluma", "given": "Arthur"} +{"country": "UG", "family": "Tuhaise", "given": "Mildred"} +{"country": "UG", "family": "Lukwago", "given": "Charles"} +{"country": "UG", "family": "Oze", "given": "Anna"} +{"country": "UG", "family": "Oze", "given": "Talia"} +{"country": "UG", "family": "Nansubuga", "given": "Gloria"} +{"country": "UG", "family": "Birungi", "given": "Olive"} +{"country": "UG", "family": "Anthony", "given": "Semi"} +{"country": "UG", "family": "Batema", "given": "David"} +{"country": "UG", "family": "Okwanga", "given": "Vincent"} +{"country": "UG", "family": "Matovu", "given": "David"} +{"country": "UG", "family": "Stephen", "given": "Mubiru"} +{"country": "UG", "family": "Mackay", "given": "Alex"} +{"country": "UG", "family": "Musa", "given": "Sekaana"} +{"country": "UG", "family": "Wamala", "given": "Boniface"} +{"country": "UG", "family": "Jemutai", "given": "Tom"} +{"country": "UG", "family": "Matovu", "given": "Ronald"} +{"country": "UG", "family": "Muhairwe", "given": "Reagan"} +{"country": "UG", "family": "Mato", "given": "Rogers"} +{"country": "UG", "family": "Kalyowa", "given": "Emmanuel"} +{"country": "UG", "family": "Kayondo", "given": "Frances"} +{"country": "UG", "family": "Kayondo", "given": "Jane"} +{"country": "UG", "family": "Moni", "given": "Jacksen"} +{"country": "UG", "family": "Kisenyi", "given": "Kisenyi"} +{"country": "UG", "family": "Ssozi", "given": "Yusuf"} +{"country": "UG", "family": "Herman", "given": "Wasswa"} +{"country": "UG", "family": "Kakooza", "given": "Derrick"} +{"country": "UG", "family": "Hamisi", "given": "Diego"} +{"country": "UG", "family": "Freedom", "given": "Alfred"} +{"country": "UG", "family": "Owori", "given": "David"} +{"country": "UG", "family": "Kayondo", "given": "Abdu"} +{"country": "UG", "family": "Kayondo", "given": "Aziz"} +{"country": "UG", "family": "Wafula", "given": "Innocent"} +{"country": "UG", "family": "Tohá", "given": "Rashid"} +{"country": "UG", "family": "Thierry", "given": "Allan"} +{"country": "UG", "family": "Farouk", "given": "Farouk"} +{"country": "UG", "family": "John", "given": "John"} +{"country": "UG", "family": "Kavuma", "given": "Willy"} +{"country": "UG", "family": "Batte", "given": "Seif"} +{"country": "UG", "family": "Odongo", "given": "Michael"} +{"country": "UG", "family": "Okune", "given": "Michael"} +{"country": "UG", "family": "Odongo", "given": "Moses"} +{"country": "UG", "family": "Okune", "given": "Moses"} +{"country": "UG", "family": "Robert", "given": "Robert"} +{"country": "UG", "family": "Murungi", "given": "Kasim"} +{"country": "UG", "family": "Kaggwa", "given": "Pius"} +{"country": "UG", "family": "Ssozi", "given": "Joram"} +{"country": "UG", "family": "Mwaka", "given": "Paul"} +{"country": "UG", "family": "Wamala", "given": "Farouk"} +{"country": "UG", "family": "Lubega", "given": "Henry"} +{"country": "UG", "family": "Baguma", "given": "Gilbert"} +{"country": "UG", "family": "Kizito", "given": "Rayan"} +{"country": "UG", "family": "Musaala", "given": "Anthony"} +{"country": "UG", "family": "Ssemakookiro", "given": "Richard"} +{"country": "UG", "family": "Komuntale", "given": "Charlene"} +{"country": "UG", "family": "Wavamunno", "given": "Gloria"} +{"country": "UG", "family": "Nakazibwe", "given": "Venny"} +{"country": "UG", "family": "Kigozi", "given": "Joseph"} +{"country": "UG", "family": "Jolly", "given": "Jacklyn"} +{"country": "UG", "family": "Mbabazi", "given": "Winnie"} +{"country": "UG", "family": "Mukasa", "given": "Joan"} +{"country": "UG", "family": "Makula", "given": "Anna"} +{"country": "UG", "family": "Nuwamanya", "given": "Privah"} +{"country": "UG", "family": "Matovu", "given": "Shamim"} +{"country": "UG", "family": "Kavuma", "given": "Ethan"} +{"country": "UG", "family": "Kigozi", "given": "Ritah"} +{"country": "UG", "family": "Zawedde", "given": "Sarah"} +{"country": "UG", "family": "Nantume", "given": "Violet"} +{"country": "UG", "family": "Bukenya", "given": "Joe"} +{"country": "UG", "family": "Ndagire", "given": "Valentine"} +{"country": "UG", "family": "Ndagire", "given": "Prima"} +{"country": "UG", "family": "Namulindwa", "given": "Flavia"} +{"country": "UG", "family": "Namulindwa", "given": "Mary"} +{"country": "UG", "family": "Kazibwe", "given": "Sophie"} +{"country": "UG", "family": "Tusiime", "given": "Sheila"} +{"country": "UG", "family": "Tumwesigye", "given": "Josephat"} +{"country": "UG", "family": "Okello", "given": "Godfrey"} +{"country": "UG", "family": "Lawry", "given": "Lawrence"} +{"country": "UG", "family": "Okello", "given": "Caesar"} +{"country": "UG", "family": "Ojwang", "given": "George"} +{"country": "UG", "family": "Okello", "given": "Martin"} +{"country": "UG", "family": "Mao", "given": "Jimmy"} +{"country": "UG", "family": "Ogwal", "given": "Angelo"} +{"country": "UG", "family": "Magara", "given": "Patricia"} +{"country": "UG", "family": "Namulondo", "given": "Sarah"} +{"country": "UG", "family": "Namara", "given": "Betty"} +{"country": "UG", "family": "Nabatanzi", "given": "Daisy"} +{"country": "UG", "family": "Nabatanzi", "given": "Sarah"} +{"country": "UG", "family": "Obol", "given": "Phoebe"} +{"country": "UG", "family": "Kabugho", "given": "Marilyn"} +{"country": "UG", "family": "Seif", "given": "Mariam"} +{"country": "UG", "family": "Kasule", "given": "Raphael"} +{"country": "UG", "family": "Kasule", "given": "Allan"} +{"country": "UG", "family": "Walugembe", "given": "Emma"} +{"country": "UG", "family": "Suubi", "given": "Samuel"} +{"country": "UG", "family": "Kato", "given": "James"} +{"country": "UG", "family": "Gubazire", "given": "Bosco"} +{"country": "UG", "family": "Gubazire", "given": "Bonaventure"} +{"country": "UG", "family": "Lubega", "given": "Ashraf"} +{"country": "UG", "family": "Kabagambe", "given": "Johnson"} +{"country": "UG", "family": "Aloyo", "given": "Vivian"} +{"country": "UG", "family": "Acio", "given": "Julia"} +{"country": "UG", "family": "Grace", "given": "Junior"} +{"country": "UG", "family": "Adongo", "given": "Barbra"} +{"country": "UG", "family": "Albert", "given": "Anthony"} +{"country": "UG", "family": "Fredrick", "given": "Fredrick"} +{"country": "UG", "family": "Otieno", "given": "Barack"} +{"country": "UG", "family": "Tendo", "given": "Atia"} +{"country": "UG", "family": "Ssempijja", "given": "Jeremiah"} +{"country": "UG", "family": "Munyikwa", "given": "Jordan"} +{"country": "UG", "family": "Ssegawa", "given": "Kevin"} +{"country": "UG", "family": "Ssegawa", "given": "James"} +{"country": "UG", "family": "Kayongo", "given": "Kyle"} +{"country": "UG", "family": "Kayongo", "given": "Sheldon"} +{"country": "UG", "family": "Manzi", "given": "Ethan"} +{"country": "UG", "family": "Kamanzi", "given": "Jackline"} +{"country": "UG", "family": "Nalule", "given": "Vivian"} +{"country": "UG", "family": "Yona", "given": "Yona"} +{"country": "UG", "family": "Mukasa", "given": "Sylvia"} +{"country": "UG", "family": "Murungi", "given": "Cian"} +{"country": "UG", "family": "Joshua", "given": "Opoka"} +{"country": "UG", "family": "Pido", "given": "Edwin"} +{"country": "UG", "family": "Nsubuga", "given": "Grace"} +{"country": "UG", "family": "Kato", "given": "Mathias"} +{"country": "UG", "family": "Mwase Matthew", "given": "Mathew"} +{"country": "UG", "family": "Mwiiwa Benjamin", "given": "Benjamín"} +{"country": "UG", "family": "Mwaka", "given": "Emmanuel"} +{"country": "UG", "family": "Agaba", "given": "Davis"} +{"country": "UG", "family": "Lutaaya", "given": "Rogers Gonzaga Lutaaya"} +{"country": "UG", "family": "Ouma", "given": "Raphael"} +{"country": "UG", "family": "Mukiza", "given": "Robert"} +{"country": "UG", "family": "Sanyu", "given": "Angela"} +{"country": "UG", "family": "Allan", "given": "Benjamín"} +{"country": "UG", "family": "Baguma", "given": "Innocent"} +{"country": "UG", "family": "Netanyahu", "given": "Benjamín"} +{"country": "UG", "family": "Kalule", "given": "Caxton"} +{"country": "UG", "family": "Arinaitwe", "given": "Geofrey"} +{"country": "UG", "family": "Museveni", "given": "Patience"} +{"country": "UG", "family": "Bukenya", "given": "Mathew"} +{"country": "UG", "family": "Ngobi", "given": "Mark"} +{"country": "UG", "family": "Kabagambe", "given": "Dorothy"} +{"country": "UG", "family": "Kiprotich", "given": "Connell"} +{"country": "UG", "family": "Kiprop", "given": "Hosea"} +{"country": "UG", "family": "Kassim", "given": "Rogers"} +{"country": "UG", "family": "Morris", "given": "Morris"} +{"country": "UG", "family": "Nyombi", "given": "Morris"} +{"country": "UG", "family": "Morris", "given": "Nyombi"} +{"country": "UG", "family": "Nyombi", "given": "Nyombi"} +{"country": "UG", "family": "Namara", "given": "Evelyn"} +{"country": "UG", "family": "Lwanga", "given": "Edward"} +{"country": "UG", "family": "Mukasa", "given": "Andrew"} +{"country": "UG", "family": "Kazibwe", "given": "Bashir"} +{"country": "UG", "family": "Okumu", "given": "Gabriel"} +{"country": "UG", "family": "Gloria", "given": "Gloria"} +{"country": "UG", "family": "Gloria", "given": "Baby"} +{"country": "UG", "family": "Fauzia", "given": "Fauzia"} +{"country": "UG", "family": "Nakibuuka", "given": "Asia"} +{"country": "UG", "family": "Kabuye", "given": "Nicholas"} +{"country": "UG", "family": "Clare", "given": "Julia"} +{"country": "UG", "family": "Sonko", "given": "Asha"} +{"country": "UG", "family": "Attama", "given": "Friday"} +{"country": "UG", "family": "Munyira", "given": "Rose"} +{"country": "UG", "family": "Mukasa", "given": "Victoria"} +{"country": "UG", "family": "Ruth", "given": "Ruth"} +{"country": "UG", "family": "Rainer", "given": "Juliet"} +{"country": "UG", "family": "Kuka", "given": "Jane"} +{"country": "UG", "family": "Rose", "given": "Rose"} +{"country": "UG", "family": "Nyamutoro", "given": "Phiona"} +{"country": "UG", "family": "Lakhani", "given": "Sameer"} +{"country": "UG", "family": "Blick", "given": "Frederick"} +{"country": "UG", "family": "Blick", "given": "William"} +{"country": "UG", "family": "Bagala", "given": "Lillian"} +{"country": "UG", "family": "Mbabazi", "given": "Caroline"} +{"country": "UG", "family": "Musafiri", "given": "Abdul"} +{"country": "UG", "family": "Mwambu", "given": "Kenneth"} +{"country": "UG", "family": "Mwambu", "given": "Comfort"} +{"country": "UG", "family": "Chebet", "given": "Abel"} +{"country": "UG", "family": "Tuma", "given": "Basil"} +{"country": "UG", "family": "alum", "given": "Santa"} +{"country": "UG", "family": "Okello", "given": "Emmy"} +{"country": "UG", "family": "Mbulaiteye", "given": "Sam"} +{"country": "UG", "family": "Mbulaiteye", "given": "M."} +{"country": "UG", "family": "Ntale", "given": "Theopista"} +{"country": "UG", "family": "Musamali", "given": "Paul"} +{"country": "UG", "family": "Odhiambo", "given": "Alex"} +{"country": "UG", "family": "Magara", "given": "Lorna"} +{"country": "UG", "family": "Mohamed", "given": "Fadilah"} +{"country": "UG", "family": "Rafi", "given": "Fadilah"} +{"country": "UG", "family": "Mohamed", "given": "Shamika"} +{"country": "UG", "family": "Rafi", "given": "Shamika"} +{"country": "UG", "family": "Nsubuga", "given": "Emmanuel"} +{"country": "UG", "family": "Adam", "given": "Kassim"} +{"country": "UG", "family": "Musoke", "given": "Catherine"} +{"country": "UG", "family": "Anzo", "given": "Santa"} +{"country": "UG", "family": "Bockhorn", "given": "Herbert"} +{"country": "UG", "family": "Wiltshire", "given": "Christine"} +{"country": "UG", "family": "Mukiibi", "given": "Regina"} +{"country": "UG", "family": "Nabwiso", "given": "Eleanor"} +{"country": "UG", "family": "Kay", "given": "Martha"} +{"country": "UG", "family": "Atal", "given": "Stella"} +{"country": "UG", "family": "Mukiza", "given": "Chris"} +{"country": "UG", "family": "Birungi", "given": "Patrick"} +{"country": "UG", "family": "Wekesa", "given": "Amos"} +{"country": "UG", "family": "Kyeyune", "given": "George"} +{"country": "UG", "family": "Birungi", "given": "James"} +{"country": "UG", "family": "Aber", "given": "Lucy"} +{"country": "UG", "family": "Okumu", "given": "Lucy"} +{"country": "UG", "family": "Kizito", "given": "Sheila"} +{"country": "UG", "family": "Mandera", "given": "Alex"} +{"country": "UG", "family": "Lomuria", "given": "Paul"} +{"country": "UG", "family": "Nandede", "given": "Zaina"} +{"country": "UG", "family": "Kasumba", "given": "Dennis"} +{"country": "UG", "family": "Ikara", "given": "Tom"} +{"country": "UG", "family": "Kankunda", "given": "Nina"} +{"country": "UG", "family": "Kababiito", "given": "Tracy"} +{"country": "UG", "family": "Nakitto", "given": "Rhema"} +{"country": "UG", "family": "Nabasa", "given": "Linda"} +{"country": "UG", "family": "Nakaziba", "given": "Esther"} +{"country": "UG", "family": "Nanjobe", "given": "Hawa"} +{"country": "UG", "family": "Kimbugwe", "given": "Hawa"} +{"country": "UG", "family": "Namatovu", "given": "Aisha"} +{"country": "UG", "family": "Kibirige", "given": "Shakira"} +{"country": "UG", "family": "Byoga", "given": "Martha"} +{"country": "UG", "family": "Namulondo", "given": "Rashida"} +{"country": "UG", "family": "Ameny", "given": "Arao"} +{"country": "UG", "family": "Nalumansi", "given": "Cissy"} +{"country": "UG", "family": "Geno", "given": "Mercy"} +{"country": "UG", "family": "Kirabo", "given": "Winnie"} +{"country": "UG", "family": "Rupiny", "given": "Constantine"} +{"country": "UG", "family": "Kateregga", "given": "Ismael"} +{"country": "UG", "family": "Ntensibe", "given": "Joseph"} +{"country": "UG", "family": "Mirembe", "given": "Racheal"} +{"country": "UG", "family": "Noppeney", "given": "Asha"} +{"country": "UG", "family": "Bukenya", "given": "Mariam"} +{"country": "UG", "family": "Kwesiga", "given": "Brian"} +{"country": "UG", "family": "Kwesiga", "given": "Mushana"} +{"country": "UG", "family": "Lubega", "given": "Leonard"} +{"country": "UG", "family": "Black", "given": "Bianka"} +{"country": "UG", "family": "Matovu", "given": "Fahad"} +{"country": "UG", "family": "Namirembe", "given": "Daisy"} +{"country": "UG", "family": "Murungi", "given": "Diana"} +{"country": "UG", "family": "Busingye", "given": "Gloria"} +{"country": "UG", "family": "Ssali", "given": "Shaka"} +{"country": "UG", "family": "Noah", "given": "Musa"} +{"country": "UG", "family": "Okello", "given": "Esther"} +{"country": "UG", "family": "Amin", "given": "Madina"} +{"country": "UG", "family": "Amin", "given": "Norah"} +{"country": "UG", "family": "Namirimu", "given": "Angella"} +{"country": "UG", "family": "Atim", "given": "Anitah"} +{"country": "UG", "family": "Atim", "given": "Winnie"} +{"country": "UG", "family": "Nandi", "given": "Winnie"} +{"country": "UG", "family": "Birungi", "given": "Annet"} +{"country": "UG", "family": "Birungi", "given": "Aidah"} +{"country": "UG", "family": "Mayanja River (Bungoma)", "given": "Shamim"} +{"country": "UG", "family": "Murungi", "given": "Scarlett"} +{"country": "UG", "family": "Rwere", "given": "Sonia"} +{"country": "UG", "family": "Babirye", "given": "Noeline"} +{"country": "UG", "family": "Birungi", "given": "Christine"} +{"country": "UG", "family": "Mwesigwa", "given": "Betty"} +{"country": "UG", "family": "Muwonge", "given": "Jordan"} +{"country": "UG", "family": "Kony", "given": "Ali"} +{"country": "UG", "family": "Kony", "given": "S."} +{"country": "UG", "family": "Becker", "given": "Malindi"} +{"country": "UG", "family": "Ageno", "given": "Sarah"} +{"country": "UG", "family": "Odongo", "given": "Timothy"} +{"country": "UG", "family": "Birungi", "given": "Hope"} +{"country": "UG", "family": "Birungi", "given": "Winnie"} +{"country": "UG", "family": "Mosimann", "given": "Lia"} +{"country": "UG", "family": "Trinquier", "given": "Emmanuel"} +{"country": "UG", "family": "Gasasira", "given": "John"} +{"country": "UG", "family": "Sisto", "given": "Hope"} +{"country": "UG", "family": "Ola", "given": "Samuel"} +{"country": "UG", "family": "Ngobi", "given": "Joshua"} +{"country": "UG", "family": "Moses", "given": "Mary"} +{"country": "UG", "family": "Aber", "given": "Linda"} +{"country": "UG", "family": "Wamala", "given": "Cranmer"} +{"country": "UG", "family": "Aber", "given": "Bridget"} +{"country": "UG", "family": "Okoth", "given": "Henry"} +{"country": "UG", "family": "Okello", "given": "David"} +{"country": "UG", "family": "Okello", "given": "Elvis"} +{"country": "UG", "family": "Kasumba", "given": "Brian"} +{"country": "UG", "family": "Otti", "given": "Abraham"} +{"country": "UG", "family": "Katumba", "given": "Derick"} +{"country": "UG", "family": "Kayondo", "given": "Mathew"} +{"country": "UG", "family": "Male", "given": "Rasheed"} +{"country": "UG", "family": "Birungi", "given": "Mariam"} +{"country": "UG", "family": "Kolo", "given": "Olivia"} +{"country": "UG", "family": "Kizito", "given": "Edris"} +{"country": "UG", "family": "Salmon", "given": "Josephine"} +{"country": "UG", "family": "Mpambara", "given": "Yvonne"} +{"country": "UG", "family": "Ebayo", "given": "Herbert"} +{"country": "UG", "family": "Mihigo", "given": "Daniel"} +{"country": "UG", "family": "Sebunnya", "given": "Daniel"} +{"country": "UG", "family": "Nalumansi", "given": "Kruthum"} +{"country": "UG", "family": "Kasule", "given": "Ismael"} +{"country": "UG", "family": "Amin", "given": "Sherifa"} +{"country": "UG", "family": "Opiyo", "given": "Denis"} +{"country": "UG", "family": "Apiyo", "given": "Eunice"} +{"country": "UG", "family": "Mwebesa", "given": "Adrine"} +{"country": "UG", "family": "Namukwaya", "given": "Winifred"} +{"country": "UG", "family": "Apiyo", "given": "Mercy"} +{"country": "UG", "family": "Kreutter", "given": "Catherine"} +{"country": "UG", "family": "Baluku", "given": "Nason"} +{"country": "SN", "family": "Mbaye", "given": "Ibrahima"} +{"country": "SN", "family": "Ndiaye", "given": "Joseph"} +{"country": "SN", "family": "N'Diaye", "given": "Ismaila"} +{"country": "SN", "family": "Konaté", "given": "Moussa"} +{"country": "SN", "family": "Fernandez", "given": "Joachim"} +{"country": "SN", "family": "Baldé", "given": "Ibrahima"} +{"country": "SN", "family": "Gueye", "given": "Magaye"} +{"country": "SN", "family": "N'Diaye", "given": "Sylvain"} +{"country": "SN", "family": "Badji", "given": "Stéphane"} +{"country": "SN", "family": "Sy", "given": "Penda"} +{"country": "SN", "family": "Diallo", "given": "Omar"} +{"country": "SN", "family": "Touré", "given": "Aminata"} +{"country": "SN", "family": "Sow", "given": "Pape"} +{"country": "SN", "family": "Coulibaly", "given": "Elimane"} +{"country": "SN", "family": "N'Diaye", "given": "Amadou"} +{"country": "SN", "family": "N'Diaye", "given": "Mamadou"} +{"country": "SN", "family": "N'Diaye", "given": "Assane"} +{"country": "SN", "family": "N'Diaye", "given": "Moussa"} +{"country": "SN", "family": "Traoré", "given": "Amara"} +{"country": "SN", "family": "Cissé", "given": "Aliou"} +{"country": "SN", "family": "Diouf", "given": "Jacques"} +{"country": "SN", "family": "Kébé", "given": "Alioune"} +{"country": "SN", "family": "Gueye", "given": "Zakaria"} +{"country": "SN", "family": "N'Diaye", "given": "Lamine"} +{"country": "SN", "family": "Gomis", "given": "Kevin"} +{"country": "SN", "family": "Ndiaye", "given": "Cheikh"} +{"country": "SN", "family": "Sy", "given": "Pape"} +{"country": "SN", "family": "Ndoye", "given": "Mariama"} +{"country": "SN", "family": "Ndione", "given": "Serigne"} +{"country": "SN", "family": "Sall", "given": "Abbas"} +{"country": "SN", "family": "Fall", "given": "Abdou"} +{"country": "SN", "family": "Coulibaly", "given": "ʿAbd al-Laṭīf"} +{"country": "SN", "family": "Kane", "given": "Armin"} +{"country": "SN", "family": "Kane", "given": "Abdoulaye"} +{"country": "SN", "family": "Baldé", "given": "Abdoulaye"} +{"country": "SN", "family": "Bathily", "given": "Abdoulaye"} +{"country": "SN", "family": "Fofana", "given": "Abdoulaye"} +{"country": "SN", "family": "Ly", "given": "Abdoulaye"} +{"country": "SN", "family": "Ndoye", "given": "Abdoulaye"} +{"country": "SN", "family": "Sow", "given": "Abdourahmane"} +{"country": "SN", "family": "Sy", "given": "Abdourahmane"} +{"country": "SN", "family": "Cissoko", "given": "Ablaye"} +{"country": "SN", "family": "Diack", "given": "Lamine"} +{"country": "SN", "family": "Evra", "given": "Patrice"} +{"country": "SN", "family": "Gomis", "given": "Bafétimbi"} +{"country": "SN", "family": "Dabo", "given": "Mouhamadou"} +{"country": "SN", "family": "Cissokho", "given": "Aly"} +{"country": "SN", "family": "Diouf", "given": "Mame Biram"} +{"country": "SN", "family": "Sané", "given": "Ludovic"} +{"country": "SN", "family": "Saivet", "given": "Henri"} +{"country": "SN", "family": "Souaré", "given": "Pape"} +{"country": "SN", "family": "Gueye", "given": "Idrissa"} +{"country": "SN", "family": "Sall", "given": "Macky"} +{"country": "SN", "family": "Mbaye", "given": "Abdoul"} +{"country": "SN", "family": "Mbengue", "given": "Cheikh"} +{"country": "SN", "family": "Ndong", "given": "Boniface"} +{"country": "SN", "family": "Wade", "given": "Abdoulaye"} +{"country": "SN", "family": "Gomis", "given": "Rémi"} +{"country": "SN", "family": "Thioune", "given": "Daniel"} +{"country": "SN", "family": "Senghor", "given": "Léopold"} +{"country": "SN", "family": "Senghor", "given": "Sédar"} +{"country": "SN", "family": "Diallo", "given": "Abdoulaye"} +{"country": "SN", "family": "Mbaye", "given": "Mariétou"} +{"country": "SN", "family": "Gueye", "given": "Mansour"} +{"country": "SN", "family": "Diedhiou", "given": "Bineta"} +{"country": "SN", "family": "Mané", "given": "Sadio"} +{"country": "SN", "family": "N'Dour", "given": "Youssou"} +{"country": "SN", "family": "Mendy", "given": "Frédéric"} +{"country": "SN", "family": "Diouf", "given": "Abdou"} +{"country": "SN", "family": "Yade", "given": "Rama"} +{"country": "SN", "family": "Thiam", "given": "Amy"} +{"country": "SN", "family": "Faye", "given": "Safi"} +{"country": "SN", "family": "Sy", "given": "Oumou"} +{"country": "SN", "family": "Mbaye", "given": "Annette"} +{"country": "SN", "family": "Mbodj", "given": "Aissatou"} +{"country": "SN", "family": "Mbodj", "given": "Aïda"} +{"country": "SN", "family": "Diome", "given": "Fatou"} +{"country": "SN", "family": "Ba", "given": "Demba"} +{"country": "SN", "family": "Guirassy", "given": "Abdou"} +{"country": "SN", "family": "Sall", "given": "Abdou"} +{"country": "SN", "family": "Faye", "given": "Abdoulaye"} +{"country": "SN", "family": "Sané", "given": "Abdoulaye"} +{"country": "SN", "family": "Seye", "given": "Abdoulaye"} +{"country": "SN", "family": "Cissé", "given": "Papiss"} +{"country": "SN", "family": "Sakho", "given": "Mamadou"} +{"country": "SN", "family": "Kamara", "given": "Diomansy"} +{"country": "SN", "family": "Sow", "given": "Moussa"} +{"country": "SN", "family": "Beye", "given": "Habib"} +{"country": "SN", "family": "Sembène", "given": "Ousmane"} +{"country": "SN", "family": "Camara", "given": "Henri"} +{"country": "SN", "family": "Dieng", "given": "Adama"} +{"country": "SN", "family": "Ba", "given": "Ibrahim"} +{"country": "SN", "family": "Niang", "given": "Mamadou"} +{"country": "SN", "family": "Diao", "given": "Salif"} +{"country": "SN", "family": "Diawara", "given": "Souleymane"} +{"country": "SN", "family": "Dabo", "given": "Ousmane"} +{"country": "SN", "family": "Diagne", "given": "Souleymane"} +{"country": "SN", "family": "Diagne", "given": "Bachir"} +{"country": "SN", "family": "Sarr", "given": "Muhammad"} +{"country": "SN", "family": "Sarr", "given": "Mohamed"} +{"country": "SN", "family": "Fall", "given": "Aminata"} +{"country": "SN", "family": "Mbacké", "given": "Amadou"} +{"country": "SN", "family": "Bamba", "given": "Amadou"} +{"country": "SN", "family": "Thiam", "given": "Mor"} +{"country": "SN", "family": "Ba", "given": "Khalifa"} +{"country": "SN", "family": "Diatta", "given": "Lamine"} +{"country": "SN", "family": "Ba", "given": "Mariama"} +{"country": "SN", "family": "Thiam", "given": "Habib"} +{"country": "SN", "family": "Lô", "given": "Ismaël"} +{"country": "SN", "family": "Sylva", "given": "Tony"} +{"country": "SN", "family": "Sarr", "given": "Jacques"} +{"country": "SN", "family": "Wade", "given": "Viviane"} +{"country": "SN", "family": "Wade", "given": "Karim"} +{"country": "SN", "family": "Sarr", "given": "Adrien"} +{"country": "SN", "family": "Sarr", "given": "Théodore"} +{"country": "SN", "family": "Sonko", "given": "Ibrahim"} +{"country": "SN", "family": "Sonko", "given": "Ibrahima"} +{"country": "SN", "family": "Sané", "given": "Pierre"} +{"country": "SN", "family": "Faye", "given": "Ibrahim"} +{"country": "SN", "family": "Faye", "given": "Ibrahima"} +{"country": "SN", "family": "Ndiaye", "given": "Souleymane"} +{"country": "SN", "family": "Diarra", "given": "Lamine"} +{"country": "SN", "family": "Kouyaté", "given": "Cheikhou"} +{"country": "SN", "family": "Wade", "given": "Ibrahima"} +{"country": "SN", "family": "Mbodji", "given": "Kara"} +{"country": "SN", "family": "Faye", "given": "Mathieu"} +{"country": "SN", "family": "Sall", "given": "Moustapha"} +{"country": "SN", "family": "Gomis", "given": "Émilie"} +{"country": "SN", "family": "Mbaye", "given": "Abdoulaye"} +{"country": "SN", "family": "Guèye", "given": "Lamine"} +{"country": "SN", "family": "Diouf", "given": "Pierre"} +{"country": "SN", "family": "Diouf", "given": "Moustapha"} +{"country": "SN", "family": "Touré", "given": "Ibrahima"} +{"country": "SN", "family": "Diakhaté", "given": "Pape"} +{"country": "SN", "family": "Badiane", "given": "Malick"} +{"country": "SN", "family": "Fall", "given": "Baye"} +{"country": "SN", "family": "Gassama", "given": "Lamine"} +{"country": "SN", "family": "Mendy", "given": "Alexandre"} +{"country": "SN", "family": "Ba", "given": "Issa"} +{"country": "SN", "family": "Coundoul", "given": "Bouna"} +{"country": "SN", "family": "Bohringer", "given": "Richard"} +{"country": "SN", "family": "N'Diaye", "given": "Papa"} +{"country": "SN", "family": "Soumaré", "given": "Hadjibou"} +{"country": "SN", "family": "Soumaré", "given": "Cheikh"} +{"country": "SN", "family": "Moreau", "given": "Abdoulaye"} +{"country": "SN", "family": "Sagna", "given": "Augustin"} +{"country": "SN", "family": "Gaye", "given": "Babacar"} +{"country": "SN", "family": "N'Diaye", "given": "Babacar"} +{"country": "SN", "family": "Ndiaye", "given": "Benjamin"} +{"country": "SN", "family": "Niang", "given": "Mame"} +{"country": "SN", "family": "Tavares", "given": "Mickaël"} +{"country": "SN", "family": "Camara", "given": "Souleymane"} +{"country": "SN", "family": "Thiaw", "given": "Pape"} +{"country": "SN", "family": "Mendy", "given": "Pascal"} +{"country": "SN", "family": "Faty", "given": "Jacques"} +{"country": "SN", "family": "Thomas", "given": "Louis"} +{"country": "SN", "family": "Loum", "given": "Mamadou"} +{"country": "SN", "family": "Dodds", "given": "Paul"} +{"country": "SN", "family": "Dodds", "given": "Prosper"} +{"country": "SN", "family": "Beye", "given": "Ben"} +{"country": "SN", "family": "Sène", "given": "Amy"} +{"country": "SN", "family": "Wade", "given": "Mansour"} +{"country": "SN", "family": "N'Doye", "given": "Ousmane"} +{"country": "SN", "family": "Kane", "given": "Salla"} +{"country": "SN", "family": "Kane", "given": "Ndeye"} +{"country": "SN", "family": "Faye", "given": "Bilal"} +{"country": "SN", "family": "Lo", "given": "Bamba"} +{"country": "SN", "family": "Sene", "given": "Henri"} +{"country": "SN", "family": "Seck", "given": "Djibi"} +{"country": "SN", "family": "Travaly", "given": "Cheick"} +{"country": "SN", "family": "Diagne", "given": "Moussa"} +{"country": "SN", "family": "Diagne", "given": "Matar"} +{"country": "SN", "family": "Diouf", "given": "Malick"} +{"country": "SN", "family": "Diouf", "given": "El Hadji"} +{"country": "SN", "family": "Dorival", "given": "Pierre"} +{"country": "SN", "family": "Fall", "given": "Cheikh"} +{"country": "SN", "family": "Sarr", "given": "Mamadou"} +{"country": "SN", "family": "Diallo", "given": "Ibrahima"} +{"country": "SN", "family": "Baldé", "given": "Ousmane"} +{"country": "SN", "family": "Sankalé", "given": "Michel"} +{"country": "SN", "family": "Sankalé", "given": "Sylvain"} +{"country": "SN", "family": "Pouye", "given": "Khady"} +{"country": "SN", "family": "Thomas", "given": "Marie-Jeanne"} +{"country": "SN", "family": "Serbin", "given": "Marie-Jeanne"} +{"country": "SN", "family": "Samb", "given": "Moustapha"} +{"country": "SN", "family": "Pina", "given": "Eric"} +{"country": "SN", "family": "Ngom", "given": "Amadou"} +{"country": "SN", "family": "Moreau", "given": "Charles"} +{"country": "SN", "family": "Moreau", "given": "Élie"} +{"country": "SN", "family": "Seck", "given": "Mamadou"} +{"country": "SN", "family": "Thiam", "given": "Ousmane"} +{"country": "SN", "family": "Gueye", "given": "Lamine"} +{"country": "SN", "family": "Gueye", "given": "Mohamadou"} +{"country": "SN", "family": "Faye", "given": "Bassirou"} +{"country": "SN", "family": "Ndione", "given": "Victor"} +{"country": "SN", "family": "Diagne", "given": "Abdou"} +{"country": "SN", "family": "Mbaye", "given": "Khady"} +{"country": "SN", "family": "Faye", "given": "Mouhamed"} +{"country": "SN", "family": "Diouf", "given": "Cheikh"} +{"country": "SN", "family": "Lo", "given": "Mansour"} +{"country": "SN", "family": "Lo", "given": "Mouhamadou"} +{"country": "SN", "family": "Fall", "given": "Ngoné"} +{"country": "SN", "family": "Fall", "given": "Ndeye"} +{"country": "SN", "family": "Diouf", "given": "Bineta"} +{"country": "SN", "family": "Barry", "given": "Boubacar"} +{"country": "SN", "family": "Guèye", "given": "Boubacar"} +{"country": "SN", "family": "Seck", "given": "Charles"} +{"country": "SN", "family": "Carrère", "given": "Charles"} +{"country": "SN", "family": "Thioune", "given": "Cheikhou"} +{"country": "SN", "family": "Touré", "given": "Cheikh"} +{"country": "SN", "family": "Thiam", "given": "Chérif"} +{"country": "SN", "family": "Seck", "given": "Coumba"} +{"country": "SN", "family": "Diouf", "given": "Coumba"} +{"country": "SN", "family": "Boilat", "given": "David"} +{"country": "SN", "family": "Mbengue", "given": "Demba"} +{"country": "SN", "family": "Mordasini", "given": "Diana"} +{"country": "SN", "family": "Awadi", "given": "Didier"} +{"country": "SN", "family": "Ngom", "given": "Djibril"} +{"country": "SN", "family": "Diawara", "given": "Djibril"} +{"country": "SN", "family": "Niane", "given": "Djibril"} +{"country": "SN", "family": "Niane", "given": "Tamsir"} +{"country": "SN", "family": "Gaye", "given": "Dyana"} +{"country": "SN", "family": "Sy", "given": "Friedrich"} +{"country": "SN", "family": "Hamidou", "given": "Abdoul"} +{"country": "SN", "family": "Sall", "given": "Abdoul"} +{"country": "SN", "family": "Diouf", "given": "Elhadji"} +{"country": "SN", "family": "Sène", "given": "Fama"} +{"country": "SN", "family": "Dieng", "given": "Fatou"} +{"country": "SN", "family": "Fall", "given": "Fatou"} +{"country": "SN", "family": "Fall", "given": "Bintou"} +{"country": "SN", "family": "Ndiaye", "given": "Fatou"} +{"country": "SN", "family": "Sow", "given": "Fatou"} +{"country": "SN", "family": "N'Diaye", "given": "Fatou"} +{"country": "SN", "family": "Sall", "given": "Fatoumata"} +{"country": "SN", "family": "Mendy", "given": "Félix"} +{"country": "SN", "family": "Angoulvant", "given": "Gabriel"} +{"country": "SN", "family": "d'Arboussier", "given": "Gabriel"} +{"country": "SN", "family": "Acogny", "given": "Germaine"} +{"country": "SN", "family": "Mendy", "given": "Victor"} +{"country": "SN", "family": "Sy", "given": "Habib"} +{"country": "SN", "family": "Bocoum", "given": "Hamady"} +{"country": "SN", "family": "El Ali", "given": "Haidar"} +{"country": "SN", "family": "El Ali", "given": "Haïdar"} +{"country": "SN", "family": "Sagna", "given": "Henri"} +{"country": "SN", "family": "Fall", "given": "Ibrahima"} +{"country": "SN", "family": "Mbow", "given": "Ibrahima"} +{"country": "SN", "family": "Sall", "given": "Ibrahima"} +{"country": "SN", "family": "Coulibaly", "given": "Insa"} +{"country": "SN", "family": "Cissokho", "given": "Issa"} +{"country": "SN", "family": "Ba", "given": "Yakov"} +{"country": "SN", "family": "Bocoum", "given": "Fatima"} +{"country": "SN", "family": "Bocoum", "given": "Jacqueline"} +{"country": "SN", "family": "Baudin", "given": "Jacques"} +{"country": "SN", "family": "Mendy", "given": "Jean"} +{"country": "SN", "family": "Dias", "given": "Jean-Paul"} +{"country": "SN", "family": "Sleight", "given": "John"} +{"country": "SN", "family": "Mbaye", "given": "Joseph"} +{"country": "SN", "family": "Lopy", "given": "Joseph"} +{"country": "SN", "family": "Koulibaly", "given": "Kalidou"} +{"country": "SN", "family": "Hane", "given": "Khadidiatou"} +{"country": "SN", "family": "Diallo", "given": "Khadidiatou"} +{"country": "SN", "family": "Thiam", "given": "Khady"} +{"country": "SN", "family": "Sylla", "given": "Khady"} +{"country": "SN", "family": "Sall", "given": "Khalifa"} +{"country": "SN", "family": "Dieng", "given": "Lamine"} +{"country": "SN", "family": "Sané", "given": "Landing"} +{"country": "SN", "family": "Savané", "given": "Landing"} +{"country": "SN", "family": "Camara", "given": "Latyr"} +{"country": "SN", "family": "Kesteloot", "given": "Lilyan"} +{"country": "SN", "family": "Saleh", "given": "Mahmoud"} +{"country": "SN", "family": "Ba", "given": "Mamadou"} +{"country": "SN", "family": "Traoré", "given": "Mamadou"} +{"country": "SN", "family": "Baldé", "given": "Mamadou"} +{"country": "SN", "family": "Diouf", "given": "Mamadou"} +{"country": "SN", "family": "Gueye", "given": "Babacar"} +{"country": "SN", "family": "Kone", "given": "Moussa"} +{"country": "SN", "family": "Fall", "given": "Kine"} +{"country": "SN", "family": "Sall", "given": "Amadou"} +{"country": "SN", "family": "Coly", "given": "Fatoumata"} +{"country": "SN", "family": "Cissé", "given": "Hadja"} +{"country": "SN", "family": "Mbengue", "given": "Ababacar"} +{"country": "SN", "family": "Badji", "given": "Mamadou"} +{"country": "SN", "family": "Diaw", "given": "Elhadji"} +{"country": "SN", "family": "Lemoine", "given": "Lucien"} +{"country": "SN", "family": "Bourhis", "given": "Jean-Pierre"} +{"country": "SN", "family": "N'Diaye", "given": "Awa"} +{"country": "SN", "family": "Diarra", "given": "Maïmouna"} +{"country": "SN", "family": "Wane", "given": "Lala"} +{"country": "SN", "family": "Niane", "given": "Abdoul"} +{"country": "SN", "family": "Ndiaye", "given": "Amath"} +{"country": "SN", "family": "Touré", "given": "Boubacar"} +{"country": "SN", "family": "Madani", "given": "Seydou"} +{"country": "SN", "family": "Sy", "given": "Seydou"} +{"country": "SN", "family": "Sarr", "given": "Ismaila"} +{"country": "SN", "family": "Sagna", "given": "Georgette"} +{"country": "SN", "family": "Sagna", "given": "Monica"} +{"country": "SN", "family": "Senghor", "given": "Binta"} +{"country": "SN", "family": "Sambou", "given": "Anta"} +{"country": "SN", "family": "Buet", "given": "Léa"} +{"country": "SN", "family": "Barro", "given": "Mouhamed"} +{"country": "SN", "family": "Sagna", "given": "Christophe"} +{"country": "SN", "family": "Sagna", "given": "Jean-Christophe"} +{"country": "SN", "family": "Sagna", "given": "Pierre"} +{"country": "SN", "family": "Ndour", "given": "Abdallah"} +{"country": "SN", "family": "Mendy", "given": "Édouard"} +{"country": "SN", "family": "Keita", "given": "Fanta"} +{"country": "SN", "family": "Diatta", "given": "Aminata"} +{"country": "SN", "family": "Thiam", "given": "Awa"} +{"country": "SN", "family": "Ndao", "given": "Mariama"} +{"country": "SN", "family": "Gaye", "given": "Mamadou"} +{"country": "SN", "family": "Diouf", "given": "Alioune"} +{"country": "SN", "family": "Diaby", "given": "Omar"} +{"country": "SN", "family": "Fall", "given": "Eric"} +{"country": "SN", "family": "Diakhaté", "given": "Ndeye"} +{"country": "SN", "family": "Diakhaté", "given": "Coumba"} +{"country": "SN", "family": "Sarr", "given": "Oulimata"} +{"country": "SN", "family": "Mbaye", "given": "Meïssa"} +{"country": "SN", "family": "N'Diaye", "given": "Catherine"} +{"country": "SN", "family": "Ndiaye", "given": "Cherif"} +{"country": "SN", "family": "Wagué", "given": "Moussa"} +{"country": "SN", "family": "Camara", "given": "Fatou"} +{"country": "SN", "family": "Camara", "given": "Ousmane"} +{"country": "SN", "family": "Ndiaye", "given": "Daouda"} +{"country": "SN", "family": "Badji", "given": "Aliou"} +{"country": "SN", "family": "Coulibaly", "given": "Mamadou"} +{"country": "SN", "family": "Sane", "given": "Moussa"} +{"country": "SN", "family": "Ndiaye", "given": "Saliou"} +{"country": "SN", "family": "Samb", "given": "Elhadji"} +{"country": "SN", "family": "Diatta", "given": "Jean"} +{"country": "SN", "family": "Diatta", "given": "Bernard"} +{"country": "SN", "family": "Ndiaye", "given": "Sibeth"} +{"country": "SN", "family": "Brenner", "given": "Mireille"} +{"country": "SN", "family": "Kamara", "given": "Boubacar"} +{"country": "SN", "family": "Diallo", "given": "Mamadou"} +{"country": "SN", "family": "Niang", "given": "Thierno"} +{"country": "SN", "family": "Diallo", "given": "Delphine"} +{"country": "SN", "family": "Wade", "given": "Magatte"} +{"country": "SN", "family": "Fall", "given": "Amy"} +{"country": "SN", "family": "Sarr", "given": "Amy"} +{"country": "SN", "family": "Mendy", "given": "Adolphe"} +{"country": "SN", "family": "Dieng", "given": "Amadou"} +{"country": "SN", "family": "Ba", "given": "Alioune"} +{"country": "SN", "family": "Kama", "given": "Moustapha"} +{"country": "SN", "family": "Mbaye", "given": "Mouhamed"} +{"country": "SN", "family": "Ndiaye", "given": "Mamadou"} +{"country": "SN", "family": "Mendy", "given": "Jules"} +{"country": "SN", "family": "Touré", "given": "Fodé"} +{"country": "SN", "family": "Ballo", "given": "Fodé"} +{"country": "SN", "family": "Sarr", "given": "Abdourahmane"} +{"country": "SN", "family": "Ndiaye", "given": "Abdoulaye"} +{"country": "SN", "family": "Sagna", "given": "Abass"} +{"country": "SN", "family": "Gueye", "given": "Mamadou"} +{"country": "SN", "family": "Diouf", "given": "Dominique"} +{"country": "SN", "family": "Diallo", "given": "Oumar"} +{"country": "SN", "family": "Diallo", "given": "Alpha"} +{"country": "SN", "family": "Ka", "given": "Fatoumata"} +{"country": "SN", "family": "Traoré", "given": "Ousmane"} +{"country": "SN", "family": "Sarr", "given": "Pape Matar"} +{"country": "SN", "family": "Hane", "given": "Tidiane"} +{"country": "SN", "family": "Hane", "given": "Samba"} +{"country": "SN", "family": "Dieng", "given": "Ahmadou"} +{"country": "SN", "family": "Ndour", "given": "Alioune"} +{"country": "SN", "family": "Barry", "given": "Yacouba"} +{"country": "SN", "family": "Sagna", "given": "Guy"} +{"country": "SN", "family": "Sagna", "given": "Marius"} +{"country": "SN", "family": "Ndiaye", "given": "Iliman"} +{"country": "SN", "family": "Sylla", "given": "Mariama"} +{"country": "SN", "family": "Sène", "given": "Alioune"} +{"country": "SN", "family": "Baldé", "given": "Aliou"} +{"country": "SN", "family": "Ndiaye", "given": "Eli"} +{"country": "SN", "family": "N'Diaye", "given": "Eli"} +{"country": "SN", "family": "Mbengue", "given": "Amy"} +{"country": "SN", "family": "Sand", "given": "Monique"} +{"country": "SN", "family": "Bathily", "given": "Awa"} +{"country": "SN", "family": "Dabo", "given": "Amara"} +{"country": "SN", "family": "Hassan", "given": "Samir"} +{"country": "SN", "family": "Barry", "given": "Amadou"} +{"country": "SN", "family": "Sambou", "given": "Jacques"} +{"country": "SN", "family": "Doucouré", "given": "Seydina"} +{"country": "SN", "family": "Touré", "given": "Seydou"} +{"country": "SN", "family": "Sylla", "given": "Fatou"} +{"country": "SN", "family": "Sylla", "given": "Sokhna"} +{"country": "SN", "family": "Gueye", "given": "Habib"} +{"country": "SN", "family": "Diaw", "given": "Mamadou"} +{"country": "SN", "family": "Fowler", "given": "Jacques"} +{"country": "SN", "family": "Pouye", "given": "Dieynaba"} +{"country": "SN", "family": "Diawara", "given": "Mama"} +{"country": "SN", "family": "Sarr", "given": "Ndeye"} +{"country": "SN", "family": "Sarr", "given": "Astou"} +{"country": "SN", "family": "Ba", "given": "Marieme"} +{"country": "SN", "family": "Diouf", "given": "Mame"} +{"country": "SN", "family": "Mbacké", "given": "Sokhna"} +{"country": "SN", "family": "Dieng", "given": "Sokhna"} +{"country": "SN", "family": "Diongue", "given": "Mariétou"} +{"country": "SN", "family": "Diagne", "given": "Victor"} +{"country": "SN", "family": "Diack", "given": "Anta"} +{"country": "SN", "family": "Diouf", "given": "Andy"} +{"country": "SN", "family": "Ndiaye", "given": "Seny"} +{"country": "SN", "family": "Lame", "given": "Khabane"} +{"country": "SN", "family": "Badji", "given": "Fatou"} +{"country": "SN", "family": "Badji", "given": "Kine"} +{"country": "SN", "family": "N'Diaye", "given": "Marème"} +{"country": "SN", "family": "Sock", "given": "Aida"} +{"country": "SN", "family": "Fall", "given": "Mamadou"} +{"country": "SN", "family": "Kairé", "given": "Maram"} +{"country": "SN", "family": "Sow", "given": "Coumba"} +{"country": "SN", "family": "Costa", "given": "Chiara"} +{"country": "SN", "family": "Cissé", "given": "Souleymane"} +{"country": "SN", "family": "Touré", "given": "Moussa"} +{"country": "SN", "family": "Touré", "given": "Pape"} +{"country": "SN", "family": "Gueye", "given": "Moussé"} +{"country": "SN", "family": "Sène", "given": "James"} +{"country": "SN", "family": "Lô", "given": "Ababacar"} +{"country": "SN", "family": "N'Diaye", "given": "François"} +{"country": "SN", "family": "Ndiaye", "given": "Mouhamed"} +{"country": "SN", "family": "Niang", "given": "Aminata"} +{"country": "SN", "family": "Niang", "given": "Ndeye"} +{"country": "SN", "family": "Sylla", "given": "Aminata"} +{"country": "SN", "family": "Camara", "given": "Gora"} +{"country": "SN", "family": "Diallo", "given": "Dieynaba"} +{"country": "SN", "family": "Ndiaye", "given": "Amadou"} +{"country": "SN", "family": "Seye", "given": "Matthieu"} +{"country": "SN", "family": "Seye", "given": "Ousmane"} +{"country": "SN", "family": "Dramé", "given": "Mariama"} +{"country": "SN", "family": "Dieye", "given": "Ndeye"} +{"country": "SN", "family": "Niane", "given": "Adama"} +{"country": "SN", "family": "Niane", "given": "El Hadji"} +{"country": "SN", "family": "Ndiaye", "given": "Mansour"} +{"country": "SN", "family": "Diarra", "given": "Habib"} +{"country": "SN", "family": "Sow", "given": "Diariatou"} +{"country": "SN", "family": "Sarr", "given": "Souleymane"} +{"country": "SN", "family": "Malou", "given": "Auguste"} +{"country": "SN", "family": "Sauvalle", "given": "Pierre"} +{"country": "SN", "family": "Sauvalle", "given": "Lotfi"} +{"country": "SN", "family": "Touré", "given": "Fatou"} +{"country": "SN", "family": "Touré", "given": "Jupiter"} +{"country": "SN", "family": "Dumont", "given": "Christiane"} +{"country": "SN", "family": "Diouf", "given": "Mansour"} +{"country": "SN", "family": "Diakhaté", "given": "Awa"} +{"country": "SN", "family": "Gaye", "given": "Gita"} +{"country": "SN", "family": "Gaye", "given": "Aita"} +{"country": "SN", "family": "Sy", "given": "Fatimata"} +{"country": "SN", "family": "Lô", "given": "Momar"} +{"country": "SN", "family": "Ndiaye", "given": "Marie"} +{"country": "SN", "family": "Diagne", "given": "Aïssatou"} +{"country": "SN", "family": "Ndiaye", "given": "Junior"} +{"country": "SN", "family": "Tall", "given": "Mamy"} +{"country": "SN", "family": "Faye", "given": "Omar"} +{"country": "SN", "family": "Kane", "given": "Sally"} +{"country": "SN", "family": "Ndoye", "given": "Alioune"} +{"country": "SN", "family": "Sow", "given": "Ibrahima"} +{"country": "SN", "family": "Cissé", "given": "Aziz"} +{"country": "SN", "family": "Cissé", "given": "Abdoul"} +{"country": "SN", "family": "Mbaye", "given": "Amélie"} +{"country": "SN", "family": "Sy", "given": "Sophie"} +{"country": "SN", "family": "Nzinga", "given": "Sophie"} +{"country": "SN", "family": "Zinga", "given": "Sophie"} +{"country": "SN", "family": "Fofana", "given": "Karim"} +{"country": "SN", "family": "Fofana", "given": "Abdou"} +{"country": "SN", "family": "Diagne", "given": "Ababacar"} +{"country": "SN", "family": "Diagne", "given": "Assane"} +{"country": "SN", "family": "Crespin", "given": "Marie-José"} +{"country": "SN", "family": "Sène", "given": "Tenning"} +{"country": "SN", "family": "Lo", "given": "Rokhaya"} +{"country": "SN", "family": "Lo", "given": "Mame"} +{"country": "SN", "family": "Lo", "given": "Fatou"} +{"country": "SN", "family": "Diatta", "given": "Alberta"} +{"country": "SN", "family": "Ndiaye", "given": "Maïssa"} +{"country": "SN", "family": "Camara", "given": "Alioune"} +{"country": "SN", "family": "Camara", "given": "Gino"} +{"country": "SN", "family": "Camara", "given": "Ilay"} +{"country": "SN", "family": "Sall", "given": "Ndeye"} +{"country": "SN", "family": "Sall", "given": "Astou"} +{"country": "SN", "family": "Diouf", "given": "Anna"} +{"country": "SN", "family": "Ndiaye", "given": "Therese"} +{"country": "SN", "family": "Thiam", "given": "Fatim"} +{"country": "SN", "family": "Diaw", "given": "Katy"} +{"country": "SN", "family": "Diallo", "given": "Fatimata"} +{"country": "SN", "family": "Diallo", "given": "Aminata"} +{"country": "SN", "family": "Ba", "given": "Khady"} +{"country": "SN", "family": "Dieye", "given": "Aminata"} +{"country": "SN", "family": "Gueye", "given": "Khadija"} +{"country": "SN", "family": "Camara", "given": "Mariétou"} +{"country": "SN", "family": "Camara", "given": "Fatim"} +{"country": "SN", "family": "Camara", "given": "Yaye"} +{"country": "SN", "family": "Cisse", "given": "Astou"} +{"country": "SN", "family": "Cisse", "given": "Yaye"} +{"country": "SN", "family": "Faye", "given": "Aïcha"} +{"country": "SN", "family": "Diallo", "given": "Maïmouna"} +{"country": "SN", "family": "Camara", "given": "Madina"} +{"country": "SN", "family": "Thiam", "given": "Thioro"} +{"country": "SN", "family": "Ba", "given": "Fatou"} +{"country": "SN", "family": "Mboup", "given": "Péthè"} +{"country": "SN", "family": "Ba", "given": "Mame"} +{"country": "SN", "family": "Diouf", "given": "Bouna"} +{"country": "SN", "family": "Diallo", "given": "Samba"} +{"country": "SN", "family": "Bodian", "given": "Mamadou"} +{"country": "SN", "family": "Sankharé", "given": "Oumar"} +{"country": "SN", "family": "Seck", "given": "Fatoumata"} +{"country": "SN", "family": "Seck", "given": "Koumba"} +{"country": "SN", "family": "Sow", "given": "Noé"} +{"country": "SN", "family": "Mbaye", "given": "Pape"} +{"country": "SN", "family": "Mbaye", "given": "Lamine"} +{"country": "SN", "family": "Kanté", "given": "Mamadou"} +{"country": "SN", "family": "Sy", "given": "Mame-Marie"} +{"country": "SN", "family": "Seck", "given": "Mame"} +{"country": "SN", "family": "Ndiaye", "given": "Mankeur"} +{"country": "SN", "family": "Niang", "given": "Mansour"} +{"country": "SN", "family": "Zimmer", "given": "Manu"} +{"country": "SN", "family": "Sarr", "given": "Mariama"} +{"country": "SN", "family": "Fall", "given": "Martin"} +{"country": "SN", "family": "Kane", "given": "Maïmouna"} +{"country": "SN", "family": "Ndiaye", "given": "Mbaye"} +{"country": "SN", "family": "Gaye", "given": "Meïssa"} +{"country": "SN", "family": "Niang", "given": "Modou"} +{"country": "SN", "family": "Keita", "given": "Mouhamadou"} +{"country": "SN", "family": "Faye", "given": "Mouhammad"} +{"country": "SN", "family": "Sène", "given": "Moussa"} +{"country": "SN", "family": "Guirassy", "given": "Moustapha"} +{"country": "SN", "family": "Niang", "given": "Moustapha"} +{"country": "SN", "family": "Wade", "given": "Moustapha"} +{"country": "SN", "family": "N'Doye", "given": "Mustapha"} +{"country": "SN", "family": "Gueye", "given": "André"} +{"country": "SN", "family": "N'Diaye", "given": "Ndeye"} +{"country": "SN", "family": "Mendy", "given": "Nampalys"} +{"country": "SN", "family": "Ba", "given": "Omar"} +{"country": "SN", "family": "Kane", "given": "Oumar"} +{"country": "SN", "family": "Ly", "given": "Oumar"} +{"country": "SN", "family": "Pouye", "given": "Oumar"} +{"country": "SN", "family": "Sall", "given": "Oumar"} +{"country": "SN", "family": "Seck", "given": "Oumar"} +{"country": "SN", "family": "Touré", "given": "Oumou"} +{"country": "SN", "family": "Diarra", "given": "Ousmane"} +{"country": "SN", "family": "Faye", "given": "Ousmane"} +{"country": "SN", "family": "Sall", "given": "Ousmane"} +{"country": "SN", "family": "Seck", "given": "Ousmane"} +{"country": "SN", "family": "Ngom", "given": "Ousmane"} +{"country": "SN", "family": "Socé", "given": "Ousmane"} +{"country": "SN", "family": "Mbaye", "given": "William"} +{"country": "SN", "family": "Mbaye", "given": "Ousmane"} +{"country": "SN", "family": "Ndiaye", "given": "Pap"} +{"country": "SN", "family": "Thiam", "given": "Papa"} +{"country": "SN", "family": "Boye", "given": "Armand"} +{"country": "SN", "family": "Badiane", "given": "Pape"} +{"country": "SN", "family": "Fall", "given": "Pape"} +{"country": "SN", "family": "N'Diaye", "given": "Pape"} +{"country": "SN", "family": "N'Diaye", "given": "Latyr"} +{"country": "SN", "family": "Sarr", "given": "Pape"} +{"country": "SN", "family": "Diouf", "given": "Pape"} +{"country": "SN", "family": "Djilobodji", "given": "Papy"} +{"country": "SN", "family": "Mbow", "given": "Penda"} +{"country": "SN", "family": "Sagna", "given": "Robert"} +{"country": "SN", "family": "Siani", "given": "Sébastien"} +{"country": "SN", "family": "N'Diaye", "given": "Robert"} +{"country": "SN", "family": "Mendy", "given": "Roger"} +{"country": "SN", "family": "Niang", "given": "Rokhaya"} +{"country": "SN", "family": "Dieng", "given": "Rose"} +{"country": "SN", "family": "Sane", "given": "Tidiane"} +{"country": "SN", "family": "Thiam", "given": "Safiatou"} +{"country": "SN", "family": "Mbaye", "given": "Sam"} +{"country": "SN", "family": "Wade", "given": "Seydina"} +{"country": "SN", "family": "Sy", "given": "Seydina"} +{"country": "SN", "family": "Benga", "given": "Sokhna"} +{"country": "SN", "family": "Keita", "given": "Souleymane"} +{"country": "SN", "family": "Mboup", "given": "Souleymane"} +{"country": "SN", "family": "Samb", "given": "Simon"} +{"country": "SN", "family": "Samb", "given": "Sylvestre"} +{"country": "SN", "family": "Ba", "given": "Thierno"} +{"country": "SN", "family": "King", "given": "Thérèse"} +{"country": "SN", "family": "Ayayi", "given": "Valériane"} +{"country": "SN", "family": "Mendy", "given": "Vincent"} +{"country": "SN", "family": "Diatta", "given": "Édouard"} +{"country": "SN", "family": "Diouf", "given": "Élage"} +{"country": "SN", "family": "Mendy", "given": "Étienne"} +{"country": "SN", "family": "Sarr", "given": "Abdoulaye"} +{"country": "SN", "family": "N'Diaye", "given": "Astou"} +{"country": "SN", "family": "Fall", "given": "Bamba"} +{"country": "SN", "family": "Diouf", "given": "Élisabeth"} +{"country": "SN", "family": "Gaye", "given": "Fatou"} +{"country": "SN", "family": "Sonko", "given": "Mariama"} +{"country": "SN", "family": "Faye", "given": "Marie"} +{"country": "SN", "family": "Faye", "given": "Absa"} +{"country": "SN", "family": "Guisse", "given": "Fatou"} +{"country": "SN", "family": "Guisse", "given": "Ndeye"} +{"country": "SN", "family": "Sagna", "given": "Fatou"} +{"country": "SN", "family": "Diba", "given": "Cheik"} +{"country": "SN", "family": "Ngom", "given": "Daouda"} +{"country": "SN", "family": "Marefa", "given": "Omar"} +{"country": "SN", "family": "Ndiaye", "given": "Baba"} +{"country": "SN", "family": "Diouf", "given": "Pierre Fatou"} +{"country": "SN", "family": "Ba", "given": "Juliette"} +{"country": "SN", "family": "Mazza", "given": "Diene"} +{"country": "SN", "family": "Mazza", "given": "Fatiya"} +{"country": "SN", "family": "Diao", "given": "Ousmane"} +{"country": "SN", "family": "Dieye", "given": "Adji"} +{"country": "SN", "family": "Diagne", "given": "Ibrahima"} +{"country": "SN", "family": "Basse", "given": "Abdou"} +{"country": "SN", "family": "Kebe", "given": "Souleymane"} +{"country": "SN", "family": "Fall", "given": "Amet"} +{"country": "SN", "family": "Diagne", "given": "Amet"} +{"country": "SN", "family": "Faye", "given": "Thérèse"} +{"country": "SN", "family": "Boye", "given": "Abd al-Aziz"} +{"country": "SN", "family": "Ba", "given": "Ottis"} +{"country": "SN", "family": "Ba", "given": "Badou"} +{"country": "SN", "family": "Basse", "given": "Aziz"} +{"country": "SN", "family": "Basse", "given": "Abdoul"} +{"country": "SN", "family": "Sarr", "given": "Ousmane"} +{"country": "SN", "family": "Conteh", "given": "Abdoulie"} +{"country": "SN", "family": "Tall", "given": "Ahmed"} +{"country": "SN", "family": "Niang", "given": "Babacar"} +{"country": "SN", "family": "Harouna", "given": "Thierno"} +{"country": "SN", "family": "Sidibe", "given": "Moussa"} +{"country": "SN", "family": "Malick", "given": "Baye"} +{"country": "SN", "family": "Viardot", "given": "Malcolm"} +{"country": "SN", "family": "Wade", "given": "Badara"} +{"country": "SN", "family": "Ibrahima", "given": "Pape"} +{"country": "SN", "family": "Pouye", "given": "Assane"} +{"country": "SN", "family": "Ndaw", "given": "Mbaye"} +{"country": "SN", "family": "Sylva", "given": "Sire"} +{"country": "SN", "family": "Badji", "given": "Amidou"} +{"country": "SN", "family": "Gueye", "given": "Khouma"} +{"country": "SN", "family": "Thiam", "given": "Christian"} +{"country": "SN", "family": "Lopy", "given": "Pierre-Maurice"} +{"country": "SN", "family": "Diagne", "given": "Alioune"} +{"country": "SN", "family": "Thiam", "given": "Pierre"} +{"country": "SN", "family": "Gassama", "given": "Souleymane"} +{"country": "SN", "family": "Aly", "given": "Ahmadou"} +{"country": "SN", "family": "Mbaye", "given": "Ahmadou"} +{"country": "SN", "family": "Barry", "given": "Souleymane"} +{"country": "SN", "family": "Sow", "given": "Aïchatou"} +{"country": "SN", "family": "Fall", "given": "Marie"} +{"country": "SN", "family": "Mbaye", "given": "Ibrahim"} +{"country": "SN", "family": "Fall", "given": "Cheick"} +{"country": "SN", "family": "Siga", "given": "Mariama"} +{"country": "SN", "family": "Sylla", "given": "Seynabou"} +{"country": "SN", "family": "Badji", "given": "Patrice"} +{"country": "SN", "family": "Barry", "given": "Fatoumata"} +{"country": "SN", "family": "Marega", "given": "Fatoumata"} +{"country": "SN", "family": "Dieng", "given": "Mamadou"} +{"country": "SN", "family": "Kanté", "given": "Babacar"} +{"country": "SN", "family": "Niang", "given": "Saliou"} +{"country": "SN", "family": "Dyane", "given": "Adams"} +{"country": "SN", "family": "Niang", "given": "Cecile"} +{"country": "SN", "family": "Niang", "given": "Thioro"} +{"country": "SN", "family": "Diandy", "given": "Clayton"} +{"country": "SN", "family": "Fall", "given": "Aziz"} +{"country": "SN", "family": "Cissokho", "given": "Jali"} +{"country": "SN", "family": "Cissokho", "given": "Fily"} +{"country": "SN", "family": "Ndiaye", "given": "Bouna"} +{"country": "SN", "family": "Barry", "given": "Mamadou"} +{"country": "SN", "family": "Barry", "given": "Thierno"} +{"country": "SN", "family": "Diarra", "given": "Djibril"} +{"country": "SN", "family": "Sy", "given": "Mariame"} +{"country": "SN", "family": "Sarr", "given": "Khady"} +{"country": "SN", "family": "Mbacké", "given": "Marème"} +{"country": "SN", "family": "Gueye", "given": "Fatma"} +{"country": "SN", "family": "Senghor", "given": "Colette"} +{"country": "SN", "family": "Hubert", "given": "Colette"} +{"country": "SN", "family": "Pouye", "given": "Babacar"} +{"country": "SN", "family": "Mbaye", "given": "Saliou"} +{"country": "SN", "family": "Thiaw", "given": "Daniel"} +{"country": "SN", "family": "Diaz", "given": "Joseph"} +{"country": "SN", "family": "Sène", "given": "Ndeye"} +{"country": "SN", "family": "Daou", "given": "Ramata"} +{"country": "SN", "family": "Sidibe", "given": "Aicha"} +{"country": "SN", "family": "Mbaye", "given": "Aïda"} +{"country": "SN", "family": "Fall", "given": "Marième"} +{"country": "SN", "family": "Sarr", "given": "Adama"} +{"country": "SN", "family": "Almira", "given": "Emmanuelle"} +{"country": "SN", "family": "Baldé", "given": "Ibourahima"} +{"country": "SN", "family": "Andrade", "given": "Daniel"} +{"country": "SN", "family": "Diallo", "given": "Moussa"} +{"country": "SN", "family": "Ndiaye", "given": "Ndeye"} +{"country": "SN", "family": "Ndiaye", "given": "Adja"} +{"country": "SN", "family": "Sarr", "given": "Laurent"} +{"country": "SN", "family": "Gueye", "given": "Alassane"} +{"country": "SN", "family": "Gueye", "given": "Pape"} +{"country": "SN", "family": "Faye", "given": "Marieme"} +{"country": "SN", "family": "Sall", "given": "Marieme"} +{"country": "SN", "family": "Touré", "given": "Abdourahmane"} +{"country": "SN", "family": "Koma", "given": "Ibrahima"} +{"country": "SN", "family": "Koma", "given": "Cheikh"} +{"country": "SN", "family": "Fall", "given": "Khady"} +{"country": "SN", "family": "Sane", "given": "Cheikh"} +{"country": "SN", "family": "Sow", "given": "Amath"} +{"country": "SN", "family": "Cissé", "given": "Ousmane"} +{"country": "SN", "family": "Seck", "given": "Babacar"} +{"country": "SN", "family": "Diagne", "given": "Mansour"} +{"country": "SN", "family": "N'Diaye", "given": "Mousse"} +{"country": "SN", "family": "Campbell", "given": "James"} +{"country": "SN", "family": "Badiane", "given": "James"} +{"country": "SN", "family": "Dacosta", "given": "Julien"} +{"country": "SN", "family": "Aw", "given": "Boubacar"} +{"country": "SN", "family": "Fall", "given": "Kader"} +{"country": "SN", "family": "Carvalho", "given": "Raymond"} +{"country": "SN", "family": "Sow", "given": "Mouhamadou"} +{"country": "SN", "family": "Boissy", "given": "Xavier"} +{"country": "SN", "family": "Cissé", "given": "Jonas"} +{"country": "SN", "family": "Djiba", "given": "Abdoulaye"} +{"country": "SN", "family": "Wade", "given": "Lamine"} +{"country": "SN", "family": "Ndiaye", "given": "Ababacar"} +{"country": "SN", "family": "Mendoza", "given": "Marianne"} +{"country": "SN", "family": "Diallo", "given": "Marianne"} +{"country": "SN", "family": "Mendy", "given": "Paulette"} +{"country": "SN", "family": "Gomis", "given": "Liz"} +{"country": "SN", "family": "Demba", "given": "Seynabou"} +{"country": "SN", "family": "Diallo", "given": "Hawa"} +{"country": "SN", "family": "Seck", "given": "Fatou"} +{"country": "SN", "family": "Gaye", "given": "Bintou"} +{"country": "SN", "family": "Carvalho", "given": "Bonaventure"} +{"country": "SN", "family": "Diouf", "given": "Sarah"} +{"country": "SN", "family": "Diedhiou", "given": "Félix"} +{"country": "SN", "family": "Diedhiou", "given": "Marie"} +{"country": "SN", "family": "Diedhiou", "given": "Nicole"} +{"country": "SN", "family": "Diatta", "given": "Eveline"} +{"country": "SN", "family": "Lamb", "given": "Patrick"} +{"country": "SN", "family": "Lamb", "given": "E."} +{"country": "SN", "family": "Sall", "given": "Babacar"} +{"country": "SN", "family": "Toure", "given": "Yannick"} +{"country": "SN", "family": "Tall", "given": "Elhadji"} +{"country": "SN", "family": "Senghor", "given": "Jeanne"} +{"country": "SN", "family": "Sy", "given": "Ababacar"} +{"country": "SN", "family": "Sy", "given": "Sedikh"} +{"country": "SN", "family": "Sy", "given": "Aboubacar"} +{"country": "SN", "family": "Sy", "given": "Sedikhe"} +{"country": "SN", "family": "Sané", "given": "Babacar"} +{"country": "SN", "family": "Beye", "given": "Oumou"} +{"country": "SN", "family": "Beye", "given": "Cathy"} +{"country": "SN", "family": "Niang", "given": "Maïmouna"} +{"country": "SN", "family": "Cissé", "given": "Ndeye"} +{"country": "SN", "family": "Cissé", "given": "Codou"} +{"country": "SN", "family": "Ndiaye", "given": "Maguèye"} +{"country": "SN", "family": "Sarr", "given": "Maty"} +{"country": "SN", "family": "Diagne", "given": "Moustapha"} +{"country": "SN", "family": "Baldé", "given": "Yéro"} +{"country": "SN", "family": "Niang", "given": "Pape"} +{"country": "SN", "family": "Coulibaly", "given": "Ibou"} +{"country": "SN", "family": "Fakhoury", "given": "Clément"} +{"country": "SN", "family": "Ba", "given": "Ousmane"} +{"country": "SN", "family": "Ndiaye", "given": "Lune"} +{"country": "SN", "family": "Boye", "given": "Khady"} +{"country": "SN", "family": "Hanne", "given": "Khady"} +{"country": "SN", "family": "Wane", "given": "Fatimata"} +{"country": "SN", "family": "Gueye", "given": "Oulimata"} +{"country": "SN", "family": "Ndione", "given": "Moïse"} +{"country": "SN", "family": "Diallo", "given": "Hapsatou"} +{"country": "SN", "family": "Sonko", "given": "Seynabou"} +{"country": "SN", "family": "Camara", "given": "Lamine"} +{"country": "SN", "family": "Sy", "given": "Mohamed"} +{"country": "SN", "family": "Camara", "given": "Mamadou"} +{"country": "SN", "family": "Tidjani", "given": "Adams"} +{"country": "SN", "family": "Ndiaye", "given": "Ousmane"} +{"country": "SN", "family": "Faye", "given": "Souleymane"} +{"country": "SN", "family": "Badji", "given": "Landing"} +{"country": "SN", "family": "Agne", "given": "Ahmed"} +{"country": "SN", "family": "Niang", "given": "Isabelle"} +{"country": "SN", "family": "Prudencio", "given": "Gaëlle"} +{"country": "SN", "family": "Babou", "given": "Marème"} +{"country": "SN", "family": "Diouf", "given": "Aissatou"} +{"country": "SN", "family": "Dabo", "given": "Moussa"} +{"country": "SN", "family": "Sy", "given": "France"} +{"country": "SN", "family": "Dione", "given": "Bernard"} +{"country": "SN", "family": "Dabo", "given": "Youssoupha"} +{"country": "SN", "family": "N'Diaye", "given": "Anna"} +{"country": "SN", "family": "N'Diaye", "given": "Ousmane"} +{"country": "SN", "family": "Sarr", "given": "Dame"} +{"country": "SN", "family": "Diouf", "given": "Amara"} +{"country": "SN", "family": "Gueye", "given": "Mouhamed"} +{"country": "SN", "family": "Sall", "given": "Karim"} +{"country": "SN", "family": "Diatta", "given": "Sylvio"} +{"country": "SN", "family": "Ba", "given": "Fatimata"} +{"country": "SN", "family": "Boissy", "given": "Jean-Jacques"} +{"country": "SN", "family": "Gueye", "given": "Aminata"} +{"country": "SN", "family": "Diallo", "given": "Tidiane"} +{"country": "SN", "family": "Faye", "given": "Mikayıl"} +{"country": "SN", "family": "Diouf", "given": "Khadidiatou"} +{"country": "SN", "family": "Komara", "given": "Hawa"} +{"country": "SN", "family": "Toure", "given": "Maye"} +{"country": "SN", "family": "Pouye", "given": "Fatou"} +{"country": "SN", "family": "Faye", "given": "Khadija"} +{"country": "SN", "family": "Thiam", "given": "Seynabou"} +{"country": "SN", "family": "Diao", "given": "Assane"} +{"country": "SN", "family": "Sané", "given": "Ibou"} +{"country": "SN", "family": "Seck", "given": "Fadilou"} +{"country": "SN", "family": "Ndione", "given": "Élène"} +{"country": "SN", "family": "Cissé", "given": "Moustapha"} +{"country": "SN", "family": "Diagne", "given": "Léna"} +{"country": "SN", "family": "Ducommun", "given": "Dylan"} +{"country": "SN", "family": "Ndoye", "given": "Omar"} +{"country": "SN", "family": "Bodian", "given": "Ramatoulaye"} +{"country": "SN", "family": "Faye", "given": "Beatrice"} +{"country": "SN", "family": "Faye", "given": "Germaine"} +{"country": "SN", "family": "Sonko", "given": "Djibril"} +{"country": "SN", "family": "Fall", "given": "Amadou"} +{"country": "SN", "family": "Gomis", "given": "Christian"} +{"country": "SN", "family": "Coly", "given": "Demba"} +{"country": "SN", "family": "Sow", "given": "Ardo"} +{"country": "SN", "family": "Sow", "given": "Aliou"} +{"country": "SN", "family": "Gueye", "given": "Awa"} +{"country": "SN", "family": "Fall", "given": "Sokhna"} +{"country": "SN", "family": "Diagne", "given": "Fatou"} +{"country": "SN", "family": "Diouf", "given": "Fatou"} +{"country": "SN", "family": "Diagne", "given": "Danielle"} +{"country": "SN", "family": "Diouf", "given": "Danielle"} +{"country": "SN", "family": "Pouye", "given": "Aicha"} +{"country": "SN", "family": "Sonko", "given": "Fatoumata"} +{"country": "SN", "family": "Sarr", "given": "Diar"} +{"country": "SN", "family": "Sarr", "given": "Moïse"} +{"country": "SN", "family": "Seck", "given": "Cheikh"} +{"country": "SN", "family": "Kébé", "given": "Diariatou"} +{"country": "SN", "family": "Diouf", "given": "Joséphine"} +{"country": "SN", "family": "Sow", "given": "Abdoulaye"} +{"country": "SN", "family": "Sylla", "given": "Alioune"} +{"country": "SN", "family": "Sylla", "given": "Ousmane"} +{"country": "SN", "family": "Kandji", "given": "Mamadou"} +{"country": "SN", "family": "Mbaye", "given": "Awa"} +{"country": "SN", "family": "Mbaye", "given": "Cheikh"} +{"country": "SN", "family": "Oualy", "given": "Abdoulaye"} +{"country": "SN", "family": "Diouf", "given": "Maodo"} +{"country": "SN", "family": "Faty", "given": "Abdoulaye"} +{"country": "SN", "family": "Sarr", "given": "Ababacar"} +{"country": "SN", "family": "Fall", "given": "Mathew"} +{"country": "SN", "family": "Fall", "given": "Almamy"} +{"country": "SN", "family": "Ndiaye", "given": "Pape"} +{"country": "SN", "family": "Ndiaye", "given": "Abdou"} +{"country": "SN", "family": "Sall", "given": "Fatima"} +{"country": "SN", "family": "Ndiaye", "given": "Aziz"} +{"country": "CI", "family": "Cissé", "given": "Djibril"} +{"country": "CI", "family": "Diaby", "given": "Abou"} +{"country": "CI", "family": "Traoré", "given": "Ismaël"} +{"country": "CI", "family": "Sagbo", "given": "Yannick"} +{"country": "CI", "family": "Dja Djédjé", "given": "Brice"} +{"country": "CI", "family": "Drogba", "given": "Didier"} +{"country": "CI", "family": "Compaoré", "given": "Blaise"} +{"country": "CI", "family": "Ouattara", "given": "Alassane"} +{"country": "CI", "family": "Duncan", "given": "Daniel"} +{"country": "CI", "family": "Bakayoko", "given": "France"} +{"country": "CI", "family": "Gnabry", "given": "Serge"} +{"country": "CI", "family": "Akpa Akpro", "given": "Jean-Daniel"} +{"country": "CI", "family": "Aurier", "given": "Serge"} +{"country": "CI", "family": "Meité", "given": "Abdoulaye"} +{"country": "CI", "family": "Touré", "given": "Kolo"} +{"country": "CI", "family": "Kalou", "given": "Salomon"} +{"country": "CI", "family": "Touré", "given": "Yaya"} +{"country": "CI", "family": "Eboué", "given": "Emmanuel"} +{"country": "CI", "family": "Zokora", "given": "Didier"} +{"country": "CI", "family": "Kouassi", "given": "Gervais"} +{"country": "CI", "family": "Watts", "given": "Dane"} +{"country": "CI", "family": "Kouakou", "given": "Christian"} +{"country": "CI", "family": "Keïta", "given": "Fatou"} +{"country": "CI", "family": "Keita", "given": "Abd al-Qadir"} +{"country": "CI", "family": "Traoré", "given": "Abdoulaye"} +{"country": "CI", "family": "Boka", "given": "Arthur"} +{"country": "CI", "family": "Koné", "given": "Arouna"} +{"country": "CI", "family": "Brou", "given": "Benjamin"} +{"country": "CI", "family": "Angoua", "given": "Benjamin"} +{"country": "CI", "family": "Koné", "given": "Seydou"} +{"country": "CI", "family": "Fofana", "given": "France"} +{"country": "CI", "family": "Kapo", "given": "Olivier"} +{"country": "CI", "family": "Barry", "given": "Boubacar"} +{"country": "CI", "family": "Sanogo", "given": "Boubacar"} +{"country": "CI", "family": "Bamba", "given": "Sol"} +{"country": "CI", "family": "Demel", "given": "Guy"} +{"country": "CI", "family": "Bédier", "given": "Henri"} +{"country": "CI", "family": "Guéï", "given": "Robert"} +{"country": "CI", "family": "Bony", "given": "Wilfried"} +{"country": "CI", "family": "Le Postollec", "given": "Flavien"} +{"country": "CI", "family": "Kourouma", "given": "Ahmadou"} +{"country": "CI", "family": "Dadi", "given": "Eugène"} +{"country": "CI", "family": "Salley", "given": "Jonas"} +{"country": "CI", "family": "Kambou", "given": "Hervé"} +{"country": "CI", "family": "Koutouan", "given": "Antonin"} +{"country": "CI", "family": "Koné", "given": "Mohamed"} +{"country": "CI", "family": "Diané", "given": "Amara"} +{"country": "CI", "family": "Koné", "given": "Emmanuel"} +{"country": "CI", "family": "Lohouès", "given": "Emma"} +{"country": "CI", "family": "Boka", "given": "Ernest"} +{"country": "CI", "family": "de Nattes", "given": "Ernest"} +{"country": "CI", "family": "Craven", "given": "Errick"} +{"country": "CI", "family": "Brou", "given": "Estelle"} +{"country": "CI", "family": "N'Zi", "given": "Eugène"} +{"country": "CI", "family": "Mambo", "given": "Élodie"} +{"country": "CI", "family": "Koné", "given": "Fatoumata"} +{"country": "CI", "family": "Yao", "given": "Franck"} +{"country": "CI", "family": "Mondon", "given": "Gaston"} +{"country": "CI", "family": "Grebet", "given": "Geneviève"} +{"country": "CI", "family": "Gauze", "given": "Guy"} +{"country": "CI", "family": "Gauze", "given": "Alain"} +{"country": "CI", "family": "Dembele", "given": "Habiba"} +{"country": "CI", "family": "Bakayoko", "given": "Hamed"} +{"country": "CI", "family": "http://www.wikidata.org/.well-known/genid/32cc4ae0f0b46d28338a05c23896e4a6", "given": "Hanni"} +{"country": "CI", "family": "http://www.wikidata.org/.well-known/genid/32cc4ae0f0b46d28338a05c23896e4a6", "given": "Hanny"} +{"country": "CI", "family": "Hassan", "given": "David"} +{"country": "CI", "family": "Duparc", "given": "Henri"} +{"country": "CI", "family": "Konan", "given": "Henri"} +{"country": "CI", "family": "Diabaté", "given": "Henriette"} +{"country": "CI", "family": "Konan", "given": "Henriette"} +{"country": "CI", "family": "Aka", "given": "Hortense"} +{"country": "CI", "family": "Beke", "given": "Isabelle"} +{"country": "CI", "family": "Koulibaly", "given": "Isaïe"} +{"country": "CI", "family": "Koulibaly", "given": "Biton"} +{"country": "CI", "family": "Lassissi", "given": "Ismaila"} +{"country": "CI", "family": "Guébo", "given": "Israel"} +{"country": "CI", "family": "Stenka", "given": "Jacques"} +{"country": "CI", "family": "Kouassi", "given": "Jean-Baptiste"} +{"country": "CI", "family": "Domoraud", "given": "Jean-Jacques"} +{"country": "CI", "family": "Kouassi", "given": "Jean-Jacques"} +{"country": "CI", "family": "Guede", "given": "Jean-Michel"} +{"country": "CI", "family": "Peuhmond", "given": "Jeanne"} +{"country": "CI", "family": "Peuhmond", "given": "Adjoua"} +{"country": "CI", "family": "Boni", "given": "Joachim"} +{"country": "CI", "family": "Zino", "given": "John"} +{"country": "CI", "family": "Lafleur", "given": "Johnny"} +{"country": "CI", "family": "Blé", "given": "Joseph"} +{"country": "CI", "family": "Abondio", "given": "Josette"} +{"country": "CI", "family": "Guébo", "given": "Josué"} +{"country": "CI", "family": "Tiéhi", "given": "Joël"} +{"country": "CI", "family": "Toualy", "given": "Julie"} +{"country": "CI", "family": "Camara", "given": "Kandia"} +{"country": "CI", "family": "Ouattara", "given": "Karim"} +{"country": "CI", "family": "Kone", "given": "Oumar"} +{"country": "CI", "family": "Dao", "given": "Lassina"} +{"country": "CI", "family": "Versace", "given": "Lino"} +{"country": "CI", "family": "N'Da", "given": "Lucienne"} +{"country": "CI", "family": "Gallo", "given": "Manou"} +{"country": "CI", "family": "Molinié", "given": "Marc"} +{"country": "CI", "family": "Coulibaly", "given": "Mariam"} +{"country": "CI", "family": "Diawara", "given": "Mariam"} +{"country": "CI", "family": "Kolga", "given": "Mariame"} +{"country": "CI", "family": "Traoré", "given": "Mariam"} +{"country": "CI", "family": "Sylla", "given": "Mariame"} +{"country": "CI", "family": "Kouassi", "given": "Françoise"} +{"country": "CI", "family": "Asseu", "given": "Françoise"} +{"country": "CI", "family": "Kouassi", "given": "Marie-Louise"} +{"country": "CI", "family": "Asseu", "given": "Marie-Louise"} +{"country": "CI", "family": "Condé", "given": "Marie"} +{"country": "CI", "family": "Houphouët-Boigny", "given": "Marie-Thérèse"} +{"country": "CI", "family": "Tauthui", "given": "Marius"} +{"country": "CI", "family": "Gore", "given": "Martial"} +{"country": "CI", "family": "Djibo", "given": "Martine"} +{"country": "CI", "family": "Brito", "given": "Max"} +{"country": "CI", "family": "Coulibaly", "given": "Micheline"} +{"country": "CI", "family": "Toti", "given": "Mickaël"} +{"country": "CI", "family": "Traoré", "given": "Moussa"} +{"country": "CI", "family": "Diallo", "given": "Muriel"} +{"country": "CI", "family": "Esceth", "given": "Nicolas"} +{"country": "CI", "family": "N'Zi", "given": "Nicolas"} +{"country": "CI", "family": "Diomandé", "given": "Olivier"} +{"country": "CI", "family": "Lognon", "given": "Oscar"} +{"country": "CI", "family": "Michel", "given": "Oscar"} +{"country": "CI", "family": "Gnepo", "given": "Pape"} +{"country": "CI", "family": "Angan", "given": "Pascal"} +{"country": "CI", "family": "Miézan", "given": "Pascal"} +{"country": "CI", "family": "Koré", "given": "Moïse"} +{"country": "CI", "family": "Achi", "given": "Patrick"} +{"country": "CI", "family": "Achi", "given": "Jérôme"} +{"country": "CI", "family": "Akoto", "given": "Yao"} +{"country": "CI", "family": "Akoto", "given": "Paul"} +{"country": "CI", "family": "Lacôte", "given": "Philippe"} +{"country": "CI", "family": "Fakhoury", "given": "Pierre"} +{"country": "CI", "family": "Adams", "given": "Pierrette"} +{"country": "CI", "family": "Netro", "given": "René"} +{"country": "CI", "family": "Beugré", "given": "Robert"} +{"country": "CI", "family": "Bolly", "given": "Mathis"} +{"country": "CI", "family": "Bah Ndaw", "given": "Françoise"} +{"country": "CI", "family": "Bah Ndaw", "given": "Safiatou"} +{"country": "CI", "family": "Diakité", "given": "Souleymane"} +{"country": "CI", "family": "Koffi", "given": "Lauraine"} +{"country": "CI", "family": "Kouamé", "given": "Aristide"} +{"country": "CI", "family": "Kouamé", "given": "Koffi"} +{"country": "CI", "family": "Bamba", "given": "Fatim"} +{"country": "CI", "family": "Coulibaly", "given": "Baba"} +{"country": "CI", "family": "Zadi", "given": "Ezechiel"} +{"country": "CI", "family": "Koné", "given": "Fatima"} +{"country": "CI", "family": "Bamba", "given": "Hassan"} +{"country": "CI", "family": "Obin", "given": "Kevin"} +{"country": "CI", "family": "Konan", "given": "Pascal"} +{"country": "CI", "family": "Koné", "given": "Colette"} +{"country": "CI", "family": "Diomande", "given": "Dominique"} +{"country": "CI", "family": "Meite", "given": "Ladji"} +{"country": "CI", "family": "Chaney", "given": "Théo"} +{"country": "CI", "family": "Ouegnin", "given": "Jonathan"} +{"country": "CI", "family": "Amoussou", "given": "Naomie"} +{"country": "CI", "family": "Bamba", "given": "Régis"} +{"country": "CI", "family": "Diakité", "given": "Ibrahim"} +{"country": "CI", "family": "Traoré", "given": "Adam"} +{"country": "CI", "family": "Traoré", "given": "Kolia"} +{"country": "CI", "family": "Sako", "given": "Mamadou"} +{"country": "CI", "family": "Bah", "given": "Amadou"} +{"country": "CI", "family": "Diomande", "given": "Moussa"} +{"country": "CI", "family": "Kone", "given": "Moussa"} +{"country": "CI", "family": "Kamara", "given": "Almamy"} +{"country": "CI", "family": "Salami", "given": "Abraham"} +{"country": "CI", "family": "Toure", "given": "Moussa"} +{"country": "CI", "family": "Berthé", "given": "Saran"} +{"country": "CI", "family": "Diarra", "given": "Ismael"} +{"country": "CI", "family": "Camara", "given": "Adama"} +{"country": "CI", "family": "Toure", "given": "Aliou"} +{"country": "CI", "family": "Fofana", "given": "Aboubakar"} +{"country": "CI", "family": "Sanogo", "given": "Yacouba"} +{"country": "CI", "family": "Sylla", "given": "Hamadou"} +{"country": "CI", "family": "Fofana", "given": "Safiatou"} +{"country": "CI", "family": "Boire", "given": "Zoumana"} +{"country": "CI", "family": "Drame", "given": "Sanata"} +{"country": "CI", "family": "Dembele", "given": "Fatou"} +{"country": "CI", "family": "Kone", "given": "Mariam"} +{"country": "CI", "family": "Meite", "given": "Ismaël"} +{"country": "CI", "family": "Meite", "given": "Awa"} +{"country": "CI", "family": "Camara", "given": "Saran"} +{"country": "CI", "family": "Diaby", "given": "Abdoulaye"} +{"country": "CI", "family": "Moro", "given": "Amadou"} +{"country": "CI", "family": "Traore", "given": "Fodé"} +{"country": "CI", "family": "Kolga", "given": "Maïmounatou"} +{"country": "CI", "family": "Kamagate", "given": "Awa"} +{"country": "CI", "family": "Konan", "given": "Patrick"} +{"country": "CI", "family": "Keita", "given": "Abraham"} +{"country": "CI", "family": "Savadogo", "given": "Mamadou"} +{"country": "CI", "family": "Tiene", "given": "Ange"} +{"country": "CI", "family": "Diabate", "given": "Fatou"} +{"country": "CI", "family": "Sidibe", "given": "Mariam"} +{"country": "CI", "family": "Fofana", "given": "Lassina"} +{"country": "CI", "family": "Gui", "given": "Davy"} +{"country": "CI", "family": "Dable", "given": "Loïc"} +{"country": "CI", "family": "Coulibaly", "given": "Adama"} +{"country": "CI", "family": "Dramé", "given": "Adama"} +{"country": "CI", "family": "Koné", "given": "Joël"} +{"country": "CI", "family": "Komara", "given": "Constance"} +{"country": "CI", "family": "Komara", "given": "Mariam"} +{"country": "CI", "family": "Tailly", "given": "Alain"} +{"country": "CI", "family": "Tailly", "given": "Félix"} +{"country": "CI", "family": "Tailly", "given": "Auguste"} +{"country": "CI", "family": "Cissé", "given": "Sekou"} +{"country": "CI", "family": "Troussier", "given": "Philippe"} +{"country": "CI", "family": "Manfredini", "given": "Christian"} +{"country": "CI", "family": "Coulibaly", "given": "Adam"} +{"country": "CI", "family": "Yeboah", "given": "Daniel"} +{"country": "CI", "family": "Ouattara", "given": "Dominique"} +{"country": "CI", "family": "Nebout", "given": "Christine"} +{"country": "CI", "family": "Boli", "given": "Basile"} +{"country": "CI", "family": "Domoraud", "given": "Cyril"} +{"country": "CI", "family": "Touré", "given": "Sekou"} +{"country": "CI", "family": "Kouadio", "given": "Serge"} +{"country": "CI", "family": "Agré", "given": "Bernard"} +{"country": "CI", "family": "Doué", "given": "Désiré"} +{"country": "CI", "family": "Fofana", "given": "Issiaka"} +{"country": "CI", "family": "Dosso", "given": "Alimata"} +{"country": "CI", "family": "Koné", "given": "Antoine"} +{"country": "CI", "family": "Angan", "given": "Didier"} +{"country": "CI", "family": "Traoré", "given": "Ali"} +{"country": "CI", "family": "Kutwa", "given": "Jean-Pierre"} +{"country": "CI", "family": "Domoraud", "given": "Wilfried"} +{"country": "CI", "family": "Boni", "given": "Suzanne"} +{"country": "CI", "family": "Boni", "given": "Tanella"} +{"country": "CI", "family": "Sissoko", "given": "Ibrahim"} +{"country": "CI", "family": "Guéï", "given": "Rose"} +{"country": "CI", "family": "Kouassi", "given": "Blaise"} +{"country": "CI", "family": "Kouakou", "given": "Bernard"} +{"country": "CI", "family": "Hountondji", "given": "Paulin"} +{"country": "CI", "family": "Zaha", "given": "Wilfried"} +{"country": "CI", "family": "Gradel", "given": "Max"} +{"country": "CI", "family": "Bakayoko", "given": "Ibrahima"} +{"country": "CI", "family": "Faé", "given": "Emerse"} +{"country": "CI", "family": "Yacé", "given": "Philippe"} +{"country": "CI", "family": "Koné", "given": "Ibrahima"} +{"country": "CI", "family": "Dadié", "given": "Bernard"} +{"country": "CI", "family": "Yago", "given": "Bernard"} +{"country": "CI", "family": "Abou", "given": "Samassi"} +{"country": "CI", "family": "Houon", "given": "Ange"} +{"country": "CI", "family": "Houon", "given": "Didier"} +{"country": "CI", "family": "Koffi", "given": "Alain"} +{"country": "CI", "family": "Konaté", "given": "Yacouba"} +{"country": "CI", "family": "Kouamé", "given": "Bruno"} +{"country": "CI", "family": "Coulibaly", "given": "Souleymane"} +{"country": "CI", "family": "Boni", "given": "Danièle"} +{"country": "CI", "family": "Touré", "given": "Ibrahim"} +{"country": "CI", "family": "Byars", "given": "Derrick"} +{"country": "CI", "family": "Hamidou", "given": "Stéphane"} +{"country": "CI", "family": "Boli", "given": "Yannick"} +{"country": "CI", "family": "Madou", "given": "Franck"} +{"country": "CI", "family": "Tébily", "given": "Olivier"} +{"country": "CI", "family": "Pokou", "given": "Laurent"} +{"country": "CI", "family": "Lattier", "given": "Christian"} +{"country": "CI", "family": "Sio", "given": "Giovanni"} +{"country": "CI", "family": "Kaya", "given": "Simone"} +{"country": "CI", "family": "Kale", "given": "Jonathan"} +{"country": "CI", "family": "Coulibaly", "given": "Ibrahim"} +{"country": "CI", "family": "Bessi", "given": "Ignace"} +{"country": "CI", "family": "N'Guessan", "given": "Ange"} +{"country": "CI", "family": "Koulibaly", "given": "Mamadou"} +{"country": "CI", "family": "Fofié", "given": "Kouakou"} +{"country": "CI", "family": "Fofié", "given": "Martin"} +{"country": "CI", "family": "Gueu", "given": "Michel"} +{"country": "CI", "family": "Angan", "given": "Davy"} +{"country": "CI", "family": "Angan", "given": "Claude"} +{"country": "CI", "family": "Goa", "given": "Boti"} +{"country": "CI", "family": "Koné", "given": "Lamine"} +{"country": "CI", "family": "Diallo", "given": "Hamed"} +{"country": "CI", "family": "Akpa Akpro", "given": "Jean-Louis"} +{"country": "CI", "family": "Ambrosino", "given": "Alain"} +{"country": "CI", "family": "Konaté", "given": "Ben"} +{"country": "CI", "family": "Thompson", "given": "Deon"} +{"country": "CI", "family": "Bakari", "given": "Oumar"} +{"country": "CI", "family": "Kouamé", "given": "Richard"} +{"country": "CI", "family": "Konaté", "given": "Tiémoko"} +{"country": "CI", "family": "Bamba", "given": "Youssoufou"} +{"country": "CI", "family": "Traoré", "given": "France"} +{"country": "CI", "family": "Nahi", "given": "Josée"} +{"country": "CI", "family": "Diabaté", "given": "Lassina"} +{"country": "CI", "family": "Perkins", "given": "Doron"} +{"country": "CI", "family": "Perkins", "given": "Marquis"} +{"country": "CI", "family": "Koutouan", "given": "Adrienne"} +{"country": "CI", "family": "Koutouan", "given": "Ako"} +{"country": "CI", "family": "Ouattara", "given": "Ahmed"} +{"country": "CI", "family": "Diomande", "given": "Aïchata"} +{"country": "CI", "family": "Delta", "given": "Akissi"} +{"country": "CI", "family": "Koutouan", "given": "Albertine"} +{"country": "CI", "family": "Bès", "given": "Alexandre"} +{"country": "CI", "family": "Allah", "given": "Alexis"} +{"country": "CI", "family": "Coulibaly", "given": "Ally"} +{"country": "CI", "family": "Koné", "given": "Amadou"} +{"country": "CI", "family": "Thiam", "given": "Amadou"} +{"country": "CI", "family": "Koffi", "given": "Amoin"} +{"country": "CI", "family": "Pierre", "given": "Amédée"} +{"country": "CI", "family": "Ouédraogo", "given": "Angèle"} +{"country": "CI", "family": "Konan", "given": "Antoine"} +{"country": "CI", "family": "Bahin", "given": "Aristide"} +{"country": "CI", "family": "Attingré", "given": "Armelle"} +{"country": "CI", "family": "Maïga", "given": "Awa"} +{"country": "CI", "family": "Koné", "given": "Aïcha"} +{"country": "CI", "family": "Traoré", "given": "Salif"} +{"country": "CI", "family": "Kouadio", "given": "Benjamin"} +{"country": "CI", "family": "Kabi", "given": "Boris"} +{"country": "CI", "family": "Touré", "given": "Brahima"} +{"country": "CI", "family": "Blé", "given": "Bruno"} +{"country": "CI", "family": "Diallo", "given": "Christelle"} +{"country": "CI", "family": "Dongo", "given": "Céline"} +{"country": "CI", "family": "Benoît", "given": "Dali"} +{"country": "CI", "family": "Thio", "given": "David"} +{"country": "CI", "family": "Singo", "given": "Suzanne"} +{"country": "CI", "family": "Solo", "given": "Diane"} +{"country": "CI", "family": "Otokoré", "given": "Didier"} +{"country": "CI", "family": "Abouet", "given": "Marguerite"} +{"country": "CI", "family": "Clément", "given": "Clément"} +{"country": "CI", "family": "Anet", "given": "Norbert"} +{"country": "CI", "family": "Koné", "given": "Sourou"} +{"country": "CI", "family": "Pango", "given": "Philippe"} +{"country": "CI", "family": "Coulibaly", "given": "Tiémoko"} +{"country": "CI", "family": "Sylla", "given": "Yaya"} +{"country": "CI", "family": "Kane", "given": "Aminata"} +{"country": "CI", "family": "Koné", "given": "Salif"} +{"country": "CI", "family": "Ourega", "given": "Marie-Jeanne"} +{"country": "CI", "family": "Gadji", "given": "Abraham"} +{"country": "CI", "family": "Adou", "given": "Jerome"} +{"country": "CI", "family": "Kouassi", "given": "Alphonsine"} +{"country": "CI", "family": "Ballo", "given": "Yacouba"} +{"country": "CI", "family": "Nassa", "given": "Axel"} +{"country": "CI", "family": "Koné", "given": "Bakari"} +{"country": "CI", "family": "Camara", "given": "Said"} +{"country": "CI", "family": "Cissé", "given": "Adam"} +{"country": "CI", "family": "Cissé", "given": "Ismael"} +{"country": "CI", "family": "Diabaté", "given": "Tidiane"} +{"country": "CI", "family": "Diabaté", "given": "Cheick"} +{"country": "CI", "family": "Guéï", "given": "Ange"} +{"country": "CI", "family": "Guéï", "given": "Fabien"} +{"country": "CI", "family": "Akpa Akpro", "given": "Jean-Guy"} +{"country": "CI", "family": "Diallo", "given": "Ami"} +{"country": "CI", "family": "Dubois", "given": "Juliana"} +{"country": "CI", "family": "Opéri", "given": "Christopher"} +{"country": "CI", "family": "Solet", "given": "Oumar"} +{"country": "CI", "family": "Aka", "given": "Véronique"} +{"country": "CI", "family": "Traorè", "given": "Hamed"} +{"country": "CI", "family": "Traorè", "given": "Junior"} +{"country": "CI", "family": "Koné", "given": "Bruno"} +{"country": "CI", "family": "Guel", "given": "Moussa"} +{"country": "CI", "family": "Esmel", "given": "Dylan"} +{"country": "CI", "family": "Konan", "given": "Axel"} +{"country": "CI", "family": "Kassi", "given": "Anicet"} +{"country": "CI", "family": "Gbane", "given": "Seydou"} +{"country": "CI", "family": "Ziketh", "given": "Karel"} +{"country": "CI", "family": "N'Guessan", "given": "Lucie"} +{"country": "CI", "family": "Sanogo", "given": "Siriki"} +{"country": "CI", "family": "Gboho", "given": "Ambroise"} +{"country": "CI", "family": "Sanogo", "given": "Sita"} +{"country": "CI", "family": "Gnakoya", "given": "Romeo"} +{"country": "CI", "family": "Gbane", "given": "Abdoulaye"} +{"country": "CI", "family": "Ouattara", "given": "Awa"} +{"country": "CI", "family": "Traoré", "given": "Aminata"} +{"country": "CI", "family": "Kouassi", "given": "Gabriella"} +{"country": "CI", "family": "Kouassi", "given": "Gabriela"} +{"country": "CI", "family": "Amon", "given": "Alexandra"} +{"country": "CI", "family": "Poé", "given": "Jean"} +{"country": "CI", "family": "Traoré", "given": "Souleymane"} +{"country": "CI", "family": "Konaté", "given": "Hillel"} +{"country": "CI", "family": "Bassori", "given": "Timité"} +{"country": "CI", "family": "Tiéhi", "given": "Christ"} +{"country": "CI", "family": "Kamaté", "given": "Fanta"} +{"country": "CI", "family": "Kamaté", "given": "Zara"} +{"country": "CI", "family": "Koutouan", "given": "Michaela"} +{"country": "CI", "family": "Martin", "given": "Swaady"} +{"country": "CI", "family": "Wondji", "given": "Christophe"} +{"country": "CI", "family": "Kone", "given": "Benjamin"} +{"country": "CI", "family": "Kouadio", "given": "Kwame"} +{"country": "CI", "family": "Kouadio", "given": "Antoine"} +{"country": "CI", "family": "Pepe", "given": "Didier"} +{"country": "CI", "family": "Fofana", "given": "Tiémoko"} +{"country": "CI", "family": "Essomba", "given": "Gérard"} +{"country": "CI", "family": "N'Zi", "given": "Olivier"} +{"country": "CI", "family": "Koffi", "given": "Jean-Christophe"} +{"country": "CI", "family": "Sanoko", "given": "Awa"} +{"country": "CI", "family": "Bahi", "given": "Claire"} +{"country": "CI", "family": "Kossounou", "given": "Odilon"} +{"country": "CI", "family": "Meité", "given": "Bakary"} +{"country": "CI", "family": "Ky", "given": "Laetitia"} +{"country": "CI", "family": "Tape", "given": "Ira"} +{"country": "CI", "family": "Tape", "given": "Eliezer"} +{"country": "CI", "family": "Koné", "given": "Zakaria"} +{"country": "CI", "family": "N'Guessan", "given": "Shella"} +{"country": "CI", "family": "N'Guessan", "given": "Allathin"} +{"country": "CI", "family": "N'Guessan", "given": "Atiwa"} +{"country": "CI", "family": "N'Guessan", "given": "Desy-Laurene"} +{"country": "CI", "family": "Balakrishnan", "given": "Chandresh"} +{"country": "CI", "family": "Balakrishnan", "given": "Kolleri"} +{"country": "CI", "family": "Pouté", "given": "Christian"} +{"country": "CI", "family": "Beda", "given": "Ernestine"} +{"country": "CI", "family": "Espoir", "given": "Ernestine"} +{"country": "CI", "family": "Saint-Blancat", "given": "Fabrice"} +{"country": "CI", "family": "Markouma", "given": "Chantal"} +{"country": "CI", "family": "Markouma", "given": "Fematou"} +{"country": "CI", "family": "Degbe", "given": "Sebastiano"} +{"country": "CI", "family": "Degbe", "given": "Gbenoukpo"} +{"country": "CI", "family": "Hien", "given": "Odette"} +{"country": "CI", "family": "Hien", "given": "Iri"} +{"country": "CI", "family": "Succar", "given": "Johanne"} +{"country": "CI", "family": "Saint-Blancat", "given": "Johanne"} +{"country": "CI", "family": "Kone", "given": "Karidjatou"} +{"country": "CI", "family": "Kouame", "given": "Stephane"} +{"country": "CI", "family": "Kouame", "given": "Koffi"} +{"country": "CI", "family": "Ahi", "given": "Armel"} +{"country": "CI", "family": "Eude", "given": "Armel"} +{"country": "CI", "family": "Ahi", "given": "Kouakou"} +{"country": "CI", "family": "Eude", "given": "Kouakou"} +{"country": "CI", "family": "Ahi", "given": "Franck"} +{"country": "CI", "family": "Eude", "given": "Franck"} +{"country": "CI", "family": "Kouakou", "given": "Richard"} +{"country": "CI", "family": "Kouakou", "given": "N'Da"} +{"country": "CI", "family": "Bakayoko", "given": "Josée"} +{"country": "CI", "family": "Bakayoko", "given": "Celine"} +{"country": "CI", "family": "Bakayoko", "given": "Nogona"} +{"country": "CI", "family": "Coulibaly", "given": "Salimata"} +{"country": "CI", "family": "Blé", "given": "Jeanine"} +{"country": "CI", "family": "Gboho", "given": "Yann"} +{"country": "CI", "family": "Ouattara", "given": "Ibrahim"} +{"country": "CI", "family": "Kouyaté", "given": "Mariama"} +{"country": "CI", "family": "Kouakou", "given": "Amandine"} +{"country": "CI", "family": "Amani", "given": "Hanna"} +{"country": "CI", "family": "Amani", "given": "Mabelle"} +{"country": "CI", "family": "Fofana", "given": "Minata"} +{"country": "CI", "family": "Berté", "given": "Salimata"} +{"country": "CI", "family": "Delafosse", "given": "Jean"} +{"country": "CI", "family": "Gbane", "given": "Fatou"} +{"country": "CI", "family": "Kouamé", "given": "Adjoua"} +{"country": "CI", "family": "Ouattara", "given": "Sita"} +{"country": "CI", "family": "Alex", "given": "Lionel"} +{"country": "CI", "family": "Alex", "given": "Lao"} +{"country": "CI", "family": "Thiam", "given": "Abd al-Karīm"} +{"country": "CI", "family": "Koné", "given": "Maboundou"} +{"country": "CI", "family": "Koné", "given": "Souleyman"} +{"country": "CI", "family": "Cissé", "given": "Souleymane"} +{"country": "CI", "family": "Kouassi", "given": "Marlène"} +{"country": "CI", "family": "Mobio", "given": "Joseph"} +{"country": "CI", "family": "Dadiet", "given": "Maxence"} +{"country": "CI", "family": "Raggi", "given": "Anne-Marie"} +{"country": "CI", "family": "Essy", "given": "Anne-Marie"} +{"country": "CI", "family": "Diawara", "given": "Adama"} +{"country": "CI", "family": "Camara", "given": "Badra"} +{"country": "CI", "family": "Zanne", "given": "Abdoul"} +{"country": "CI", "family": "Remarck", "given": "Françoise"} +{"country": "CI", "family": "Touré", "given": "Yusuf"} +{"country": "CI", "family": "N'Guessan", "given": "Micheline"} +{"country": "CI", "family": "Parfait", "given": "Yao"} +{"country": "CI", "family": "Diaby", "given": "Souleymane"} +{"country": "CI", "family": "Guy", "given": "Ange"} +{"country": "CI", "family": "Guy", "given": "Emmanuel"} +{"country": "CI", "family": "Traoré", "given": "Yssoufou"} +{"country": "CI", "family": "Savadogo", "given": "Mathias"} +{"country": "CI", "family": "Savadogo", "given": "Boukary"} +{"country": "CI", "family": "Gbai", "given": "Jessika"} +{"country": "CI", "family": "Kacou", "given": "Kwame"} +{"country": "CI", "family": "Kacou", "given": "Gilles"} +{"country": "CI", "family": "Kacou", "given": "Romuald"} +{"country": "CI", "family": "Bah", "given": "Tidiane"} +{"country": "CI", "family": "Kohou", "given": "Kader"} +{"country": "CI", "family": "Diarrassouba", "given": "Souleymane"} +{"country": "CI", "family": "Koné", "given": "Idriss"} +{"country": "CI", "family": "Beugré", "given": "Honoré"} +{"country": "CI", "family": "Ballo", "given": "Épiphane"} +{"country": "CI", "family": "Koné", "given": "Ismaël"} +{"country": "CI", "family": "Diomandé", "given": "Bourahima"} +{"country": "CI", "family": "Nahman", "given": "Nadia"} +{"country": "CI", "family": "Bolomba", "given": "Sékouba"} +{"country": "CI", "family": "Flinder", "given": "Albert"} +{"country": "CI", "family": "Touré", "given": "Gaoussou"} +{"country": "CI", "family": "Coulibaly", "given": "Amadou"} +{"country": "CI", "family": "Kipré", "given": "Stéphane"} +{"country": "CI", "family": "Fofana", "given": "Fatim"} +{"country": "CI", "family": "Koffi", "given": "Paul"} +{"country": "CI", "family": "Serey", "given": "Célestin"} +{"country": "CI", "family": "Traoré", "given": "Warren"} +{"country": "CI", "family": "Traoré", "given": "Steve"} +{"country": "CI", "family": "Keita", "given": "Emmanuelle"} +{"country": "CI", "family": "Roullard", "given": "Valérie"} +{"country": "CI", "family": "Roullard", "given": "Raymonde"} +{"country": "CI", "family": "Cissé", "given": "Mariama"} +{"country": "CI", "family": "Koffi", "given": "Olivier"} +{"country": "CI", "family": "Zunon", "given": "Christiane"} +{"country": "CI", "family": "Zunon", "given": "Justine"} +{"country": "CI", "family": "Zunon", "given": "Eunice"} +{"country": "CI", "family": "Bakayoko", "given": "Youssoufou"} +{"country": "CI", "family": "Lou", "given": "Niantié"} +{"country": "CI", "family": "Lou", "given": "Goley"} +{"country": "CI", "family": "Zeze", "given": "Nathan"} +{"country": "CI", "family": "Koné", "given": "Mariam"} +{"country": "CI", "family": "Sylla", "given": "Habib"} +{"country": "CI", "family": "Mathieu", "given": "Amani"} +{"country": "CI", "family": "Mathieu", "given": "Koffi"} +{"country": "CI", "family": "Camara", "given": "Chantal"} +{"country": "CI", "family": "Dadiet", "given": "Pacôme"} +{"country": "CI", "family": "Diomande", "given": "Ousmane"} +{"country": "CI", "family": "Konan", "given": "Aude"} +{"country": "CI", "family": "Miézan", "given": "Victorie"} +{"country": "CI", "family": "Koné", "given": "Drissa"} +{"country": "CI", "family": "Koné", "given": "Abdoul"} +{"country": "CI", "family": "Koné", "given": "Kialy"} +{"country": "CI", "family": "Kouamé", "given": "Sarah"} +{"country": "CI", "family": "Sylla", "given": "Alaman"} +{"country": "CI", "family": "Diarra", "given": "Lassina"} +{"country": "CI", "family": "Cissé", "given": "Djiguiba"} +{"country": "CI", "family": "Goore", "given": "Bastien"} +{"country": "CI", "family": "Goore", "given": "Junior"} +{"country": "CI", "family": "Zézé", "given": "Stanislas"} +{"country": "CI", "family": "Mahre", "given": "Mariam"} +{"country": "CI", "family": "Mahre", "given": "Adja"} +{"country": "CI", "family": "Touré", "given": "Ben"} +{"country": "CI", "family": "Touré", "given": "Hamed"} +{"country": "CI", "family": "Yobo", "given": "Constant"} +{"country": "CI", "family": "Kouassi", "given": "Jean-Claude"} +{"country": "CI", "family": "Dorgeles", "given": "Mario"} +{"country": "CI", "family": "Esteban", "given": "Maxine"} +{"country": "CI", "family": "Lebbe", "given": "Alexis"} +{"country": "CI", "family": "Koné", "given": "Ibrahim Khalil"} +{"country": "CI", "family": "Fofana", "given": "Amaral"} +{"country": "CI", "family": "Kean", "given": "Sylvain"} +{"country": "CI", "family": "Kakou", "given": "Hyacinthe"} +{"country": "CI", "family": "Dosso", "given": "Aminata"} +{"country": "CI", "family": "Kaiser", "given": "Molly"} +{"country": "CI", "family": "Ouattara", "given": "Florence"} +{"country": "CI", "family": "Touré", "given": "Habiba"} +{"country": "CI", "family": "N'Guessan", "given": "Jocelyne"} +{"country": "CI", "family": "Traoré", "given": "Mamadou"} +{"country": "CI", "family": "Traoré", "given": "Caroline"} +{"country": "CI", "family": "Boni", "given": "Germaine"} +{"country": "CI", "family": "Bamba", "given": "Mohamed"} +{"country": "CI", "family": "Foucault", "given": "Elliot"} +{"country": "CI", "family": "N'Da", "given": "Jacques"} +{"country": "CI", "family": "Konan", "given": "Sidonie"} +{"country": "CI", "family": "Yacé", "given": "Jean-Marc"} +{"country": "CI", "family": "Koffi", "given": "Daniel"} +{"country": "CI", "family": "Konan", "given": "Daniel"} +{"country": "CI", "family": "Koffi", "given": "Franck"} +{"country": "CI", "family": "Konan", "given": "Franck"} +{"country": "CI", "family": "Kouassi", "given": "Euphrasie"} +{"country": "CI", "family": "Yao", "given": "Euphrasie"} +{"country": "CI", "family": "Kouadio", "given": "Christ"} +{"country": "CI", "family": "Folly", "given": "Charle"} +{"country": "CI", "family": "Ayayi", "given": "Charle"} +{"country": "CI", "family": "Tiendrébéogo", "given": "Mahamoudou"} +{"country": "CI", "family": "Sidibé", "given": "Zai"} +{"country": "CI", "family": "Badey", "given": "Ange"} +{"country": "CI", "family": "Konan", "given": "Jacques"} +{"country": "CI", "family": "Fini", "given": "Seydou"} +{"country": "CI", "family": "Konaté", "given": "Ibrahim"} +{"country": "CI", "family": "Solet", "given": "Isaac"} +{"country": "CI", "family": "Bomawoko", "given": "Isaac"} +{"country": "CI", "family": "Solet", "given": "Sandor"} +{"country": "CI", "family": "Bomawoko", "given": "Sandor"} +{"country": "CI", "family": "Kouame", "given": "Axel"} +{"country": "CI", "family": "Atta", "given": "Florence"} +{"country": "CI", "family": "Koné", "given": "Florence"} +{"country": "CI", "family": "Traoré", "given": "Bakari"} +{"country": "CI", "family": "Kossonou", "given": "Noé"} +{"country": "CI", "family": "Kossonou", "given": "Moïse"} +{"country": "CI", "family": "Gbane", "given": "Ousmane"} +{"country": "CI", "family": "Diallo", "given": "Adams"} +{"country": "CI", "family": "Zinsou", "given": "Roger"} +{"country": "CI", "family": "Zinsou", "given": "Frédéric"} +{"country": "CI", "family": "Dembélé", "given": "Daouda"} +{"country": "CI", "family": "Kone", "given": "Yaya"} +{"country": "CI", "family": "Fofana", "given": "Mariam"} +{"country": "CI", "family": "Tolo", "given": "Grace"} +{"country": "CI", "family": "Huys", "given": "Nicolas"} +{"country": "CI", "family": "Bamba", "given": "Aminata"} +{"country": "CI", "family": "Condo", "given": "Juste"} +{"country": "CI", "family": "Diabaté", "given": "Mamadou"} +{"country": "CI", "family": "Cissé", "given": "Ibrahim"} +{"country": "CI", "family": "Dosso", "given": "Abou"} +{"country": "CI", "family": "Sidimé", "given": "Fatime"} +{"country": "CI", "family": "Kuny", "given": "Georges"} +{"country": "CI", "family": "Kouamé", "given": "Jean"} +{"country": "CI", "family": "Kouamé", "given": "Ezechiel"} +{"country": "CI", "family": "Kra", "given": "Marthe"} +{"country": "CI", "family": "Kra", "given": "Akissi"} +{"country": "CI", "family": "Kra", "given": "Bénédicte"} +{"country": "CI", "family": "Diakité", "given": "Ousmane"} +{"country": "CI", "family": "Sylla", "given": "Fatou"} +{"country": "CI", "family": "Fofana", "given": "Aboubacar"} +{"country": "CI", "family": "Yao", "given": "Koffi"} +{"country": "CI", "family": "Kouko", "given": "Judith"} +{"country": "CI", "family": "Lobé", "given": "Hélène"} +{"country": "CI", "family": "Boho", "given": "Meganne"} +{"country": "CI", "family": "Kouamé", "given": "Amie"} +{"country": "CI", "family": "Pango", "given": "Marie-Cécile"} +{"country": "CI", "family": "Marley", "given": "Siam"} +{"country": "CI", "family": "Kouame", "given": "Éric"} +{"country": "CI", "family": "Diamala", "given": "Marie-Emmanuelle"} +{"country": "CI", "family": "Danon", "given": "Charlène"} +{"country": "CI", "family": "Bakayoko", "given": "Siaka"} +{"country": "CI", "family": "Koné", "given": "Marie"} +{"country": "CI", "family": "Koné", "given": "Gabrielle"} +{"country": "CI", "family": "Donkor", "given": "Koffi"} +{"country": "CI", "family": "Zan", "given": "Daniel"} +{"country": "CI", "family": "Inao", "given": "Christ"} +{"country": "CI", "family": "Zena", "given": "Alisar"} +{"country": "CI", "family": "Camara", "given": "Ismael"} +{"country": "CI", "family": "Piccio", "given": "Ismael"} +{"country": "CI", "family": "Kebe", "given": "Mahamadou"} +{"country": "CI", "family": "Wawa", "given": "Ivan"} +{"country": "CI", "family": "Wawa", "given": "Alex"} +{"country": "CI", "family": "Wawa", "given": "Christ"} +{"country": "CI", "family": "Oka", "given": "Jean-Philippe"} +{"country": "CI", "family": "Diakite", "given": "Fatou"} +{"country": "CI", "family": "Traoré", "given": "Djakaridja"} +{"country": "CI", "family": "Koné", "given": "Olivier"} +{"country": "CI", "family": "Bamba", "given": "Ibrahim"} +{"country": "CI", "family": "Thompson", "given": "Mary"} +{"country": "CI", "family": "Hien", "given": "Philippe"} +{"country": "CI", "family": "Coulibaly", "given": "Noufou"} +{"country": "CI", "family": "Kouassi", "given": "Joachim"} +{"country": "CI", "family": "Kouassi", "given": "Kouassi"} +{"country": "CI", "family": "Alabi", "given": "Habib"} +{"country": "CI", "family": "Koffi", "given": "Amenan"} +{"country": "CI", "family": "Koffi", "given": "Rose"} +{"country": "CI", "family": "Achirou", "given": "Mohamed"} +{"country": "CI", "family": "Kouamé", "given": "Pascal"} +{"country": "CI", "family": "Kouamé", "given": "Kwame"} +{"country": "CI", "family": "Kouamé", "given": "Kouassi"} +{"country": "CI", "family": "Bamba", "given": "Jessica"} +{"country": "CI", "family": "Kouassi", "given": "Xavier"} +{"country": "CI", "family": "Amin", "given": "Manuela"} +{"country": "CI", "family": "Amin", "given": "Ariane"} +{"country": "CI", "family": "Kouamé", "given": "Désiré"} +{"country": "CI", "family": "Traoré", "given": "Namory"} +{"country": "CI", "family": "Koffi", "given": "Armand"} +{"country": "CI", "family": "Yao", "given": "Armand"} +{"country": "CI", "family": "Kouadio", "given": "Carine"} +{"country": "CI", "family": "Touré", "given": "Marième"} +{"country": "CI", "family": "Leibel", "given": "Aya"} +{"country": "CI", "family": "Traoré", "given": "Anna"} +{"country": "CI", "family": "Gueye", "given": "Tara"} +{"country": "CI", "family": "Kouadio", "given": "Marilyne"} +{"country": "CI", "family": "Beugré", "given": "Marie"} +{"country": "CI", "family": "Beugré", "given": "Christine"} +{"country": "CI", "family": "Yacé", "given": "Olivia"} +{"country": "CI", "family": "Sabeh", "given": "Nadiyah"} +{"country": "CI", "family": "Koné", "given": "Lacina"} +{"country": "CI", "family": "N'Da", "given": "Koffi"} +{"country": "CI", "family": "Coulibaly", "given": "Ali"} +{"country": "CI", "family": "Coulibaly", "given": "Kader"} +{"country": "CI", "family": "Kouakou", "given": "Marcellin"} +{"country": "CI", "family": "Kouakou", "given": "Dapa"} +{"country": "CI", "family": "Gole", "given": "Marcelin"} +{"country": "CI", "family": "Koné", "given": "Lassina"} +{"country": "CI", "family": "Kouakou", "given": "Pascal"} +{"country": "CI", "family": "Boni", "given": "Sarah"} +{"country": "CI", "family": "Traore", "given": "Aboubacar"} +{"country": "CI", "family": "N'Diaye", "given": "Pape"} +{"country": "CI", "family": "Kouassi", "given": "Laetitia"} +{"country": "CI", "family": "Atangana", "given": "Alain"} +{"country": "CI", "family": "Zoma", "given": "Anne"} +{"country": "CI", "family": "Lasme", "given": "Keren"} +{"country": "CI", "family": "Traoré", "given": "Karim"} +{"country": "CI", "family": "Traoré", "given": "Abdoul"} +{"country": "CI", "family": "Kouadio", "given": "Bernard"} +{"country": "CI", "family": "Koffi", "given": "Charles"} +{"country": "CI", "family": "Diomandé", "given": "Lassina"} +{"country": "CI", "family": "Diarrassouba", "given": "Soumaila"} +{"country": "CI", "family": "Kouassi", "given": "Koffi"} +{"country": "CI", "family": "Goli", "given": "Simon"} +{"country": "CI", "family": "Bakayoko", "given": "Adama"} +{"country": "CI", "family": "Kouassi", "given": "Paulin"} +{"country": "CI", "family": "Dion", "given": "Rémi"} +{"country": "CI", "family": "Eto'o", "given": "Georgette"} +{"country": "CI", "family": "Eto'o", "given": "Nicole"} +{"country": "CI", "family": "Koné", "given": "Marcel"} +{"country": "CI", "family": "Vilasco", "given": "Jacob"} +{"country": "CI", "family": "Singo", "given": "Wilfried"} +{"country": "CI", "family": "Goba", "given": "Jeanne"} +{"country": "CI", "family": "Touré", "given": "Ali"} +{"country": "CI", "family": "Touré", "given": "Mohamed"} +{"country": "CI", "family": "Touré", "given": "Cheick"} +{"country": "CI", "family": "Agbo", "given": "Espérance"} +{"country": "CI", "family": "Kone", "given": "Aboubacar"} +{"country": "CI", "family": "Ilboudo", "given": "Émile"} +{"country": "CI", "family": "Sidibé", "given": "Amadou"} +{"country": "CI", "family": "Bleu", "given": "Brigitte"} +{"country": "CI", "family": "Coffie", "given": "Raymonde"} +{"country": "CI", "family": "Goudou", "given": "Raymonde"} +{"country": "CI", "family": "Guiraud", "given": "Marie-Rose"} +{"country": "CI", "family": "Koné", "given": "Bernard"} +{"country": "CI", "family": "Dossongui", "given": "Bernard"} +{"country": "CI", "family": "Touré", "given": "Yacouba"} +{"country": "CI", "family": "Kouame", "given": "Edo"} +{"country": "CI", "family": "Bictogo", "given": "Adama"} +{"country": "CI", "family": "Touré", "given": "Aïcha"} +{"country": "CI", "family": "Touré", "given": "Gninin"} +{"country": "CI", "family": "Kouassi", "given": "Rosemonde"} +{"country": "CI", "family": "Tijani", "given": "Mohamed"} +{"country": "CI", "family": "N'dri", "given": "Aya"} +{"country": "CI", "family": "N'dri", "given": "Thérèse"} +{"country": "CI", "family": "Krasso", "given": "Jean-Philippe"} +{"country": "CI", "family": "Guiagon", "given": "Parfait"} +{"country": "CI", "family": "Bracchi", "given": "Rachelle"} +{"country": "CI", "family": "M'Bassidje", "given": "Anaïs"} +{"country": "CI", "family": "Konan", "given": "Inès"} +{"country": "CI", "family": "Guessand", "given": "Evann"} +{"country": "CI", "family": "Coulibaly", "given": "Yuri"} +{"country": "CI", "family": "Coulibaly", "given": "Stephane"} +{"country": "CI", "family": "Touré", "given": "Isaak"} +{"country": "CI", "family": "Touré", "given": "Souleymane"} +{"country": "CI", "family": "Kouassi", "given": "Germain"} +{"country": "CI", "family": "Dérou", "given": "Martial"} +{"country": "CI", "family": "Dérou", "given": "Toualy"} +{"country": "CI", "family": "Amon", "given": "Gérard"} +{"country": "CI", "family": "Koné", "given": "Yacouba"} +{"country": "CI", "family": "Ollo", "given": "Manuella"} +{"country": "CI", "family": "Brou", "given": "Marthe"} +{"country": "CI", "family": "Brou", "given": "Solange"} +{"country": "CI", "family": "Coulibaly", "given": "Adolphe"} +{"country": "CI", "family": "Fofana", "given": "Mike"} +{"country": "CI", "family": "Kouassi", "given": "Willy"} +{"country": "CI", "family": "Tape", "given": "Patrick"} +{"country": "CI", "family": "Cisse", "given": "Ousmane"} +{"country": "CI", "family": "Diomandé", "given": "Yaya"} +{"country": "CI", "family": "N'Zi", "given": "Modeste"} +{"country": "CI", "family": "Gbenoukpo", "given": "Étienne"} +{"country": "CI", "family": "Gbenoukpo", "given": "Etienne"} +{"country": "CI", "family": "Ehui", "given": "Simeon"} +{"country": "CI", "family": "Wahi", "given": "Elye"} +{"country": "CI", "family": "Diomande", "given": "Adama"} +{"country": "CI", "family": "Diabate", "given": "Ibrahim"} +{"country": "CI", "family": "Macalou", "given": "Issouf"} +{"country": "CI", "family": "Fofana", "given": "Yahia"} +{"country": "CI", "family": "Goua", "given": "Marc"} +{"country": "CI", "family": "Fofana", "given": "David"} +{"country": "CI", "family": "Zohouri", "given": "Armel"} +{"country": "CI", "family": "Monnet", "given": "Agnès"} +{"country": "CI", "family": "Edy", "given": "Jean"} +{"country": "CI", "family": "Edy", "given": "Jean-Emmanuel"} +{"country": "CI", "family": "Vendeix", "given": "Jean-Pierre"} +{"country": "CI", "family": "Kamara", "given": "Adama"} +{"country": "CI", "family": "Ouattara", "given": "Junior"} +{"country": "CI", "family": "Dao", "given": "Moussa"} +{"country": "CI", "family": "Koné", "given": "Souleymane"} +{"country": "CI", "family": "Bathily", "given": "Katherine"} +{"country": "CI", "family": "Fofana", "given": "Sylvie"} +{"country": "CI", "family": "Toungara", "given": "Amy"} +{"country": "CI", "family": "Coffie", "given": "Léopoldine"} +{"country": "CI", "family": "Keïta", "given": "Kader"} +{"country": "CI", "family": "Kouadio", "given": "Marcel"} +{"country": "CI", "family": "Athanase", "given": "Kwame"} +{"country": "CI", "family": "Athanase", "given": "Koffi"} +{"country": "CI", "family": "Adingra", "given": "Simon"} +{"country": "CI", "family": "Konaté", "given": "Karim"} +{"country": "CI", "family": "Kouadio", "given": "Lionel"} +{"country": "CI", "family": "Kouassi", "given": "Brice"} +{"country": "CI", "family": "Koffi", "given": "Philippe"} +{"country": "CI", "family": "Nyamsi", "given": "Franklin"} +{"country": "CI", "family": "Sanon", "given": "Valentin"} +{"country": "CI", "family": "Touré", "given": "Saliou"} +{"country": "CI", "family": "Bilé", "given": "Serge"} +{"country": "CI", "family": "Kassi", "given": "Serge"} +{"country": "CI", "family": "Bamba", "given": "Sekou"} +{"country": "CI", "family": "Mel Eg", "given": "Théodore"} +{"country": "CI", "family": "Taba", "given": "Thérèse"} +{"country": "CI", "family": "Koffi", "given": "Tiburce"} +{"country": "CI", "family": "Dem", "given": "Tidiane"} +{"country": "CI", "family": "Boda", "given": "Victor"} +{"country": "CI", "family": "Gboko", "given": "Victorine"} +{"country": "CI", "family": "Yao", "given": "Vital"} +{"country": "CI", "family": "Kroupi", "given": "Élie"} +{"country": "CI", "family": "Droubry", "given": "Éliane"} +{"country": "CI", "family": "Diarra", "given": "Abdoulaye"} +{"country": "CI", "family": "Kader", "given": "Barry"} +{"country": "CI", "family": "Koné", "given": "Ibrahim"} +{"country": "CI", "family": "Beugré", "given": "Kevin"} +{"country": "CI", "family": "Koné", "given": "Mamadou"} +{"country": "CI", "family": "Koné", "given": "Moussa"} +{"country": "CI", "family": "Kouamé", "given": "Flore"} +{"country": "CI", "family": "Poythress", "given": "Alex"} +{"country": "CI", "family": "Monney", "given": "Arnaud"} +{"country": "CI", "family": "Oka", "given": "Arsène"} +{"country": "CI", "family": "Touré", "given": "Assita"} +{"country": "CI", "family": "Touré", "given": "Aya"} +{"country": "CI", "family": "Ali", "given": "Diarra"} +{"country": "CI", "family": "Tape", "given": "Éric"} +{"country": "CI", "family": "Boli", "given": "Franck"} +{"country": "CI", "family": "Arkhurst", "given": "Gregory"} +{"country": "CI", "family": "Koné", "given": "Hamed"} +{"country": "CI", "family": "Koffi", "given": "Francis"} +{"country": "CI", "family": "Keita", "given": "Ibrahim"} +{"country": "CI", "family": "Keita", "given": "Ibrahima"} +{"country": "CI", "family": "Kipré", "given": "Jean-Martial"} +{"country": "CI", "family": "Anis", "given": "Jean-Yves"} +{"country": "CI", "family": "Seri", "given": "Jean"} +{"country": "CI", "family": "Kodjia", "given": "Jonathan"} +{"country": "CI", "family": "Drogba", "given": "Joël"} +{"country": "CI", "family": "Kassi", "given": "Luc"} +{"country": "CI", "family": "Bah", "given": "Mariam"} +{"country": "CI", "family": "Moreau", "given": "Mathilde"} +{"country": "CI", "family": "Koné", "given": "Mory"} +{"country": "CI", "family": "Wawa", "given": "Serge"} +{"country": "CI", "family": "Kamara", "given": "France"} +{"country": "CI", "family": "Ouattara", "given": "Alima"} +{"country": "CI", "family": "Obou", "given": "Delmas"} +{"country": "CI", "family": "Touzet", "given": "Franck"} +{"country": "CI", "family": "Assi", "given": "Laurent"} +{"country": "CI", "family": "Kourouma", "given": "Lamine"} +{"country": "CI", "family": "Gnanduillet", "given": "Armand"} +{"country": "CI", "family": "Griffiths", "given": "Georges"} +{"country": "CI", "family": "Guidy", "given": "Joséphine"} +{"country": "CI", "family": "Wandja", "given": "Joséphine"} +{"country": "CI", "family": "Gbamin", "given": "Jean-Philippe"} +{"country": "CI", "family": "Cornet", "given": "Maxwel"} +{"country": "CI", "family": "Lasme", "given": "Michel"} +{"country": "CI", "family": "Diakité", "given": "Binta"} +{"country": "CI", "family": "Coulibaly", "given": "Fatoumata"} +{"country": "CI", "family": "Saki", "given": "Lydie"} +{"country": "CI", "family": "Sanogo", "given": "Mariam"} +{"country": "CI", "family": "Koffi", "given": "Nadège"} +{"country": "CI", "family": "N'Guessan", "given": "Nadège"} +{"country": "CI", "family": "Lobognon", "given": "Alain"} +{"country": "CI", "family": "Acka", "given": "Stephane"} +{"country": "CI", "family": "Diakite", "given": "Adama"} +{"country": "CI", "family": "Dansoko", "given": "Mamadou"} +{"country": "CI", "family": "Koné", "given": "Adama"} +{"country": "CI", "family": "Saeed", "given": "Juma"} +{"country": "CI", "family": "Traoré", "given": "Brahima"} +{"country": "CI", "family": "Konaté", "given": "Abd al-Rahman"} +{"country": "CI", "family": "Bosson", "given": "Annie"} +{"country": "CI", "family": "Diaby", "given": "Bintou"} +{"country": "CI", "family": "Kouadio", "given": "Solange"} +{"country": "CI", "family": "Kouame", "given": "Julie"} +{"country": "CI", "family": "Keita", "given": "Safiatou"} +{"country": "CI", "family": "Ollo", "given": "Honorine"} +{"country": "CI", "family": "Sidibe", "given": "Fatim"} +{"country": "CI", "family": "Diaz", "given": "Michel"} +{"country": "CI", "family": "Diaz", "given": "Junior"} +{"country": "CI", "family": "Touré", "given": "Angèle"} +{"country": "CI", "family": "Touré", "given": "Marie"} +{"country": "CI", "family": "Aka", "given": "Marie-Ange"} +{"country": "CI", "family": "Adjo", "given": "Marie-Ange"} +{"country": "CI", "family": "Adebayo", "given": "Marya"} +{"country": "CI", "family": "Traoré", "given": "Adjaratou"} +{"country": "CI", "family": "Yale", "given": "Olivia"} +{"country": "CI", "family": "Diomandé", "given": "Ibrahim"} +{"country": "CI", "family": "Karamoko", "given": "Souleymane"} +{"country": "CI", "family": "Kakou", "given": "Emmanuel"} +{"country": "CI", "family": "Koné", "given": "Ambroise"} +{"country": "CI", "family": "Koné", "given": "Samba"} +{"country": "CI", "family": "Ngosso", "given": "Soli"} +{"country": "CI", "family": "Kouadio", "given": "Ange"} +{"country": "CI", "family": "Kouadio", "given": "Eddy"} +{"country": "CI", "family": "Kouadio", "given": "Bienvenu"} +{"country": "CI", "family": "Ajayi", "given": "Junior"} +{"country": "CI", "family": "Valerie", "given": "Grace"} +{"country": "CI", "family": "Bosso", "given": "Armand"} +{"country": "CI", "family": "Bosso", "given": "Paul-Joseph"} +{"country": "CI", "family": "Guéhi", "given": "Eve"} +{"country": "CI", "family": "Ouattara", "given": "Mahama"} +{"country": "CI", "family": "Bakayoko", "given": "Abdul Rahim"} +{"country": "CI", "family": "Harouna", "given": "Abdoul"} +{"country": "CI", "family": "Bancé", "given": "Zeinab"} +{"country": "CI", "family": "Ouattara", "given": "Lacina"} +{"country": "CI", "family": "Beugré", "given": "Valérie"} +{"country": "CI", "family": "Kaboré", "given": "Victoire"} +{"country": "CI", "family": "Kaboré", "given": "Moïse"} +{"country": "CI", "family": "Kaboré", "given": "Elohim"} +{"country": "CI", "family": "Bomou", "given": "Mamadou"} +{"country": "CI", "family": "Gondo", "given": "Marie-Odile"} +{"country": "CI", "family": "Akakpo", "given": "Fortuné"} +{"country": "ET", "family": "Nega", "given": "Berhanu"} +{"country": "ET", "family": "Assefa", "given": "Astrid"} +{"country": "ET", "family": "Engelbrektsson", "given": "Astrid"} +{"country": "ET", "family": "Assefa", "given": "Margaretha"} +{"country": "ET", "family": "Engelbrektsson", "given": "Margaretha"} +{"country": "ET", "family": "Monica", "given": "Dadi"} +{"country": "ET", "family": "Imam", "given": "Ferid"} +{"country": "ET", "family": "Pellegrini", "given": "Gaetano"} +{"country": "ET", "family": "Gebregiorgis", "given": "Genet"} +{"country": "ET", "family": "Tsegay", "given": "Genet"} +{"country": "ET", "family": "Negash", "given": "Habte"} +{"country": "ET", "family": "Fekadu", "given": "Hibret"} +{"country": "ET", "family": "Abebe", "given": "Mihret"} +{"country": "ET", "family": "Assefa", "given": "Samuel"} +{"country": "ET", "family": "Yirga", "given": "Samuel"} +{"country": "ET", "family": "Gizaw", "given": "Sara"} +{"country": "ET", "family": "Bekele", "given": "Sophia"} +{"country": "ET", "family": "Desta", "given": "Sophia"} +{"country": "ET", "family": "Getahun", "given": "Yodit"} +{"country": "ET", "family": "Gebreslase", "given": "Gotytom"} +{"country": "ET", "family": "Castagna", "given": "Sebastiano"} +{"country": "ET", "family": "Legesse", "given": "Meskerem"} +{"country": "ET", "family": "Mekonnen", "given": "Tsegaye"} +{"country": "ET", "family": "Alemu", "given": "Bethlehem"} +{"country": "ET", "family": "Birru", "given": "Tadesse"} +{"country": "ET", "family": "Isaac", "given": "Ephraim"} +{"country": "ET", "family": "Yilma", "given": "Sophia"} +{"country": "ET", "family": "Gebregiorgis", "given": "Tadesse"} +{"country": "ET", "family": "Legesse", "given": "Addisu"} +{"country": "ET", "family": "Mamo", "given": "Aster"} +{"country": "ET", "family": "Amare", "given": "Shewarge"} +{"country": "ET", "family": "Alene", "given": "Shewarge"} +{"country": "ET", "family": "Gudeta", "given": "Netsanet"} +{"country": "ET", "family": "Tufa", "given": "Tigist"} +{"country": "ET", "family": "Girmay", "given": "Dagmawit"} +{"country": "ET", "family": "Berhane", "given": "Dagmawit"} +{"country": "ET", "family": "Ruach", "given": "Tut"} +{"country": "ET", "family": "Crippa", "given": "Yemaneberhan"} +{"country": "ET", "family": "Gidey", "given": "Letesenbet"} +{"country": "ET", "family": "Gebrehiwot", "given": "Lemma"} +{"country": "ET", "family": "Hussein", "given": "Redwan"} +{"country": "ET", "family": "Molla", "given": "Getaneh"} +{"country": "ET", "family": "Assefa", "given": "Tigist"} +{"country": "ET", "family": "Shankule", "given": "Amane"} +{"country": "ET", "family": "Abera", "given": "Tesfaye"} +{"country": "ET", "family": "Getachew", "given": "Firehiwot"} +{"country": "ET", "family": "Getachew", "given": "Asnake"} +{"country": "ET", "family": "Sahilu", "given": "Asnake"} +{"country": "ET", "family": "Tola", "given": "Helen"} +{"country": "ET", "family": "Bekele", "given": "Helen"} +{"country": "ET", "family": "Abraham", "given": "Emmanuel"} +{"country": "ET", "family": "Tura", "given": "Yerusksew"} +{"country": "ET", "family": "Tura", "given": "Legssey"} +{"country": "ET", "family": "Gebrelu", "given": "Mekonen"} +{"country": "ET", "family": "Seid", "given": "Asrar"} +{"country": "ET", "family": "Yakob", "given": "Ayelech"} +{"country": "ET", "family": "Davis", "given": "Adrian"} +{"country": "ET", "family": "Davis", "given": "Wayne"} +{"country": "ET", "family": "Fikadu", "given": "Dawit"} +{"country": "ET", "family": "Gezahegn", "given": "Addis"} +{"country": "ET", "family": "Hussein", "given": "'Abd al-Majid"} +{"country": "ET", "family": "Gakuru", "given": "David"} +{"country": "ET", "family": "Reuss", "given": "Frederick"} +{"country": "ET", "family": "Melaku", "given": "Tsehay"} +{"country": "ET", "family": "Shiferaw", "given": "Emebet"} +{"country": "ET", "family": "Yilma", "given": "Aklilu"} +{"country": "ET", "family": "Mayer", "given": "Jakub"} +{"country": "ET", "family": "Mar", "given": "Jakub"} +{"country": "ET", "family": "Mayer", "given": "Jacob"} +{"country": "ET", "family": "Mar", "given": "Jacob"} +{"country": "ET", "family": "Bekele", "given": "Daniel"} +{"country": "ET", "family": "Skretteberg", "given": "Daniel"} +{"country": "ET", "family": "Tadesse", "given": "Tesfaye"} +{"country": "ET", "family": "Birhane", "given": "Abeba"} +{"country": "ET", "family": "Abebe", "given": "Nathan"} +{"country": "ET", "family": "Gizaw", "given": "Meskerem"} +{"country": "ET", "family": "Lemma", "given": "Meskerem"} +{"country": "ET", "family": "Girma", "given": "Tigist"} +{"country": "ET", "family": "Zeleke", "given": "Samuel"} +{"country": "ET", "family": "Mesele", "given": "Worknesh"} +{"country": "ET", "family": "Dawit", "given": "Nathan"} +{"country": "ET", "family": "Desta", "given": "Netsanet"} +{"country": "ET", "family": "Teka", "given": "Genet"} +{"country": "ET", "family": "Elmi", "given": "Hibo"} +{"country": "ET", "family": "Dawit", "given": "Tamara"} +{"country": "ET", "family": "Dawit", "given": "Mariam"} +{"country": "ET", "family": "Debebe", "given": "Mignot"} +{"country": "ET", "family": "Kebede", "given": "Kassy"} +{"country": "ET", "family": "Meakins", "given": "Caleb"} +{"country": "ET", "family": "Duguma", "given": "Tsige"} +{"country": "ET", "family": "Rogora", "given": "Kiya"} +{"country": "ET", "family": "Almayew", "given": "Sembo"} +{"country": "ET", "family": "Berhe", "given": "Hagos"} +{"country": "ET", "family": "Abera", "given": "Meskerem"} +{"country": "ET", "family": "Ibrahim", "given": "Harun"} +{"country": "ET", "family": "Araya", "given": "Rebecca"} +{"country": "ET", "family": "Alemayehu", "given": "Samuel"} +{"country": "ET", "family": "Awad", "given": "Mohamed"} +{"country": "ET", "family": "Eisa", "given": "Medina"} +{"country": "ET", "family": "Haylom", "given": "Birke"} +{"country": "ET", "family": "Neguse", "given": "Gebre"} +{"country": "ET", "family": "Girma", "given": "Taye"} +{"country": "ET", "family": "Mohammed", "given": "Meaza"} +{"country": "ET", "family": "Hajiso", "given": "Abebayehu"} +{"country": "ET", "family": "Getachew", "given": "Tsegaye"} +{"country": "ET", "family": "Kiros", "given": "Tigist"} +{"country": "ET", "family": "Abera", "given": "Hawi"} +{"country": "ET", "family": "Jérôme", "given": "Abba"} +{"country": "ET", "family": "Melaku", "given": "M."} +{"country": "ET", "family": "Melaku", "given": "Tsedale"} +{"country": "ET", "family": "Lykke", "given": "Anna"} +{"country": "ET", "family": "Oehlenschlæger", "given": "Anna"} +{"country": "ET", "family": "Lykke", "given": "Saba"} +{"country": "ET", "family": "Oehlenschlæger", "given": "Saba"} +{"country": "ET", "family": "Farah", "given": "Adam"} +{"country": "ET", "family": "Menker", "given": "Sarah"} +{"country": "ET", "family": "Esa", "given": "Mohamed"} +{"country": "ET", "family": "Ayana", "given": "Tigist"} +{"country": "ET", "family": "Girma", "given": "Yohannes"} +{"country": "ET", "family": "Gebremeskel", "given": "Dejan"} +{"country": "ET", "family": "Assefa", "given": "Sofia"} +{"country": "ET", "family": "Böhm", "given": "Karlheinz"} +{"country": "ET", "family": "Kebede", "given": "Liya"} +{"country": "ET", "family": "Mahammed", "given": "Ali"} +{"country": "ET", "family": "Ejeta", "given": "Gebisa"} +{"country": "ET", "family": "Atta", "given": "Waleed"} +{"country": "ET", "family": "Sahle", "given": "Maryam"} +{"country": "ET", "family": "Gigi", "given": "Asha"} +{"country": "ET", "family": "Gregorius", "given": "Abba"} +{"country": "ET", "family": "Dawit", "given": "Abdullah"} +{"country": "ET", "family": "Wolde", "given": "Mamo"} +{"country": "ET", "family": "Mezgebu", "given": "Ayele"} +{"country": "ET", "family": "Bekele", "given": "Bizunesh"} +{"country": "ET", "family": "Gobena", "given": "Amane"} +{"country": "ET", "family": "Seid", "given": "Amane"} +{"country": "ET", "family": "Diro", "given": "Etenesh"} +{"country": "ET", "family": "Kuma", "given": "Eyerusalem"} +{"country": "ET", "family": "Gemechu", "given": "Shitaye"} +{"country": "ET", "family": "Alemu", "given": "Deriba"} +{"country": "ET", "family": "Yohannes", "given": "Tereza"} +{"country": "ET", "family": "Aman", "given": "Leila"} +{"country": "ET", "family": "Alemu", "given": "Elfenesh"} +{"country": "ET", "family": "Mezgebu", "given": "Assefa"} +{"country": "ET", "family": "Mohr", "given": "Benedetto"} +{"country": "ET", "family": "Kedir", "given": "Muhammad"} +{"country": "ET", "family": "Kedir", "given": "Mohamed"} +{"country": "ET", "family": "Benti", "given": "Tafari"} +{"country": "ET", "family": "Aregawi", "given": "Abeba"} +{"country": "ET", "family": "Ibrahim", "given": "Fuad"} +{"country": "ET", "family": "Kebede", "given": "Asrat"} +{"country": "ET", "family": "Souraphiel", "given": "Berhaneyesus"} +{"country": "ET", "family": "Souraphiel", "given": "Demerew"} +{"country": "ET", "family": "Tola", "given": "Tesfaye"} +{"country": "ET", "family": "Boghossian", "given": "Alexander"} +{"country": "ET", "family": "Aman", "given": "Muhammad"} +{"country": "ET", "family": "Alemu", "given": "Dagne"} +{"country": "ET", "family": "Abera", "given": "Daniel"} +{"country": "ET", "family": "Zegeye", "given": "Daniel"} +{"country": "ET", "family": "Dibaba", "given": "Mare"} +{"country": "ET", "family": "Melaku", "given": "Elfenesh"} +{"country": "ET", "family": "Saïd", "given": "Salah ad-Din"} +{"country": "ET", "family": "Tola", "given": "Fate"} +{"country": "ET", "family": "Sado", "given": "Fatuma"} +{"country": "ET", "family": "Belayneh", "given": "Tadesse"} +{"country": "ET", "family": "Molla", "given": "Solomon"} +{"country": "ET", "family": "Vassalo", "given": "Luciano"} +{"country": "ET", "family": "Germina", "given": "Haile"} +{"country": "ET", "family": "Bogale", "given": "Yona"} +{"country": "ET", "family": "Ayana", "given": "Almaz"} +{"country": "ET", "family": "Mamo", "given": "Esti"} +{"country": "ET", "family": "Vassalo", "given": "Italo"} +{"country": "ET", "family": "Sadat", "given": "Jamal"} +{"country": "ET", "family": "Megersa", "given": "Lemma"} +{"country": "ET", "family": "Assefa", "given": "Mengistu"} +{"country": "ET", "family": "Belete", "given": "Mimi"} +{"country": "ET", "family": "Nalbandian", "given": "Nerses"} +{"country": "ET", "family": "Grmay", "given": "Tsgabu"} +{"country": "ET", "family": "Ghermandi", "given": "Gabriella"} +{"country": "ET", "family": "Sefir", "given": "Dino"} +{"country": "ET", "family": "Kejeta", "given": "Melat"} +{"country": "ET", "family": "Wale", "given": "Getnet"} +{"country": "ET", "family": "Ebrahim", "given": "Redwan"} +{"country": "ET", "family": "Gebremariam", "given": "Fiseha"} +{"country": "ET", "family": "Jewett", "given": "Lidya"} +{"country": "ET", "family": "Dereje", "given": "Roza"} +{"country": "ET", "family": "Tasama", "given": "Faisa"} +{"country": "ET", "family": "Melese", "given": "Mahlet"} +{"country": "ET", "family": "Menker", "given": "Sara"} +{"country": "ET", "family": "Tadesse", "given": "Solomon"} +{"country": "ET", "family": "Kaïtéris", "given": "Konjit"} +{"country": "ET", "family": "Welteji", "given": "Diribe"} +{"country": "ET", "family": "Taye", "given": "Ejgayehu"} +{"country": "ET", "family": "Alemu", "given": "Dawit"} +{"country": "ET", "family": "Tadesse", "given": "Lia"} +{"country": "ET", "family": "Wadler", "given": "Naomi"} +{"country": "ET", "family": "Cherinet", "given": "Loulou"} +{"country": "ET", "family": "Kiros", "given": "Judith"} +{"country": "ET", "family": "Abdulahi", "given": "Idrus"} +{"country": "ET", "family": "Kahsai", "given": "Sammy"} +{"country": "ET", "family": "Meshesha", "given": "Hirut"} +{"country": "ET", "family": "Haile", "given": "Tilahun"} +{"country": "ET", "family": "Ketema", "given": "Tigist"} +{"country": "ET", "family": "Yehualaw", "given": "Yalemzerf"} +{"country": "ET", "family": "Tadesse", "given": "Bizunesh"} +{"country": "ET", "family": "Belcher", "given": "Laura"} +{"country": "ET", "family": "Belcher", "given": "Wendy"} +{"country": "ET", "family": "Goshu", "given": "Yohannes"} +{"country": "ET", "family": "Bekele", "given": "Heman"} +{"country": "ET", "family": "Alemayehu", "given": "Tsehay"} +{"country": "ET", "family": "Goshu", "given": "Solomon"} +{"country": "ET", "family": "Deguara", "given": "Samira"} +{"country": "ET", "family": "Kiros", "given": "Tsige"} +{"country": "ET", "family": "Alemayo", "given": "Tekle"} +{"country": "ET", "family": "Woldemariam", "given": "Petros"} +{"country": "ET", "family": "Seyoum", "given": "Nahom"} +{"country": "ET", "family": "Descloux", "given": "Bertrand"} +{"country": "ET", "family": "Habtamu", "given": "Daniel"} +{"country": "ET", "family": "Hussein", "given": "Ibrahim"} +{"country": "ET", "family": "Bekele", "given": "Sahelislassie"} +{"country": "ET", "family": "Hadgu", "given": "Kiros"} +{"country": "ET", "family": "Yohannes", "given": "Ephrem"} +{"country": "ET", "family": "Debay", "given": "Filimon"} +{"country": "ET", "family": "Zerabruk", "given": "Filimon"} +{"country": "ET", "family": "Tilahun", "given": "Emebet"} +{"country": "ET", "family": "Tsehaye", "given": "Saida"} +{"country": "ZW", "family": "Mugabe", "given": "Gabriel"} +{"country": "ZW", "family": "Mugabe", "given": "Robert"} +{"country": "ZW", "family": "Love", "given": "John"} +{"country": "ZW", "family": "Tingle", "given": "Sam"} +{"country": "ZW", "family": "Black", "given": "Cara"} +{"country": "ZW", "family": "Coventry", "given": "Kirsty"} +{"country": "ZW", "family": "Chiweshe", "given": "Stella"} +{"country": "ZW", "family": "Smith", "given": "Douglas"} +{"country": "ZW", "family": "Smith", "given": "Ian"} +{"country": "ZW", "family": "Muzorewa", "given": "Abel"} +{"country": "ZW", "family": "Mwaruwari", "given": "Benjani"} +{"country": "ZW", "family": "Ullyett", "given": "Kevin"} +{"country": "ZW", "family": "Ullyett", "given": "Robert"} +{"country": "ZW", "family": "Nasrallah", "given": "Emily"} +{"country": "ZW", "family": "Gono", "given": "Gideon"} +{"country": "ZW", "family": "Mtawarira", "given": "Tendai"} +{"country": "ZW", "family": "Todd", "given": "Garfield"} +{"country": "ZW", "family": "Grobbelaar", "given": "Bruce"} +{"country": "ZW", "family": "Mugabe", "given": "Grace"} +{"country": "ZW", "family": "Nkomo", "given": "Joshua"} +{"country": "ZW", "family": "Mnangagwa", "given": "Emmerson"} +{"country": "ZW", "family": "Black", "given": "Wayne"} +{"country": "ZW", "family": "Black", "given": "Hamilton"} +{"country": "ZW", "family": "Banda", "given": "Lewis"} +{"country": "ZW", "family": "Davies", "given": "Patricia"} +{"country": "ZW", "family": "Cowley", "given": "Gillian"} +{"country": "ZW", "family": "Brown", "given": "Andy"} +{"country": "ZW", "family": "Mukoko", "given": "Jestina"} +{"country": "ZW", "family": "Davy", "given": "Yvonne"} +{"country": "ZW", "family": "Davy", "given": "Chelsy"} +{"country": "ZW", "family": "Ndlovu", "given": "Robert"} +{"country": "ZW", "family": "Black", "given": "Hamish"} +{"country": "ZW", "family": "Black", "given": "Byron"} +{"country": "ZW", "family": "Walshaw", "given": "Glen"} +{"country": "ZW", "family": "Price", "given": "Nick"} +{"country": "ZW", "family": "Jones", "given": "Timothy"} +{"country": "ZW", "family": "Gurira", "given": "Danai"} +{"country": "ZW", "family": "Gurira", "given": "Jekesai"} +{"country": "ZW", "family": "Zengeni", "given": "Brian"} +{"country": "ZW", "family": "Ngwenya", "given": "Joseph"} +{"country": "ZW", "family": "Denton", "given": "David"} +{"country": "ZW", "family": "Dickinson", "given": "Peter"} +{"country": "ZW", "family": "Chiwawa", "given": "Edward"} +{"country": "ZW", "family": "Rautenbach", "given": "Conrad"} +{"country": "ZW", "family": "Nyanhongo", "given": "Agnes"} +{"country": "ZW", "family": "Choto", "given": "Dickson"} +{"country": "ZW", "family": "Tekere", "given": "Edgar"} +{"country": "ZW", "family": "Mtukudzi", "given": "Oliver"} +{"country": "ZW", "family": "Ncube", "given": "Pius"} +{"country": "ZW", "family": "Hove", "given": "Chenjerai"} +{"country": "ZW", "family": "Ndlovu", "given": "Adam"} +{"country": "ZW", "family": "Conway", "given": "Mohamed"} +{"country": "ZW", "family": "Martin", "given": "Dave"} +{"country": "ZW", "family": "Hayes", "given": "Dean"} +{"country": "ZW", "family": "Maraire", "given": "Abraham"} +{"country": "ZW", "family": "Maraire", "given": "Dumisani"} +{"country": "ZW", "family": "McNulty", "given": "Mark"} +{"country": "ZW", "family": "Stewart", "given": "Evan"} +{"country": "ZW", "family": "Msika", "given": "Joseph"} +{"country": "ZW", "family": "Muchabaiwa", "given": "Alexio"} +{"country": "ZW", "family": "Chihuri", "given": "Kennedy"} +{"country": "ZW", "family": "Chitepo", "given": "Herbert"} +{"country": "ZW", "family": "Reed", "given": "Ray"} +{"country": "ZW", "family": "Dube", "given": "Jefta"} +{"country": "ZW", "family": "Wood", "given": "Kevin"} +{"country": "ZW", "family": "Garvey", "given": "Adrian"} +{"country": "ZW", "family": "Teichmann", "given": "Gary"} +{"country": "ZW", "family": "Pearce", "given": "Mick"} +{"country": "ZW", "family": "Mercer", "given": "Robert"} +{"country": "ZW", "family": "Mugabe", "given": "Sabina"} +{"country": "ZW", "family": "Phiri", "given": "Virginia"} +{"country": "ZW", "family": "Bryant", "given": "Alan"} +{"country": "ZW", "family": "Pocock", "given": "David"} +{"country": "ZW", "family": "Bennett", "given": "Roy"} +{"country": "ZW", "family": "Ziegler", "given": "Garth"} +{"country": "ZW", "family": "McCallum", "given": "Ian"} +{"country": "ZW", "family": "Whyte", "given": "James"} +{"country": "ZW", "family": "Moyo", "given": "Jonathan"} +{"country": "ZW", "family": "Harnden", "given": "Ken"} +{"country": "ZW", "family": "Basto", "given": "Luis"} +{"country": "ZW", "family": "Mapeza", "given": "Norman"} +{"country": "ZW", "family": "Godwin", "given": "Peter"} +{"country": "ZW", "family": "Dixon", "given": "Pieter"} +{"country": "ZW", "family": "Gray", "given": "Scott"} +{"country": "ZW", "family": "Chick", "given": "Sandra"} +{"country": "ZW", "family": "Kob", "given": "Tetiana"} +{"country": "ZW", "family": "Wishart", "given": "Craig"} +{"country": "ZW", "family": "Strang", "given": "Paul"} +{"country": "ZW", "family": "Whittall", "given": "Guy"} +{"country": "ZW", "family": "Ireland", "given": "Anthony"} +{"country": "ZW", "family": "Rennie", "given": "Gavin"} +{"country": "ZW", "family": "Waller", "given": "Andy"} +{"country": "ZW", "family": "Vermeulen", "given": "Mark"} +{"country": "ZW", "family": "Flower", "given": "Grant"} +{"country": "ZW", "family": "Brent", "given": "Gary"} +{"country": "ZW", "family": "Arnott", "given": "Kevin"} +{"country": "ZW", "family": "Campbell", "given": "Alistair"} +{"country": "ZW", "family": "Williams", "given": "Sean"} +{"country": "ZW", "family": "Rainsford", "given": "Ed"} +{"country": "ZW", "family": "Moyo", "given": "Alois"} +{"country": "ZW", "family": "Murray", "given": "Barbara"} +{"country": "ZW", "family": "Charles", "given": "Henry"} +{"country": "ZW", "family": "Williams", "given": "Maggie"} +{"country": "ZW", "family": "Nkomo", "given": "Peter"} +{"country": "ZW", "family": "Takawira", "given": "Vitalis"} +{"country": "ZW", "family": "Wachi", "given": "Albert"} +{"country": "ZW", "family": "Govere", "given": "Alexandra"} +{"country": "ZW", "family": "Savory", "given": "Allan"} +{"country": "ZW", "family": "Edwards", "given": "Alton"} +{"country": "ZW", "family": "Grant", "given": "Gwynne"} +{"country": "ZW", "family": "Grant", "given": "Ann-Mary"} +{"country": "ZW", "family": "McClintock", "given": "Anne"} +{"country": "ZW", "family": "Fata", "given": "Arthur"} +{"country": "ZW", "family": "Rogers", "given": "Barney"} +{"country": "ZW", "family": "Mtetwa", "given": "Beatrice"} +{"country": "ZW", "family": "Freeth", "given": "Ben"} +{"country": "ZW", "family": "Makoni", "given": "Betty"} +{"country": "ZW", "family": "Conway", "given": "Bevil"} +{"country": "ZW", "family": "Mteki", "given": "Boira"} +{"country": "ZW", "family": "Pritchard", "given": "Bradley"} +{"country": "ZW", "family": "Phillips", "given": "Brenda"} +{"country": "ZW", "family": "Dawson", "given": "Brendon"} +{"country": "ZW", "family": "Galloway", "given": "Brendan"} +{"country": "ZW", "family": "Clark", "given": "Brian"} +{"country": "ZW", "family": "Davison", "given": "Brian"} +{"country": "ZW", "family": "Murphy", "given": "Brian"} +{"country": "ZW", "family": "Beale", "given": "Bruce"} +{"country": "ZW", "family": "Gray", "given": "Carole"} +{"country": "ZW", "family": "Buckle", "given": "Catherine"} +{"country": "ZW", "family": "Mukavhi", "given": "Celestino"} +{"country": "ZW", "family": "Lock", "given": "Charlie"} +{"country": "ZW", "family": "Chung", "given": "Chipo"} +{"country": "ZW", "family": "Prinsloo", "given": "Christine"} +{"country": "ZW", "family": "Mpofu", "given": "Christopher"} +{"country": "ZW", "family": "Seager", "given": "Christopher"} +{"country": "ZW", "family": "Evans", "given": "Craig"} +{"country": "ZW", "family": "Hondo", "given": "Daniel"} +{"country": "ZW", "family": "Matambanadzo", "given": "Darlington"} +{"country": "ZW", "family": "Weber", "given": "Darren"} +{"country": "ZW", "family": "Ewers", "given": "Dave"} +{"country": "ZW", "family": "Beach", "given": "David"} +{"country": "ZW", "family": "Lewis", "given": "David"} +{"country": "ZW", "family": "Mercer", "given": "David"} +{"country": "ZW", "family": "Norman", "given": "Denis"} +{"country": "ZW", "family": "Walker", "given": "Denis"} +{"country": "ZW", "family": "Watson", "given": "Denis"} +{"country": "ZW", "family": "Ebrahim", "given": "Dion"} +{"country": "ZW", "family": "Viljoen", "given": "Dirk"} +{"country": "ZW", "family": "Armand", "given": "Don"} +{"country": "ZW", "family": "Campbell", "given": "Donald"} +{"country": "ZW", "family": "Marillier", "given": "Dougie"} +{"country": "ZW", "family": "Hondo", "given": "Douglas"} +{"country": "ZW", "family": "Rogers", "given": "Douglas"} +{"country": "ZW", "family": "Cross", "given": "Eddie"} +{"country": "ZW", "family": "Kasinauyo", "given": "Edzai"} +{"country": "ZW", "family": "Hill", "given": "Elana"} +{"country": "ZW", "family": "Chase", "given": "Elizabeth"} +{"country": "ZW", "family": "Nkala", "given": "Enos"} +{"country": "ZW", "family": "Moyo", "given": "Eric"} +{"country": "ZW", "family": "Matambanadzo", "given": "Everton"} +{"country": "ZW", "family": "Crocker", "given": "Gary"} +{"country": "ZW", "family": "Martin", "given": "Gary"} +{"country": "ZW", "family": "Briant", "given": "Gavin"} +{"country": "ZW", "family": "Ewing", "given": "Gavin"} +{"country": "ZW", "family": "Nene", "given": "George"} +{"country": "ZW", "family": "Banda", "given": "Gilbert"} +{"country": "ZW", "family": "Goosen", "given": "Glenn"} +{"country": "ZW", "family": "Edwards", "given": "Graham"} +{"country": "ZW", "family": "Paterson", "given": "Grant"} +{"country": "ZW", "family": "Lamb", "given": "Greg"} +{"country": "ZW", "family": "Strydom", "given": "Gregory"} +{"country": "ZW", "family": "Mackay", "given": "Gus"} +{"country": "ZW", "family": "McKop", "given": "Henry"} +{"country": "ZW", "family": "Dick", "given": "Herbert"} +{"country": "ZW", "family": "Mariga", "given": "Joram"} +{"country": "ZW", "family": "McIntosh", "given": "Ian"} +{"country": "ZW", "family": "Sithole", "given": "Godfrey"} +{"country": "ZW", "family": "Cameron", "given": "James"} +{"country": "ZW", "family": "Fraser-Mackenzie", "given": "James"} +{"country": "ZW", "family": "Fraser-Mackenzie", "given": "Jamie"} +{"country": "ZW", "family": "Majome", "given": "Jessie"} +{"country": "ZW", "family": "McPhun", "given": "John"} +{"country": "ZW", "family": "McPhun", "given": "David"} +{"country": "ZW", "family": "Kabwe", "given": "Joseph"} +{"country": "ZW", "family": "Made", "given": "Joseph"} +{"country": "ZW", "family": "Todd", "given": "Judith"} +{"country": "ZW", "family": "Barbour", "given": "Kevan"} +{"country": "ZW", "family": "Mambo", "given": "Kevin"} +{"country": "ZW", "family": "Dembo", "given": "Leonard"} +{"country": "ZW", "family": "Leach", "given": "Charles"} +{"country": "ZW", "family": "Leach", "given": "Leslie"} +{"country": "ZW", "family": "Fahy", "given": "Liam"} +{"country": "ZW", "family": "Watson", "given": "Linda"} +{"country": "ZW", "family": "Jarvis", "given": "Malcolm"} +{"country": "ZW", "family": "Waller", "given": "Malcolm"} +{"country": "ZW", "family": "Leach", "given": "Mandy"} +{"country": "ZW", "family": "Smith", "given": "Mark"} +{"country": "ZW", "family": "Kanda", "given": "Mathias"} +{"country": "ZW", "family": "Rusike", "given": "Matthew"} +{"country": "ZW", "family": "George", "given": "Maureen"} +{"country": "ZW", "family": "Robertson", "given": "Sonia"} +{"country": "ZW", "family": "Goodwin", "given": "Murray"} +{"country": "ZW", "family": "Waller", "given": "Nathan"} +{"country": "ZW", "family": "Ferreira", "given": "Neil"} +{"country": "ZW", "family": "Goche", "given": "Nicholas"} +{"country": "ZW", "family": "Dorward", "given": "Nigel"} +{"country": "ZW", "family": "Lourenco", "given": "Orlando"} +{"country": "ZW", "family": "McKillop", "given": "Patricia"} +{"country": "ZW", "family": "Jones", "given": "Peter"} +{"country": "ZW", "family": "Gumbo", "given": "Rahman"} +{"country": "ZW", "family": "Price", "given": "Ray"} +{"country": "ZW", "family": "Hudson", "given": "Richard"} +{"country": "ZW", "family": "Sims", "given": "Richard"} +{"country": "ZW", "family": "Tredgold", "given": "Robert"} +{"country": "ZW", "family": "Tredgold", "given": "Clarkson"} +{"country": "ZW", "family": "Ullyett", "given": "Bassett"} +{"country": "ZW", "family": "Gifford", "given": "Robin"} +{"country": "ZW", "family": "Reid-Daly", "given": "Francis"} +{"country": "ZW", "family": "Reid-Daly", "given": "Ronald"} +{"country": "ZW", "family": "Higgins", "given": "Ryan"} +{"country": "ZW", "family": "James", "given": "Sandra"} +{"country": "ZW", "family": "Davies", "given": "Sean"} +{"country": "ZW", "family": "Holland", "given": "Sekai"} +{"country": "ZW", "family": "Cloete", "given": "Shane"} +{"country": "ZW", "family": "Carlisle", "given": "Stuart"} +{"country": "ZW", "family": "Walker", "given": "Stuart"} +{"country": "ZW", "family": "Tsatsa", "given": "Tabitha"} +{"country": "ZW", "family": "Cox", "given": "Tony"} +{"country": "ZW", "family": "Friend", "given": "Travis"} +{"country": "ZW", "family": "Ncube", "given": "Trevor"} +{"country": "ZW", "family": "Stevenson", "given": "Trudy"} +{"country": "ZW", "family": "Carne", "given": "Warren"} +{"country": "ZW", "family": "James", "given": "Wayne"} +{"country": "ZW", "family": "Visser", "given": "Wayne"} +{"country": "ZW", "family": "English", "given": "Sarah"} +{"country": "ZW", "family": "Ndlovu", "given": "Bekithemba"} +{"country": "ZW", "family": "Mhlauri", "given": "Charles"} +{"country": "ZW", "family": "Muzadzi", "given": "Gift"} +{"country": "ZW", "family": "Dekker", "given": "Mark"} +{"country": "ZW", "family": "Hitz", "given": "Jason"} +{"country": "ZW", "family": "Kennedy", "given": "Godfrey"} +{"country": "ZW", "family": "Bissett", "given": "Cecil"} +{"country": "ZW", "family": "Shamuyarira", "given": "Norbert"} +{"country": "ZW", "family": "Lamprecht", "given": "Johannes"} +{"country": "ZW", "family": "Richards", "given": "John"} +{"country": "ZW", "family": "Meyer", "given": "Paul"} +{"country": "ZW", "family": "Harnden", "given": "Iain"} +{"country": "ZW", "family": "Mukwesha", "given": "Virginia"} +{"country": "ZW", "family": "Sibanda", "given": "Precious"} +{"country": "ZW", "family": "Ismail", "given": "Haroon"} +{"country": "ZW", "family": "Brand", "given": "Heather"} +{"country": "ZW", "family": "N'gum", "given": "Annie"} +{"country": "ZW", "family": "N'gum", "given": "Aminatta"} +{"country": "ZW", "family": "Conway", "given": "Sean"} +{"country": "ZW", "family": "Matkovich", "given": "Peter"} +{"country": "ZW", "family": "Steyn", "given": "Luke"} +{"country": "ZW", "family": "Pelham", "given": "Aviva"} +{"country": "ZW", "family": "Walsh", "given": "Norman"} +{"country": "ZW", "family": "Campbell", "given": "Mike"} +{"country": "ZW", "family": "Coventry", "given": "Charles"} +{"country": "ZW", "family": "Moyo", "given": "Mavis"} +{"country": "ZW", "family": "Robinson", "given": "Ian"} +{"country": "ZW", "family": "Allen", "given": "Adrian"} +{"country": "ZW", "family": "Donaldson", "given": "Kim"} +{"country": "ZW", "family": "Dongo", "given": "Margaret"} +{"country": "ZW", "family": "Williams", "given": "Jenni"} +{"country": "ZW", "family": "Graham", "given": "Anthony"} +{"country": "ZW", "family": "Masarira", "given": "Linda"} +{"country": "ZW", "family": "Cole", "given": "John"} +{"country": "ZW", "family": "Crocker", "given": "Sean"} +{"country": "ZW", "family": "Vincent", "given": "Scott"} +{"country": "ZW", "family": "Wermter", "given": "Oskar"} +{"country": "ZW", "family": "Morgan", "given": "Peter"} +{"country": "ZW", "family": "Landman", "given": "Nate"} +{"country": "ZW", "family": "Simpson", "given": "Georgina"} +{"country": "ZW", "family": "Lombard", "given": "Shelagh"} +{"country": "ZW", "family": "Francis", "given": "Grace"} +{"country": "ZW", "family": "Hewlett", "given": "Mireille"} +{"country": "ZW", "family": "Chibaya", "given": "Calson"} +{"country": "ZW", "family": "Rugare", "given": "Calson"} +{"country": "ZW", "family": "Gwena", "given": "Faith"} +{"country": "ZW", "family": "Mabuku", "given": "Melusi"} +{"country": "ZW", "family": "Kativhu", "given": "Paul"} +{"country": "ZW", "family": "Makusha", "given": "Precious"} +{"country": "ZW", "family": "Chinguwa", "given": "Prince"} +{"country": "ZW", "family": "Alfonso", "given": "Raffick"} +{"country": "ZW", "family": "Chikwanha", "given": "Sharon"} +{"country": "ZW", "family": "Khan", "given": "Farhaan"} +{"country": "ZW", "family": "van der Westhuizen", "given": "Paige"} +{"country": "ZW", "family": "Armstrong", "given": "Peter"} +{"country": "ZW", "family": "Dean", "given": "Howard"} +{"country": "ZW", "family": "Kureya", "given": "Samantha"} +{"country": "ZW", "family": "Faulds", "given": "James"} +{"country": "ZW", "family": "Faulds", "given": "Frederick"} +{"country": "ZW", "family": "Faulds", "given": "Beverly"} +{"country": "ZW", "family": "Moodie", "given": "Teresa"} +{"country": "ZW", "family": "Plunket", "given": "Rory"} +{"country": "ZW", "family": "Plunket", "given": "Patrick"} +{"country": "ZW", "family": "Hawkins", "given": "Roger"} +{"country": "ZW", "family": "Tiffin", "given": "Nicki"} +{"country": "ZW", "family": "Gutu", "given": "Timothy"} +{"country": "ZW", "family": "Wolhuter", "given": "Allan"} +{"country": "ZW", "family": "Wolhuter", "given": "Steven"} +{"country": "ZW", "family": "Cole", "given": "Jeremy"} +{"country": "ZW", "family": "Mabiza", "given": "Virginia"} +{"country": "ZW", "family": "McGown", "given": "Rhoderick"} +{"country": "ZW", "family": "Murphy", "given": "Sarah"} +{"country": "ZW", "family": "Smith", "given": "Lesley"} +{"country": "ZW", "family": "Staunton", "given": "Irene"} +{"country": "ZW", "family": "Makamba", "given": "Zororo"} +{"country": "ZW", "family": "Watson", "given": "Nicola"} +{"country": "ZW", "family": "Loveday", "given": "Martin"} +{"country": "ZW", "family": "Kasu", "given": "Tonderai"} +{"country": "ZW", "family": "Davis", "given": "Liam"} +{"country": "ZW", "family": "Hewlett", "given": "Peter"} +{"country": "ZW", "family": "Smith", "given": "David"} +{"country": "ZW", "family": "Chiketa", "given": "Stephen"} +{"country": "ZW", "family": "Chiketa", "given": "Cletus"} +{"country": "ZW", "family": "Mapimbiro", "given": "Charmaine"} +{"country": "ZW", "family": "Bateman", "given": "Anisha"} +{"country": "ZW", "family": "Mungoshi", "given": "David"} +{"country": "ZW", "family": "Lasker", "given": "Daniel"} +{"country": "ZW", "family": "Chirisa", "given": "Innocent"} +{"country": "ZW", "family": "Saunder", "given": "Deirdre"} +{"country": "ZW", "family": "Doorman", "given": "Lorna"} +{"country": "ZW", "family": "Moyo", "given": "Tamy"} +{"country": "ZW", "family": "Phiri", "given": "Saul"} +{"country": "ZW", "family": "Barlow", "given": "Mary"} +{"country": "ZW", "family": "Dell", "given": "Nicola"} +{"country": "ZW", "family": "Maguranyanga", "given": "Thabani"} +{"country": "ZW", "family": "Houghton", "given": "John"} +{"country": "ZW", "family": "Masoja", "given": "Olivia"} +{"country": "ZW", "family": "Khumalo", "given": "Gugulethu"} +{"country": "ZW", "family": "Tate", "given": "Melissa"} +{"country": "ZW", "family": "Muir", "given": "Julia"} +{"country": "ZW", "family": "Dyck", "given": "Lionel"} +{"country": "ZW", "family": "Mpofu", "given": "Bekithemba"} +{"country": "ZW", "family": "Commerford", "given": "Shaun"} +{"country": "ZW", "family": "Scott", "given": "Stephen"} +{"country": "ZW", "family": "Katai", "given": "Donata"} +{"country": "ZW", "family": "Richter", "given": "Samantha"} +{"country": "ZW", "family": "Ferris", "given": "Timothy"} +{"country": "ZW", "family": "Fraser", "given": "Moira"} +{"country": "ZW", "family": "Lapham", "given": "Kirsten"} +{"country": "ZW", "family": "Chitando", "given": "Ezra"} +{"country": "ZW", "family": "Rennie", "given": "Tarryn"} +{"country": "ZW", "family": "Horn", "given": "Nicole"} +{"country": "ZW", "family": "Welch", "given": "Samantha"} +{"country": "ZW", "family": "Fabisch", "given": "Jonah"} +{"country": "ZW", "family": "Payne", "given": "Arnold"} +{"country": "ZW", "family": "Horstmann", "given": "Kai"} +{"country": "ZW", "family": "Rowland", "given": "Daniel"} +{"country": "ZW", "family": "Price", "given": "Calum"} +{"country": "ZW", "family": "Ncube", "given": "Milton"} +{"country": "ZW", "family": "Lang", "given": "Kingsley"} +{"country": "ZW", "family": "Cooke", "given": "Keegan"} +{"country": "ZW", "family": "Maphosa", "given": "Norman"} +{"country": "ZW", "family": "McGorian", "given": "Elizabeth"} +{"country": "ZW", "family": "Williams", "given": "Mike"} +{"country": "ZW", "family": "Evans", "given": "Graeme"} +{"country": "ZW", "family": "Fenwick", "given": "Jeff"} +{"country": "ZW", "family": "Fleming", "given": "Nigel"} +{"country": "ZW", "family": "Middleton", "given": "Liam"} +{"country": "ZW", "family": "Ritson", "given": "Phil"} +{"country": "ZW", "family": "Strang", "given": "Ronald"} +{"country": "ZW", "family": "Makamba", "given": "James"} +{"country": "ZW", "family": "Nakamba", "given": "Marvelous"} +{"country": "ZW", "family": "Irvine", "given": "Hank"} +{"country": "ZW", "family": "Bloch", "given": "Erich"} +{"country": "ZW", "family": "Levy", "given": "Sam"} +{"country": "ZW", "family": "Williamson", "given": "Graham"} +{"country": "ZW", "family": "Moor", "given": "Peter"} +{"country": "ZW", "family": "Whitby", "given": "Conrad"} +{"country": "ZW", "family": "Brown", "given": "Gordon"} +{"country": "ZW", "family": "Hove", "given": "Tinashe"} +{"country": "ZW", "family": "Mbamba", "given": "Christopher"} +{"country": "ZW", "family": "Ball", "given": "John"} +{"country": "ZW", "family": "Ball", "given": "Stanhope"} +{"country": "ZW", "family": "Manyuchi", "given": "Charles"} +{"country": "ZW", "family": "Lock", "given": "Benjamin"} +{"country": "ZW", "family": "Gillow", "given": "David"} +{"country": "ZW", "family": "McBeath", "given": "Michael"} +{"country": "ZW", "family": "Lovemore", "given": "Frances"} +{"country": "ZW", "family": "Chikoko", "given": "Vitalis"} +{"country": "ZW", "family": "Tsumba", "given": "Tatenda"} +{"country": "ZW", "family": "Maturure", "given": "Tatenda"} +{"country": "ZW", "family": "Sutherland", "given": "Gavin"} +{"country": "ZW", "family": "Negri", "given": "Sebastian"} +{"country": "ZW", "family": "Negri", "given": "Luke"} +{"country": "ZW", "family": "Phiri", "given": "Christopher"} +{"country": "ZW", "family": "Silundika", "given": "George"} +{"country": "ZW", "family": "Cumming", "given": "Meg"} +{"country": "ZW", "family": "Stevenson", "given": "Roy"} +{"country": "ZW", "family": "Stevenson", "given": "Hew"} +{"country": "ZW", "family": "Stevenson", "given": "Russel"} +{"country": "ZW", "family": "Lazarus", "given": "Tommy"} +{"country": "ZW", "family": "Mitchell", "given": "Diana"} +{"country": "ZW", "family": "Engelbrecht", "given": "Ian"} +{"country": "ZW", "family": "Moyo", "given": "Sipho"} +{"country": "ZW", "family": "Robertson", "given": "Colin"} +{"country": "ZW", "family": "Cox", "given": "Christopher"} +{"country": "ZW", "family": "Chinyahara", "given": "Tanaka"} +{"country": "ZW", "family": "Ndoro", "given": "Tendai"} +{"country": "ZW", "family": "Nyamayaro", "given": "Elizabeth"} +{"country": "ZW", "family": "Le Roux", "given": "Paul"} +{"country": "ZW", "family": "Gilmour", "given": "Andrew"} +{"country": "ZW", "family": "Robinson", "given": "Bradley"} +{"country": "ZW", "family": "Mama", "given": "Marco"} +{"country": "ZW", "family": "Page", "given": "Regé-Jean"} +{"country": "ZW", "family": "Mandy", "given": "Gary"} +{"country": "ZW", "family": "Carter", "given": "Ivan"} +{"country": "ZW", "family": "Mupunga", "given": "Tatenda"} +{"country": "ZW", "family": "Gunn", "given": "Sean"} +{"country": "ZW", "family": "Snyman", "given": "Colin"} +{"country": "ZW", "family": "Snyman", "given": "Eli"} +{"country": "ZW", "family": "Colahan", "given": "Liam"} +{"country": "ZW", "family": "Burger", "given": "Danie"} +{"country": "ZW", "family": "Banda", "given": "George"} +{"country": "ZW", "family": "Kruger", "given": "Camilla"} +{"country": "ZW", "family": "Barrett", "given": "Glen"} +{"country": "ZW", "family": "Chipurura", "given": "Moses"} +{"country": "ZW", "family": "Mdege", "given": "Lawrence"} +{"country": "ZW", "family": "Matsanura", "given": "Audrey"} +{"country": "ZW", "family": "Matsanura", "given": "Olga"} +{"country": "ZW", "family": "Panganai", "given": "Kudzai"} +{"country": "ZW", "family": "Kambarani", "given": "Munashe"} +{"country": "ZW", "family": "Alronso", "given": "Willard"} +{"country": "ZW", "family": "Verma", "given": "Rishi"} +{"country": "ZW", "family": "Donaghy", "given": "Trish"} +{"country": "ZW", "family": "Malan", "given": "Gerrit"} +{"country": "ZW", "family": "Richmond", "given": "Peter"} +{"country": "ZW", "family": "Revans", "given": "Peter"} +{"country": "ZW", "family": "Peebles", "given": "Andrew"} +{"country": "ZW", "family": "Sinclair", "given": "Ingrid"} +{"country": "ZW", "family": "Van Breda", "given": "Kevin"} +{"country": "ZW", "family": "Ravizzotti", "given": "Mirko"} +{"country": "ZW", "family": "Wood", "given": "Jenny"} +{"country": "ZW", "family": "Divine", "given": "Divine"} +{"country": "ZW", "family": "Ndiweni", "given": "Mimi"} +{"country": "ZW", "family": "Verma", "given": "Ajit"} +{"country": "ZW", "family": "Saunders", "given": "Dave"} +{"country": "ZW", "family": "Murray", "given": "Ryan"} +{"country": "ZW", "family": "Colahan", "given": "Ryan"} +{"country": "ZW", "family": "Lewis", "given": "Justin"} +{"country": "ZW", "family": "Macmillan", "given": "Campbell"} +{"country": "ZW", "family": "Hoffman", "given": "Andre"} +{"country": "ZW", "family": "Neethling", "given": "Andre"} +{"country": "ZW", "family": "King", "given": "Ryan"} +{"country": "ZW", "family": "Landau", "given": "John"} +{"country": "ZW", "family": "Taylor", "given": "Alec"} +{"country": "ZW", "family": "Stone", "given": "Andrew"} +{"country": "ZW", "family": "Young", "given": "Jason"} +{"country": "ZW", "family": "Durham", "given": "Andrew"} +{"country": "ZW", "family": "Hill", "given": "Debbie"} +{"country": "ZW", "family": "Jackson", "given": "Bill"} +{"country": "ZW", "family": "Bradley", "given": "Alan"} +{"country": "ZW", "family": "Mkuruva", "given": "Tatenda"} +{"country": "ZW", "family": "Donovan", "given": "Bernard"} +{"country": "ZW", "family": "Garden", "given": "Roy"} +{"country": "ZW", "family": "Sibanda", "given": "Desire"} +{"country": "ZW", "family": "Turner", "given": "Ronnie"} +{"country": "ZW", "family": "Mutapi", "given": "Francisca"} +{"country": "ZW", "family": "Goodwin", "given": "Darrell"} +{"country": "ZW", "family": "Murphy", "given": "Kevin"} +{"country": "ZW", "family": "Mitchell", "given": "Paul"} +{"country": "ZW", "family": "Marillier", "given": "Stephan"} +{"country": "ZW", "family": "Thompson", "given": "Graham"} +{"country": "ZW", "family": "Smith", "given": "Vaughan"} +{"country": "ZW", "family": "Nakai", "given": "Nadia"} +{"country": "ZW", "family": "Hunter", "given": "Linda"} +{"country": "ZW", "family": "Bekker", "given": "Linda"} +{"country": "ZW", "family": "Bekker", "given": "Gail"} +{"country": "ZW", "family": "Mlambo", "given": "Sibongile"} +{"country": "ZW", "family": "Bruce", "given": "James"} +{"country": "ZW", "family": "King", "given": "Gary"} +{"country": "ZW", "family": "Lee", "given": "Robyn"} +{"country": "ZW", "family": "Wetzlar", "given": "Peter"} +{"country": "ZW", "family": "Nydam", "given": "Tristan"} +{"country": "ZW", "family": "Lawson", "given": "James"} +{"country": "ZW", "family": "Campbell", "given": "Johnathan"} +{"country": "ZW", "family": "Bamford", "given": "Marion"} +{"country": "ZW", "family": "Iversen", "given": "Paula"} +{"country": "ZW", "family": "Dube", "given": "Ndaba"} +{"country": "ZW", "family": "Fulton", "given": "William"} +{"country": "ZW", "family": "McNally", "given": "Nicholas"} +{"country": "ZW", "family": "Muskwe", "given": "Admiral"} +{"country": "ZW", "family": "Mupa", "given": "Raymond"} +{"country": "ZW", "family": "Sharp", "given": "Cathy"} +{"country": "ZW", "family": "Davies", "given": "Nicola"} +{"country": "ZW", "family": "Williams", "given": "Collin"} +{"country": "ZW", "family": "Gibson", "given": "Margaret"} +{"country": "ZW", "family": "White", "given": "Susanne"} +{"country": "ZW", "family": "Standish", "given": "Susanne"} +{"country": "ZW", "family": "Chimbaira", "given": "Kudzai"} +{"country": "ZW", "family": "Davis", "given": "Jessica"} +{"country": "ZW", "family": "Garnett", "given": "Michelle"} +{"country": "ZW", "family": "McKillop", "given": "Michael"} +{"country": "ZW", "family": "Kachingwe", "given": "Sarah"} +{"country": "ZW", "family": "Gibson", "given": "Mavis"} +{"country": "ZW", "family": "Williams", "given": "Matthew"} +{"country": "ZW", "family": "Moyo", "given": "Cliff"} +{"country": "ZW", "family": "Barson", "given": "Maxwell"} +{"country": "ZW", "family": "Matambanadzo", "given": "Isabella"} +{"country": "ZW", "family": "Jenje", "given": "Joyce"} +{"country": "ZW", "family": "Makwenda", "given": "Joyce"} +{"country": "ZW", "family": "Burton", "given": "Stephanie"} +{"country": "ZW", "family": "Evans", "given": "Brad"} +{"country": "ZW", "family": "Curran", "given": "Kevin"} +{"country": "ZW", "family": "Warren", "given": "Debbie"} +{"country": "ZW", "family": "Harvey", "given": "Lauren"} +{"country": "ZW", "family": "Ndebele", "given": "Sandra"} +{"country": "ZW", "family": "Guvava", "given": "Antonia"} +{"country": "ZW", "family": "Antonio", "given": "Bill"} +{"country": "ZW", "family": "Antonio", "given": "Leeroy"} +{"country": "ZW", "family": "Mukuba", "given": "Andrew"} +{"country": "ZW", "family": "Mathe", "given": "Thabani"} +{"country": "ZW", "family": "Garananga", "given": "Peter"} +{"country": "ZW", "family": "Garananga", "given": "Munashe"} +{"country": "ZW", "family": "Mpofu", "given": "Paul"} +{"country": "ZW", "family": "Moyo", "given": "Ashleigh"} +{"country": "ZW", "family": "Ncube", "given": "Monica"} +{"country": "ZW", "family": "Scott", "given": "Susan"} +{"country": "ZW", "family": "Chikoya", "given": "Innocent"} +{"country": "ZW", "family": "Mudzingwa", "given": "Florence"} +{"country": "ZW", "family": "Maseko", "given": "Alexandra"} +{"country": "ZW", "family": "Chikumbutso", "given": "Maxwell"} +{"country": "ZW", "family": "Chikumbutso", "given": "Sangulani"} +{"country": "ZW", "family": "Sibanda", "given": "Candice"} +{"country": "ZW", "family": "Sibanda", "given": "Ayanda"} +{"country": "ZW", "family": "Kaziboni", "given": "Vimbayi"} +{"country": "ZW", "family": "Sibanda", "given": "Mthokozisi"} +{"country": "ZW", "family": "Davidson", "given": "Cami"} +{"country": "ZW", "family": "Green", "given": "Marie"} +{"country": "ZW", "family": "Masamvu", "given": "Misheck"} +{"country": "ZW", "family": "Ncube", "given": "Caroline"} +{"country": "ZW", "family": "Chipendo", "given": "Winnie"} +{"country": "ZW", "family": "Chipendo", "given": "Felistus"} +{"country": "ZW", "family": "Chigudu", "given": "Hope"} +{"country": "ZW", "family": "Roberts", "given": "Debra"} +{"country": "ZW", "family": "Nyaruwata", "given": "Shepherd"} +{"country": "ZW", "family": "Kassis", "given": "Saad"} +{"country": "ZW", "family": "Gonda", "given": "Violet"} +{"country": "ZW", "family": "Baison", "given": "Precious"} +{"country": "ZW", "family": "Miller", "given": "Ashley"} +{"country": "ZW", "family": "Miller", "given": "Tinashe"} +{"country": "ZW", "family": "Chiwara", "given": "Letty"} +{"country": "ZW", "family": "Hughes", "given": "John"} +{"country": "ZW", "family": "Michie", "given": "Colin"} +{"country": "ZW", "family": "Addison", "given": "Michael"} +{"country": "ZW", "family": "Forth", "given": "Patrick"} +{"country": "ZW", "family": "Light", "given": "Graham"} +{"country": "ZW", "family": "Samkange", "given": "Stanlake"} +{"country": "ZW", "family": "Robinson", "given": "John"} +{"country": "ZW", "family": "Child", "given": "Brian"} +{"country": "ZW", "family": "Stobart", "given": "Andrew"} +{"country": "ZW", "family": "Robinson", "given": "Stephen"} +{"country": "ZW", "family": "Hughes", "given": "Nick"} +{"country": "ZW", "family": "Bowyer", "given": "Robert"} +{"country": "ZW", "family": "Hildebrand", "given": "Peter"} +{"country": "ZW", "family": "Forbes", "given": "Ruth"} +{"country": "ZW", "family": "Lewis", "given": "Simon"} +{"country": "ZW", "family": "Sigsworth", "given": "Romi"} +{"country": "ZW", "family": "Kelly", "given": "Chris"} +{"country": "ZW", "family": "Neill", "given": "Karin"} +{"country": "ZW", "family": "Cameron", "given": "John"} +{"country": "ZW", "family": "Taylor", "given": "Julie"} +{"country": "ZW", "family": "Lobb", "given": "Clare"} +{"country": "ZW", "family": "Calder", "given": "Tara"} +{"country": "ZW", "family": "Winn", "given": "Bryony"} +{"country": "ZW", "family": "Gede", "given": "Tinashe"} +{"country": "ZW", "family": "Wilkinson", "given": "Glenn"} +{"country": "ZW", "family": "Williams", "given": "Simon"} +{"country": "ZW", "family": "Dube", "given": "Lilian"} +{"country": "ZW", "family": "Clatworthy", "given": "John"} +{"country": "ZW", "family": "Hummel", "given": "Hans"} +{"country": "ZW", "family": "Morgan", "given": "David"} +{"country": "ZW", "family": "Ncube", "given": "Oliver"} +{"country": "ZW", "family": "Mwanaka", "given": "Tendai"} +{"country": "ZW", "family": "Molen", "given": "Phoebe"} +{"country": "ZW", "family": "Evans", "given": "Sarah"} +{"country": "ZW", "family": "Clark", "given": "Lindsay"} +{"country": "ZW", "family": "Cox", "given": "Stephen"} +{"country": "ZW", "family": "Muwishi", "given": "Gerren"} +{"country": "ZW", "family": "Lewis", "given": "John"} +{"country": "ZW", "family": "Oliver", "given": "Ronald"} +{"country": "ZW", "family": "Daneel", "given": "Louis"} +{"country": "ZW", "family": "Daneel", "given": "Martinus"} +{"country": "ZW", "family": "Daneel", "given": "Marthinus"} +{"country": "ZW", "family": "Padera", "given": "Prosper"} +{"country": "ZW", "family": "Mhangami", "given": "Marlene"} +{"country": "ZW", "family": "Ndlovu", "given": "Vuyisile"} +{"country": "ZW", "family": "O'Donoghue", "given": "Rachel"} +{"country": "ZW", "family": "Cowen", "given": "Philip"} +{"country": "ZW", "family": "Cowen", "given": "Michael"} +{"country": "ZW", "family": "Mathieson", "given": "Jenna"} +{"country": "ZW", "family": "Diplock", "given": "Kelly"} +{"country": "ZW", "family": "Terblanche", "given": "Natalie"} +{"country": "ZW", "family": "Matimba", "given": "Matimba"} +{"country": "ZW", "family": "Mahere", "given": "Claire"} +{"country": "ZW", "family": "Dzenga", "given": "Chelsea"} +{"country": "ZW", "family": "Makoni", "given": "Emma"} +{"country": "ZW", "family": "Maroto", "given": "Happiness"} +{"country": "ZW", "family": "Phiri", "given": "Gladys"} +{"country": "ZW", "family": "Mukandi", "given": "Emmanuel"} +{"country": "ZW", "family": "Chibanda", "given": "Patience"} +{"country": "ZW", "family": "Chitima", "given": "Simbarashe"} +{"country": "ZW", "family": "Chiwara", "given": "Davison"} +{"country": "ZW", "family": "Gurira", "given": "Agnes"} +{"country": "ZW", "family": "Dube", "given": "Precious"} +{"country": "ZW", "family": "Owen", "given": "Tendai"} +{"country": "ZW", "family": "Hlatshwayo", "given": "Primrose"} +{"country": "ZW", "family": "Ndlovu", "given": "Lee"} +{"country": "ZW", "family": "Moyo", "given": "Desiré"} +{"country": "ZW", "family": "Darare", "given": "Heath"} +{"country": "ZW", "family": "http://www.wikidata.org/.well-known/genid/352990d98e4d6ca223e371527913510d", "given": "Gabriel"} +{"country": "ZW", "family": "Chihota", "given": "Virginia"} +{"country": "ZW", "family": "Ngwenya", "given": "Patrick"} +{"country": "ZW", "family": "Cross", "given": "Grace"} +{"country": "ZW", "family": "Abade", "given": "Carol"} +{"country": "ZW", "family": "Southey", "given": "Trevor"} +{"country": "ZW", "family": "Samba", "given": "Chesterfield"} +{"country": "ZW", "family": "Broderick", "given": "Tim"} +{"country": "ZW", "family": "Nyoni", "given": "Jonah"} +{"country": "ZW", "family": "Chivero", "given": "Davison"} +{"country": "ZW", "family": "Madhuku", "given": "Claris"} +{"country": "ZW", "family": "Collins", "given": "Roy"} +{"country": "ZW", "family": "Ndhlovu", "given": "Jacob"} +{"country": "ZW", "family": "Somers", "given": "Xanthe"} +{"country": "ZW", "family": "Takura", "given": "Tawanda"} +{"country": "ZM", "family": "Sinkamba", "given": "Peter"} +{"country": "ZM", "family": "Kunda", "given": "Willie"} +{"country": "ZM", "family": "Stanley", "given": "Robert"} +{"country": "ZM", "family": "Lungu", "given": "Esther"} +{"country": "ZM", "family": "Tembo", "given": "Vera"} +{"country": "ZM", "family": "Kapil", "given": "Vishav"} +{"country": "ZM", "family": "Nyahoda", "given": "Christine"} +{"country": "ZM", "family": "Kaseba", "given": "Christine"} +{"country": "ZM", "family": "Muwowo", "given": "Juma"} +{"country": "ZM", "family": "Chongo", "given": "Ngosa"} +{"country": "ZM", "family": "Goveia", "given": "Ralph"} +{"country": "ZM", "family": "Sando", "given": "Esther"} +{"country": "ZM", "family": "Mabiza", "given": "Jean"} +{"country": "ZM", "family": "Scott", "given": "Charlotte"} +{"country": "ZM", "family": "Chimfwembe", "given": "Bernard"} +{"country": "ZM", "family": "Jere", "given": "Daniel"} +{"country": "ZM", "family": "Mulenga", "given": "Anita"} +{"country": "ZM", "family": "Banda", "given": "Susan"} +{"country": "ZM", "family": "Abraham", "given": "Malcolm"} +{"country": "ZM", "family": "Kapil", "given": "Visnan"} +{"country": "ZM", "family": "Pathak", "given": "Yagesh"} +{"country": "ZM", "family": "Lawes", "given": "Judien"} +{"country": "ZM", "family": "Koloko", "given": "Teresa"} +{"country": "ZM", "family": "Mushimba", "given": "Brian"} +{"country": "ZM", "family": "Kaunda", "given": "Philemon"} +{"country": "ZM", "family": "Mabo", "given": "Donald"} +{"country": "ZM", "family": "Nakanyika", "given": "Delphine"} +{"country": "ZM", "family": "Siamupangila", "given": "Evelyn"} +{"country": "ZM", "family": "Chipeleme", "given": "Elizaberth"} +{"country": "ZM", "family": "Phiri", "given": "Topsy"} +{"country": "ZM", "family": "Kalima", "given": "Victoria"} +{"country": "ZM", "family": "Mulenga", "given": "Owen"} +{"country": "ZM", "family": "Mulenga", "given": "Kalombo"} +{"country": "ZM", "family": "Miyambo", "given": "Ngandwe"} +{"country": "ZM", "family": "Banda", "given": "Charles"} +{"country": "ZM", "family": "Sichalwe", "given": "Lawrence"} +{"country": "ZM", "family": "Mwepu", "given": "Enock"} +{"country": "ZM", "family": "Haynes", "given": "Trevor"} +{"country": "ZM", "family": "Banda", "given": "Emmanuel"} +{"country": "ZM", "family": "Banda", "given": "Justine"} +{"country": "ZM", "family": "Banda", "given": "Rabby"} +{"country": "ZM", "family": "Lungu", "given": "Beatrice"} +{"country": "ZM", "family": "Phiri", "given": "Memory"} +{"country": "ZM", "family": "Malama", "given": "Anthony"} +{"country": "ZM", "family": "Phiri", "given": "Elizabeth"} +{"country": "ZM", "family": "Kabamba", "given": "Joseph"} +{"country": "ZM", "family": "Malama", "given": "Martin"} +{"country": "ZM", "family": "Fundanga", "given": "Rosario"} +{"country": "ZM", "family": "Fundanga", "given": "Rosaria"} +{"country": "ZM", "family": "Muchima", "given": "Elija"} +{"country": "ZM", "family": "Muchima", "given": "Elijah"} +{"country": "ZM", "family": "Mwiinga", "given": "Kabwe"} +{"country": "ZM", "family": "Mwiinga", "given": "Chrispin"} +{"country": "ZM", "family": "Kasonde", "given": "Linda"} +{"country": "ZM", "family": "Zukas", "given": "Cynthia"} +{"country": "ZM", "family": "Kapwepwe", "given": "Mulenga"} +{"country": "ZM", "family": "Graham", "given": "Helen"} +{"country": "ZM", "family": "Hughes", "given": "Margaret"} +{"country": "ZM", "family": "Mafuta", "given": "James"} +{"country": "ZM", "family": "Colley", "given": "Jacqui"} +{"country": "ZM", "family": "Lungu", "given": "Ireen"} +{"country": "ZM", "family": "Mwansa", "given": "Kenny"} +{"country": "ZM", "family": "Mwamba", "given": "Godfrey"} +{"country": "ZM", "family": "Chama", "given": "Enock"} +{"country": "ZM", "family": "Banda", "given": "Barbra"} +{"country": "ZM", "family": "Kamanga-Dyrbak", "given": "Tazana"} +{"country": "ZM", "family": "Mwaba", "given": "Moses"} +{"country": "ZM", "family": "Mutale", "given": "Justina"} +{"country": "ZM", "family": "Muchanga", "given": "Albert"} +{"country": "ZM", "family": "Ngulube", "given": "Jacob"} +{"country": "ZM", "family": "Zulu", "given": "Judith"} +{"country": "ZM", "family": "Tembo", "given": "Martha"} +{"country": "ZM", "family": "Smith", "given": "John"} +{"country": "ZM", "family": "McFee", "given": "Andrew"} +{"country": "ZM", "family": "Charlton", "given": "Annabelle"} +{"country": "ZM", "family": "Brummage", "given": "Brian"} +{"country": "ZM", "family": "Selley", "given": "Eric"} +{"country": "ZM", "family": "van Heerden", "given": "Harriet"} +{"country": "ZM", "family": "Leys", "given": "I."} +{"country": "ZM", "family": "Buck", "given": "Ida"} +{"country": "ZM", "family": "Owen", "given": "Ingrid"} +{"country": "ZM", "family": "Winter", "given": "Isobel"} +{"country": "ZM", "family": "Phiri", "given": "Jenipher"} +{"country": "ZM", "family": "Pickersgill", "given": "Keith"} +{"country": "ZM", "family": "Banda", "given": "Mark"} +{"country": "ZM", "family": "Kwiya", "given": "Marrien"} +{"country": "ZM", "family": "Kafuni", "given": "Marrien"} +{"country": "ZM", "family": "Kaunda", "given": "Kenneth"} +{"country": "ZM", "family": "Kaunda", "given": "David"} +{"country": "ZM", "family": "Mambwe", "given": "Eli"} +{"country": "ZM", "family": "Scott", "given": "Guy"} +{"country": "ZM", "family": "Banda", "given": "Rupiah"} +{"country": "ZM", "family": "Sata", "given": "Michael"} +{"country": "ZM", "family": "Lungu", "given": "Misheck"} +{"country": "ZM", "family": "Mwanza", "given": "Billy"} +{"country": "ZM", "family": "Smith", "given": "Wilbur"} +{"country": "ZM", "family": "Smith", "given": "Addison"} +{"country": "ZM", "family": "Mulenga", "given": "Jacob"} +{"country": "ZM", "family": "Moyo", "given": "Dambisa"} +{"country": "ZM", "family": "Kaunda", "given": "Betty"} +{"country": "ZM", "family": "Lange", "given": "John"} +{"country": "ZM", "family": "Lange", "given": "Robert"} +{"country": "ZM", "family": "Kola", "given": "Rodgers"} +{"country": "ZM", "family": "Kaunda", "given": "Tilyenji"} +{"country": "ZM", "family": "Lungu", "given": "Chisamba"} +{"country": "ZM", "family": "Dickinson", "given": "Peter"} +{"country": "ZM", "family": "Hichilema", "given": "Hakainde"} +{"country": "ZM", "family": "Tembo", "given": "Andrew"} +{"country": "ZM", "family": "Phiri", "given": "Benjamin"} +{"country": "ZM", "family": "Tembo", "given": "Christon"} +{"country": "ZM", "family": "Phiri", "given": "David"} +{"country": "ZM", "family": "Kabwe", "given": "Kasase"} +{"country": "ZM", "family": "Mutati", "given": "Felix"} +{"country": "ZM", "family": "Nkonde", "given": "Sunday"} +{"country": "ZM", "family": "Mulemba", "given": "Humphrey"} +{"country": "ZM", "family": "Sayifwanda", "given": "Sara"} +{"country": "ZM", "family": "Mwale", "given": "Maxwell"} +{"country": "ZM", "family": "Bots", "given": "Dennis"} +{"country": "ZM", "family": "Kapwepwe", "given": "Simon"} +{"country": "ZM", "family": "Musonda", "given": "Joseph"} +{"country": "ZM", "family": "Banda", "given": "Dennis"} +{"country": "ZM", "family": "Phiri", "given": "Gerald"} +{"country": "ZM", "family": "Phiri", "given": "Edwin"} +{"country": "ZM", "family": "Mpashi", "given": "Stephen"} +{"country": "ZM", "family": "Phiri", "given": "James"} +{"country": "ZM", "family": "Mwanza", "given": "Richard"} +{"country": "ZM", "family": "Mwansa", "given": "Sebastian"} +{"country": "ZM", "family": "Lota", "given": "Dennis"} +{"country": "ZM", "family": "Chola", "given": "Alexander"} +{"country": "ZM", "family": "Young", "given": "Carey"} +{"country": "ZM", "family": "Lemba", "given": "Chilu"} +{"country": "ZM", "family": "Musonda", "given": "Christopher"} +{"country": "ZM", "family": "Patel", "given": "Dipak"} +{"country": "ZM", "family": "Tembo", "given": "Eddie"} +{"country": "ZM", "family": "Unsworth", "given": "Edgar"} +{"country": "ZM", "family": "Hight", "given": "Ellen"} +{"country": "ZM", "family": "Ellison", "given": "Gabriel"} +{"country": "ZM", "family": "McLeod", "given": "Hamish"} +{"country": "ZM", "family": "Howard", "given": "Jade"} +{"country": "ZM", "family": "Skinner", "given": "James"} +{"country": "ZM", "family": "Haarhoff", "given": "Jimmy"} +{"country": "ZM", "family": "Kaunda", "given": "John"} +{"country": "ZM", "family": "Kamuzati", "given": "Kabwe"} +{"country": "ZM", "family": "Moyo", "given": "Leo"} +{"country": "ZM", "family": "Skinner", "given": "Patricia"} +{"country": "ZM", "family": "Chintala", "given": "Peter"} +{"country": "ZM", "family": "Stephenson", "given": "Richard"} +{"country": "ZM", "family": "Taylor", "given": "Robert"} +{"country": "ZM", "family": "Ndhlovu", "given": "Samuel"} +{"country": "ZM", "family": "Mwitwa", "given": "Timothy"} +{"country": "ZM", "family": "Mofu", "given": "Winfridah"} +{"country": "ZM", "family": "Lota", "given": "Charles"} +{"country": "ZM", "family": "Moyo", "given": "Henry"} +{"country": "ZM", "family": "Sunday", "given": "Dave"} +{"country": "ZM", "family": "Banda", "given": "Alick"} +{"country": "ZM", "family": "Soko", "given": "John"} +{"country": "ZM", "family": "Kajiya", "given": "Francis"} +{"country": "ZM", "family": "Ngoma", "given": "Leonard"} +{"country": "ZM", "family": "Siamupangila", "given": "Ogar"} +{"country": "ZM", "family": "Tembo", "given": "Milton"} +{"country": "ZM", "family": "Mulenga", "given": "Ezra"} +{"country": "ZM", "family": "Mulenga", "given": "Chongo"} +{"country": "ZM", "family": "Norgrove", "given": "Michael"} +{"country": "ZM", "family": "Carter", "given": "Nick"} +{"country": "ZM", "family": "Maskell", "given": "Edna"} +{"country": "ZM", "family": "Chipangama", "given": "Jordan"} +{"country": "ZM", "family": "Kaite", "given": "Mubanga"} +{"country": "ZM", "family": "Mwangulu", "given": "Stanley"} +{"country": "ZM", "family": "Mwangulu", "given": "Pitiri"} +{"country": "ZM", "family": "Durrett", "given": "Alan"} +{"country": "ZM", "family": "Mupopo", "given": "Kabange"} +{"country": "ZM", "family": "Lungu", "given": "Edgar"} +{"country": "ZM", "family": "Ngonga", "given": "Alex"} +{"country": "ZM", "family": "Kabwe", "given": "Roderick"} +{"country": "ZM", "family": "Chikwanda", "given": "Alexander"} +{"country": "ZM", "family": "Daka", "given": "Patson"} +{"country": "ZM", "family": "Clark", "given": "Portia"} +{"country": "ZM", "family": "Doyle", "given": "Brian"} +{"country": "ZM", "family": "Mulenga", "given": "Justin"} +{"country": "ZM", "family": "Phiri", "given": "Catherine"} +{"country": "ZM", "family": "Chama", "given": "Adrian"} +{"country": "ZM", "family": "McKelvey", "given": "Grant"} +{"country": "ZM", "family": "Chona", "given": "Chongo"} +{"country": "ZM", "family": "Daka", "given": "Elizabeth"} +{"country": "ZM", "family": "Kupa", "given": "Joshua"} +{"country": "ZM", "family": "Zimba", "given": "Lenny"} +{"country": "ZM", "family": "Zulu", "given": "Charles"} +{"country": "ZM", "family": "Mwale", "given": "Naomi"} +{"country": "ZM", "family": "Kunda", "given": "Hope"} +{"country": "ZM", "family": "Ngandu", "given": "Norie"} +{"country": "ZM", "family": "Lungu", "given": "Joanna"} +{"country": "ZM", "family": "Mwansa", "given": "Natasha"} +{"country": "ZM", "family": "Mwansa", "given": "Karen"} +{"country": "ZM", "family": "Chileshe", "given": "Josephine"} +{"country": "ZM", "family": "Chala", "given": "Paul"} +{"country": "ZM", "family": "Chinkuli", "given": "Monty"} +{"country": "ZM", "family": "Chisanga", "given": "George"} +{"country": "ZM", "family": "Chisala", "given": "Wilson"} +{"country": "ZM", "family": "Lukama", "given": "Siphiwe"} +{"country": "ZM", "family": "Limbikani", "given": "Mumbai"} +{"country": "ZM", "family": "Limbikani", "given": "Dickson"} +{"country": "ZM", "family": "Limbikani", "given": "Junior"} +{"country": "ZM", "family": "Nakaanda", "given": "Cheezwa"} +{"country": "ZM", "family": "Musonda", "given": "Malama"} +{"country": "ZM", "family": "Mukuka", "given": "Mutale"} +{"country": "ZM", "family": "Lusambo", "given": "Taizya"} +{"country": "ZM", "family": "Mwanza", "given": "Edward"} +{"country": "ZM", "family": "Kafunda", "given": "Timothy"} +{"country": "ZM", "family": "Ngulube", "given": "Samson"} +{"country": "ZM", "family": "Mutale", "given": "Ruth"} +{"country": "ZM", "family": "Mulenga", "given": "Boston"} +{"country": "ZM", "family": "Chilambe", "given": "Mary"} +{"country": "ZM", "family": "MacIntyre", "given": "Nancy"} +{"country": "ZM", "family": "Ngambi", "given": "Naomi"} +{"country": "ZM", "family": "Parulekar", "given": "Surin"} +{"country": "ZM", "family": "Gondwe", "given": "Towela"} +{"country": "ZM", "family": "Banda", "given": "Lameck"} +{"country": "ZM", "family": "Mulenga", "given": "Mulenga"} +{"country": "ZM", "family": "Mulenga", "given": "Jestina"} +{"country": "ZM", "family": "Tembo", "given": "Dorothy"} +{"country": "ZM", "family": "Musonda", "given": "Monica"} +{"country": "ZM", "family": "Chileshe", "given": "Rhoda"} +{"country": "ZM", "family": "Musonda", "given": "Catherine"} +{"country": "ZM", "family": "Mambwe", "given": "Mary"} +{"country": "ZM", "family": "De Ville", "given": "Caitlin"} +{"country": "ZM", "family": "Johnson", "given": "Todd"} +{"country": "ZM", "family": "Mulenga", "given": "Mary"} +{"country": "ZM", "family": "Zulu", "given": "Arthur"} +{"country": "ZM", "family": "Blom", "given": "Marieke"} +{"country": "ZM", "family": "Drevenšek", "given": "Miha"} +{"country": "ZM", "family": "Mulandu", "given": "Edwin"} +{"country": "ZM", "family": "Mabika", "given": "Aimé"} +{"country": "ZM", "family": "Lunda", "given": "Michelle"} +{"country": "ZM", "family": "Rowland", "given": "Alice"} +{"country": "ZM", "family": "Chinyemba", "given": "Patrick"} +{"country": "ZM", "family": "Moosa", "given": "Shaquille"} +{"country": "ZM", "family": "Hichilema", "given": "Mutinta"} +{"country": "ZM", "family": "Mutti", "given": "Nelly"} +{"country": "ZM", "family": "Alibuzwi", "given": "Dennis"} +{"country": "ZM", "family": "Alibuzwi", "given": "Sitali"} +{"country": "ZM", "family": "Mwanza", "given": "Tilyenji"} +{"country": "ZM", "family": "Maluma", "given": "Greg"} +{"country": "ZM", "family": "Kabinga", "given": "George"} +{"country": "ZM", "family": "Samukonga", "given": "Muzala"} +{"country": "ZM", "family": "Nyambe", "given": "Patrick"} +{"country": "ZM", "family": "Tembo", "given": "Margret"} +{"country": "ZM", "family": "Tembo", "given": "Eunice"} +{"country": "ZM", "family": "Mulenga", "given": "Elton"} +{"country": "ZM", "family": "Kapwepwe", "given": "Salome"} +{"country": "ZM", "family": "Tembo", "given": "Friday"} +{"country": "ZM", "family": "Mukutu", "given": "Faith"} +{"country": "ZM", "family": "Musonda", "given": "Michael"} +{"country": "ZM", "family": "Banda", "given": "Esther"} +{"country": "ZM", "family": "Mapepa", "given": "Xiomara"} +{"country": "ZM", "family": "Mwanza", "given": "George"} +{"country": "ZM", "family": "Soko", "given": "Judith"} +{"country": "ZM", "family": "Sakala", "given": "Eunice"} +{"country": "ZM", "family": "Zulu", "given": "Simon"} +{"country": "ZM", "family": "Solochi", "given": "Patrick"} +{"country": "ZM", "family": "Solochi", "given": "Maliti"} +{"country": "ZM", "family": "Barry", "given": "Colin"} +{"country": "ZM", "family": "Chabala", "given": "Mirriam"} +{"country": "ZM", "family": "Kabinga", "given": "Rapheal"} +{"country": "ZM", "family": "Kunda", "given": "Wilkinson"} +{"country": "ZM", "family": "Eckersley", "given": "Gregory"} +{"country": "ZM", "family": "Lungu", "given": "Thomas"} +{"country": "ZM", "family": "Shankar", "given": "Varun"} +{"country": "ZM", "family": "Uzor", "given": "Hannah"} +{"country": "ZM", "family": "Nkonde", "given": "Mutale"} +{"country": "ZM", "family": "Chinkuli", "given": "Godwin"} +{"country": "ZM", "family": "Chinkuli", "given": "Kingsley"} +{"country": "ZM", "family": "Zuze", "given": "Peter"} +{"country": "ZM", "family": "Zulu", "given": "Dickson"} +{"country": "ZM", "family": "Funjika", "given": "Joseph"} +{"country": "ZM", "family": "Funjika", "given": "Wilfred"} +{"country": "ZM", "family": "Mbao", "given": "Michael"} +{"country": "ZM", "family": "Chisheta", "given": "Raphael"} +{"country": "ZM", "family": "Mulanda", "given": "Anna"} +{"country": "ZM", "family": "Chardy", "given": "Susan"} +{"country": "ZM", "family": "Gossage", "given": "Susan"} +{"country": "ZM", "family": "Zimba", "given": "Noah"} +{"country": "ZM", "family": "Banda", "given": "Martha"} +{"country": "ZM", "family": "Mulenga", "given": "Kelvin"} +{"country": "ZM", "family": "Mwamba", "given": "Gift"} +{"country": "ZM", "family": "Maseko", "given": "Charity"} +{"country": "ZM", "family": "Kalala", "given": "Lizzie"} +{"country": "ZM", "family": "Chella", "given": "Priscilla"} +{"country": "ZM", "family": "Mwale", "given": "Abigail"} +{"country": "ZM", "family": "Kasonde", "given": "Ryan"} +{"country": "ZM", "family": "Moyo", "given": "Thabani"} +{"country": "ZM", "family": "Ngonga", "given": "Maxwell"} diff --git a/datasets/names_dataops/bench_population_tf_into_splink.py b/datasets/names_dataops/bench_population_tf_into_splink.py new file mode 100644 index 0000000..1f8c2d0 --- /dev/null +++ b/datasets/names_dataops/bench_population_tf_into_splink.py @@ -0,0 +1,153 @@ +# Copyright 2026 unpatterned.org +# SPDX-License-Identifier: Apache-2.0 + +"""Q2: does the population table's small-batch property transfer INTO Splink? + + uv run python datasets/names_dataops/bench_population_tf_into_splink.py + +`bench_population_vs_batch.py` established the one measured property that is +arche's and not Splink's: with nothing to learn from, Splink merges 368 of 400 +known-different schools that share a name, because a batch of 1,200 records +cannot know `COMMUNITY PRIMARY SCHOOL` is common; arche reads a shipped +population table and merges 2 at every size. + +Plan §7f proposes Splink as the default scorer with arche as the layer that +declares, guards, decides and remembers. That proposal has a hole if the +small-batch property can only live in arche's own engine. So: **hand the +population to Splink.** Splink can take a pre-computed term-frequency table +(`register_term_frequency_lookup`) in place of the one it would count from the +batch. If a population-derived table makes the filler-0 false merges collapse, +the property is a *data* property that any Fellegi-Sunter scorer can consume, +and the architecture holds. If it does not, `basic` stays below the size +floor for a reason. + +What the population is, stated plainly +-------------------------------------- +Splink's term-frequency adjustment is per *value* of the compared column -- +the whole school name -- where arche's shipped table is per *token*. A +token table cannot be registered as a value lookup without inventing a +combination rule, so this run builds the value-level table from the full +Nigerian school register itself: 107,670 names, the population the labelled +records were drawn from. That is the most favourable population possible, +and the result is an upper bound on what a shipped table could do for +Splink, not a measurement of arche's table inside it. The gap between the +two is a build task (a value-level table per domain), not an open question. + +Three arms at each filler size, labels identical throughout: + + splink / batch TF Splink as it ships: frequencies counted from the batch + splink / population TF the same model, frequencies read from the register + arche the shipped place pack and its shipped table +""" +from __future__ import annotations + +import csv +import json +import sys +import warnings +from collections import Counter +from pathlib import Path + +warnings.filterwarnings("ignore") + +_HERE = Path(__file__).resolve().parent +_REPO = _HERE.parents[1] +sys.path.insert(0, str(_REPO / "packages" / "arche-core" / "src")) +sys.path.insert(0, str(_HERE)) + +OUT = _HERE / "bench_population_tf_into_splink_result.json" +FILLERS = (0, 500, 2000) + + +def population_tf() -> "pd.DataFrame": # noqa: F821 + """`name -> tf_name` over the whole register, in Splink's lookup shape.""" + import pandas as pd + + import bench_splink_nigeria as base + + counts: Counter[str] = Counter() + for r in csv.DictReader(base.CSV_PATH.open(encoding="utf-8")): + n = (r["name"] or "").strip() + if n: + counts[n] += 1 + total = sum(counts.values()) + return pd.DataFrame({"name": list(counts), "tf_name": [c / total for c in counts.values()]}) + + +def run_splink(records: list[dict], *, tf_lookup=None): + """`bench_splink_nigeria.run_splink`, with an optional registered lookup.""" + import pandas as pd + from splink import DuckDBAPI, Linker + + import bench_splink_nigeria as base + + df = pd.DataFrame([{"unique_id": r["id"], "name": r["name"], + "lat": r["lat"], "lon": r["lon"]} for r in records]) + linker = Linker(df, base.splink_settings(), db_api=DuckDBAPI()) + if tf_lookup is not None: + # Registered before training so EM and prediction both read it. This + # is the whole intervention: everything else about the model is the + # published recipe. + linker.table_management.register_term_frequency_lookup(tf_lookup, "name") + base.splink_train(linker) + out = linker.inference.predict( + threshold_match_probability=0.01).as_pandas_dataframe() + return [(base.norm(p), s) for p, s in zip( + zip(out["unique_id_l"], out["unique_id_r"], strict=False), + out["match_probability"], strict=False)] + + +def main() -> int: + import bench_population_vs_batch as pvb + import bench_splink_nigeria as base + + negatives, positives, others = base.build() + lookup = population_tf() + print(f" {len(negatives)} observed negatives, {len(positives)} constructed positives") + print(f" population lookup: {len(lookup):,} distinct names from the full register\n", + flush=True) + + results = {} + print(f" {'filler':>8}{'records':>9}{'arm':>26}{'true':>7}{'false':>7}", flush=True) + print(" " + "-" * 57, flush=True) + for filler in FILLERS: + records, neg_ids, pos_ids = base._records(negatives, positives, others[:filler]) + row = {} + for label, kwargs in (("splink / batch TF", {}), + ("splink / population TF", {"tf_lookup": lookup})): + try: + scored = pvb.score(run_splink(records, **kwargs), neg_ids, pos_ids, + is_arche=False) + row[label] = scored + except Exception as exc: # noqa: BLE001 + row[label] = {"error": f"{type(exc).__name__}: {exc}"} + print(f" {label} failed at filler={filler}: {exc}", flush=True) + try: + row["arche"] = pvb.score(base.run_arche(records), neg_ids, pos_ids, is_arche=True) + except Exception as exc: # noqa: BLE001 + row["arche"] = {"error": f"{type(exc).__name__}: {exc}"} + + for label, block in row.items(): + for thr, counts in block.items(): + if isinstance(counts, dict) and "true" in counts: + print(f" {filler:>8}{len(records):>9}{label + ' ' + thr:>26}" + f"{counts['true']:>7}{counts['false']:>7}", flush=True) + print(flush=True) + results[str(filler)] = {"records": len(records), **row} + + OUT.write_text(json.dumps({ + "benchmark": "the population table as a Splink input", + "question": "does registering a population-derived term-frequency lookup " + "give Splink the small-batch property arche's shipped table gives arche?", + "population": "value-level frequencies over the full Nigerian school register " + "(107,670 names) -- the most favourable population, an upper bound", + "labels": "identical at every filler size (bench_splink_nigeria)", + "seed": base.SEED, + "results": results, + }, indent=2) + "\n", encoding="utf-8", newline="\n") + print(f" wrote {OUT.relative_to(_REPO)}", flush=True) + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/datasets/names_dataops/bench_population_tf_into_splink_result.json b/datasets/names_dataops/bench_population_tf_into_splink_result.json new file mode 100644 index 0000000..1651638 --- /dev/null +++ b/datasets/names_dataops/bench_population_tf_into_splink_result.json @@ -0,0 +1,108 @@ +{ + "benchmark": "the population table as a Splink input", + "question": "does registering a population-derived term-frequency lookup give Splink the small-batch property arche's shipped table gives arche?", + "population": "value-level frequencies over the full Nigerian school register (107,670 names) -- the most favourable population, an upper bound", + "labels": "identical at every filler size (bench_splink_nigeria)", + "seed": 20260816, + "results": { + "0": { + "records": 1200, + "splink / batch TF": { + "splink@0.9": { + "true": 190, + "false": 2 + }, + "splink@0.5": { + "true": 190, + "false": 368 + } + }, + "splink / population TF": { + "splink@0.9": { + "true": 190, + "false": 364 + }, + "splink@0.5": { + "true": 190, + "false": 368 + } + }, + "arche": { + "arche_match": { + "true": 146, + "false": 2 + }, + "arche_surfaced": { + "true": 199, + "false": 400 + } + } + }, + "500": { + "records": 1700, + "splink / batch TF": { + "splink@0.9": { + "true": 190, + "false": 0 + }, + "splink@0.5": { + "true": 190, + "false": 2 + } + }, + "splink / population TF": { + "splink@0.9": { + "true": 190, + "false": 13 + }, + "splink@0.5": { + "true": 190, + "false": 13 + } + }, + "arche": { + "arche_match": { + "true": 146, + "false": 2 + }, + "arche_surfaced": { + "true": 199, + "false": 400 + } + } + }, + "2000": { + "records": 3200, + "splink / batch TF": { + "splink@0.9": { + "true": 190, + "false": 0 + }, + "splink@0.5": { + "true": 190, + "false": 2 + } + }, + "splink / population TF": { + "splink@0.9": { + "true": 190, + "false": 12 + }, + "splink@0.5": { + "true": 190, + "false": 13 + } + }, + "arche": { + "arche_match": { + "true": 146, + "false": 2 + }, + "arche_surfaced": { + "true": 199, + "false": 398 + } + } + } + } +} diff --git a/datasets/names_dataops/bench_splink_england_schools.py b/datasets/names_dataops/bench_splink_england_schools.py new file mode 100644 index 0000000..d81fa8c --- /dev/null +++ b/datasets/names_dataops/bench_splink_england_schools.py @@ -0,0 +1,322 @@ +# Copyright 2026 unpatterned.org +# SPDX-License-Identifier: Apache-2.0 + +"""Splink and arche on the England schools crosswalk, against real labels. + +The three Splink comparisons so far -- Febrl 4, `historical_50k` and the +Nigerian school register -- were all *dedupe* problems, and Splink won all +three. This is the fourth, and it differs in two ways that matter. + +It is a **link**, not a dedupe. Two registers, OSM and GIAS, neither carrying +the other's identifier, which is the shape most reconciliation work actually +has. `link_type="link_only"` is Splink's own answer to that shape. + +And the labels are **real**. 93% of Leeds OSM school features carry a +`ref:edubase` tag, which is an editor asserting *this mapped school is that +URN*. Nobody created those tags for this benchmark. Febrl's records were +invented by a generator; the Nigerian positives were constructed by us. These +were not. + +Why this run exists +------------------- +`docs-site/docs/guides/school-reconciliation.md` scores this crosswalk against +exact match, token Jaccard and `token_set_ratio` -- the things people reach for +first -- and reports that arche's shipped place pack lands at F1 0.931 against +plain exact matching's 0.930. Splink is absent from that table, and it is the +only labelled place benchmark in the repository where adding it would mean +anything. (The GRID3 x OpenStreetMap crosswalk has no ground-truth identifier +at all; `about/place-benchmark.md` calls it a consistency check and measures +precision, never recall.) + +Two scoring rules, and both are reported +---------------------------------------- +The guide's rule counts any predicted pair outside the truth set as a false +merge. 282 of the 308 OSM features carry a label, so a correct link to one of +the other 26 is scored as an error. That rule is kept, because the existing +table uses it and a number that cannot be dropped into that table is not much +use -- but it penalises recall on unlabelled features, and it penalises +whichever engine finds more of them. + +So a second rule is reported beside it: **restricted**, which scores only pairs +whose OSM feature carries a label. On that rule a false merge is genuinely a +merge of two things an editor said were different. + +Neither rule is the "right" one. They bound the answer from both sides. + +Thresholds +---------- +Splink's decision is a probability, and no single threshold is its answer. +Borrowing one is how an earlier benchmark in this repository lost half a point +of recall to a 0.99 threshold copied from a Febrl recipe. The sweep is printed +in full and the best operating point is named rather than assumed. + +arche is scored on its own vocabulary: `match` is a merge, `review` is a queue +and not a merge. + +Run it with:: + + uv run python datasets/names_dataops/bench_splink_england_schools.py + +Stage the sources first (fetched, never committed):: + + python data/scripts/fetch_england_schools.py --la Leeds +""" +from __future__ import annotations + +import csv +import json +import re +import sys +import warnings +from pathlib import Path + +_REPO = Path(__file__).resolve().parents[2] +DATA = _REPO / "data" / "_cache" / "schools" +OUT = Path(__file__).with_name("bench_splink_england_schools_result.json") + +#: Probabilities to score Splink at. 0.01 is the prediction floor, so every +#: pair the blocking proposed is present and the sweep is over the full range +#: rather than over whatever survived a cutoff chosen in advance. +THRESHOLDS = (0.01, 0.1, 0.5, 0.9, 0.95, 0.99) + + +# --- data -------------------------------------------------------------------- + +def load() -> tuple[list[dict], list[dict], set[tuple[str, str]]]: + """The three staged files, loaded exactly as notebook 13 loads them. + + The truth set is filtered to URNs GIAS still lists as open, which is what + turns 286 tagged features into the 282 pairs the guide reports: four tags + point at establishments that have since closed. + """ + if not (DATA / "gias.csv").exists(): + raise SystemExit( + "Stage the sources first (they are fetched, never committed):\n" + " python data/scripts/fetch_england_schools.py --la Leeds" + ) + gias = list(csv.DictReader((DATA / "gias.csv").open(encoding="utf-8"))) + osm = list(csv.DictReader((DATA / "osm.csv").open(encoding="utf-8"))) + truth = {(r["osm_id"], r["urn"]) + for r in csv.DictReader((DATA / "truth_pairs.csv").open(encoding="utf-8"))} + known = {g["urn"] for g in gias} + return gias, osm, {(o, u) for o, u in truth if u in known} + + +# --- scoring ----------------------------------------------------------------- + +def score(pairs: set[tuple[str, str]], truth: set[tuple[str, str]], + labelled: set[str]) -> dict: + """Precision, recall and F1 under both rules. + + `pairs` is what the engine decided to merge, as (osm_id, urn). The two + rules differ only in whether a link to an unlabelled OSM feature counts + against the engine. + """ + tp = len(pairs & truth) + fp_all = len(pairs - truth) + # Restricted: only pairs whose OSM feature carries a label are scored, so a + # correct link to one of the 26 unlabelled features is neither credited nor + # penalised. + fp_res = len({(o, u) for o, u in pairs - truth if o in labelled}) + + def _row(fp: int) -> dict: + prec = tp / (tp + fp) if tp + fp else 0.0 + rec = tp / len(truth) if truth else 0.0 + f1 = 2 * prec * rec / (prec + rec) if prec + rec else 0.0 + return {"true": tp, "false": fp, "precision": round(prec, 6), + "recall": round(rec, 6), "f1": round(f1, 6)} + + return {"guide_rule": _row(fp_all), "restricted": _row(fp_res)} + + +# --- splink ------------------------------------------------------------------ + +def splink_settings(with_coords: bool): + """The hand-written configuration. + + Deliberately the same shape as `bench_splink_nigeria.splink_settings`: name + with term-frequency adjustments on, which is Splink's own answer to a name + that repeats, plus a distance comparison when coordinates are in play. + `link_only` is the difference, and it is the point -- OSM and GIAS are two + registers, and asking Splink to dedupe their concatenation would be asking + it the wrong question. + """ + import splink.comparison_library as cl + from splink import SettingsCreator, block_on + + rules = [block_on("name"), block_on("substr(name,1,8)")] + comparisons = [cl.NameComparison("name") + .configure(term_frequency_adjustments=True)] + if with_coords: + # arche's place pack gets these coordinates, so withholding them here + # would be the harness choosing the winner. + rules += [block_on("round(lat,2)", "round(lon,2)"), + block_on("round(lat,1)", "round(lon,1)")] + comparisons.append(cl.DistanceInKMAtThresholds("lat", "lon", + [0.1, 0.5, 2, 10])) + return SettingsCreator( + link_type="link_only", + blocking_rules_to_generate_predictions=rules, + comparisons=comparisons, + retain_intermediate_calculation_columns=False, + ) + + +def run_splink(osm: list[dict], gias: list[dict], *, with_coords: bool + ) -> list[tuple[tuple[str, str], float]]: + """Every proposed pair with its match probability, as ((osm_id, urn), p).""" + import pandas as pd + from splink import DuckDBAPI, Linker, block_on + + def frame(rows: list[dict], key: str) -> "pd.DataFrame": + cols = {"unique_id": [r[key] for r in rows], + "name": [r["name"] for r in rows]} + if with_coords: + cols["lat"] = [float(r["lat"]) for r in rows] + cols["lon"] = [float(r["lon"]) for r in rows] + return pd.DataFrame(cols) + + a, b = frame(osm, "osm_id"), frame(gias, "urn") + linker = Linker([a, b], splink_settings(with_coords), db_api=DuckDBAPI(), + input_table_aliases=["osm", "gias"]) + + linker.training.estimate_probability_two_random_records_match( + [block_on("name")], recall=0.5) + linker.training.estimate_u_using_random_sampling(max_pairs=2e6) + # EM needs to block on one field and learn another. The names-only model + # has exactly one comparison, so there is no such pair and EM cannot run: + # blocking on `name` leaves the name comparison with no variation, and + # blocking on a prefix of the name raises inside Splink's own counting SQL + # (measured, not assumed). That arm therefore predicts with Splink's + # default m values, which Splink itself warns about at predict time. It is + # reported because the guide has an "arche, names only" arm and dropping + # its counterpart would be the harness choosing the winner -- but it is a + # weaker model than the coords arm, not a like-for-like one. + trained = False + if with_coords: + for rule in (block_on("round(lat,2)", "round(lon,2)"), block_on("name")): + try: + linker.training.estimate_parameters_using_expectation_maximisation(rule) + trained = True + except Exception as exc: # noqa: BLE001 + print(f" EM on {rule} did not converge: {exc}", flush=True) + print(f" EM trained: {trained}", flush=True) + + out = linker.inference.predict( + threshold_match_probability=0.01).as_pandas_dataframe() + # link_only keeps the frames apart, but which side lands in `_l` is not + # guaranteed, so the OSM id is identified by shape rather than by position. + got = [] + for left, right, p in zip(out["unique_id_l"], out["unique_id_r"], + out["match_probability"], strict=False): + left, right = str(left), str(right) + osm_id, urn = (left, right) if "/" in left else (right, left) + got.append(((osm_id, urn), float(p))) + return got + + +# --- arche ------------------------------------------------------------------- + +def run_arche(osm: list[dict], gias: list[dict], *, with_coords: bool + ) -> dict[tuple[str, str], dict]: + """The shipped place pack, exactly as notebook 13 calls it.""" + from arche.resolve import reconcile + + def rows(src: list[dict]) -> list[dict]: + if with_coords: + return [{"name": r["name"], "lat": r["lat"], "lon": r["lon"]} + for r in src] + return [{"name": r["name"]} for r in src] + + res = reconcile(rows(osm), rows(gias), entity="place") + return {(osm[e["a_id"]]["osm_id"], gias[e["b_id"]]["urn"]): e + for e in res["matches"]} + + +# --- baselines --------------------------------------------------------------- + +def _toks(s: str) -> set[str]: + return {t for t in re.split(r"[^a-z0-9]+", s.casefold()) if t} + + +def baselines(osm: list[dict], gias: list[dict]) -> dict[str, set]: + """The guide's string arms, reproduced so the table is self-contained.""" + from rapidfuzz import fuzz + + def jaccard(x: str, y: str) -> float: + tx, ty = _toks(x), _toks(y) + return len(tx & ty) / len(tx | ty) if tx and ty else 0.0 + + arms = { + "exact name (casefold)": lambda x, y: x.casefold().strip() == y.casefold().strip(), + "token Jaccard >= 0.5": lambda x, y: jaccard(x, y) >= 0.5, + "token_set_ratio >= 90": lambda x, y: fuzz.token_set_ratio(x, y) >= 90, + } + out: dict[str, set] = {k: set() for k in arms} + for o in osm: + for g in gias: + for label, decide in arms.items(): + if decide(o["name"], g["name"]): + out[label].add((o["osm_id"], g["urn"])) + return out + + +# --- main -------------------------------------------------------------------- + +def main() -> int: + warnings.filterwarnings("ignore") + gias, osm, truth = load() + labelled = {o for o, _ in truth} + print(f" GIAS open establishments : {len(gias):>4}") + print(f" OSM named school features: {len(osm):>4} " + f"({len(labelled)} carry a ref:edubase label)") + print(f" truth pairs : {len(truth):>4}\n", flush=True) + + report: dict = {"gias": len(gias), "osm": len(osm), "truth": len(truth), + "arms": {}} + + def record(label: str, pairs: set) -> None: + report["arms"][label] = score(pairs, truth, labelled) + + for label, pairs in baselines(osm, gias).items(): + record(label, pairs) + + for coords in (False, True): + suffix = "name + coords" if coords else "names only" + print(f" running arche ({suffix}) ...", flush=True) + pred = run_arche(osm, gias, with_coords=coords) + record(f"arche, {suffix}", + {k for k, e in pred.items() if e["decision"] == "match"}) + surfaced = {k for k, e in pred.items() + if e["decision"] in ("match", "review")} + report["arms"][f"arche, {suffix} (surfaced)"] = score( + surfaced, truth, labelled) + + print(f" running splink ({suffix}) ...", flush=True) + sp = run_splink(osm, gias, with_coords=coords) + for t in THRESHOLDS: + record(f"splink p >= {t}, {suffix}", + {k for k, p in sp if p >= t}) + + width = max(len(k) for k in report["arms"]) + for rule in ("guide_rule", "restricted"): + title = ("every predicted pair outside the truth set is a false merge" + if rule == "guide_rule" + else "only pairs whose OSM feature carries a label are scored") + print(f"\n {rule} -- {title}") + print(f" {'approach':<{width}}{'precision':>11}{'recall':>9}" + f"{'F1':>8}{'true':>8}{'false':>9}") + for label, r in report["arms"].items(): + row = r[rule] + print(f" {label:<{width}}{row['precision']:>11.3f}" + f"{row['recall']:>9.3f}{row['f1']:>8.3f}" + f"{row['true']:>8,}{row['false']:>9,}") + + OUT.write_text(json.dumps(report, indent=2) + "\n", encoding="utf-8", + newline="\n") + print(f"\n wrote {OUT.relative_to(_REPO)}") + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/datasets/names_dataops/bench_splink_england_schools_result.json b/datasets/names_dataops/bench_splink_england_schools_result.json new file mode 100644 index 0000000..8c87f6f --- /dev/null +++ b/datasets/names_dataops/bench_splink_england_schools_result.json @@ -0,0 +1,311 @@ +{ + "gias": 306, + "osm": 308, + "truth": 282, + "arms": { + "exact name (casefold)": { + "guide_rule": { + "true": 247, + "false": 2, + "precision": 0.991968, + "recall": 0.875887, + "f1": 0.93032 + }, + "restricted": { + "true": 247, + "false": 0, + "precision": 1.0, + "recall": 0.875887, + "f1": 0.933837 + } + }, + "token Jaccard >= 0.5": { + "guide_rule": { + "true": 279, + "false": 4953, + "precision": 0.053326, + "recall": 0.989362, + "f1": 0.101197 + }, + "restricted": { + "true": 279, + "false": 4882, + "precision": 0.054059, + "recall": 0.989362, + "f1": 0.102517 + } + }, + "token_set_ratio >= 90": { + "guide_rule": { + "true": 267, + "false": 131, + "precision": 0.670854, + "recall": 0.946809, + "f1": 0.785294 + }, + "restricted": { + "true": 267, + "false": 122, + "precision": 0.686375, + "recall": 0.946809, + "f1": 0.795827 + } + }, + "arche, names only": { + "guide_rule": { + "true": 278, + "false": 184, + "precision": 0.601732, + "recall": 0.985816, + "f1": 0.747312 + }, + "restricted": { + "true": 278, + "false": 177, + "precision": 0.610989, + "recall": 0.985816, + "f1": 0.75441 + } + }, + "arche, names only (surfaced)": { + "guide_rule": { + "true": 281, + "false": 1061, + "precision": 0.209389, + "recall": 0.996454, + "f1": 0.346059 + }, + "restricted": { + "true": 281, + "false": 1049, + "precision": 0.211278, + "recall": 0.996454, + "f1": 0.348635 + } + }, + "splink p >= 0.01, names only": { + "guide_rule": { + "true": 278, + "false": 66, + "precision": 0.80814, + "recall": 0.985816, + "f1": 0.888179 + }, + "restricted": { + "true": 278, + "false": 59, + "precision": 0.824926, + "recall": 0.985816, + "f1": 0.898223 + } + }, + "splink p >= 0.1, names only": { + "guide_rule": { + "true": 246, + "false": 2, + "precision": 0.991935, + "recall": 0.87234, + "f1": 0.928302 + }, + "restricted": { + "true": 246, + "false": 0, + "precision": 1.0, + "recall": 0.87234, + "f1": 0.931818 + } + }, + "splink p >= 0.5, names only": { + "guide_rule": { + "true": 246, + "false": 2, + "precision": 0.991935, + "recall": 0.87234, + "f1": 0.928302 + }, + "restricted": { + "true": 246, + "false": 0, + "precision": 1.0, + "recall": 0.87234, + "f1": 0.931818 + } + }, + "splink p >= 0.9, names only": { + "guide_rule": { + "true": 0, + "false": 0, + "precision": 0.0, + "recall": 0.0, + "f1": 0.0 + }, + "restricted": { + "true": 0, + "false": 0, + "precision": 0.0, + "recall": 0.0, + "f1": 0.0 + } + }, + "splink p >= 0.95, names only": { + "guide_rule": { + "true": 0, + "false": 0, + "precision": 0.0, + "recall": 0.0, + "f1": 0.0 + }, + "restricted": { + "true": 0, + "false": 0, + "precision": 0.0, + "recall": 0.0, + "f1": 0.0 + } + }, + "splink p >= 0.99, names only": { + "guide_rule": { + "true": 0, + "false": 0, + "precision": 0.0, + "recall": 0.0, + "f1": 0.0 + }, + "restricted": { + "true": 0, + "false": 0, + "precision": 0.0, + "recall": 0.0, + "f1": 0.0 + } + }, + "arche, name + coords": { + "guide_rule": { + "true": 278, + "false": 37, + "precision": 0.88254, + "recall": 0.985816, + "f1": 0.931323 + }, + "restricted": { + "true": 278, + "false": 32, + "precision": 0.896774, + "recall": 0.985816, + "f1": 0.939189 + } + }, + "arche, name + coords (surfaced)": { + "guide_rule": { + "true": 281, + "false": 515, + "precision": 0.353015, + "recall": 0.996454, + "f1": 0.521336 + }, + "restricted": { + "true": 281, + "false": 502, + "precision": 0.358876, + "recall": 0.996454, + "f1": 0.5277 + } + }, + "splink p >= 0.01, name + coords": { + "guide_rule": { + "true": 278, + "false": 45, + "precision": 0.860681, + "recall": 0.985816, + "f1": 0.919008 + }, + "restricted": { + "true": 278, + "false": 41, + "precision": 0.871473, + "recall": 0.985816, + "f1": 0.925125 + } + }, + "splink p >= 0.1, name + coords": { + "guide_rule": { + "true": 278, + "false": 10, + "precision": 0.965278, + "recall": 0.985816, + "f1": 0.975439 + }, + "restricted": { + "true": 278, + "false": 7, + "precision": 0.975439, + "recall": 0.985816, + "f1": 0.9806 + } + }, + "splink p >= 0.5, name + coords": { + "guide_rule": { + "true": 278, + "false": 5, + "precision": 0.982332, + "recall": 0.985816, + "f1": 0.984071 + }, + "restricted": { + "true": 278, + "false": 2, + "precision": 0.992857, + "recall": 0.985816, + "f1": 0.989324 + } + }, + "splink p >= 0.9, name + coords": { + "guide_rule": { + "true": 278, + "false": 3, + "precision": 0.989324, + "recall": 0.985816, + "f1": 0.987567 + }, + "restricted": { + "true": 278, + "false": 0, + "precision": 1.0, + "recall": 0.985816, + "f1": 0.992857 + } + }, + "splink p >= 0.95, name + coords": { + "guide_rule": { + "true": 278, + "false": 3, + "precision": 0.989324, + "recall": 0.985816, + "f1": 0.987567 + }, + "restricted": { + "true": 278, + "false": 0, + "precision": 1.0, + "recall": 0.985816, + "f1": 0.992857 + } + }, + "splink p >= 0.99, name + coords": { + "guide_rule": { + "true": 219, + "false": 1, + "precision": 0.995455, + "recall": 0.776596, + "f1": 0.87251 + }, + "restricted": { + "true": 219, + "false": 0, + "precision": 1.0, + "recall": 0.776596, + "f1": 0.874251 + } + } + } +} diff --git a/datasets/products_dataops/bench_splink_abt_buy.py b/datasets/products_dataops/bench_splink_abt_buy.py new file mode 100644 index 0000000..4c87cca --- /dev/null +++ b/datasets/products_dataops/bench_splink_abt_buy.py @@ -0,0 +1,298 @@ +# Copyright 2026 unpatterned.org +# SPDX-License-Identifier: Apache-2.0 + +"""Q1: does "Splink as the base scorer" hold for products? Splink on Abt-Buy. + + uv run python datasets/products_dataops/bench_splink_abt_buy.py + +The question (plan §7f) +----------------------- +Splink is general-purpose Fellegi-Sunter: hand it sensible columns and it +scores products as readily as people. The proposal is to make it arche's +default scorer and keep arche as the layer that *declares* identity, guards +it, decides and remembers. This is the first product test of that proposal, +on the one labelled product benchmark arche gates in CI. + +The recipe, and what arche supplies to it +----------------------------------------- +Abt-Buy has one usable shared column: the product name. Splink cannot compare +a model code it has not been given, so **arche's representation runs first** +-- `extract_product_code_candidates` pulls `pslx350h` out of `Sony Turntable +- PSLX350H`, `extract_specs` pulls `500gb` out of a hard drive -- and Splink +compares the columns that come out: + + code1 the first extracted code, exact match with term frequency + codes every extracted code, array-intersect level + brand first token of the name, exact match with term frequency + name the normalised title, Jaro-Winkler levels + tokens title tokens, array-intersect-at-sizes + specs `unit:value` strings; both present and DISJOINT is a level + of its own, so EM prices the refutation instead of us + +Same input as arche's arm: names only, `tf=None`. Buy's `manufacturer` and +both sides' `description` are withheld so the comparison with the gated arche +number (741 true, 22 false, precision 0.9712) is on the same evidence. + +The two invariants +------------------ +arche's product pack carries two properties the gate enforces: on Abt-Buy the +spec refutation is neutral (the auto-match set is identical with and without +it) and the electronics stop list is inert. §7f asks whether such guarantees +survive *inside* a learned model or must stay outside it. So the recipe is run +three ways -- as written, without the spec comparison, with the stop list +emptied at extraction -- and the match sets are compared at the same +threshold, and the weight EM assigned to the "specs disjoint" level is +printed. A learned weight near zero is neutrality; a strongly negative one is +a refutation the model found for itself. + +Thresholds +---------- +Reported at 0.5, 0.9, 0.99 and at the best-F1 point. The best-F1 point is +chosen on the labels and says so. arche's arm has no threshold to tune. +""" +from __future__ import annotations + +import csv +import json +import math +import re +import sys +import time +import warnings +from pathlib import Path +from typing import Any + +_REPO = Path(__file__).resolve().parents[2] +DATA = _REPO / "data" / "er_bench" / "products" +GATE = _REPO / "data" / "er_bench" / "benchmark_abt_buy_result.json" +OUT = Path(__file__).with_name("bench_splink_abt_buy_result.json") + +THRESHOLDS = (0.5, 0.9, 0.99) +_WORD = re.compile(r"[a-z0-9]+") + + +def read(name: str) -> list[dict]: + with open(DATA / name, encoding="utf-8-sig", errors="replace", newline="") as fh: + return list(csv.DictReader(fh)) + + +def norm(text: str) -> str: + return " ".join(_WORD.findall((text or "").casefold())) + + +# --- arche's representation, as columns ----------------------------------------- + +def represent(rows: list[dict], *, stop_list: bool = True) -> list[dict]: + """What arche extracts from a title, laid out as columns for Splink.""" + from arche.resolve._productcode import ( + PRODUCT_CATEGORIES, ProductCategory, extract_product_code_candidates, + extract_specs, register_category) + + original = PRODUCT_CATEGORIES["electronics"] + if not stop_list: + register_category(ProductCategory(name="electronics", + identity_units=original.identity_units, + stop_codes=frozenset()), replace=True) + try: + out = [] + for r in rows: + name = norm(r["name"]) + codes = sorted(extract_product_code_candidates(r["name"], category="electronics")) + specs = sorted(f"{unit}:{v:g}" for unit, values in + extract_specs(r["name"], "electronics").items() for v in values) + tokens = [t for t in name.split() if len(t) > 1] + out.append({"unique_id": r["id"], "name": name, + "brand": tokens[0] if tokens else None, + "code1": codes[0] if codes else None, + "codes": codes, "tokens": tokens, "specs": specs}) + return out + finally: + if not stop_list: + register_category(original, replace=True) + + +# --- the recipe ------------------------------------------------------------------ + +#: Two recipes, and the contrast between them is the finding. `descriptive` +#: is what a Splink user would write: every column arche extracted, plus the +#: title itself. `identity` keeps only the columns the pack declares +#: identity-bearing -- the code and the brand -- and withholds title +#: similarity from the model entirely. +RECIPES = ("descriptive", "identity") + + +def settings(recipe: str, *, with_spec: bool): + import splink.comparison_level_library as cll + import splink.comparison_library as cl + from splink import SettingsCreator, block_on + + code = cl.CustomComparison(output_column_name="code", comparison_levels=[ + cll.NullLevel("code1"), + cll.ExactMatchLevel("code1").configure(tf_adjustment_column="code1"), + cll.ArrayIntersectLevel("codes", min_intersection=1), + cll.ElseLevel(), + ]) + spec = cl.CustomComparison(output_column_name="spec", comparison_levels=[ + cll.CustomLevel("len(specs_l) = 0 OR len(specs_r) = 0", + label_for_charts="a spec missing on one side" + ).configure(is_null_level=True), + cll.ArrayIntersectLevel("specs", min_intersection=1), + # Both sides carry a spec and they share none. This is the level + # arche refutes on; here EM prices it. + cll.ElseLevel(), + ]) + comparisons = [code, cl.ExactMatch("brand").configure(term_frequency_adjustments=True)] + if recipe == "descriptive": + comparisons += [cl.JaroWinklerAtThresholds("name", [0.92, 0.85]), + cl.ArrayIntersectAtSizes("tokens", [4, 3, 2])] + if with_spec: + comparisons.append(spec) + return SettingsCreator( + link_type="link_only", + comparisons=comparisons, + blocking_rules_to_generate_predictions=[ + block_on("code1"), + block_on("brand"), + block_on("substr(name,1,10)"), + ], + retain_intermediate_calculation_columns=False, + ) + + +def run(a: list[dict], b: list[dict], recipe: str, *, with_spec: bool + ) -> tuple[list[tuple[tuple[str, str], float]], dict[str, float]]: + import pandas as pd + from splink import DuckDBAPI, Linker, block_on + + linker = Linker([pd.DataFrame(a), pd.DataFrame(b)], settings(recipe, with_spec=with_spec), + db_api=DuckDBAPI(), input_table_aliases=["abt", "buy"]) + linker.training.estimate_probability_two_random_records_match( + [block_on("code1")], recall=0.7) + linker.training.estimate_u_using_random_sampling(max_pairs=2e6, seed=42) + # Brand-blocked EM trains code, name, tokens and spec; code-blocked EM + # trains brand. Never a rule on a column being trained (§7d's trap). + for rule in (block_on("brand"), block_on("code1")): + try: + linker.training.estimate_parameters_using_expectation_maximisation(rule) + except Exception as exc: # noqa: BLE001 + print(f" EM on {rule} did not converge: {exc}", flush=True) + + learned: dict[str, float] = {} + for c in linker.misc.save_model_to_json()["comparisons"]: + for lv in c["comparison_levels"]: + m, u = lv.get("m_probability"), lv.get("u_probability") + if m and u: + learned[f"{c['output_column_name']}: {lv['label_for_charts']}"] = round( + math.log2(m / u), 2) + + out = linker.inference.predict(threshold_match_probability=0.01).as_pandas_dataframe() + got = [] + for left, right, p in zip(out["unique_id_l"], out["unique_id_r"], + out["match_probability"], strict=False): + # link_only does not fix which frame lands in `_l`; Abt ids are short. + left, right = str(left), str(right) + abt, buy = (left, right) if len(left) < len(right) else (right, left) + got.append(((abt, buy), float(p))) + return got, learned + + +# --- main -------------------------------------------------------------------------- + +def score(pairs: set, truth: set) -> dict[str, Any]: + tp, fp = len(pairs & truth), len(pairs - truth) + prec = tp / (tp + fp) if tp + fp else 0.0 + rec = tp / len(truth) + f1 = 2 * prec * rec / (prec + rec) if prec + rec else 0.0 + return {"true": tp, "false": fp, "precision": round(prec, 4), + "recall": round(rec, 4), "f1": round(f1, 4)} + + +def main() -> int: + warnings.filterwarnings("ignore") + abt_rows, buy_rows = read("Abt.csv"), read("Buy.csv") + truth = {(r["idAbt"], r["idBuy"]) for r in read("abt_buy_perfectMapping.csv")} + gate = json.loads(GATE.read_text(encoding="utf-8"))["configurations"]["product_electronics"] + print(f" Abt {len(abt_rows):,} x Buy {len(buy_rows):,}, {len(truth):,} true pairs") + print(f" arche gate: {gate['tp']} true, {gate['fp']} false, " + f"precision {gate['precision']}, recall {gate['recall']}\n", flush=True) + + a, b = represent(abt_rows), represent(buy_rows) + with_codes = sum(1 for r in a + b if r["code1"]) + with_specs = sum(1 for r in a + b if r["specs"]) + print(f" representation: {with_codes:,} of {len(a) + len(b):,} records carry a code, " + f"{with_specs:,} a spec\n", flush=True) + + report: dict[str, Any] = {"records": {"abt": len(a), "buy": len(b)}, + "true_pairs": len(truth), "arche_gate": gate, "arms": {}} + + def sweep(got: list) -> tuple[float, dict]: + best = (None, {"f1": -1.0}) + for t in (i / 100 for i in range(5, 100, 5)): + r = score({p for p, s in got if s >= t}, truth) + if r["f1"] > best[1]["f1"]: + best = (t, r) + return best + + for recipe in RECIPES: + print(f" splink, {recipe} recipe ...", flush=True) + t0 = time.time() + got, learned = run(a, b, recipe, with_spec=True) + secs = time.time() - t0 + arms = {} + for t in THRESHOLDS: + arms[f"p>={t}"] = score({p for p, s in got if s >= t}, truth) + best_t, best = sweep(got) + arms[f"best-F1 (p>={best_t:.2f}, chosen on labels)"] = best + + # --- invariants inside the model --------------------------------- + at = {p for p, s in got if s >= best_t} + got_nospec, _ = run(a, b, recipe, with_spec=False) + nospec = {p for p, s in got_nospec if s >= best_t} + a2, b2 = represent(abt_rows, stop_list=False), represent(buy_rows, stop_list=False) + got_nostop, _ = run(a2, b2, recipe, with_spec=True) + nostop = {p for p, s in got_nostop if s >= best_t} + report["arms"][recipe] = { + "results": arms, "learned_bits": learned, "seconds": round(secs, 1), + "invariants": { + "threshold": best_t, + "spec_refutation_neutral": at == nospec, + "spec_delta": {"only_with_spec": len(at - nospec), + "only_without": len(nospec - at), + "without_spec": score(nospec, truth)}, + "stop_list_inert": at == nostop, + "stop_delta": {"only_with_stop": len(at - nostop), + "only_without": len(nostop - at), + "without_stop_list": score(nostop, truth)}, + }, + } + + # --- print ------------------------------------------------------------- + g = gate + print(f"\n {'arm':<52}{'prec':>7}{'recall':>8}{'F1':>7}{'true':>6}{'false':>7}") + print(f" {'arche product_electronics (gated, no threshold)':<52}{g['precision']:>7.3f}" + f"{g['recall']:>8.3f}{2*g['precision']*g['recall']/(g['precision']+g['recall']):>7.3f}" + f"{g['tp']:>6}{g['fp']:>7}") + for recipe, block in report["arms"].items(): + for label, r in block["results"].items(): + print(f" {'splink ' + recipe + ' ' + label:<52}{r['precision']:>7.3f}" + f"{r['recall']:>8.3f}{r['f1']:>7.3f}{r['true']:>6}{r['false']:>7}") + for recipe, block in report["arms"].items(): + print(f"\n {recipe}: learned weights (bits)") + for k, v in block["learned_bits"].items(): + print(f" {k:<58}{v:>+7.2f}") + inv = block["invariants"] + print(f" {recipe}: invariants at p>={inv['threshold']:.2f}") + print(f" spec refutation neutral : {inv['spec_refutation_neutral']} " + f"(+{inv['spec_delta']['only_with_spec']} / -{inv['spec_delta']['only_without']} pairs; " + f"without spec: {inv['spec_delta']['without_spec']['true']} true, " + f"{inv['spec_delta']['without_spec']['false']} false)") + print(f" stop list inert : {inv['stop_list_inert']} " + f"(+{inv['stop_delta']['only_with_stop']} / -{inv['stop_delta']['only_without']} pairs)") + + OUT.write_text(json.dumps(report, indent=2) + "\n", encoding="utf-8", newline="\n") + print(f"\n wrote {OUT.relative_to(_REPO)}") + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/datasets/products_dataops/bench_splink_abt_buy_result.json b/datasets/products_dataops/bench_splink_abt_buy_result.json new file mode 100644 index 0000000..add0bb6 --- /dev/null +++ b/datasets/products_dataops/bench_splink_abt_buy_result.json @@ -0,0 +1,166 @@ +{ + "records": { + "abt": 1081, + "buy": 1092 + }, + "true_pairs": 1097, + "arche_gate": { + "comparators": "ENTITY_PACKS['product_electronics'] on the name field, tf=None", + "tp": 741, + "fp": 22, + "precision": 0.9712, + "recall": 0.6755, + "invariants": [ + "spec_refutation_neutral: the auto-match set is identical with and without refutes_below on the spec comparator", + "stop_list_inert: the auto-match set is identical with the electronics stop list emptied" + ] + }, + "arms": { + "descriptive": { + "results": { + "p>=0.5": { + "true": 940, + "false": 2538, + "precision": 0.2703, + "recall": 0.8569, + "f1": 0.4109 + }, + "p>=0.9": { + "true": 806, + "false": 1105, + "precision": 0.4218, + "recall": 0.7347, + "f1": 0.5359 + }, + "p>=0.99": { + "true": 605, + "false": 886, + "precision": 0.4058, + "recall": 0.5515, + "f1": 0.4675 + }, + "best-F1 (p>=0.80, chosen on labels)": { + "true": 864, + "false": 1256, + "precision": 0.4075, + "recall": 0.7876, + "f1": 0.5371 + } + }, + "learned_bits": { + "code: Exact match on code1": 6.08, + "code: Array intersection size >= 1": 6.07, + "code: All other comparisons": -0.09, + "brand: Exact match on brand": 4.14, + "brand: All other comparisons": -3.54, + "name: Exact match on name": 9.77, + "name: Jaro-Winkler distance of name >= 0.92": 9.11, + "name: Jaro-Winkler distance of name >= 0.85": 7.61, + "name: All other comparisons": -0.5, + "tokens: Array intersection size >= 4": 7.01, + "tokens: Array intersection size >= 3": 5.03, + "tokens: Array intersection size >= 2": 3.83, + "tokens: All other comparisons": -6.8, + "spec: Array intersection size >= 1": 3.58, + "spec: All other comparisons": -1.42 + }, + "seconds": 13.5, + "invariants": { + "threshold": 0.8, + "spec_refutation_neutral": false, + "spec_delta": { + "only_with_spec": 75, + "only_without": 2, + "without_spec": { + "true": 859, + "false": 1188, + "precision": 0.4196, + "recall": 0.783, + "f1": 0.5464 + } + }, + "stop_list_inert": false, + "stop_delta": { + "only_with_stop": 18, + "only_without": 45, + "without_stop_list": { + "true": 871, + "false": 1276, + "precision": 0.4057, + "recall": 0.794, + "f1": 0.537 + } + } + } + }, + "identity": { + "results": { + "p>=0.5": { + "true": 732, + "false": 49, + "precision": 0.9373, + "recall": 0.6673, + "f1": 0.7796 + }, + "p>=0.9": { + "true": 484, + "false": 32, + "precision": 0.938, + "recall": 0.4412, + "f1": 0.6001 + }, + "p>=0.99": { + "true": 113, + "false": 9, + "precision": 0.9262, + "recall": 0.103, + "f1": 0.1854 + }, + "best-F1 (p>=0.35, chosen on labels)": { + "true": 740, + "false": 49, + "precision": 0.9379, + "recall": 0.6746, + "f1": 0.7847 + } + }, + "learned_bits": { + "code: Exact match on code1": 10.05, + "code: Array intersection size >= 1": 10.11, + "code: All other comparisons": -4.13, + "brand: Exact match on brand": 4.1, + "brand: All other comparisons": -3.13, + "spec: Array intersection size >= 1": 4.16, + "spec: All other comparisons": -4.86 + }, + "seconds": 10.9, + "invariants": { + "threshold": 0.35, + "spec_refutation_neutral": false, + "spec_delta": { + "only_with_spec": 3, + "only_without": 6, + "without_spec": { + "true": 737, + "false": 55, + "precision": 0.9306, + "recall": 0.6718, + "f1": 0.7803 + } + }, + "stop_list_inert": false, + "stop_delta": { + "only_with_stop": 0, + "only_without": 67, + "without_stop_list": { + "true": 740, + "false": 116, + "precision": 0.8645, + "recall": 0.6746, + "f1": 0.7578 + } + } + } + } + } +} diff --git a/datasets/pull_wikidata.py b/datasets/pull_wikidata.py new file mode 100644 index 0000000..3c592be --- /dev/null +++ b/datasets/pull_wikidata.py @@ -0,0 +1,247 @@ +#!/usr/bin/env python +# Copyright 2026 unpatterned.org +# SPDX-License-Identifier: Apache-2.0 +"""Pull real names from Wikidata (CC0) — the two things the generator cannot invent. + + python datasets/pull_wikidata.py names --out datasets/data/wikidata_name_pairs.jsonl + python datasets/pull_wikidata.py aliases --out datasets/data/wikidata_artist_aliases.jsonl + +**`names`** — real *given + family* pairs with a country, from people Wikidata +holds. This is what the synthetic generator has no way to make up: it draws the +two halves of a name independently and produces `Zubeyde Saliou`, and the +notebook measured the result as **0.0% regional signal against 90.4% in real +data**. A conditional table built from real pairs is the fix (plan N1), and a +table derived from public data is `public-data-derived` provenance rather than +`synthetic-assumption`. + +**`aliases`** — artists with their alternate names: stage name, legal name, +orthographic variants. `Jua Cali` and `Paul Julius Nunda` are one person; +`Achieng Abura`, `Achien'g Abura` and `Lydia Achieng Abura` are one person +written four ways. Ground truth comes free, because the entity is a QID. This +is the variant list for the ablation (plan N4): does supplying it buy recall, +and what does it cost in false merges? + +Licence. Wikidata is **CC0** — no permission needed, which is the entire reason +this lane exists while `ai4privacy`, `i2b2` and OpenSanctions remain blocked. +Attribution is still good manners and the data card carries it. + +Etiquette. WDQS is a shared public service. This pager keeps one request in +flight, sleeps between pages, sends a real User-Agent with contact details as +the service asks, and backs off on 429 and 5xx. Do not remove those. +""" + +from __future__ import annotations + +import argparse +import http.client +import json +import sys +import time +import urllib.error +import urllib.parse +import urllib.request +from collections.abc import Iterator +from pathlib import Path +from typing import Any + +ENDPOINT = "https://query.wikidata.org/sparql" +USER_AGENT = ("arche-synthetic/0.0.1 (https://unpatterned.org; " + "connect@unpatterned.org) python-urllib") + +#: Countries to pull. Wikidata QIDs. Widen deliberately: every addition is more +#: load on a free service and more rows to curate. +COUNTRIES = { + "NG": "wd:Q1033", "KE": "wd:Q114", "ZA": "wd:Q258", "GH": "wd:Q117", + "TZ": "wd:Q924", "UG": "wd:Q1036", "SN": "wd:Q1041", "CI": "wd:Q1008", + "ET": "wd:Q115", "CM": "wd:Q1009", "ZW": "wd:Q954", "ZM": "wd:Q953", +} + +#: Occupations that count as "artist" for the alias pull. +MUSICIANS = "wd:Q177220 wd:Q639 wd:Q36834 wd:Q488205 wd:Q753110" + +# One country at a time, no ORDER BY and no OPTIONAL. Both were what made this +# too expensive: WDQS answered the sorted, optional-carrying version by closing +# the connection, at every page size tried. Per country, plain, it returns +# 5,000 rows in about three seconds. +_NAMES = """ +SELECT ?givenLabel ?familyLabel WHERE {{ + ?person wdt:P31 wd:Q5 ; + wdt:P735 ?given ; + wdt:P734 ?family ; + wdt:P27 {country} . + SERVICE wikibase:label {{ bd:serviceParam wikibase:language "en". }} +}} +LIMIT {limit} +""" + +_ALIASES = """ +SELECT ?artist ?artistLabel ?alias ?countryLabel WHERE {{ + ?artist wdt:P31 wd:Q5 ; + wdt:P106 ?occ ; + wdt:P27 ?country ; + skos:altLabel ?alias . + VALUES ?occ {{ {occupations} }} + VALUES ?country {{ {countries} }} + FILTER(LANG(?alias) = "en") + SERVICE wikibase:label {{ bd:serviceParam wikibase:language "en". }} +}} +ORDER BY ?artist +LIMIT {limit} OFFSET {offset} +""" + + +def _ask(query: str, *, timeout: int = 180, attempts: int = 4) -> list[dict[str, Any]]: + """One SPARQL request, with the back-off a shared public service deserves.""" + url = ENDPOINT + "?" + urllib.parse.urlencode({"query": query, "format": "json"}) + request = urllib.request.Request(url, headers={ + "User-Agent": USER_AGENT, + "Accept": "application/sparql-results+json", + }) + for attempt in range(attempts): + try: + with urllib.request.urlopen(request, timeout=timeout) as fh: + return json.load(fh)["results"]["bindings"] + except urllib.error.HTTPError as exc: + if exc.code in (429, 500, 502, 503, 504) and attempt < attempts - 1: + wait = 5 * (2 ** attempt) + print(f" {exc.code}; waiting {wait}s", file=sys.stderr) + time.sleep(wait) + continue + raise + except (TimeoutError, urllib.error.URLError, ConnectionError, + http.client.HTTPException) as exc: + # WDQS answers a query it considers too expensive by closing the + # connection rather than returning an error, which arrives as + # http.client.RemoteDisconnected -- a ConnectionError, not a + # URLError, so it escaped an earlier version of this handler and + # ended the run instead of being retried. + if attempt < attempts - 1: + print(f" {type(exc).__name__}; retrying", file=sys.stderr) + time.sleep(5 * (2 ** attempt)) + continue + raise + return [] + + +def _pages(template: str, *, limit: int, cap: int, pause: float, + **fields: str) -> Iterator[dict[str, Any]]: + """Page through a query until it runs dry or the cap is reached. + + Used by the alias pull only. The name pull queries one country at a time + instead, because paging it with ORDER BY is what WDQS refuses. + """ + offset = 0 + while offset < cap: + query = template.format(limit=min(limit, cap - offset), offset=offset, **fields) + rows = _ask(query) + if not rows: + return + for row in rows: + yield {k: v["value"] for k, v in row.items()} + got = len(rows) + print(f" +{got:,} (offset {offset:,})", file=sys.stderr) + offset += got + if got < limit: + return + time.sleep(pause) + + +def pull_names(cap: int, limit: int, pause: float) -> list[dict[str, Any]]: + """Real given+family pairs, a country at a time. + + The pair is the point. A list of given names and a list of family names is + what the generator already has; what it cannot invent is which ones go + *together*, and that is exactly what P735 and P734 on one person record. + """ + seen: set[tuple[str, str, str]] = set() + out: list[dict[str, Any]] = [] + per_country = max(200, cap // max(len(COUNTRIES), 1)) + for iso, qid in COUNTRIES.items(): + if len(out) >= cap: + break + query = _NAMES.format(country=qid, limit=min(limit, per_country)) + try: + rows = _ask(query) + except Exception as exc: # one country failing must not lose the rest + print(f" {iso}: {type(exc).__name__}, skipped", file=sys.stderr) + continue + kept = 0 + for row in rows: + given = row.get("givenLabel", {}).get("value", "") + family = row.get("familyLabel", {}).get("value", "") + # An unlabelled entity comes back as its bare QID -- `Faith + # Q16870958`. Either half can be affected, and an earlier version + # of this filter only checked the given name. + if not given or not family or _is_qid(given) or _is_qid(family): + continue + key = (given, family, iso) + if key in seen: + continue + seen.add(key) + out.append({"given": given, "family": family, "country": iso}) + kept += 1 + print(f" {iso}: {kept:,} pairs", file=sys.stderr) + time.sleep(pause) + return out + + +def _is_qid(text: str) -> bool: + return text.startswith("Q") and text[1:].isdigit() + + +def pull_aliases(cap: int, limit: int, pause: float) -> list[dict[str, Any]]: + """Artists grouped by QID, with every English alternate name.""" + countries = " ".join(COUNTRIES.values()) + grouped: dict[str, dict[str, Any]] = {} + for row in _pages(_ALIASES, limit=limit, cap=cap, pause=pause, + countries=countries, occupations=MUSICIANS): + qid = row["artist"].rsplit("/", 1)[-1] + entry = grouped.setdefault(qid, { + "entity_id": qid, + "canonical": row.get("artistLabel", ""), + "country": row.get("countryLabel", ""), + "variants": [], + }) + alias = row.get("alias", "").strip() + if alias and alias != entry["canonical"] and alias not in entry["variants"]: + entry["variants"].append(alias) + # An entity with no variant teaches the ablation nothing. + return [e for e in grouped.values() if e["variants"] and e["canonical"]] + + +def main() -> int: + ap = argparse.ArgumentParser(description=__doc__.splitlines()[0]) + ap.add_argument("what", choices=("names", "aliases")) + ap.add_argument("--out", required=True) + ap.add_argument("--cap", type=int, default=40_000, help="stop after this many rows") + ap.add_argument("--limit", type=int, default=None, + help="rows per request (default: 1,000 for names, 5,000 for " + "aliases -- the name query carries two OPTIONALs and " + "WDQS drops it at larger page sizes)") + ap.add_argument("--pause", type=float, default=1.5, help="seconds between requests") + args = ap.parse_args() + + limit = args.limit or (1_000 if args.what == "names" else 5_000) + print(f" pulling {args.what} from Wikidata (CC0), cap {args.cap:,}, " + f"page {limit:,}", file=sys.stderr) + started = time.perf_counter() + rows = (pull_names if args.what == "names" else pull_aliases)( + args.cap, limit, args.pause) + + out = Path(args.out) + out.parent.mkdir(parents=True, exist_ok=True) + with out.open("w", encoding="utf-8", newline="\n") as fh: + for row in rows: + fh.write(json.dumps(row, ensure_ascii=False, sort_keys=True) + "\n") + + print(f" {len(rows):,} rows -> {out} ({time.perf_counter() - started:.0f}s)", + file=sys.stderr) + if args.what == "aliases": + variants = sum(len(r["variants"]) for r in rows) + print(f" {variants:,} variants across {len(rows):,} entities " + f"({variants / max(len(rows), 1):.1f} each)", file=sys.stderr) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/docs-site/docs/blog/index.md b/docs-site/docs/blog/index.md index e53045e..6d1ab21 100644 --- a/docs-site/docs/blog/index.md +++ b/docs-site/docs/blog/index.md @@ -6,6 +6,8 @@ The pieces that teach you to *use* arche moved to [Tutorials](../tutorials/intro ## Latest +- **[What a name list is worth](what-a-name-list-is-worth.md)**. Splink's author asked what an alias list actually buys. A world of real African artists, a rule that keeps the list and the truth apart, one alias in ten in the public data, and Splink pricing the list itself at +10.7 bits — with the cost in the collision column. + - **[The number we could not reproduce](the-number-we-could-not-reproduce.md)**. We went looking for the evidence behind our own headline result and it was not there. What we built instead disagreed with us three times, and the one we found and chose not to fix. - **[Similar is not the same](similar-is-not-the-same.md)**. Embeddings, Fellegi-Sunter, and what a machine has to know before it may merge two records. Plus where explicit vectors *do* belong: retrieval for agentic entity resolution. diff --git a/docs-site/docs/blog/what-a-name-list-is-worth.md b/docs-site/docs/blog/what-a-name-list-is-worth.md new file mode 100644 index 0000000..50ec070 --- /dev/null +++ b/docs-site/docs/blog/what-a-name-list-is-worth.md @@ -0,0 +1,177 @@ +# What a name list is worth + +*Splink's author asked us a question we had been answering by assertion. We built a world of real artists to measure it, found the two biggest public alias sources know one alternate name in ten, and let Splink price the list itself. By Dennis Irorere, September 2026.* + +--- + +`Wizkid` and `Ayodeji Ibrahim Balogun` are one person. So are `Burna Boy` and `Damini Ogulu`, `Tyla` and `Tyla Laura Seethal`. If you run a catalogue, a rights registry or a press archive, these pairs are in your data, and no edit distance, term-frequency weight or phonetic key will ever put them together. The strings share nothing that matters. The only thing that can pair them is a list that says they are the same. + +We have such lists. `datasets/artist_equivalences/` opens with the sentence *equivalence data buys recall, the frequency table buys precision, the gate keeps merges safe.* When Robin Linacre, who wrote [Splink](https://moj-analytical-services.github.io/splink/), saw that, he asked the obvious thing: run Splink over the same records with the list and without it, and say what the difference is. + +That claim had been in our repository for months and had never been measured. This post is the measurement. + +## Why the pair is unreachable, in Splink's own numbers + +It is worth being precise about *why* a stage name and a legal name cannot be linked by a string method, because "obviously" is not a number. + +Splink is a Fellegi-Sunter model. Every comparison level gets a weight, in bits, learned from the data by expectation-maximisation. On the world described below, the raw model learned these for the name: + +```text +exact match +10.8 bits +Jaro-Winkler >= 0.92 +10.3 +Jaro-Winkler >= 0.88 +8.7 +Jaro-Winkler >= 0.70 +7.1 +all other comparisons -6.7 +``` + +`Wizkid` against `Ayodeji Ibrahim Balogun` is "all other comparisons": minus 6.7 bits, against a prior of about minus 11. No threshold recovers that. And it never gets that far, because the pair is never proposed: blocking on the name and its prefix reaches 80.7% of the world's true pairs, and the missing fifth is almost entirely this kind. **Raw Splink finds 0 of the 2,016 pairs in the world whose names are below Jaro-Winkler 0.7 — at every threshold from 0.1 to 0.9.** + +That is the stratum a list exists for. The question is what a list does to it, and what it costs elsewhere. + +## The rule that makes the experiment honest + +If the list Splink is given comes from the same place as the answer key, "with list" wins by construction and the number means nothing. So the two are different sources, joined by identifier and never by name. + +The **truth** is Wikidata: 1,464 African musicians with the alternate names Wikidata records for them, CC0. The **list** is MusicBrainz: alias sets for the same artists, reached through Wikidata's `P434` property (the MusicBrainz id), plus our 38 curated groups. Two editorial communities, two opinions about what an artist is called. Where they disagree is where the experiment lives. + +Before any matcher ran, we measured how much of the truth the list knows: + +```text +truth: 1,464 alias groups, 3,503 name pairs +list : 449 groups (411 MusicBrainz, 38 curated) + +coverage of truth pairs 10.5% (367 / 3,503) + alias (not string-similar) 10.6% + spelling 10.0% + artist has a MusicBrainz id 18.2% + artist does not 0.2% +``` + +The chain of loss is short. 1,468 Wikidata artists; 727 carry a MusicBrainz id at all; 311 of those have no MusicBrainz aliases; 411 usable groups; one alias pair in ten. Alias and spelling coverage are the same, so the list is not preferentially missing the hard pairs. It is just thin. + +That number is a finding on its own, before Splink runs. **For African artists, the two largest public alias sources between them know about one alternate name in ten.** Anyone who says "just use MusicBrainz" has not counted. + +It also fixes the experiment's shape. A list that covers 10% of pairs can lift recall on them by at most about 10 points, whatever the matcher does. So there are two lists in the table, not one: the **independent** list you can actually get, and an **oracle** — the truth's own aliases, 100% coverage, leakage by construction and labelled as such. The oracle says what a *complete* list would be worth. The gap between the two arms is the value of building one. + +## The world + +Real names, invented catalogues. Every alias group is a real artist with Wikidata's alternate names for them; the crowd around them are real people's names from the same pull, one each. The generator decides which alias each of four sources writes — a streaming catalogue that prefers the stage name, a press archive that writes whatever the journalist used, a festival line-up in capitals, a rights registry that writes the legal name — and what it does to it: lost diacritics, a typo, a truncated field. It never decides what an artist is called. + +9,944 records of 2,941 artists, 15,171 true pairs, and every disagreement between two records of one artist labelled with why: `alias`, `spelling`, `case_upper`, `typo`. Twenty-eight pairs of *different* artists who genuinely share a name — found in the data, not made — are written to their own file, because that is where a list's cost will show. + +Source coverage and error rates are declared assumptions. Names, aliases and countries are public data. The manifest says which is which. + +## Six ways to give Splink a list + +Every arm is Splink 4.0.16. What changes is the list and how it is handed over. + +| arm | what Splink sees | +|---|---| +| **raw** | name and country, term frequency on. What a user runs today | +| **canon** | each name replaced by its list group's canonical form before Splink sees it | +| **level** | raw name kept; a `name_variants` array added and an `ArrayIntersect` comparison level placed between exact match and Jaro-Winkler, with its m and u estimated by EM like any other level | +| **both** | canonical name and the variant level | + +Each of `canon` and `level` runs with the independent list and with the oracle. The `level` arm is the one Robin would want, and the reason is in the table below: it lets Splink put its own price on the list rather than being made to trust it. + +The `level` configuration, in full: + +```python +import splink.comparison_level_library as cll +import splink.comparison_library as cl +from splink import SettingsCreator, block_on + +name = cl.CustomComparison( + output_column_name="name", + comparison_levels=[ + cll.NullLevel("name"), + cll.ExactMatchLevel("name").configure(tf_adjustment_column="name"), + cll.ArrayIntersectLevel("name_variants", min_intersection=1), # the list + cll.JaroWinklerLevel("name", 0.92), + cll.JaroWinklerLevel("name", 0.88), + cll.JaroWinklerLevel("name", 0.7), + cll.ElseLevel(), + ], +) +settings = SettingsCreator( + link_type="dedupe_only", + comparisons=[name, cl.ExactMatch("country")], + blocking_rules_to_generate_predictions=[ + block_on("name"), block_on("substr(name,1,4)"), + block_on("canonical"), # reach the pairs that share no prefix + ], +) +``` + +Blocking is part of the treatment. A pair that shares no prefix is never proposed unless something proposes it, and the list key is that something. That is not the harness helping the list; it is what a list is for, and the `block` column below says how much of each arm's recall was reachable at all. + +## The result + +Recall by stratum, each arm at its own best-F1 operating point. **`<0.7`** is the sub-stratum the post is about: 2,016 alias pairs below Jaro-Winkler 0.7 on the observed names. `coll.` is false merges on the 327 record pairs where two different artists share a name. + +| arm | p ≥ | prec | recall | F1 | false | coll. | **<0.7** | spelling | typo | block | +|---|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:| +| raw | 0.15 | 0.712 | 0.777 | 0.743 | 4,759 | 125 | **0.000** | 0.657 | 0.530 | 0.807 | +| canon / independent | 0.15 | 0.710 | 0.805 | 0.755 | 4,981 | 126 | **0.161** | 0.677 | 0.533 | 0.832 | +| level / independent | 0.15 | 0.719 | 0.805 | 0.759 | 4,769 | 131 | **0.141** | 0.710 | 0.530 | 0.831 | +| canon / oracle | 0.30 | 0.925 | 0.963 | **0.944** | 1,180 | 159 | **0.944** | 0.963 | 0.953 | 1.000 | +| level / oracle | 0.10 | 0.756 | 1.000 | 0.861 | 4,902 | 264 | **1.000** | 1.000 | 1.000 | 1.000 | + +`both` is not shown because it is `canon`: two records with intersecting variants always share a canonical form, so the exact level fires first and Splink reports the variant level as never observed. The full sweep at 0.1, 0.2, 0.3, 0.5 and 0.9 is in the result file beside the script. + +## What Splink thinks the list is worth + +This is the number we would quote if we could only quote one. + +With the variant level in the model, EM estimated the weight of "these two records' variant sets intersect" at **+10.7 bits**. An exact match on the name, in the same model, is +10.75. The same held for the independent list and the oracle. + +Nobody told Splink to trust the list. It looked at the data, saw which pairs the list asserted and how those pairs behaved on every other comparison, and concluded that a list-asserted alias is worth as much as the names being identical. That is a stronger endorsement of equivalence data than anything we have written, and it came from the model we were supposedly competing with. + +## What a list you can actually get is worth + +Less than that endorsement suggests, and for a reason that has nothing to do with the model. + +The independent list can reach 13.4% of the alias record pairs in the world. It recovers 14–16% of the `<0.7` stratum and lifts overall recall by 2.8 points at the same precision. One alias in ten in the list; one alias in ten recovered. There is no leverage in the inference. **The value is in the list**, and the list is thin. + +The oracle shows what the list would be worth if someone finished it: canon/oracle reaches F1 0.944 against raw's 0.743, and the `<0.7` stratum goes from nothing to 0.944. That 0.2 of F1 is the value of the curation work that turns a 10% list into a complete one, as one measured number. We think of it as the price of the asset. + +## What it costs + +The collision column. Raw Splink merges 125 of the 327 pairs where two different artists share a name. The independent list adds one to six. The complete list adds 34 with canonicalisation and 139 with the native level. + +A list that says the two `Tyla`s are one artist will merge two Tylas, and a complete list does that more often than a thin one, because it has more to say. The gain is real; so is this. Reporting one without the other is the failure mode we were trying to avoid. + +## Canonicalise first, or let Splink weigh it? + +At independent scale it hardly matters: F1 0.755 against 0.759. At oracle scale canonicalisation wins clearly, 0.944 against 0.861, and the reason is a detail worth knowing if you build one of these. + +The `ArrayIntersect` level carries no term-frequency adjustment. An alias hit on a *common* name is priced at the full +10.7 bits, while an exact hit on the same common name is discounted by how common it is. That makes the level arm more generous on exactly the names that collide — 264 collision merges against 159. Canonicalising first gets the adjustment for free, because the exact-match level already has one. A TF-adjusted variant level would close the gap; until Splink has one, canonicalise. + +## What this does not say + +**It is not a comparison of arche with Splink.** Every arm above is Splink. We ran our own artist pack once, for the record, and its F1 came out at 0.832 — above every non-oracle Splink arm — which is not the finding it looks like. The precision is refusal: it sent 13,883 pairs to review, nearly four times the number of true pairs in the world. The Splink arms were configured for this ablation, not tuned to win; a Jaro-Winkler 0.7 level that EM priced at +7 bits makes most of their false merges, and a Splink user would drop it. And each Splink arm's threshold was chosen on the labels where ours is the default. Splink wins [the four head-to-heads that matter](../reference/benchmarks.md), on real labels, and nothing here changes that. + +**The world is thin, and it shows.** Two fields make a steep model: the best operating points sit at 0.10–0.30, not 0.9, and an exact-name pair with no country on either side lands near p = 0.4. Comparisons between arms at a matched threshold are what the table supports. The absolute probabilities are a property of a world with two columns, and the first thing to do if this draws fire is a `v1` with a third column a real catalogue has. + +**These are musicians.** Stage names are the extreme case of the alias problem, which is why they were the right place to measure it and the wrong place to generalise from. Whether a variant list is worth +10.7 bits on Yoruba given names is a different experiment, and one we cannot run honestly yet: the African name-equivalence lists we hold are CC-BY-NC-SA, and there is no second public source of *Mohammed is Muhammad for this person* to keep the list and the truth apart. + +## Where this leaves us + +Three things we did not know in August. + +The public alias data for African artists is one-tenth complete, and where MusicBrainz knows more than Wikidata it is usually a legal name the other never recorded — 1,388 of the list's 1,755 pairs are outside the truth. That is the gap, and it is a data gap, not a modelling one. + +A trained Fellegi-Sunter model, given a list, prices it as highly as identical names. The argument for equivalence data does not need us to make it; Splink makes it from the data. + +And the value of a list is bounded by its coverage and paid for in collisions — both measurable, both measured, neither the number we would have guessed. + +The world that produced these numbers is a file contract, not a Python class: Parquet, a schema beside each table, a manifest with content fingerprints and provenance, no truth column in the file a matcher is given. Anyone with Splink, or Zingg, or a SQL prompt, can regenerate it and run their own recipe over it. That is what it is for. + +```sh +python -m arche_synthetic --world-pack artists_v0 --scale 10000 --out worlds/artists_v0 +uv run python datasets/artists_dataops/pull_musicbrainz.py # ~15 min, cached +uv run python datasets/artists_dataops/coverage.py # the 10.5% +uv run python datasets/artists_dataops/bench_splink_variants.py # ~2 min +``` + +Every number above comes out of those four commands. If one of them does not, that is the bug report we want. diff --git a/docs-site/docs/guides/school-reconciliation.md b/docs-site/docs/guides/school-reconciliation.md index 1512819..f078282 100644 --- a/docs-site/docs/guides/school-reconciliation.md +++ b/docs-site/docs/guides/school-reconciliation.md @@ -52,11 +52,27 @@ approach precision recall F1 false merges exact name (casefold) 0.992 0.876 0.930 2 token Jaccard >= 0.5 0.053 0.989 0.101 4,953 token_set_ratio >= 90 0.671 0.947 0.785 131 -arche, names only 0.651 0.986 0.784 149 +arche, names only 0.602 0.986 0.747 184 arche, name + coords 0.883 0.986 0.931 37 +Splink, p >= 0.9 0.989 0.986 0.988 3 ``` -Read that honestly. On F1 the shipped pack and plain exact matching are level here, because English school names are unusually standardised. What arche buys is recall: 0.986 against 0.876, which is 31 more true pairs found. If your two sources spell things identically, exact matching is a fine answer. +!!! note "Which frequency table these numbers came from" + + `shipped:place@sha256:c94f20a1c2dfba18+phrases@sha256:ed19b623d77407d3`. + Token rarity is a **blocking key** as well as a comparator input, so + rebuilding the table changes which pairs are proposed at all and moves the + counts even when no threshold did. The `arche, names only` row above read + 0.651 / 149 against the previous table and was corrected when this page + was re-measured; the `name + coords` row was unchanged at 278 / 37. + Coordinates carry the blocking there, so that arm is the less + table-sensitive of the two. + +Read that honestly, starting from the bottom row. **Splink wins.** Given the same two columns it finds *exactly the same 278 true pairs* arche does — the same set, not a similar count — and merges 3 things it should not where arche merges 37. Under the stricter rule that scores only labelled features it merges none at all. There is no recall story to tell against it here. + +Above that row: on F1 the shipped pack and plain exact matching are level, because English school names are unusually standardised. What arche buys over *exact matching* is recall, 0.986 against 0.876, which is 31 more true pairs found. If your two sources spell things identically, exact matching is a fine answer. + +The full sweep, what Splink said about each pair arche got wrong, and why the "needs labels to pick a threshold" argument does not apply on this data are in [the benchmarks page](../reference/benchmarks.md#splink-on-the-england-schools-crosswalk). The fuzzy rows show why one threshold cannot serve both directions. Loosening from exact to token overlap takes recall from 0.876 to 0.989 and turns 2 false merges into 4,953. diff --git a/docs-site/docs/reference/benchmarks.md b/docs-site/docs/reference/benchmarks.md index cfdd2e5..fd79cbd 100644 --- a/docs-site/docs/reference/benchmarks.md +++ b/docs-site/docs/reference/benchmarks.md @@ -139,10 +139,28 @@ What it establishes is narrower and, for a shipped library, more useful: **arche Because the alternative reading is available and should be stated: at `p >= 0.9` Splink also holds 0-2 false merges at every filler size. A higher threshold compensates for a thinner batch. But **choosing that threshold requires labels**, and a caller with 400 records to reconcile and no ground truth has no way to know that 0.5 is wrong for their data and 0.9 is right. The shipped prior removes that choice rather than winning an argument about it. -Run it with: +**Can the property be handed to Splink?** If the table is the moat, the question for an architecture that scores with Splink is whether Splink can *read* the table. Splink accepts a pre-computed term-frequency lookup in place of the one it counts from the batch, so `bench_population_tf_into_splink.py` registers one built from the full register — 98,591 distinct names, the most favourable population possible — and re-runs the same labels: + +| filler | arm | true | false at p ≥ 0.9 | false at p ≥ 0.5 | +| ---: | --- | ---: | ---: | ---: | +| 0 | Splink, batch TF | 190 | 2 | 368 | +| 0 | **Splink, population TF** | 190 | **364** | 368 | +| 0 | arche | 146 | 2 | — | +| 500 | Splink, batch TF | 190 | 0 | 2 | +| 500 | Splink, population TF | 190 | 13 | 13 | +| 2,000 | Splink, population TF | 190 | 12 | 13 | + +**It does not transfer, and it gets worse.** Two things the run exposed, both of them about mechanism rather than about Splink. + +First, the negatives are pairs of schools that share a name across a state line, and many of those names are *rare in the register* — `Mercy Nursery Primary School` occurs five times in 107,670. Value-level term frequency does what it should with that: it boosts an exact match on a rare value, here by a factor of 22.9, and two different schools with one rare name merge at p = 0.97. arche does not, because its table is per *token* — `mercy`, `nursery`, `primary`, `school` are each common — and because a geo veto refutes a pair a state apart without needing to be trained. The small-batch property is not "a population prior"; it is token-level rarity plus a veto, and neither is expressible as a Splink TF lookup. + +Second, and a caveat on the table above this one: **at filler 0 the Splink model's name levels are untrained.** EM on the coordinate rule sees only the constructed positives, whose names differ by construction, so Splink reports *"Exact match on name … not observed, unable to train m value"* and predicts with defaults. The 368 is real behaviour of the published recipe on a 1,200-record batch, and it is default-m plus a batch TF that is identical for every name (each appears exactly twice), not a trained model's opinion. + +Run both with: ```sh uv run python datasets/names_dataops/bench_population_vs_batch.py +uv run python datasets/names_dataops/bench_population_tf_into_splink.py ``` **One caveat on the harness.** It builds four Splink models in one process. At filler 12,000 the `p >= 0.9` arm returned 1 true where the standalone `bench_splink_nigeria.py` reproduces 190 exactly, byte for byte. The `p >= 0.5` arm is stable across repeated runs at every size, so the ranking is reproducible and the absolute probability calibration at that size is not. The figures quoted above are from `p >= 0.5` for that reason, and the discrepancy is unexplained rather than diagnosed. @@ -205,9 +223,50 @@ That split is worth stating plainly because the two have different meanings. Blo Script: `datasets/names_dataops/bench_sweep_historical.py`. arche is run with `threshold=0.0, review_margin=0.0` so the curve is limited by blocking rather than by the default decision point. That is not a production setting; it exists to separate "scored badly" from "never seen". +### Splink, on the England schools crosswalk + +The three Splink sections above are all **dedupe** problems, and two of the three use labels somebody constructed. This one is neither. It is a **link** between two registers that do not share an identifier, which is the shape most reconciliation work actually has, and the labels were not made for it: 93% of Leeds OpenStreetMap school features carry a `ref:edubase` tag, which is an editor asserting *this mapped school is that URN*. Neither engine sees the tag. + +306 GIAS establishments, 308 OSM features, 282 truth pairs. Splink runs `link_type="link_only"`; arche runs `reconcile(..., entity="place")` with the shipped pack, unretuned. Both get name and coordinates, and the same string baselines from the [schools guide](../guides/school-reconciliation.md) are repeated so the table stands alone. + +The guide's scoring rule counts any predicted pair outside the truth set as a false merge, and 26 OSM features carry no label at all, so a correct link to one of those is scored as an error. That rule is kept, because it is the one the guide's table uses. **Restricted** is reported beside it: only pairs whose OSM feature carries a label are scored, so a false merge there is a merge of two things an editor said were different. Neither rule is the right one; they bound the answer from both sides. + +| approach | precision | recall | F1 | true | false | restricted false | +| --- | ---: | ---: | ---: | ---: | ---: | ---: | +| exact name (casefold) | 0.992 | 0.876 | 0.930 | 247 | 2 | 0 | +| token Jaccard >= 0.5 | 0.053 | 0.989 | 0.101 | 279 | 4,953 | 4,882 | +| `token_set_ratio` >= 90 | 0.671 | 0.947 | 0.785 | 267 | 131 | 122 | +| arche, name + coords | 0.883 | 0.986 | 0.931 | 278 | 37 | 32 | +| Splink, p >= 0.5 | 0.982 | 0.986 | 0.984 | 278 | 5 | 2 | +| **Splink, p >= 0.9** | **0.989** | **0.986** | **0.988** | **278** | **3** | **0** | +| Splink, p >= 0.99 | 0.995 | 0.777 | 0.873 | 219 | 1 | 0 | + +**Splink wins the fourth one too, and this is the cleanest loss of the four.** Both engines find **exactly the same 278 true pairs** — not a similar number, the same set. Neither finds one the other misses, and the four they both miss are the same four. Recall is identical to three decimal places. The entire difference is false merges: 32 against 0 under the restricted rule. + +So on this dataset the representation argument has nothing to point at on the recall side, and loses on the precision side. + +**Where arche's 32 go, and what Splink said about them.** Nineteen are one academy chain: + +```text +Co-op Academy Woodlands x Co-op Academy Leeds arche: match splink: p=0.022 +Co-op Academy Leeds x Co-op Academy Nightingale arche: match splink: never proposed +Hunslet Moor Primary x Hunslet Carr Primary arche: match splink: p=0.172 +Corpus Christi College x Corpus Christi Primary arche: match splink: p=0.813 +``` + +Splink **proposed 17 of the 32** and scored every one of them below 0.9; it never proposed the other 15. So this is not blocking luck. A trained Fellegi-Sunter model looked at the same pairs arche merged and put them at 0.022 to 0.813, and the highest of them — a Catholic college and a Catholic primary school sharing a saint's name — is still the pair a human would want to see rather than merge. + +**The threshold-fragility argument does not rescue it here.** On the Nigerian register the comparison turned on Splink needing a threshold a caller cannot choose without labels. Not on this data: Splink beats arche at **every** threshold from 0.1 to 0.95, and only cliffs at 0.99. Its default operating point is already ahead. + +**Two things this does not say.** It does not say the place pack is badly built; 0.986 recall on a country and an entity type away from where it was calibrated is the part that transfers. And the 32 are a known, named failure mode — chain branding, where a shared prefix is two thirds of every name and the campuses are close enough that coordinates do not settle it. The guide surfaced that family from a UKPRN audit before Splink was ever run here. What this section adds is that a well-trained probabilistic model does not fall for it. + +**Caveats.** Leeds only, 306 establishments: one local authority, and one with unusually standardised school naming — exact name matching already reaches F1 0.930 here. The `names only` arms are not like-for-like and are reported in the result file rather than above: a one-comparison Splink model cannot be EM-trained at all (blocking on the only comparison leaves it no variation, and blocking on a prefix of it raises inside Splink's own counting SQL), so that arm predicts with default `m` values and tops out at p = 0.607. Splink's `estimate_u_using_random_sampling` is unseeded, but unlike the Febrl arm this one reproduced exactly across runs. + +Script: `datasets/names_dataops/bench_splink_england_schools.py`. Stage the sources first with `python data/scripts/fetch_england_schools.py --la Leeds`. + ### arche using Splink, rather than against it -The three sections above measure arche's own matcher against Splink and it loses all three. `reconcile(backend="splink")` is the response: hand the scoring to Splink and keep the decision layer arche puts around a score. +The five Splink sections above measure arche's own matcher against Splink; it loses four and wins the product one, for a reason that is about declaration rather than estimation. `reconcile(backend="splink")` is the response: hand the scoring to Splink and keep the decision layer arche puts around a score. The question a benchmark can answer about an adapter is not "is it better" but "is it faithful". Does wrapping the scorer change what the scorer says? @@ -243,6 +302,30 @@ Same edges, same order, three different answers, straddling arche's own engine a Scripts: `datasets/names_dataops/bench_backend_compare.py`. +### Splink, on Abt-Buy + +The fifth Splink comparison, and the first on products. Abt-Buy is the labelled product benchmark the resolver gates in CI: 1,081 Abt records against 1,092 Buy records, 1,097 true pairs, product names only (`description` and Buy's `manufacturer` withheld so the evidence matches the gated arche arm). + +Splink cannot compare a model code it has not been given, so arche's representation runs first — `extract_product_code_candidates` pulls `pslx350h` out of `Sony Turntable - PSLX350H`, `extract_specs` pulls `500gb` out of a drive — and Splink is handed the columns. Two recipes, because the contrast between them is the result: + +- **descriptive**: everything extracted (code, brand, specs) *plus* the title itself as Jaro-Winkler and token-overlap comparisons. What a Splink user would write. +- **identity**: only the columns the pack declares identity-bearing — code and brand — with title similarity withheld from the model entirely. + +| arm | precision | recall | F1 | true | false | +| --- | ---: | ---: | ---: | ---: | ---: | +| arche `product_electronics`, gated, no threshold | 0.971 | 0.675 | 0.797 | 741 | 22 | +| Splink, descriptive, best F1 (p ≥ 0.80, chosen on labels) | 0.407 | 0.788 | 0.537 | 864 | 1,256 | +| Splink, identity, p ≥ 0.5 | 0.937 | 0.667 | 0.780 | 732 | 49 | +| Splink, identity, best F1 (p ≥ 0.35, chosen on labels) | 0.938 | 0.675 | 0.785 | 740 | 49 | + +**arche wins this one, and the reason is not the estimator.** Given only the identity columns, Splink lands at arche's recall to within one pair (740 against 741) with more than twice the false merges (49 against 22). Given the title as well — the natural thing to do — it collapses to precision 0.41, because EM cannot tell *same product* from *same brand, same kind of product, similar title*, and the learned weights show it doing exactly that: the same shared-code level is worth **+10.05 bits** in the identity model and **+6.08** in the descriptive one, and "no shared code" goes from **−4.13** to **−0.09** — neutral. Adding descriptive similarity taught the model to stop caring about the identifier. + +That is the point the product pack makes by declaration: which field carries identity is not something an unsupervised estimator can learn from titles, because titles are similar for reasons that have nothing to do with identity. Splink scores the columns it is given; deciding which columns to give it, and which to withhold, was the whole difference between 0.537 and 0.785. + +**The two invariants do not survive inside the model.** The gate holds that on Abt-Buy the spec refutation is neutral and the electronics stop list is inert. In the learned identity model, dropping the spec comparison moves 9 pairs at the same threshold (+3 / −6) and emptying the stop list adds 67 merges; in the descriptive model the numbers are +75 / −2 and +18 / −45. EM priced "both carry a spec and share none" at −4.86 bits in one model and −1.42 in the other: a refutation whose strength depends on what else was in the model, not a guarantee. A guarantee has to sit outside the estimator. + +Script: `datasets/products_dataops/bench_splink_abt_buy.py`, ~50 s for both recipes and their ablations. + ### Python `recordlinkage`, Febrl 4 Febrl 4 is synthetic, 5,000 by 5,000, with complete truth, distributed with the [`recordlinkage`](https://github.com/J535D165/recordlinkage) package. arche claimed precision 1.0000 with 87.7% auto-resolved from v0.1 onwards. The benchmark reproduces that claim exactly, and shows what it depends on: diff --git a/examples/notebooks/24_is_the_synthetic_world_realistic.ipynb b/examples/notebooks/24_is_the_synthetic_world_realistic.ipynb new file mode 100644 index 0000000..d0e24d8 --- /dev/null +++ b/examples/notebooks/24_is_the_synthetic_world_realistic.ipynb @@ -0,0 +1,503 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Is the synthetic world realistic enough to measure on?\n", + "\n", + "**51,023 real Nigerian facility names against a generated supplier world.**\n", + "\n", + "`data/synthetic` generates suppliers, ages them, observes them through three\n", + "source systems, and labels every disagreement by *why* it happened. Numbers\n", + "measured on it are published in `data/synthetic/RESULTS.md`. This notebook asks\n", + "the question that comes before any of those numbers: **is the generated world\n", + "enough like a real one that a matcher's score on it tells you anything?**\n", + "\n", + "It is written to **falsify**. Each hypothesis below states what result would\n", + "refute it, before the result is computed. That matters here more than usual:\n", + "the same benchmark has already had three claims withdrawn after a seed sweep\n", + "showed they sat inside the noise, and a notebook built to confirm a hypothesis\n", + "will confirm it.\n", + "\n", + "| | hypothesis | refuted if |\n", + "|---|---|---|\n", + "| **H1** | Generated company names have a token vocabulary as rich as real ones | generated type/token ratio is close to real |\n", + "| **H2** | Name collisions in the generated world are as common as in real data | collision rates are within a factor of two |\n", + "| **H3** | Generated names carry regional signal, the way real names do | generated tokens are as regionally marked as real ones |\n", + "\n", + "H1 and H2 are stated in the direction we *expect to fail*, so that confirming\n", + "them would be the surprise. H3 tests the defect Robin Linacre identified — that\n", + "our names are drawn without correlation — against real data rather than by\n", + "assertion." + ] + }, + { + "cell_type": "code", + "metadata": {}, + "source": [ + "from __future__ import annotations\n", + "\n", + "import collections\n", + "import csv\n", + "import math\n", + "import random\n", + "import sys\n", + "from pathlib import Path\n", + "\n", + "REPO = Path.cwd()\n", + "while not (REPO / \"data\" / \"synthetic\").exists() and REPO != REPO.parent:\n", + " REPO = REPO.parent\n", + "sys.path.insert(0, str(REPO / \"data\" / \"synthetic\"))\n", + "sys.path.insert(0, str(REPO / \"packages\" / \"arche-core\" / \"src\"))\n", + "\n", + "GRID3 = REPO / \"data\" / \"GRID3_NGA_health_facilities_v2.csv\"\n", + "print(\"repo:\", REPO)\n", + "print(\"real data present:\", GRID3.exists())" + ], + "outputs": [], + "execution_count": null + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## The real data\n", + "\n", + "GRID3's Nigerian health facility register. Not suppliers — but real Nigerian\n", + "**organisation names**, recorded by many hands over many years, with the state\n", + "and local government area attached. That last column is what makes the\n", + "correlation test possible: it lets us ask whether a name predicts where it is." + ] + }, + { + "cell_type": "code", + "metadata": {}, + "source": [ + "with open(GRID3, encoding=\"utf-8-sig\") as fh:\n", + " real = [\n", + " {\"name\": r[\"facility_name\"].strip(), \"state\": r[\"state\"].strip(),\n", + " \"lga\": r[\"lga\"].strip()}\n", + " for r in csv.DictReader(fh)\n", + " if r.get(\"facility_name\", \"\").strip()\n", + " ]\n", + "\n", + "print(f\"{len(real):,} real facility names, {len({r['state'] for r in real})} states\")\n", + "for r in real[:6]:\n", + " print(f\" {r['name']:<48} {r['state']}\")" + ], + "outputs": [], + "execution_count": null + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## The generated data\n", + "\n", + "The same generator that produced the worlds in `data/synthetic/worlds/`. We\n", + "take the **true** company names rather than the observed ones: the observations\n", + "carry deliberate typos and OCR damage, and comparing those against a clean\n", + "register would measure the corruption engine rather than the naming model." + ] + }, + { + "cell_type": "code", + "metadata": {}, + "source": [ + "from arche_synthetic import build\n", + "\n", + "world, _ = build(\"ng_supplier_v0\", seed=42,\n", + " scale={\"organisations\": 2000, \"people\": 3000, \"places\": 1500})\n", + "\n", + "generated = [\n", + " {\"name\": world.current(e.entity_id).attributes[\"legal_name\"],\n", + " \"city\": world.current(\n", + " world.current(e.entity_id).attributes[\"place_id\"]).attributes[\"city\"]}\n", + " for e in world.of_type(\"organisation\")\n", + "]\n", + "\n", + "print(f\"{len(generated):,} generated company names\")\n", + "for g in generated[:6]:\n", + " print(f\" {g['name']:<48} {g['city']}\")" + ], + "outputs": [], + "execution_count": null + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## H1 — how rich is the naming vocabulary?\n", + "\n", + "A real register accumulates names from thousands of independent naming\n", + "decisions. Ours composes them from ` ` over 18 trades\n", + "and 10 legal forms. The **type/token ratio** — distinct words divided by total\n", + "words — measures that directly.\n", + "\n", + "*Refuted if the generated ratio is close to the real one.*" + ] + }, + { + "cell_type": "code", + "metadata": {}, + "source": [ + "def tokens(name: str) -> list[str]:\n", + " return [t for t in \"\".join(c if c.isalnum() else \" \" for c in name).lower().split()\n", + " if len(t) > 1]\n", + "\n", + "\n", + "def vocabulary(names: list[str]) -> dict:\n", + " counted = collections.Counter(t for n in names for t in tokens(n))\n", + " total = sum(counted.values())\n", + " return {\"names\": len(names), \"tokens\": total, \"distinct\": len(counted),\n", + " \"ratio\": len(counted) / total, \"top\": counted.most_common(8)}\n", + "\n", + "\n", + "real_v = vocabulary([r[\"name\"] for r in real])\n", + "gen_v = vocabulary([g[\"name\"] for g in generated])\n", + "\n", + "print(f\"{'':<12}{'names':>8}{'tokens':>9}{'distinct':>10}{'type/token':>12}\")\n", + "for label, v in ((\"real\", real_v), (\"generated\", gen_v)):\n", + " print(f\"{label:<12}{v['names']:>8,}{v['tokens']:>9,}{v['distinct']:>10,}\"\n", + " f\"{v['ratio']:>12.4f}\")\n", + "print()\n", + "print(\"most common tokens\")\n", + "for label, v in ((\"real\", real_v), (\"generated\", gen_v)):\n", + " print(f\" {label:<10}\", \", \".join(f\"{t}({c:,})\" for t, c in v[\"top\"]))" + ], + "outputs": [], + "execution_count": null + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Reading H1 — not refuted, but not for the reason first assumed\n", + "\n", + "Type/token is 0.164 real against 0.113 generated, and the top tokens show what\n", + "kind of difference it is. Real names are built from a **descriptive**\n", + "vocabulary — `health`, `center`, `primary`, `clinic`, `post`, `hospital`,\n", + "`maternity`. Ours are built from a **legal-form** vocabulary — `limited`,\n", + "`nigeria`, `enterprises`, `sons`. A real register names the thing; ours names\n", + "the company wrapper.\n", + "\n", + "**A first attempt at a fairer measure got this backwards and is worth\n", + "recording.** Counting how many tokens are *common* — appearing in at least\n", + "0.1%, 0.5%, 2% of names — says generated has **more** of them (243 against 130\n", + "at the 0.1% mark). That is true and it is not richness: with eighteen trade\n", + "words and ten legal forms, every one of ours appears constantly, while real\n", + "vocabulary is spread thin across tens of thousands of settlement names and\n", + "one-off descriptors. Concentration read as richness because the statistic was\n", + "chosen before the shape of the data was understood.\n", + "\n", + "The cell below fixes it by comparing at **matched sample size**, which is what\n", + "vocabulary comparisons require: vocabulary grows with the number of documents\n", + "(Heaps' law), so 51,022 names will always out-vocabulary 2,000.\n", + "\n", + "At 2,000 names each, real draws **2,429 distinct tokens** (2,402-2,446 over five\n", + "samples) against the generator's **877** — 2.8x. And the shape says where the\n", + "difference lives:\n", + "\n", + "| token appears in | real | generated |\n", + "|---|---:|---:|\n", + "| 1 name | 2,102 | 634 |\n", + "| 2-9 names | 285 | 190 |\n", + "| 10+ names | 29 | **53** |\n", + "\n", + "Real vocabulary is **dispersed** — a long tail of settlement names and one-off\n", + "descriptors, three times larger than ours. Ours is **concentrated** — fewer\n", + "distinct words, each repeating far more often, which is why the naive\n", + "common-token count flattered it. H1 stands.\n", + "\n", + "The consequence for the benchmark is specific. A blocker keyed on name tokens\n", + "sees far fewer distinct keys in our world than in a real one, so blocks are\n", + "larger and blocking looks worse than it would on a real register. `RESULTS.md`\n", + "carries that as a caveat; this is the measurement behind it." + ] + }, + { + "cell_type": "code", + "metadata": {}, + "source": [ + "# Matched sample size. The real set is 26x larger, and vocabulary grows with\n", + "# sample size (Heaps' law), so comparing 51,022 names against 2,000 measures\n", + "# the sample, not the naming model. Draw the same number from each.\n", + "rng = random.Random(0)\n", + "real_names = [r[\"name\"] for r in real]\n", + "gen_names = [g[\"name\"] for g in generated]\n", + "n = len(gen_names)\n", + "\n", + "trials = [len({t for name in rng.sample(real_names, n) for t in tokens(name)})\n", + " for _ in range(5)]\n", + "gen_distinct = len({t for name in gen_names for t in tokens(name)})\n", + "\n", + "print(f\"at n = {n:,} names each:\")\n", + "print(f\" real {sum(trials) / len(trials):>8,.0f} distinct tokens \"\n", + " f\"(5 draws: {min(trials):,}-{max(trials):,})\")\n", + "print(f\" generated {gen_distinct:>8,} distinct tokens\")\n", + "print(f\" ratio {sum(trials) / len(trials) / gen_distinct:>8.1f}x\")\n", + "\n", + "# Where the difference sits: the tail, or the common words?\n", + "def band(names, lo, hi):\n", + " c = collections.Counter(t for name in names for t in set(tokens(name)))\n", + " return sum(1 for _, v in c.items() if lo <= v < hi)\n", + "\n", + "\n", + "sample = rng.sample(real_names, n)\n", + "print()\n", + "print(f\"{'token appears in':<22}{'real':>8}{'generated':>12}\")\n", + "for lo, hi in ((1, 2), (2, 10), (10, 10**9)):\n", + " label = \"1 name\" if hi == 2 else (f\"{lo}-{hi - 1} names\" if hi < 10**9\n", + " else f\"{lo}+ names\")\n", + " print(f\"{label:<22}{band(sample, lo, hi):>8,}{band(gen_names, lo, hi):>12,}\")" + ], + "outputs": [], + "execution_count": null + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## H2 — are name collisions as common as in real data?\n", + "\n", + "The `common_names` stratum exists because a name that many entities share is\n", + "weak evidence. If our collision rate is far from the real one, that stratum is\n", + "measuring a difficulty that does not exist.\n", + "\n", + "*Refuted if the two rates land within a factor of two.*" + ] + }, + { + "cell_type": "code", + "metadata": {}, + "source": [ + "def collision_rate(names: list[str]) -> tuple[float, list]:\n", + " norm = [\" \".join(tokens(n)) for n in names]\n", + " counted = collections.Counter(norm)\n", + " shared = sum(c for c in counted.values() if c > 1)\n", + " return shared / len(norm), counted.most_common(5)\n", + "\n", + "\n", + "real_rate, real_top = collision_rate([r[\"name\"] for r in real])\n", + "gen_rate, gen_top = collision_rate([g[\"name\"] for g in generated])\n", + "\n", + "print(f\"real exact-name collisions: {real_rate:6.1%}\")\n", + "print(f\"generated exact-name collisions: {gen_rate:6.1%}\")\n", + "print()\n", + "print(\"real, most repeated: \", \", \".join(f\"{n!r}x{c}\" for n, c in real_top[:3]))\n", + "print(\"generated, most repeated:\", \", \".join(f\"{n!r}x{c}\" for n, c in gen_top[:3]))" + ], + "outputs": [], + "execution_count": null + }, + { + "cell_type": "code", + "metadata": {}, + "source": [ + "# Head-token collisions: how often two organisations share their first word.\n", + "def head_rate(names: list[str]) -> float:\n", + " heads = collections.Counter(tokens(n)[0] for n in names if tokens(n))\n", + " return sum(c for c in heads.values() if c > 1) / sum(heads.values())\n", + "\n", + "\n", + "print(f\"real share a head token: {head_rate([r['name'] for r in real]):6.1%}\")\n", + "print(f\"generated share a head token: {head_rate([g['name'] for g in generated]):6.1%}\")" + ], + "outputs": [], + "execution_count": null + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Reading H2 — refuted, which is the good outcome\n", + "\n", + "12.0% real against 13.5% generated on exact name collisions, and 61.4% against\n", + "68.7% on the head token. Both well inside the factor of two that was set in\n", + "advance as the refutation condition, so **H2 is refuted: the collision *rate*\n", + "is realistic.** The Zipf surname draw is doing its job.\n", + "\n", + "That is necessary for the `common_names` stratum to mean anything, and it is\n", + "not sufficient. A rate can be right while the collisions are the wrong *kind*.\n", + "H3 is the sufficiency test." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## H3 — do names carry regional signal?\n", + "\n", + "This is the important one. In real data a name predicts where it is: Hausa\n", + "naming in Kano, Yoruba in Oyo, and facility words that travel with them. Our\n", + "generator draws a surname from a global pool and a city independently, so a\n", + "generated name should predict its city no better than chance.\n", + "\n", + "The measure: for each frequent token, how concentrated is its distribution over\n", + "regions, compared with the baseline distribution of regions? A token that\n", + "appears three times more often in one region than the baseline is\n", + "**regionally marked**.\n", + "\n", + "*Refuted if generated tokens are as regionally marked as real ones.*" + ] + }, + { + "cell_type": "code", + "metadata": {}, + "source": [ + "def regional_marking(rows: list[dict], key: str, min_count: int = 20) -> dict:\n", + " baseline = collections.Counter(r[key] for r in rows)\n", + " total = sum(baseline.values())\n", + " per_token: dict[str, collections.Counter] = collections.defaultdict(\n", + " collections.Counter)\n", + " for r in rows:\n", + " for t in set(tokens(r[\"name\"])):\n", + " per_token[t][r[key]] += 1\n", + "\n", + " marked, examined, best = 0, 0, []\n", + " for token, dist in per_token.items():\n", + " n = sum(dist.values())\n", + " if n < min_count:\n", + " continue\n", + " examined += 1\n", + " region, count = dist.most_common(1)[0]\n", + " lift = (count / n) / (baseline[region] / total)\n", + " if lift >= 3.0:\n", + " marked += 1\n", + " best.append((token, region, round(lift, 1), n))\n", + " best.sort(key=lambda x: -x[2])\n", + " return {\"examined\": examined, \"marked\": marked,\n", + " \"share\": marked / examined if examined else 0.0, \"top\": best[:6]}\n", + "\n", + "\n", + "real_m = regional_marking(real, \"state\")\n", + "gen_m = regional_marking(generated, \"city\")\n", + "\n", + "print(f\"{'':<12}{'tokens examined':>17}{'regionally marked':>20}{'share':>9}\")\n", + "for label, m in ((\"real\", real_m), (\"generated\", gen_m)):\n", + " print(f\"{label:<12}{m['examined']:>17,}{m['marked']:>20,}{m['share']:>9.1%}\")\n", + "print()\n", + "for label, m in ((\"real\", real_m), (\"generated\", gen_m)):\n", + " print(f\"{label} — most regionally marked tokens:\")\n", + " print(\" \", m[\"top\"] if m[\"top\"] else \"(none)\")" + ], + "outputs": [], + "execution_count": null + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Reading H3 — not refuted, and the gap is total\n", + "\n", + "**90.4% of real tokens are regionally marked (367 of 406). 0.0% of generated\n", + "tokens are (0 of 40).** Not a difference of degree. The generator has no\n", + "regional structure whatsoever, which is what independent draws produce and\n", + "what Robin Linacre predicted from reading the design.\n", + "\n", + "Two honest qualifications, neither of which rescues the generator:\n", + "\n", + "- **Some real marks are circular.** `ekiti` is marked 64x for Ekiti because\n", + " facilities are often named after where they are. Discount those and the\n", + " signal survives in the ones that are not place names: `akpan` at 49x for Akwa\n", + " Ibom is an Ibibio surname, `afaha` at 55x is an Ibibio settlement prefix.\n", + " Real names carry linguistic origin, not just an address.\n", + "- **Only 40 generated tokens cleared the 20-occurrence floor**, against 406\n", + " real ones — itself the H1 finding. But the share is 0 of 40, not 1 or 2 of\n", + " 40, so thinness is not hiding a weak signal.\n", + "\n", + "This is the defect measured rather than asserted, and it is the number to watch\n", + "after N1 lands." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## The same thing, by eye\n", + "\n", + "Real African person names, from the artist equivalence data — these are actual\n", + "people, so the two halves of each name belong together. Next to them, names\n", + "this generator produces." + ] + }, + { + "cell_type": "code", + "metadata": {}, + "source": [ + "import yaml\n", + "\n", + "from arche_synthetic.world import Names\n", + "\n", + "real_people = []\n", + "for f in sorted((REPO / \"datasets\" / \"artist_equivalences\").glob(\"*.yaml\")):\n", + " doc = yaml.safe_load(f.read_text(encoding=\"utf-8\"))\n", + " for group in doc.get(\"groups\", []):\n", + " for value in [group[\"canonical\"], *group.get(\"variants\", [])]:\n", + " if value.count(\" \") == 2 and all(w[:1].isupper() for w in value.split()):\n", + " real_people.append(value)\n", + "\n", + "names = Names(random.Random(42))\n", + "generated_people = [names.person() for _ in range(10)]\n", + "\n", + "print(f\"{'real (artist legal names)':<34}generated\")\n", + "for a, b in zip(real_people[:10], generated_people, strict=False):\n", + " print(f\"{a:<34}{b}\")" + ], + "outputs": [], + "execution_count": null + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## What this means for the published numbers\n", + "\n", + "Nothing here changes a measured result. What it changes is which results can be\n", + "**generalised**, and that distinction is the whole point of running it.\n", + "\n", + "Safe to generalise — these depend on the *labels*, which are correct by\n", + "construction, not on the naming model:\n", + "\n", + "- **Every engine that reads the address fails on relocated suppliers**, while\n", + " the one that ignores the address does not. The mechanism is the address\n", + " comparator, and no amount of naming realism changes it.\n", + "- **The ledger recovers legitimate change that batch comparison refuses**\n", + " (`change` stratum +0.115 / +0.162 / +0.120 across three paired worlds).\n", + "\n", + "Not safe to generalise — these depend on the naming model this notebook has\n", + "just measured:\n", + "\n", + "- **Anything from the `common_names` stratum.** The *rate* is realistic (H2\n", + " refuted, 13.5% against 12.0%) but the *structure* is not (H3, 0.0% against\n", + " 90.4% regionally marked). A matcher that exploits regional coherence — and a\n", + " human reviewer certainly does — has nothing to exploit here.\n", + "- **Blocking numbers.** H1: a descriptive vocabulary of eighteen trade words\n", + " against a real register's hundreds makes token blocks much larger than they\n", + " would be in the field.\n", + "- **Absolute recall on any arm.** Ordering survives; the level does not.\n", + "\n", + "The fixes are already named in the plan: **N1** correlated names\n", + "(`P(given | region, era)` derived from ParaNames/Wikidata language and script\n", + "tags) and **N2** a rename that changes the distinctive head rather than the\n", + "legal form. This notebook is the before; re-running it after N1 is how we will\n", + "know the fix worked, and the `regionally marked` share is the number to watch.\n", + "\n", + "Re-run with `python examples/notebooks/build_24.py` after any generator change." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "name": "python" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/notebooks/build_24.py b/examples/notebooks/build_24.py new file mode 100644 index 0000000..58f65ae --- /dev/null +++ b/examples/notebooks/build_24.py @@ -0,0 +1,478 @@ +# Copyright 2026 unpatterned.org +# SPDX-License-Identifier: Apache-2.0 +"""Generate 24_is_the_synthetic_world_realistic.ipynb. + + python examples/notebooks/build_24.py + +Holds the generated supplier world up against 51,023 real Nigerian facility +names and asks whether it is realistic enough for the numbers measured on it +to mean anything. Written to falsify: each hypothesis states in advance what +result would refute it. +""" +from __future__ import annotations + +import json +from pathlib import Path + +MD, CODE = "markdown", "code" +cells: list[tuple[str, str]] = [] +md = lambda t: cells.append((MD, t.strip("\n"))) # noqa: E731 +code = lambda t: cells.append((CODE, t.strip("\n"))) # noqa: E731 + + +# 1 +md(""" +# Is the synthetic world realistic enough to measure on? + +**51,023 real Nigerian facility names against a generated supplier world.** + +`data/synthetic` generates suppliers, ages them, observes them through three +source systems, and labels every disagreement by *why* it happened. Numbers +measured on it are published in `data/synthetic/RESULTS.md`. This notebook asks +the question that comes before any of those numbers: **is the generated world +enough like a real one that a matcher's score on it tells you anything?** + +It is written to **falsify**. Each hypothesis below states what result would +refute it, before the result is computed. That matters here more than usual: +the same benchmark has already had three claims withdrawn after a seed sweep +showed they sat inside the noise, and a notebook built to confirm a hypothesis +will confirm it. + +| | hypothesis | refuted if | +|---|---|---| +| **H1** | Generated company names have a token vocabulary as rich as real ones | generated type/token ratio is close to real | +| **H2** | Name collisions in the generated world are as common as in real data | collision rates are within a factor of two | +| **H3** | Generated names carry regional signal, the way real names do | generated tokens are as regionally marked as real ones | + +H1 and H2 are stated in the direction we *expect to fail*, so that confirming +them would be the surprise. H3 tests the defect Robin Linacre identified — that +our names are drawn without correlation — against real data rather than by +assertion. +""") + +# 2 +code(""" +from __future__ import annotations + +import collections +import csv +import math +import random +import sys +from pathlib import Path + +REPO = Path.cwd() +while not (REPO / "data" / "synthetic").exists() and REPO != REPO.parent: + REPO = REPO.parent +sys.path.insert(0, str(REPO / "data" / "synthetic")) +sys.path.insert(0, str(REPO / "packages" / "arche-core" / "src")) + +GRID3 = REPO / "data" / "GRID3_NGA_health_facilities_v2.csv" +print("repo:", REPO) +print("real data present:", GRID3.exists()) +""") + +# 3 +md(""" +## The real data + +GRID3's Nigerian health facility register. Not suppliers — but real Nigerian +**organisation names**, recorded by many hands over many years, with the state +and local government area attached. That last column is what makes the +correlation test possible: it lets us ask whether a name predicts where it is. +""") + +# 4 +code(""" +with open(GRID3, encoding="utf-8-sig") as fh: + real = [ + {"name": r["facility_name"].strip(), "state": r["state"].strip(), + "lga": r["lga"].strip()} + for r in csv.DictReader(fh) + if r.get("facility_name", "").strip() + ] + +print(f"{len(real):,} real facility names, {len({r['state'] for r in real})} states") +for r in real[:6]: + print(f" {r['name']:<48} {r['state']}") +""") + +# 5 +md(""" +## The generated data + +The same generator that produced the worlds in `data/synthetic/worlds/`. We +take the **true** company names rather than the observed ones: the observations +carry deliberate typos and OCR damage, and comparing those against a clean +register would measure the corruption engine rather than the naming model. +""") + +# 6 +code(""" +from arche_synthetic import build + +world, _ = build("ng_supplier_v0", seed=42, + scale={"organisations": 2000, "people": 3000, "places": 1500}) + +generated = [ + {"name": world.current(e.entity_id).attributes["legal_name"], + "city": world.current( + world.current(e.entity_id).attributes["place_id"]).attributes["city"]} + for e in world.of_type("organisation") +] + +print(f"{len(generated):,} generated company names") +for g in generated[:6]: + print(f" {g['name']:<48} {g['city']}") +""") + +# 7 +md(""" +## H1 — how rich is the naming vocabulary? + +A real register accumulates names from thousands of independent naming +decisions. Ours composes them from ` ` over 18 trades +and 10 legal forms. The **type/token ratio** — distinct words divided by total +words — measures that directly. + +*Refuted if the generated ratio is close to the real one.* +""") + +# 8 +code(""" +def tokens(name: str) -> list[str]: + return [t for t in "".join(c if c.isalnum() else " " for c in name).lower().split() + if len(t) > 1] + + +def vocabulary(names: list[str]) -> dict: + counted = collections.Counter(t for n in names for t in tokens(n)) + total = sum(counted.values()) + return {"names": len(names), "tokens": total, "distinct": len(counted), + "ratio": len(counted) / total, "top": counted.most_common(8)} + + +real_v = vocabulary([r["name"] for r in real]) +gen_v = vocabulary([g["name"] for g in generated]) + +print(f"{'':<12}{'names':>8}{'tokens':>9}{'distinct':>10}{'type/token':>12}") +for label, v in (("real", real_v), ("generated", gen_v)): + print(f"{label:<12}{v['names']:>8,}{v['tokens']:>9,}{v['distinct']:>10,}" + f"{v['ratio']:>12.4f}") +print() +print("most common tokens") +for label, v in (("real", real_v), ("generated", gen_v)): + print(f" {label:<10}", ", ".join(f"{t}({c:,})" for t, c in v["top"])) +""") + +# 9 +md(""" +### Reading H1 — not refuted, but not for the reason first assumed + +Type/token is 0.164 real against 0.113 generated, and the top tokens show what +kind of difference it is. Real names are built from a **descriptive** +vocabulary — `health`, `center`, `primary`, `clinic`, `post`, `hospital`, +`maternity`. Ours are built from a **legal-form** vocabulary — `limited`, +`nigeria`, `enterprises`, `sons`. A real register names the thing; ours names +the company wrapper. + +**A first attempt at a fairer measure got this backwards and is worth +recording.** Counting how many tokens are *common* — appearing in at least +0.1%, 0.5%, 2% of names — says generated has **more** of them (243 against 130 +at the 0.1% mark). That is true and it is not richness: with eighteen trade +words and ten legal forms, every one of ours appears constantly, while real +vocabulary is spread thin across tens of thousands of settlement names and +one-off descriptors. Concentration read as richness because the statistic was +chosen before the shape of the data was understood. + +The cell below fixes it by comparing at **matched sample size**, which is what +vocabulary comparisons require: vocabulary grows with the number of documents +(Heaps' law), so 51,022 names will always out-vocabulary 2,000. + +At 2,000 names each, real draws **2,429 distinct tokens** (2,402-2,446 over five +samples) against the generator's **877** — 2.8x. And the shape says where the +difference lives: + +| token appears in | real | generated | +|---|---:|---:| +| 1 name | 2,102 | 634 | +| 2-9 names | 285 | 190 | +| 10+ names | 29 | **53** | + +Real vocabulary is **dispersed** — a long tail of settlement names and one-off +descriptors, three times larger than ours. Ours is **concentrated** — fewer +distinct words, each repeating far more often, which is why the naive +common-token count flattered it. H1 stands. + +The consequence for the benchmark is specific. A blocker keyed on name tokens +sees far fewer distinct keys in our world than in a real one, so blocks are +larger and blocking looks worse than it would on a real register. `RESULTS.md` +carries that as a caveat; this is the measurement behind it. +""") + +# 10 +code(""" +# Matched sample size. The real set is 26x larger, and vocabulary grows with +# sample size (Heaps' law), so comparing 51,022 names against 2,000 measures +# the sample, not the naming model. Draw the same number from each. +rng = random.Random(0) +real_names = [r["name"] for r in real] +gen_names = [g["name"] for g in generated] +n = len(gen_names) + +trials = [len({t for name in rng.sample(real_names, n) for t in tokens(name)}) + for _ in range(5)] +gen_distinct = len({t for name in gen_names for t in tokens(name)}) + +print(f"at n = {n:,} names each:") +print(f" real {sum(trials) / len(trials):>8,.0f} distinct tokens " + f"(5 draws: {min(trials):,}-{max(trials):,})") +print(f" generated {gen_distinct:>8,} distinct tokens") +print(f" ratio {sum(trials) / len(trials) / gen_distinct:>8.1f}x") + +# Where the difference sits: the tail, or the common words? +def band(names, lo, hi): + c = collections.Counter(t for name in names for t in set(tokens(name))) + return sum(1 for _, v in c.items() if lo <= v < hi) + + +sample = rng.sample(real_names, n) +print() +print(f"{'token appears in':<22}{'real':>8}{'generated':>12}") +for lo, hi in ((1, 2), (2, 10), (10, 10**9)): + label = "1 name" if hi == 2 else (f"{lo}-{hi - 1} names" if hi < 10**9 + else f"{lo}+ names") + print(f"{label:<22}{band(sample, lo, hi):>8,}{band(gen_names, lo, hi):>12,}") +""") + +# 11 +md(""" +## H2 — are name collisions as common as in real data? + +The `common_names` stratum exists because a name that many entities share is +weak evidence. If our collision rate is far from the real one, that stratum is +measuring a difficulty that does not exist. + +*Refuted if the two rates land within a factor of two.* +""") + +# 12 +code(""" +def collision_rate(names: list[str]) -> tuple[float, list]: + norm = [" ".join(tokens(n)) for n in names] + counted = collections.Counter(norm) + shared = sum(c for c in counted.values() if c > 1) + return shared / len(norm), counted.most_common(5) + + +real_rate, real_top = collision_rate([r["name"] for r in real]) +gen_rate, gen_top = collision_rate([g["name"] for g in generated]) + +print(f"real exact-name collisions: {real_rate:6.1%}") +print(f"generated exact-name collisions: {gen_rate:6.1%}") +print() +print("real, most repeated: ", ", ".join(f"{n!r}x{c}" for n, c in real_top[:3])) +print("generated, most repeated:", ", ".join(f"{n!r}x{c}" for n, c in gen_top[:3])) +""") + +# 13 +code(""" +# Head-token collisions: how often two organisations share their first word. +def head_rate(names: list[str]) -> float: + heads = collections.Counter(tokens(n)[0] for n in names if tokens(n)) + return sum(c for c in heads.values() if c > 1) / sum(heads.values()) + + +print(f"real share a head token: {head_rate([r['name'] for r in real]):6.1%}") +print(f"generated share a head token: {head_rate([g['name'] for g in generated]):6.1%}") +""") + +# 14 +md(""" +### Reading H2 — refuted, which is the good outcome + +12.0% real against 13.5% generated on exact name collisions, and 61.4% against +68.7% on the head token. Both well inside the factor of two that was set in +advance as the refutation condition, so **H2 is refuted: the collision *rate* +is realistic.** The Zipf surname draw is doing its job. + +That is necessary for the `common_names` stratum to mean anything, and it is +not sufficient. A rate can be right while the collisions are the wrong *kind*. +H3 is the sufficiency test. +""") + +# 15 +md(""" +## H3 — do names carry regional signal? + +This is the important one. In real data a name predicts where it is: Hausa +naming in Kano, Yoruba in Oyo, and facility words that travel with them. Our +generator draws a surname from a global pool and a city independently, so a +generated name should predict its city no better than chance. + +The measure: for each frequent token, how concentrated is its distribution over +regions, compared with the baseline distribution of regions? A token that +appears three times more often in one region than the baseline is +**regionally marked**. + +*Refuted if generated tokens are as regionally marked as real ones.* +""") + +# 16 +code(""" +def regional_marking(rows: list[dict], key: str, min_count: int = 20) -> dict: + baseline = collections.Counter(r[key] for r in rows) + total = sum(baseline.values()) + per_token: dict[str, collections.Counter] = collections.defaultdict( + collections.Counter) + for r in rows: + for t in set(tokens(r["name"])): + per_token[t][r[key]] += 1 + + marked, examined, best = 0, 0, [] + for token, dist in per_token.items(): + n = sum(dist.values()) + if n < min_count: + continue + examined += 1 + region, count = dist.most_common(1)[0] + lift = (count / n) / (baseline[region] / total) + if lift >= 3.0: + marked += 1 + best.append((token, region, round(lift, 1), n)) + best.sort(key=lambda x: -x[2]) + return {"examined": examined, "marked": marked, + "share": marked / examined if examined else 0.0, "top": best[:6]} + + +real_m = regional_marking(real, "state") +gen_m = regional_marking(generated, "city") + +print(f"{'':<12}{'tokens examined':>17}{'regionally marked':>20}{'share':>9}") +for label, m in (("real", real_m), ("generated", gen_m)): + print(f"{label:<12}{m['examined']:>17,}{m['marked']:>20,}{m['share']:>9.1%}") +print() +for label, m in (("real", real_m), ("generated", gen_m)): + print(f"{label} — most regionally marked tokens:") + print(" ", m["top"] if m["top"] else "(none)") +""") + +# 17 +md(""" +### Reading H3 — not refuted, and the gap is total + +**90.4% of real tokens are regionally marked (367 of 406). 0.0% of generated +tokens are (0 of 40).** Not a difference of degree. The generator has no +regional structure whatsoever, which is what independent draws produce and +what Robin Linacre predicted from reading the design. + +Two honest qualifications, neither of which rescues the generator: + +- **Some real marks are circular.** `ekiti` is marked 64x for Ekiti because + facilities are often named after where they are. Discount those and the + signal survives in the ones that are not place names: `akpan` at 49x for Akwa + Ibom is an Ibibio surname, `afaha` at 55x is an Ibibio settlement prefix. + Real names carry linguistic origin, not just an address. +- **Only 40 generated tokens cleared the 20-occurrence floor**, against 406 + real ones — itself the H1 finding. But the share is 0 of 40, not 1 or 2 of + 40, so thinness is not hiding a weak signal. + +This is the defect measured rather than asserted, and it is the number to watch +after N1 lands. +""") + +# 18 +md(""" +## The same thing, by eye + +Real African person names, from the artist equivalence data — these are actual +people, so the two halves of each name belong together. Next to them, names +this generator produces. +""") + +# 19 +code(""" +import yaml + +from arche_synthetic.world import Names + +real_people = [] +for f in sorted((REPO / "datasets" / "artist_equivalences").glob("*.yaml")): + doc = yaml.safe_load(f.read_text(encoding="utf-8")) + for group in doc.get("groups", []): + for value in [group["canonical"], *group.get("variants", [])]: + if value.count(" ") == 2 and all(w[:1].isupper() for w in value.split()): + real_people.append(value) + +names = Names(random.Random(42)) +generated_people = [names.person() for _ in range(10)] + +print(f"{'real (artist legal names)':<34}generated") +for a, b in zip(real_people[:10], generated_people, strict=False): + print(f"{a:<34}{b}") +""") + +# 20 +md(""" +## What this means for the published numbers + +Nothing here changes a measured result. What it changes is which results can be +**generalised**, and that distinction is the whole point of running it. + +Safe to generalise — these depend on the *labels*, which are correct by +construction, not on the naming model: + +- **Every engine that reads the address fails on relocated suppliers**, while + the one that ignores the address does not. The mechanism is the address + comparator, and no amount of naming realism changes it. +- **The ledger recovers legitimate change that batch comparison refuses** + (`change` stratum +0.115 / +0.162 / +0.120 across three paired worlds). + +Not safe to generalise — these depend on the naming model this notebook has +just measured: + +- **Anything from the `common_names` stratum.** The *rate* is realistic (H2 + refuted, 13.5% against 12.0%) but the *structure* is not (H3, 0.0% against + 90.4% regionally marked). A matcher that exploits regional coherence — and a + human reviewer certainly does — has nothing to exploit here. +- **Blocking numbers.** H1: a descriptive vocabulary of eighteen trade words + against a real register's hundreds makes token blocks much larger than they + would be in the field. +- **Absolute recall on any arm.** Ordering survives; the level does not. + +The fixes are already named in the plan: **N1** correlated names +(`P(given | region, era)` derived from ParaNames/Wikidata language and script +tags) and **N2** a rename that changes the distinctive head rather than the +legal form. This notebook is the before; re-running it after N1 is how we will +know the fix worked, and the `regionally marked` share is the number to watch. + +Re-run with `python examples/notebooks/build_24.py` after any generator change. +""") + + +def build() -> Path: + nb = { + "cells": [ + { + "cell_type": kind, + "metadata": {}, + "source": text.splitlines(keepends=True), + **({"outputs": [], "execution_count": None} if kind == CODE else {}), + } + for kind, text in cells + ], + "metadata": { + "kernelspec": {"display_name": "Python 3", "language": "python", + "name": "python3"}, + "language_info": {"name": "python"}, + }, + "nbformat": 4, + "nbformat_minor": 5, + } + out = Path(__file__).with_name("24_is_the_synthetic_world_realistic.ipynb") + out.write_text(json.dumps(nb, indent=1, ensure_ascii=False) + "\n", encoding="utf-8") + return out + + +if __name__ == "__main__": + print(build()) diff --git a/packages/arche-core/tests/test_synthetic_arms.py b/packages/arche-core/tests/test_synthetic_arms.py new file mode 100644 index 0000000..9acb28d --- /dev/null +++ b/packages/arche-core/tests/test_synthetic_arms.py @@ -0,0 +1,173 @@ +# Copyright 2026 unpatterned.org +# SPDX-License-Identifier: Apache-2.0 + +"""The Splink arm (B9 S4) and the ledger arms (B9 S5). + +These guard configuration fairness rather than arithmetic. A competitor arm +that is badly set up is worse than no competitor: it makes whatever it is +compared against look good for a reason that has nothing to do with the +comparison, and the first version of the Splink arm did exactly that -- it +scored 0.000 on relocated suppliers because `block_on` is case-sensitive and +57% of this world's representation differences are a source that stores IN +CAPITALS. + +So: Splink is given normalised input, cut at its own decision boundary rather +than at a threshold borrowed from a different benchmark, and seeded. The +ledger arms are checked for the thing that would silently invalidate them -- +that our record ids survive the round trip through arche's own record store. +""" + +from __future__ import annotations + +import sys +from pathlib import Path + +import pytest + +REPO = Path(__file__).resolve().parents[3] +SYNTHETIC = REPO / "data" / "synthetic" + +# `arche_synthetic` writes Parquet, and pyarrow is an arche *extra* +# (`arche-core[parquet]`), not a base dependency. Without this the whole +# module ERRORS in a checkout that has not installed it, rather than +# skipping -- which is what happened in CI. +pytest.importorskip("pyarrow") + +pytestmark = pytest.mark.skipif( + not (SYNTHETIC / "arm_splink.py").exists(), + reason="data/synthetic is not present in this checkout", +) + +TINY = {"organisations": 25, "people": 40, "places": 20} + + +@pytest.fixture(scope="module") +def modules(): + if str(SYNTHETIC) not in sys.path: + sys.path.insert(0, str(SYNTHETIC)) + import arche_synthetic + import arms + from arche_synthetic import evaluate + + return arche_synthetic, evaluate, arms + + +@pytest.fixture(scope="module") +def bench(modules, tmp_path_factory): + synthetic, evaluate, _ = modules + out = tmp_path_factory.mktemp("world") + synthetic.build("ng_supplier_v0", seed=5, scale=TINY, out=out) + return evaluate.Benchmark.load(out) + + +class TestTheSplinkArmIsConfiguredFairly: + def test_input_is_normalised_before_it_reaches_splink(self, bench): + """`block_on` is case-sensitive; unnormalised input broke every key.""" + pytest.importorskip("splink") + from arm_splink import _frame + + frame = _frame(bench.observations) + for column in ("name", "city", "address"): + # `if v` is not enough: pandas types an all-null column as float64 + # and NaN is truthy, so filter on the type instead. A column that + # HAS degenerated to float would also be a real problem for Splink, + # which is why the name column is checked for it below. + values = [v for v in frame[column].tolist() if isinstance(v, str)] + assert values, column + assert all(v == v.lower() for v in values), column + assert all(v.isdigit() for v in frame["phone"].tolist() if isinstance(v, str)) + import pandas as pd + assert not pd.api.types.is_numeric_dtype(frame["name"]), ( + "the name column degenerated to a numeric dtype; every comparison " + "and every blocking key would silently misbehave") + + def test_a_blocking_key_survives_a_changed_city(self, bench): + """A supplier that moved must still be retrievable, or the arm measures + its own blocking and reports the result as recall.""" + pytest.importorskip("splink") + from arm_splink import _frame + + frame = _frame(bench.observations) + assert "name_head" in frame.columns + heads = [v for v in frame["name_head"].tolist() if v] + assert heads and all(len(v) <= 4 for v in heads) + + def test_the_threshold_is_splinks_own_decision_boundary(self): + """0.99 was borrowed from a different benchmark and cost 0.52 recall. + + Imposing an arche-flavoured caution on an engine that has no third + answer is the same error as scoring arche on a probability cut. + """ + pytest.importorskip("splink") + import arm_splink + + assert arm_splink.DEFAULT_THRESHOLD == 0.5 + + def test_the_u_estimation_is_seeded(self): + """Unseeded sampling moved an earlier arche benchmark by 0.03 recall + between two runs in one session.""" + pytest.importorskip("splink") + import inspect + + import arm_splink + + assert arm_splink.DEFAULT_SEED is not None + assert "seed=seed" in inspect.getsource(arm_splink._train) + + +class TestTheLedgerArms: + def test_our_record_ids_survive_the_round_trip(self, bench): + """arche drops the `id_field`, so the ids come back through a + passthrough attribute. If that broke, every cluster would be empty and + the arm would silently score zero.""" + pytest.importorskip("duckdb") + from arm_ledger import PASSTHROUGH, _record + + record = _record(bench.observations[0]) + assert record[PASSTHROUGH] == bench.observations[0]["record_id"] + assert record["id"] == bench.observations[0]["record_id"] + + def test_the_passthrough_is_not_a_field_the_pack_compares(self): + """It must be inert: a column arche scores would change the answer.""" + from arche.resolve import ENTITY_PACKS + from arm_ledger import PASSTHROUGH + + assert PASSTHROUGH not in {c.get("field") for c in ENTITY_PACKS["organisation"]} + + def test_clusters_become_within_cluster_pairs(self, modules): + from arm_ledger import _pairs + + assert _pairs([["a", "b", "c"], ["d"]]) == {("a", "b"), ("a", "c"), ("b", "c")} + + def test_ingestion_is_in_arrival_order(self): + """The whole point of the arm: records arrive over years, and the + supplier moves in between. Feeding them in id order would measure + batch resolution with extra steps.""" + import inspect + + import arm_ledger + + source = inspect.getsource(arm_ledger.ledger_arm) + assert 'key=lambda o: (o["observed_at"]' in source + + def test_the_observe_pass_looks_up_by_an_identifier_not_by_truth(self): + """It may use the RC number, which is in the records. It may never use + `truth_entity_id`, which is the answer.""" + import inspect + + import arm_ledger + + source = inspect.getsource(arm_ledger._observe_pass) + assert "registration_id" in source + assert "truth" not in source.replace("truth mapping", "").replace( + "the truth", "") + + def test_the_ledger_arm_runs_end_to_end(self, bench, modules): + pytest.importorskip("duckdb") + from arm_ledger import ledger_arm + + predictions = ledger_arm(bench.observations) + report = bench.score(predictions) + assert report["overall"]["claimed_pairs"] >= 0 + assert predictions.clusters + assert report["entities"]["clusters"] == len(predictions.clusters) diff --git a/packages/arche-core/tests/test_synthetic_artists.py b/packages/arche-core/tests/test_synthetic_artists.py new file mode 100644 index 0000000..15ab970 --- /dev/null +++ b/packages/arche-core/tests/test_synthetic_artists.py @@ -0,0 +1,145 @@ +# Copyright 2026 unpatterned.org +# SPDX-License-Identifier: Apache-2.0 + +"""The artist world: real alias sets, labelled strata, no invented truth.""" +from __future__ import annotations + +import json +import sys +from pathlib import Path + +import pytest + +pytest.importorskip("pyarrow") + +_REPO = Path(__file__).resolve().parents[3] +sys.path.insert(0, str(_REPO / "data" / "synthetic")) + +from arche_synthetic import artists # noqa: E402 +from arche_synthetic.evaluate import Benchmark # noqa: E402 + + +@pytest.fixture(scope="module") +def sources(tmp_path_factory: pytest.TempPathFactory) -> tuple[Path, Path]: + """A tiny truth and filler, written to disk in the pulls' own formats.""" + d = tmp_path_factory.mktemp("artists") + truth = d / "aliases.jsonl" + truth.write_text("\n".join(json.dumps(r) for r in [ + {"canonical": "Wizkid", "country": "Nigeria", "entity_id": "Q1", + "variants": ["Ayodeji Ibrahim Balogun", "Wiz Kid", "StarBoy"]}, + {"canonical": "Tyla", "country": "South Africa", "entity_id": "Q2", + "variants": ["Tyla Laura Seethal"]}, + {"canonical": "Burna Boy", "country": "Nigeria", "entity_id": "Q3", + "variants": ["Damini Ogulu"]}, + # Only case differs: not an alias group, must be dropped. + {"canonical": "Rema", "country": "Nigeria", "entity_id": "Q4", + "variants": ["REMA"]}, + ]) + "\n", encoding="utf-8") + filler = d / "pairs.jsonl" + rows = [{"country": "NG", "given": f"Given{i}", "family": f"Family{i}"} + for i in range(40)] + # A filler person who shares a name with an alias artist: a real collision. + rows.append({"country": "ZA", "given": "Tyla", "family": ""}) + filler.write_text("\n".join(json.dumps(r) for r in rows) + "\n", encoding="utf-8") + return truth, filler + + +class TestJaroWinkler: + @pytest.mark.parametrize("a,b,expect", [ + ("Wizkid", "Wizkid", 1.0), + ("Wiz Kid", "Wizkid", ">=0.88"), + ("Wizkid", "Ayodeji Ibrahim Balogun", "<0.88"), + ("", "x", 0.0), + ]) + def test_boundary_matches_splinks_second_level(self, a, b, expect): + got = artists.jaro_winkler(a, b) + if isinstance(expect, float): + assert got == expect + elif expect.startswith(">="): + assert got >= float(expect[2:]) + else: + assert got < float(expect[1:]) + + def test_symmetric_and_case_insensitive(self): + assert artists.jaro_winkler("Burna Boy", "burna boy") == 1.0 + assert artists.jaro_winkler("Tamy Moyo", "Thamsanqa Moyo") == pytest.approx( + artists.jaro_winkler("Thamsanqa Moyo", "Tamy Moyo")) + + +class TestLoading: + def test_case_only_variants_are_not_alias_groups(self, sources): + truth, _ = sources + groups = artists.load_truth(truth) + assert {g["canonical"] for g in groups} == {"Wizkid", "Tyla", "Burna Boy"} + + def test_country_labels_become_iso(self, sources): + truth, _ = sources + by = {g["canonical"]: g for g in artists.load_truth(truth)} + assert by["Wizkid"]["country"] == "NG" + assert by["Tyla"]["country"] == "ZA" + + +class TestWorld: + @pytest.fixture(scope="class") + def built(self, sources, tmp_path_factory): + truth, filler = sources + out = tmp_path_factory.mktemp("world") + world, manifest = artists.build(seed=3, records=120, out=out, + truth_path=truth, filler_path=filler) + return world, manifest, out + + def test_every_alias_group_is_an_entity_and_filler_tops_up(self, built): + world, manifest, _ = built + kinds = [s[0].attributes["kind"] for s in world.states.values()] + assert kinds.count("alias") == 3 + assert kinds.count("filler") > 0 + assert manifest["counts"]["entities"] == {"artist": len(world.states)} + + def test_deterministic_by_fingerprint(self, sources, tmp_path): + truth, filler = sources + _, a = artists.build(seed=11, records=120, out=tmp_path / "a", + truth_path=truth, filler_path=filler) + _, b = artists.build(seed=11, records=120, out=tmp_path / "b", + truth_path=truth, filler_path=filler) + assert a["content_fingerprints"] == b["content_fingerprints"] + + def test_observations_carry_no_truth(self, built): + _, _, out = built + import pyarrow.parquet as pq + cols = set(pq.read_table(out / "observations.parquet").column_names) + assert cols == set(artists.COLUMNS) + + def test_strata_are_labelled_by_intended_names_not_corrupted_ones(self, built): + world, _, _ = built + by = {o.record_id: o for o in world.observations} + alias = [d for d in world.differences if d.cause == "alias"] + spelling = [d for d in world.differences if d.cause == "spelling"] + assert alias, "a world with Wizkid/Balogun must produce alias pairs" + for d in alias: + ia = world.states[d.entity_id][0].attributes["names"] + # Both records belong to a multi-name artist. + assert len(ia) >= 2 + for d in spelling: + a, b = by[d.observation_a], by[d.observation_b] + assert a.entity_id == b.entity_id + + def test_error_rows_name_the_rule(self, built): + world, _, _ = built + from arche_synthetic.observe import CORRUPTION + errors = {d.cause for d in world.differences if d.difference_kind == "error"} + assert errors and errors <= set(CORRUPTION) + + def test_collisions_are_found_not_made(self, built): + world, manifest, out = built + import pyarrow.parquet as pq + rows = pq.read_table(out / "collisions.parquet").to_pylist() + assert manifest["collisions"] == len(rows) >= 1 + assert any(r["shared_name"] == "tyla" for r in rows) + for r in rows: + assert r["entity_a"] != r["entity_b"] + + def test_loads_as_a_benchmark(self, built): + _, _, out = built + bench = Benchmark.load(out) + assert bench.true_pairs + assert "representation/alias" in bench.by_cause diff --git a/packages/arche-core/tests/test_synthetic_evaluate.py b/packages/arche-core/tests/test_synthetic_evaluate.py new file mode 100644 index 0000000..0a5e781 --- /dev/null +++ b/packages/arche-core/tests/test_synthetic_evaluate.py @@ -0,0 +1,232 @@ +# Copyright 2026 unpatterned.org +# SPDX-License-Identifier: Apache-2.0 + +"""The stratified evaluator (B9 S2) and the baseline arms (B9 S3). + +The claims worth pinning are about *honesty*, not arithmetic: + +* recall stratifies and precision does not, so no stratified precision is ever + reported; +* blocking recall is never quietly filled in with the arm's own recall; +* an engine that can abstain is reported with a coverage figure beside its + recall, so it is not scored as if it only had two answers; +* a perfect matcher scores 1.0 and a matcher that claims everything has low + precision -- the ordinary sanity checks, on a tiny hand-built world. +""" + +from __future__ import annotations + +import importlib.util +import sys +from pathlib import Path + +import pytest + +REPO = Path(__file__).resolve().parents[3] +SYNTHETIC = REPO / "data" / "synthetic" + +# `arche_synthetic` writes Parquet, and pyarrow is an arche *extra* +# (`arche-core[parquet]`), not a base dependency. Without this the whole +# module ERRORS in a checkout that has not installed it, rather than +# skipping -- which is what happened in CI. +pytest.importorskip("pyarrow") + +pytestmark = pytest.mark.skipif( + not (SYNTHETIC / "arche_synthetic" / "evaluate.py").exists(), + reason="data/synthetic is not present in this checkout", +) + +TINY = {"organisations": 40, "people": 60, "places": 30} + + +@pytest.fixture(scope="module") +def modules(): + if str(SYNTHETIC) not in sys.path: + sys.path.insert(0, str(SYNTHETIC)) + if importlib.util.find_spec("arche_synthetic") is None: # pragma: no cover + pytest.skip("arche_synthetic not importable") + import arche_synthetic + import arms + from arche_synthetic import evaluate + + return arche_synthetic, evaluate, arms + + +@pytest.fixture(scope="module") +def bench(modules, tmp_path_factory): + synthetic, evaluate, _ = modules + out = tmp_path_factory.mktemp("world") + synthetic.build("ng_supplier_v0", seed=11, scale=TINY, out=out) + return evaluate.Benchmark.load(out) + + +class TestTheTruthItLoads: + def test_true_pairs_are_all_and_only_same_entity_pairs(self, bench): + for a, b in bench.true_pairs: + assert bench.truth[a] == bench.truth[b] + expected = sum(len(m) * (len(m) - 1) // 2 for m in bench.by_entity.values()) + assert len(bench.true_pairs) == expected + + def test_pairs_are_unordered_keys(self, modules): + _, evaluate, _ = modules + assert evaluate.pair("b", "a") == evaluate.pair("a", "b") == ("a", "b") + + def test_strata_are_populated_and_are_subsets_of_the_true_pairs(self, bench): + assert set(bench.by_kind) == {"change", "representation", "error"} + for name, pairs in bench.by_kind.items(): + # Every difference is between two observations of ONE entity, so a + # stratum can only ever be a subset of the true pairs. This is the + # structural reason precision cannot be stratified. + assert pairs <= bench.true_pairs, name + assert pairs, name + + def test_strata_may_overlap(self, bench): + """A pair whose address moved AND whose OCR mangled it is in both. + + The evaluator must never force a choice; that is why differences are + one row per (pair, attribute, kind). + """ + assert bench.by_kind["change"] & bench.by_kind["error"] + + +class TestScoringHonesty: + def test_a_perfect_matcher_scores_one(self, bench, modules): + _, evaluate, _ = modules + report = bench.score(evaluate.Predictions( + arm="oracle", pairs=set(bench.true_pairs), + candidates=set(bench.true_pairs))) + assert report["overall"]["precision"] == 1.0 + assert report["overall"]["recall"] == 1.0 + assert report["bcubed"]["f1"] == 1.0 + assert report["entities"]["false_merge_clusters"] == 0 + assert all(s["recall"] == 1.0 for s in report["recall_by_stratum"].values()) + + def test_a_matcher_that_finds_nothing_scores_zero_everywhere(self, bench, modules): + _, evaluate, _ = modules + report = bench.score(evaluate.Predictions(arm="null", pairs=set())) + assert report["overall"]["recall"] == 0.0 + assert all(s["recall"] == 0.0 for s in report["recall_by_stratum"].values()) + assert report["entities"]["false_merge_clusters"] == 0 + + def test_no_stratified_precision_is_ever_reported(self, bench, modules): + """The invariant the module exists to protect. + + A false merge joins two different entities, so it has no difference row + and belongs to no stratum. A stratified precision column would have no + denominator and would be an invented number that reads as authoritative. + """ + _, evaluate, _ = modules + report = bench.score(evaluate.Predictions(arm="x", pairs=set(bench.true_pairs))) + for stratum in report["recall_by_stratum"].values(): + assert set(stratum) == {"true_pairs", "recall"} + assert "precision" not in stratum and "f1" not in stratum + + def test_blocking_recall_is_never_the_arms_recall_in_disguise(self, bench, modules): + """Falling back to the positive pairs would make the two identical by + construction, and print a lie in the flattering direction.""" + _, evaluate, _ = modules + report = bench.score(evaluate.Predictions( + arm="no-candidates", pairs=set(list(bench.true_pairs)[:5]))) + assert report["blocking"]["measured"] is False + assert "recall" not in report["blocking"] + + def test_a_reported_blocking_recall_says_it_was_reported(self, bench, modules): + _, evaluate, _ = modules + report = bench.score(evaluate.Predictions( + arm="arche/x", pairs=set(), + notes={"blocking_recall_reported_by_arche": 0.99, "candidate_pairs": 10})) + assert report["blocking"]["recall"] == 0.99 + assert "reported by the arm" in report["blocking"]["source"] + + def test_an_engine_that_abstains_gets_a_coverage_figure(self, bench, modules): + """Recall counts automatic merges; coverage counts merged-or-surfaced. + + Scoring an engine with three answers as if it had two understates every + engine with a refusal mechanism. + """ + _, evaluate, _ = modules + half = sorted(bench.true_pairs) + report = bench.score(evaluate.Predictions( + arm="cautious", pairs=set(half[:10]), abstentions=set(half[10:]))) + assert report["overall"]["recall"] < report["overall"]["coverage"] + assert report["overall"]["coverage"] == 1.0 + assert report["overall"]["abstentions"] == len(half) - 10 + + def test_abstentions_are_never_scored_as_right_or_wrong(self, bench, modules): + """An abstention folded into either answer would be decorative.""" + _, evaluate, _ = modules + wrong = {("rec_ffffffffffffffff", "rec_eeeeeeeeeeeeeeee")} + a = bench.score(evaluate.Predictions(arm="a", pairs=set())) + b = bench.score(evaluate.Predictions(arm="b", pairs=set(), abstentions=wrong)) + assert a["overall"]["precision"] == b["overall"]["precision"] + assert a["overall"]["recall"] == b["overall"]["recall"] + + def test_false_merges_are_explained_by_what_was_shared(self, bench, modules): + """Where a stratified precision column would have gone.""" + _, evaluate, _ = modules + entities = sorted(bench.by_entity) + a = bench.by_entity[entities[0]][0] + b = bench.by_entity[entities[1]][0] + report = bench.score(evaluate.Predictions( + arm="merger", pairs={evaluate.pair(a, b)})) + assert report["overall"]["precision"] == 0.0 + assert report["false_merges_by_what_was_shared"] + + +class TestTheArms: + def test_normalise_sets_aside_the_legal_form(self, modules): + _, _, arms = modules + assert (arms.normalise("Okafor Engineering Limited") + == arms.normalise("OKAFOR ENGINEERING LTD.") + == "okafor engineering") + + def test_normalise_never_empties_a_name_that_is_all_form_words(self, modules): + """Stripping every token would make unrelated companies join.""" + _, _, arms = modules + assert arms.normalise("Nigeria Limited") + + def test_the_exact_arm_claims_only_identical_normalised_names(self, bench, modules): + _, _, arms = modules + predictions = arms.exact(bench.observations) + by_id = {o["record_id"]: o for o in bench.observations} + for a, b in predictions.pairs: + assert arms.normalise(by_id[a]["name"]) == arms.normalise(by_id[b]["name"]) + assert (by_id[a]["city"] or "").upper() == (by_id[b]["city"] or "").upper() + + def test_the_exact_arm_is_worse_on_legitimate_change_than_overall(self, bench, modules): + """**The headline of the benchmark.** + + A rule join looks respectable overall and collapses where the entity + moved: a relocated supplier has a different city, so the join key is + gone. This is the row that makes the argument, and it is asserted here + so that a generator change which quietly stops producing meaningful + change fails a test instead of producing a flattering table. + """ + _, evaluate, arms = modules + report = bench.score(arms.exact(bench.observations)) + overall = report["overall"]["recall"] + relocated = report["recall_by_stratum"].get("change/ORG_RELOCATED") + assert relocated, "no relocation pairs in this world" + assert relocated["recall"] < overall, ( + f"the exact join scored {relocated['recall']} on relocations against " + f"{overall} overall -- if a rule baseline handles legitimate change " + "as well as anything else, the changes being generated are too " + "small to measure anything") + + def test_the_arms_report_their_own_candidates(self, bench, modules): + _, _, arms = modules + for arm in (arms.exact, arms.jaro_winkler): + predictions = arm(bench.observations) + assert predictions.candidates >= predictions.pairs + assert predictions.seconds >= 0 + + def test_the_custom_comparators_read_what_the_pack_ignores(self, modules): + """The shipped `organisation` pack declares `ignores_everything_else` + and reads none of phone, TIN, account or director -- where a third of + the labelled changes live.""" + _, _, arms = modules + fields = {c.get("field") for c in arms._custom_comparators()} + assert {"tin", "account_number", "phone", "director_name"} <= fields + from arche.resolve import ENTITY_PACKS + assert not {"tin", "account_number", "phone", "director_name"} & { + c.get("field") for c in ENTITY_PACKS["organisation"]} diff --git a/packages/arche-core/tests/test_synthetic_world.py b/packages/arche-core/tests/test_synthetic_world.py new file mode 100644 index 0000000..ba9b2b5 --- /dev/null +++ b/packages/arche-core/tests/test_synthetic_world.py @@ -0,0 +1,365 @@ +# Copyright 2026 unpatterned.org +# SPDX-License-Identifier: Apache-2.0 + +"""The synthetic world's ground truth, and the invariants that make it worth scoring. + +Guards `data/synthetic/`. Not the benchmark itself -- that runs from +`build_ng_supplier_v0.py` -- but the claims the dataset makes about itself: + +* it is reproducible under its seed, and a different seed is a different world; +* it does not ship the answer inside the question (no truth column, no entity + id recoverable from a record id); +* every observation maps to exactly one entity; +* **a legitimate change is never labelled an error**, which is the whole reason + this exists; +* the identifiers are valid by construction, so a miss is the matcher's. + +The world is generated once per module at small scale. It is seeded, so these +are deterministic tests, not sampling. +""" + +from __future__ import annotations + +import importlib.util +import sys +from pathlib import Path + +import pytest + +REPO = Path(__file__).resolve().parents[3] +SYNTHETIC = REPO / "data" / "synthetic" + +# `arche_synthetic` writes Parquet, and pyarrow is an arche *extra* +# (`arche-core[parquet]`), not a base dependency. Without this the whole +# module ERRORS in a checkout that has not installed it, rather than +# skipping -- which is what happened in CI. +pytest.importorskip("pyarrow") + +pytestmark = pytest.mark.skipif( + not (SYNTHETIC / "arche_synthetic" / "__init__.py").exists(), + reason="data/synthetic is not present in this checkout", +) + +SMALL = {"organisations": 120, "people": 160, "places": 80} + + +@pytest.fixture(scope="module") +def synthetic(): + if str(SYNTHETIC) not in sys.path: + sys.path.insert(0, str(SYNTHETIC)) + if importlib.util.find_spec("arche_synthetic") is None: # pragma: no cover + pytest.skip("arche_synthetic not importable") + import arche_synthetic + + return arche_synthetic + + +@pytest.fixture(scope="module") +def world(synthetic): + built, _ = synthetic.build("ng_supplier_v0", seed=7, scale=SMALL) + return built + + +@pytest.fixture(scope="module") +def written(synthetic, tmp_path_factory): + out = tmp_path_factory.mktemp("world") + _, manifest = synthetic.build("ng_supplier_v0", seed=7, scale=SMALL, out=out) + return out, manifest + + +class TestReproducibility: + """AT-006. A benchmark nobody can regenerate is an anecdote.""" + + def test_the_same_seed_is_the_same_world(self, synthetic, tmp_path): + _, a = synthetic.build("ng_supplier_v0", seed=7, scale=SMALL, out=tmp_path / "a") + _, b = synthetic.build("ng_supplier_v0", seed=7, scale=SMALL, out=tmp_path / "b") + assert a["content_fingerprints"] == b["content_fingerprints"] + assert set(a["content_fingerprints"]) == {"observations", "truth", + "differences", "events"} + + def test_a_different_seed_is_a_different_world(self, synthetic, tmp_path): + _, a = synthetic.build("ng_supplier_v0", seed=7, scale=SMALL, out=tmp_path / "a") + _, b = synthetic.build("ng_supplier_v0", seed=8, scale=SMALL, out=tmp_path / "b") + assert a["content_fingerprints"] != b["content_fingerprints"] + + def test_the_manifest_records_what_would_be_needed_to_rebuild(self, written): + _, manifest = written + assert manifest["seed"] == 7 + assert manifest["generator_version"] + assert manifest["world_pack"] == "ng_supplier_v0" + assert manifest["provenance"] + + +class TestTheAnswerIsNotInTheQuestion: + """The invariant a benchmark cannot be trusted without.""" + + def test_observations_carry_no_truth_column(self, written, synthetic): + out, _ = written + import pyarrow.parquet as pq + + columns = set(pq.read_table(out / "observations.parquet").column_names) + assert not columns & set(synthetic.export.FORBIDDEN) + assert "record_id" in columns + + def test_a_truth_column_is_refused_at_write_time(self, synthetic, world): + """Not only tested -- refused. A test can be deleted; the writer cannot.""" + rows = [{"record_id": "rec_1", "entity_id": "syn:organisation:000001"}] + with pytest.raises(synthetic.export.LeakError, match="truth column"): + synthetic.export.check_no_leak(rows, world) + + def test_an_entity_id_leaking_through_a_value_is_refused(self, synthetic, world): + """A column-name check alone would not catch this one.""" + leaked = next(iter(world.entities)) + rows = [{"record_id": "rec_1", "name": leaked}] + with pytest.raises(synthetic.export.LeakError, match="leaks entity id"): + synthetic.export.check_no_leak(rows, world) + + def test_record_ids_hold_no_entity_information(self, world, synthetic): + """Opaque by construction: the entity was never in the hashed payload. + + Checked three ways, because this is the invariant whose failure would + silently invalidate every number measured on the set. + """ + import re + + shape = re.compile(r"^rec_[0-9a-f]{16}$") + suffixes = {e.rsplit(":", 1)[-1] for e in world.entities} + for observation in world.observations: + assert shape.match(observation.record_id) + assert observation.entity_id not in observation.record_id + assert not any(s in observation.record_id[4:] for s in suffixes) + + # And the id function takes no entity argument at all -- the strongest + # form of the guarantee, since there is nothing to leak. + import inspect + + parameters = inspect.signature(synthetic.ids.record_id).parameters + assert list(parameters) == ["world_id", "source", "sequence"] + + def test_record_ids_are_unique(self, world): + ids = [o.record_id for o in world.observations] + assert len(ids) == len(set(ids)) + + +class TestTruthCompleteness: + """AT-008.""" + + def test_every_observation_maps_to_exactly_one_entity(self, written, world): + out, _ = written + import pyarrow.parquet as pq + + truth = pq.read_table(out / "truth.parquet").to_pylist() + observations = pq.read_table(out / "observations.parquet").to_pylist() + mapping = {r["record_id"]: r["truth_entity_id"] for r in truth} + assert len(mapping) == len(truth) + assert {o["record_id"] for o in observations} == set(mapping) + assert set(mapping.values()) <= set(world.entities) + + def test_every_difference_joins_two_observations_of_one_entity(self, world): + by_id = {o.record_id: o for o in world.observations} + for d in world.differences: + a, b = by_id[d.observation_a], by_id[d.observation_b] + assert a.entity_id == b.entity_id == d.entity_id + assert a.record_id != b.record_id + + def test_every_change_names_an_event_that_exists(self, world): + events = {e.event_id for e in world.events} + changes = [d for d in world.differences if d.difference_kind == "change"] + assert changes, "no legitimate change was generated at all" + for d in changes: + assert d.event_id in events + + +class TestChangeIsNotError: + """AT-001 and AT-005 -- the claim the whole dataset is built to support.""" + + def test_an_entity_that_moves_keeps_one_identity_and_gains_a_state(self, world): + moved = [e for e, chain in world.states.items() if len(chain) > 1] + assert moved, "no entity changed state" + for entity_id in moved: + chain = world.states[entity_id] + assert world.entities[entity_id].entity_type + # states tile the timeline, in order, without a gap + for earlier, later in zip(chain, chain[1:], strict=False): + assert earlier.valid_to == later.valid_from + assert earlier.valid_from < earlier.valid_to + assert chain[-1].valid_to is None + + def test_no_lifecycle_change_is_labelled_an_error(self, world): + """The failure this dataset exists to make visible. + + A stale ERP address is not a typo. If the generator ever labels one as + an error, every number measured on the `legitimate_change` stratum is + wrong in the direction that flatters a matcher. + """ + by_id = {o.record_id: o for o in world.observations} + observer = _observer(world) + changes = {(d.observation_a, d.observation_b, d.attribute) + for d in world.differences if d.difference_kind == "change"} + checked = 0 + for pair in {(d.observation_a, d.observation_b) for d in world.differences}: + a, b = by_id[pair[0]], by_id[pair[1]] + if a.state_index == b.state_index: + continue + # Independent of the generator's own event lookup: compare the TRUE + # values of the two states these records saw. If they differ, the + # pair must carry a `change` row for that attribute -- whatever + # corruption was layered on top. + truth_a = observer._flatten(world.states[a.entity_id][a.state_index].attributes) + truth_b = observer._flatten(world.states[b.entity_id][b.state_index].attributes) + for attribute in set(a.attributes) & set(b.attributes): + if truth_a.get(attribute) == truth_b.get(attribute): + continue + checked += 1 + assert (*pair, attribute) in changes, ( + f"{attribute} genuinely differs between the states " + f"{a.record_id} and {b.record_id} saw, but the pair carries " + "no `change` row -- a legitimate change has been filed as noise") + assert checked, "no pair straddled a real change; the test proved nothing" + + def test_the_stale_source_is_the_one_that_lags(self, world): + """The ERP should be the source most often behind *at the moment it wrote*. + + Two earlier versions of this test were wrong in instructive ways. + + It first compared raw counts across sources, which cannot work: the + registry covers every supplier and the ERP covers 85%, so the registry + wins on volume before staleness is considered at all. Rates, not counts. + + It also called a record "stale" whenever it was not looking at the + entity's *final* state -- but an invoice filed in 2020 was never going + to know about a 2024 relocation, and that is age, not lag. The + discriminating question is whether the source was behind **relative to + what was true on the day it observed**, which is what a lagging system + does and a merely old record does not. + """ + behind = {"erp": 0, "registry": 0, "invoice": 0} + total = {"erp": 0, "registry": 0, "invoice": 0} + for o in world.observations: + total[o.source] += 1 + current_then, _ = world.state_at(o.entity_id, o.observed_at) + if o.state_index < current_then: + behind[o.source] += 1 + rate = {k: behind[k] / total[k] for k in total if total[k]} + assert rate["erp"] > rate["registry"], rate + + +class TestRepresentationIsNotError: + """AT-002 and AT-003.""" + + def test_a_legal_suffix_rewrite_is_representation(self, synthetic): + import random + rewritten = synthetic.observe.REPRESENTATION["legal_suffix_abbreviated"]( + "Okafor Engineering Limited", random.Random(0)) + assert rewritten == "Okafor Engineering Ltd" + kinds = {d.difference_kind for d in _by_cause(synthetic, "legal_suffix_abbreviated")} + assert kinds == {"representation"} + + def test_dropping_a_suffix_is_representation(self, synthetic): + import random + assert synthetic.observe.REPRESENTATION["legal_suffix_dropped"]( + "Okafor Engineering Limited", random.Random(0)) == "Okafor Engineering" + + def test_an_ocr_substitution_is_an_error_with_its_cause(self, synthetic, world): + import random + broken = synthetic.observe.CORRUPTION["ocr_confusion"]( + "OKAFOR", random.Random(1)) + assert broken != "OKAFOR" + ocr = [d for d in world.differences if d.cause == "ocr_confusion"] + assert ocr and {d.difference_kind for d in ocr} == {"error"} + + def test_the_three_kinds_are_the_whole_vocabulary(self, world): + assert ({d.difference_kind for d in world.differences} + == {"change", "representation", "error"}) + + def test_house_style_is_consistent_across_a_record(self, world): + """An ERP that stores NAMES IN CAPITALS stores addresses in capitals too. + + Rolling case per field produced records that shouted one column and + whispered the next, which inflated the representation stratum with + differences no matcher would ever see. + """ + for o in world.observations: + upper = {name for name, notes in o.applied.items() + if any(c == "case_upper" for _, c in notes)} + if not upper: + continue + eligible = {name for name, value in o.attributes.items() + if isinstance(value, str) and value != value.upper()} + assert not eligible, ( + f"{o.record_id} upper-cased {sorted(upper)} but left " + f"{sorted(eligible)} in mixed case") + + +class TestValidByConstruction: + """A benchmark whose identifiers fail the validator measures the generator.""" + + def test_the_local_validators_agree_with_arches(self, synthetic): + """The package carries its own RC/TIN format checks so it can generate a + world with nothing else installed. arche has the same two. Asserting + they still agree is stronger than depending on either alone: a one-sided + import would hide a drift, and a drift means the benchmark's identifiers + stop being the ones arche's detectors were built to read. + """ + from arche.detect.ng.ids import _validate_ng_rc, _validate_ng_tin + + cases = ["RC123456", "BN99999999", "RC1234", "rc 123456", "RC12345678", + "XX123456", "RC", "", "12345678901234567"] + for text in cases: + assert synthetic.world.valid_rc(text) == _validate_ng_rc(text)[0], text + for text in ["1234567890", "12345678901234", "123", "12345678901", + "1234-5678-90", "abcdefghij", ""]: + assert synthetic.world.valid_tin(text) == _validate_ng_tin(text)[0], text + + def test_the_lexicon_is_vendored_so_the_package_stands_alone(self, synthetic): + """`pip install arche-synthetic` must generate a world with nothing else + installed; a name pool reachable only through arche would break that.""" + from pathlib import Path as _Path + + vendored = _Path(synthetic.world.__file__).parent / "data" / "african_names_v1.jsonl.gz" + assert vendored.exists() + assert synthetic.world._lexicon_path() == vendored + + def test_every_rc_number_and_tin_passes_arches_validator(self, world): + from arche.detect.ng.ids import _validate_ng_rc, _validate_ng_tin + + for entity in world.of_type("organisation"): + attributes = world.current(entity.entity_id).attributes + assert _validate_ng_rc(attributes["rc_number"])[0] + assert _validate_ng_tin(attributes["tin"])[0] + + def test_the_name_pool_excludes_what_is_not_a_name(self, synthetic): + """5.8% of the shipped lexicon is Wikidata URLs and property labels.""" + usable = synthetic.world._usable + assert not usable("http://www.wikidata.org/.well-known/genid/25884cc") + assert not usable("Abas (nom de famille)") + assert not usable("njirimara ezinụlọnjirimara ezinụlọ") + assert not usable("Baale Amulegbaro Jagun Oninlo Estate") + assert usable("Okonkwo") + assert usable("Abdul Sattar") + + def test_common_names_actually_collide(self, world): + """Uniform names make a benchmark easy in a way real data never is. + + This is the gap the frequency work exists to close: without collisions + a name match is very nearly a key, and the matcher is not being asked + the hard question. + """ + from collections import Counter + + heads = Counter(world.current(e.entity_id).attributes["legal_name"].split()[0] + for e in world.of_type("organisation")) + shared = sum(n for n in heads.values() if n > 1) + assert shared >= len(world.of_type("organisation")) * 0.15 + + +def _observer(world): + """The flattening logic, to read a state the way an observation would.""" + import arche_synthetic + + return arche_synthetic.observe.Observer(world, seed=0) + + +def _by_cause(synthetic, cause: str): + built, _ = synthetic.build("ng_supplier_v0", seed=7, scale=SMALL) + return [d for d in built.differences if d.cause == cause] diff --git a/pyproject.toml b/pyproject.toml index 42c1719..f109640 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -28,6 +28,10 @@ dev = [ "ruff>=0.4", "pytest>=8.0", "pytest-asyncio>=0.23", + # `data/synthetic` writes Parquet. It is an arche extra rather than a base + # dependency, so without it here the synthetic tests skip in CI and read as + # coverage they are not providing. + "pyarrow>=14", ] [tool.ruff] diff --git a/uv.lock b/uv.lock index c54b92a..ace6bde 100644 --- a/uv.lock +++ b/uv.lock @@ -267,8 +267,7 @@ dependencies = [ all = [ { name = "anthropic" }, { name = "duckdb" }, - { name = "gliner" }, - { name = "onnxruntime" }, + { name = "gliner2", extra = ["local"] }, { name = "openai" }, { name = "presidio-analyzer" }, { name = "presidio-anonymizer" }, @@ -277,8 +276,7 @@ all = [ { name = "splink" }, ] detect = [ - { name = "gliner" }, - { name = "onnxruntime" }, + { name = "gliner2", extra = ["local"] }, ] detect2 = [ { name = "gliner2", extra = ["local"] }, @@ -304,8 +302,7 @@ geo = [ { name = "shapely" }, ] gliner = [ - { name = "gliner" }, - { name = "onnxruntime" }, + { name = "gliner2", extra = ["local"] }, ] ledger = [ { name = "duckdb" }, @@ -341,6 +338,10 @@ resolve = [ runtime = [ { name = "duckdb" }, ] +service = [ + { name = "fastapi" }, + { name = "uvicorn" }, +] splink = [ { name = "duckdb" }, { name = "splink" }, @@ -359,18 +360,16 @@ requires-dist = [ { name = "duckdb", marker = "extra == 'resolve'", specifier = ">=1.0" }, { name = "duckdb", marker = "extra == 'runtime'", specifier = ">=1.0" }, { name = "duckdb", marker = "extra == 'splink'", specifier = ">=1.0" }, - { name = "gliner", marker = "extra == 'all'", specifier = ">=0.2.8" }, - { name = "gliner", marker = "extra == 'detect'", specifier = ">=0.2.8" }, - { name = "gliner", marker = "extra == 'gliner'", specifier = ">=0.2.8" }, + { name = "fastapi", marker = "extra == 'service'", specifier = ">=0.110" }, + { name = "gliner2", extras = ["local"], marker = "extra == 'all'", specifier = ">=2.0" }, + { name = "gliner2", extras = ["local"], marker = "extra == 'detect'", specifier = ">=2.0" }, { name = "gliner2", extras = ["local"], marker = "extra == 'detect2'", specifier = ">=2.0" }, + { name = "gliner2", extras = ["local"], marker = "extra == 'gliner'", specifier = ">=2.0" }, { name = "h3", specifier = ">=4.0" }, { name = "jellyfish", specifier = ">=1.0" }, { name = "litellm", marker = "extra == 'litellm'", specifier = ">=1.40" }, { name = "mypy", marker = "extra == 'dev'", specifier = ">=1.10" }, { name = "networkx", specifier = ">=3.0" }, - { name = "onnxruntime", marker = "extra == 'all'", specifier = ">=1.18" }, - { name = "onnxruntime", marker = "extra == 'detect'", specifier = ">=1.18" }, - { name = "onnxruntime", marker = "extra == 'gliner'", specifier = ">=1.18" }, { name = "openai", marker = "extra == 'all'", specifier = ">=1.0" }, { name = "openai", marker = "extra == 'llm'", specifier = ">=1.0" }, { name = "phonenumbers", specifier = ">=8.13" }, @@ -397,8 +396,9 @@ requires-dist = [ { name = "splink", marker = "extra == 'all'", specifier = ">=4.0" }, { name = "splink", marker = "extra == 'resolve'", specifier = ">=4.0" }, { name = "splink", marker = "extra == 'splink'", specifier = ">=4.0" }, + { name = "uvicorn", marker = "extra == 'service'", specifier = ">=0.29" }, ] -provides-extras = ["africa", "all", "detect", "detect2", "dev", "doc", "doc-ocr", "docx", "geo", "gh", "gliner", "ke", "ledger", "litellm", "llm", "ng", "parquet", "pdf", "pdf-mupdf", "pii", "presidio", "resolve", "runtime", "splink", "za"] +provides-extras = ["africa", "all", "detect", "detect2", "dev", "doc", "doc-ocr", "docx", "geo", "gh", "gliner", "ke", "ledger", "litellm", "llm", "ng", "parquet", "pdf", "pdf-mupdf", "pii", "presidio", "resolve", "runtime", "service", "splink", "za"] [[package]] name = "arche-mcp" @@ -433,6 +433,7 @@ dependencies = [ [package.dev-dependencies] dev = [ + { name = "pyarrow" }, { name = "pytest" }, { name = "pytest-asyncio" }, { name = "ruff" }, @@ -446,6 +447,7 @@ requires-dist = [ [package.metadata.requires-dev] dev = [ + { name = "pyarrow", specifier = ">=14" }, { name = "pytest", specifier = ">=8.0" }, { name = "pytest-asyncio", specifier = ">=0.23" }, { name = "ruff", specifier = ">=0.4" }, @@ -1241,6 +1243,22 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/50/9a/b947ed175ce9a0dcb070ccf3607f0ce8720cfb5ed1a36166a150b2acd5af/faker-40.36.0-py3-none-any.whl", hash = "sha256:82b9497d9cfe017048075bcf969298a74b1b6e39f5e4dad1211085d1133f7b62", size = 2062829, upload-time = "2026-07-24T21:11:31.37Z" }, ] +[[package]] +name = "fastapi" +version = "0.141.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-doc" }, + { name = "pydantic" }, + { name = "starlette" }, + { name = "typing-extensions" }, + { name = "typing-inspection" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8a/02/91e3416a8fdd715abb903a952a6bec7cdd8d14eed55d415fc8595524c319/fastapi-0.141.1.tar.gz", hash = "sha256:e8822fc40db1e1858054d7a949a888695bc9bdce70139178e33bd2871a453ca1", size = 425799, upload-time = "2026-07-29T17:18:05.568Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/03/10388a42375ee7e4ac9b94eb2c5c569c8b5795e377e701c9ac3ad63de890/fastapi-0.141.1-py3-none-any.whl", hash = "sha256:bfb91aa2d334c61cb35ba9a116fc123b3d3df31640b801cf57a7a78ec3f603b3", size = 131954, upload-time = "2026-07-29T17:18:04.364Z" }, +] + [[package]] name = "filelock" version = "3.25.2" @@ -1381,23 +1399,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d5/1f/5f4a3cd9e4440e9d9bc78ad0a91a1c8d46b4d429d5239ebe6793c9fe5c41/fsspec-2026.3.0-py3-none-any.whl", hash = "sha256:d2ceafaad1b3457968ed14efa28798162f1638dbb5d2a6868a2db002a5ee39a4", size = 202595, upload-time = "2026-03-27T19:11:13.595Z" }, ] -[[package]] -name = "gliner" -version = "0.2.26" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "huggingface-hub" }, - { name = "onnxruntime" }, - { name = "sentencepiece" }, - { name = "torch" }, - { name = "tqdm" }, - { name = "transformers" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/49/18/e199cb97147c4a9260c75e4caf51e17be6ff969b0604a029c9c62810cbe0/gliner-0.2.26.tar.gz", hash = "sha256:6783be92b4b81caa878dcc4269ba37800207c37118d8ff9be028b93bddd6813d", size = 181224, upload-time = "2026-03-19T15:07:22.707Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7c/6e/d54d3d2867e29b68a22b144f570c8204209647fccc7879cec5218d6ed5fb/gliner-0.2.26-py3-none-any.whl", hash = "sha256:b9baa47641efb90b9d069add0528ed2464d137991ff097f42b0cab37a91ba991", size = 170429, upload-time = "2026-03-19T15:07:19.914Z" }, -] - [[package]] name = "gliner2" version = "2.0.0" @@ -4589,62 +4590,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f8/95/12d226ee4d207cb1f77a216baa7e1a8bae2639733c140abe8d0316d23a18/semchunk-3.2.5-py3-none-any.whl", hash = "sha256:fd09cc5f380bd010b8ca773bd81893f7eaf11d37dd8362a83d46cedaf5dae076", size = 13048, upload-time = "2025-10-28T02:12:36.724Z" }, ] -[[package]] -name = "sentencepiece" -version = "0.2.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/15/15/2e7a025fc62d764b151ae6d0f2a92f8081755ebe8d4a64099accc6f77ba6/sentencepiece-0.2.1.tar.gz", hash = "sha256:8138cec27c2f2282f4a34d9a016e3374cd40e5c6e9cb335063db66a0a3b71fad", size = 3228515, upload-time = "2025-08-12T07:00:51.718Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d8/15/46afbab00733d81788b64be430ca1b93011bb9388527958e26cc31832de5/sentencepiece-0.2.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6356d0986b8b8dc351b943150fcd81a1c6e6e4d439772e8584c64230e58ca987", size = 1942560, upload-time = "2025-08-12T06:59:25.82Z" }, - { url = "https://files.pythonhosted.org/packages/fa/79/7c01b8ef98a0567e9d84a4e7a910f8e7074fcbf398a5cd76f93f4b9316f9/sentencepiece-0.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8f8ba89a3acb3dc1ae90f65ec1894b0b9596fdb98ab003ff38e058f898b39bc7", size = 1325385, upload-time = "2025-08-12T06:59:27.722Z" }, - { url = "https://files.pythonhosted.org/packages/bb/88/2b41e07bd24f33dcf2f18ec3b74247aa4af3526bad8907b8727ea3caba03/sentencepiece-0.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:02593eca45440ef39247cee8c47322a34bdcc1d8ae83ad28ba5a899a2cf8d79a", size = 1253319, upload-time = "2025-08-12T06:59:29.306Z" }, - { url = "https://files.pythonhosted.org/packages/a0/54/38a1af0c6210a3c6f95aa46d23d6640636d020fba7135cd0d9a84ada05a7/sentencepiece-0.2.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0a0d15781a171d188b661ae4bde1d998c303f6bd8621498c50c671bd45a4798e", size = 1316162, upload-time = "2025-08-12T06:59:30.914Z" }, - { url = "https://files.pythonhosted.org/packages/ef/66/fb191403ade791ad2c3c1e72fe8413e63781b08cfa3aa4c9dfc536d6e795/sentencepiece-0.2.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4f5a3e0d9f445ed9d66c0fec47d4b23d12cfc858b407a03c194c1b26c2ac2a63", size = 1387785, upload-time = "2025-08-12T06:59:32.491Z" }, - { url = "https://files.pythonhosted.org/packages/a9/2d/3bd9b08e70067b2124518b308db6a84a4f8901cc8a4317e2e4288cdd9b4d/sentencepiece-0.2.1-cp311-cp311-win32.whl", hash = "sha256:6d297a1748d429ba8534eebe5535448d78b8acc32d00a29b49acf28102eeb094", size = 999555, upload-time = "2025-08-12T06:59:34.475Z" }, - { url = "https://files.pythonhosted.org/packages/32/b8/f709977f5fda195ae1ea24f24e7c581163b6f142b1005bc3d0bbfe4d7082/sentencepiece-0.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:82d9ead6591015f009cb1be1cb1c015d5e6f04046dbb8c9588b931e869a29728", size = 1054617, upload-time = "2025-08-12T06:59:36.461Z" }, - { url = "https://files.pythonhosted.org/packages/7a/40/a1fc23be23067da0f703709797b464e8a30a1c78cc8a687120cd58d4d509/sentencepiece-0.2.1-cp311-cp311-win_arm64.whl", hash = "sha256:39f8651bd10974eafb9834ce30d9bcf5b73e1fc798a7f7d2528f9820ca86e119", size = 1033877, upload-time = "2025-08-12T06:59:38.391Z" }, - { url = "https://files.pythonhosted.org/packages/4a/be/32ce495aa1d0e0c323dcb1ba87096037358edee539cac5baf8755a6bd396/sentencepiece-0.2.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:57cae326c8727de58c85977b175af132a7138d84c764635d7e71bbee7e774133", size = 1943152, upload-time = "2025-08-12T06:59:40.048Z" }, - { url = "https://files.pythonhosted.org/packages/88/7e/ff23008899a58678e98c6ff592bf4d368eee5a71af96d0df6b38a039dd4f/sentencepiece-0.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:56dd39a3c4d6493db3cdca7e8cc68c6b633f0d4195495cbadfcf5af8a22d05a6", size = 1325651, upload-time = "2025-08-12T06:59:41.536Z" }, - { url = "https://files.pythonhosted.org/packages/19/84/42eb3ce4796777a1b5d3699dfd4dca85113e68b637f194a6c8d786f16a04/sentencepiece-0.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d9381351182ff9888cc80e41c632e7e274b106f450de33d67a9e8f6043da6f76", size = 1253645, upload-time = "2025-08-12T06:59:42.903Z" }, - { url = "https://files.pythonhosted.org/packages/89/fa/d3d5ebcba3cb9e6d3775a096251860c41a6bc53a1b9461151df83fe93255/sentencepiece-0.2.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:99f955df238021bf11f0fc37cdb54fd5e5b5f7fd30ecc3d93fb48b6815437167", size = 1316273, upload-time = "2025-08-12T06:59:44.476Z" }, - { url = "https://files.pythonhosted.org/packages/04/88/14f2f4a2b922d8b39be45bf63d79e6cd3a9b2f248b2fcb98a69b12af12f5/sentencepiece-0.2.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0cdfecef430d985f1c2bcbfff3defd1d95dae876fbd0173376012d2d7d24044b", size = 1387881, upload-time = "2025-08-12T06:59:46.09Z" }, - { url = "https://files.pythonhosted.org/packages/fd/b8/903e5ccb77b4ef140605d5d71b4f9e0ad95d456d6184688073ed11712809/sentencepiece-0.2.1-cp312-cp312-win32.whl", hash = "sha256:a483fd29a34c3e34c39ac5556b0a90942bec253d260235729e50976f5dba1068", size = 999540, upload-time = "2025-08-12T06:59:48.023Z" }, - { url = "https://files.pythonhosted.org/packages/2d/81/92df5673c067148c2545b1bfe49adfd775bcc3a169a047f5a0e6575ddaca/sentencepiece-0.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:4cdc7c36234fda305e85c32949c5211faaf8dd886096c7cea289ddc12a2d02de", size = 1054671, upload-time = "2025-08-12T06:59:49.895Z" }, - { url = "https://files.pythonhosted.org/packages/fe/02/c5e3bc518655d714622bec87d83db9cdba1cd0619a4a04e2109751c4f47f/sentencepiece-0.2.1-cp312-cp312-win_arm64.whl", hash = "sha256:daeb5e9e9fcad012324807856113708614d534f596d5008638eb9b40112cd9e4", size = 1033923, upload-time = "2025-08-12T06:59:51.952Z" }, - { url = "https://files.pythonhosted.org/packages/ba/4a/85fbe1706d4d04a7e826b53f327c4b80f849cf1c7b7c5e31a20a97d8f28b/sentencepiece-0.2.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dcd8161eee7b41aae57ded06272905dbd680a0a04b91edd0f64790c796b2f706", size = 1943150, upload-time = "2025-08-12T06:59:53.588Z" }, - { url = "https://files.pythonhosted.org/packages/c2/83/4cfb393e287509fc2155480b9d184706ef8d9fa8cbf5505d02a5792bf220/sentencepiece-0.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c6c8f42949f419ff8c7e9960dbadcfbc982d7b5efc2f6748210d3dd53a7de062", size = 1325651, upload-time = "2025-08-12T06:59:55.073Z" }, - { url = "https://files.pythonhosted.org/packages/8d/de/5a007fb53b1ab0aafc69d11a5a3dd72a289d5a3e78dcf2c3a3d9b14ffe93/sentencepiece-0.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:097f3394e99456e9e4efba1737c3749d7e23563dd1588ce71a3d007f25475fff", size = 1253641, upload-time = "2025-08-12T06:59:56.562Z" }, - { url = "https://files.pythonhosted.org/packages/2c/d2/f552be5928105588f4f4d66ee37dd4c61460d8097e62d0e2e0eec41bc61d/sentencepiece-0.2.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d7b670879c370d350557edabadbad1f6561a9e6968126e6debca4029e5547820", size = 1316271, upload-time = "2025-08-12T06:59:58.109Z" }, - { url = "https://files.pythonhosted.org/packages/96/df/0cfe748ace5485be740fed9476dee7877f109da32ed0d280312c94ec259f/sentencepiece-0.2.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c7f0fd2f2693309e6628aeeb2e2faf6edd221134dfccac3308ca0de01f8dab47", size = 1387882, upload-time = "2025-08-12T07:00:00.701Z" }, - { url = "https://files.pythonhosted.org/packages/ac/dd/f7774d42a881ced8e1739f393ab1e82ece39fc9abd4779e28050c2e975b5/sentencepiece-0.2.1-cp313-cp313-win32.whl", hash = "sha256:92b3816aa2339355fda2c8c4e021a5de92180b00aaccaf5e2808972e77a4b22f", size = 999541, upload-time = "2025-08-12T07:00:02.709Z" }, - { url = "https://files.pythonhosted.org/packages/dd/e9/932b9eae6fd7019548321eee1ab8d5e3b3d1294df9d9a0c9ac517c7b636d/sentencepiece-0.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:10ed3dab2044c47f7a2e7b4969b0c430420cdd45735d78c8f853191fa0e3148b", size = 1054669, upload-time = "2025-08-12T07:00:04.915Z" }, - { url = "https://files.pythonhosted.org/packages/c9/3a/76488a00ea7d6931689cda28726a1447d66bf1a4837943489314593d5596/sentencepiece-0.2.1-cp313-cp313-win_arm64.whl", hash = "sha256:ac650534e2251083c5f75dde4ff28896ce7c8904133dc8fef42780f4d5588fcd", size = 1033922, upload-time = "2025-08-12T07:00:06.496Z" }, - { url = "https://files.pythonhosted.org/packages/4a/b6/08fe2ce819e02ccb0296f4843e3f195764ce9829cbda61b7513f29b95718/sentencepiece-0.2.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:8dd4b477a7b069648d19363aad0cab9bad2f4e83b2d179be668efa672500dc94", size = 1946052, upload-time = "2025-08-12T07:00:08.136Z" }, - { url = "https://files.pythonhosted.org/packages/ab/d9/1ea0e740591ff4c6fc2b6eb1d7510d02f3fb885093f19b2f3abd1363b402/sentencepiece-0.2.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0c0f672da370cc490e4c59d89e12289778310a0e71d176c541e4834759e1ae07", size = 1327408, upload-time = "2025-08-12T07:00:09.572Z" }, - { url = "https://files.pythonhosted.org/packages/99/7e/1fb26e8a21613f6200e1ab88824d5d203714162cf2883248b517deb500b7/sentencepiece-0.2.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:ad8493bea8432dae8d6830365352350f3b4144415a1d09c4c8cb8d30cf3b6c3c", size = 1254857, upload-time = "2025-08-12T07:00:11.021Z" }, - { url = "https://files.pythonhosted.org/packages/bc/85/c72fd1f3c7a6010544d6ae07f8ddb38b5e2a7e33bd4318f87266c0bbafbf/sentencepiece-0.2.1-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b81a24733726e3678d2db63619acc5a8dccd074f7aa7a54ecd5ca33ca6d2d596", size = 1315722, upload-time = "2025-08-12T07:00:12.989Z" }, - { url = "https://files.pythonhosted.org/packages/4a/e8/661e5bd82a8aa641fd6c1020bd0e890ef73230a2b7215ddf9c8cd8e941c2/sentencepiece-0.2.1-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0a81799d0a68d618e89063fb423c3001a034c893069135ffe51fee439ae474d6", size = 1387452, upload-time = "2025-08-12T07:00:15.088Z" }, - { url = "https://files.pythonhosted.org/packages/99/5e/ae66c361023a470afcbc1fbb8da722c72ea678a2fcd9a18f1a12598c7501/sentencepiece-0.2.1-cp313-cp313t-win32.whl", hash = "sha256:89a3ea015517c42c0341d0d962f3e6aaf2cf10d71b1932d475c44ba48d00aa2b", size = 1002501, upload-time = "2025-08-12T07:00:16.966Z" }, - { url = "https://files.pythonhosted.org/packages/c1/03/d332828c4ff764e16c1b56c2c8f9a33488bbe796b53fb6b9c4205ddbf167/sentencepiece-0.2.1-cp313-cp313t-win_amd64.whl", hash = "sha256:33f068c9382dc2e7c228eedfd8163b52baa86bb92f50d0488bf2b7da7032e484", size = 1057555, upload-time = "2025-08-12T07:00:18.573Z" }, - { url = "https://files.pythonhosted.org/packages/88/14/5aee0bf0864df9bd82bd59e7711362908e4935e3f9cdc1f57246b5d5c9b9/sentencepiece-0.2.1-cp313-cp313t-win_arm64.whl", hash = "sha256:b3616ad246f360e52c85781e47682d31abfb6554c779e42b65333d4b5f44ecc0", size = 1036042, upload-time = "2025-08-12T07:00:20.209Z" }, - { url = "https://files.pythonhosted.org/packages/24/9c/89eb8b2052f720a612478baf11c8227dcf1dc28cd4ea4c0c19506b5af2a2/sentencepiece-0.2.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:5d0350b686c320068702116276cfb26c066dc7e65cfef173980b11bb4d606719", size = 1943147, upload-time = "2025-08-12T07:00:21.809Z" }, - { url = "https://files.pythonhosted.org/packages/82/0b/a1432bc87f97c2ace36386ca23e8bd3b91fb40581b5e6148d24b24186419/sentencepiece-0.2.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:c7f54a31cde6fa5cb030370566f68152a742f433f8d2be458463d06c208aef33", size = 1325624, upload-time = "2025-08-12T07:00:23.289Z" }, - { url = "https://files.pythonhosted.org/packages/ea/99/bbe054ebb5a5039457c590e0a4156ed073fb0fe9ce4f7523404dd5b37463/sentencepiece-0.2.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c83b85ab2d6576607f31df77ff86f28182be4a8de6d175d2c33ca609925f5da1", size = 1253670, upload-time = "2025-08-12T07:00:24.69Z" }, - { url = "https://files.pythonhosted.org/packages/19/ad/d5c7075f701bd97971d7c2ac2904f227566f51ef0838dfbdfdccb58cd212/sentencepiece-0.2.1-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1855f57db07b51fb51ed6c9c452f570624d2b169b36f0f79ef71a6e6c618cd8b", size = 1316247, upload-time = "2025-08-12T07:00:26.435Z" }, - { url = "https://files.pythonhosted.org/packages/fb/03/35fbe5f3d9a7435eebd0b473e09584bd3cc354ce118b960445b060d33781/sentencepiece-0.2.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01e6912125cb45d3792f530a4d38f8e21bf884d6b4d4ade1b2de5cf7a8d2a52b", size = 1387894, upload-time = "2025-08-12T07:00:28.339Z" }, - { url = "https://files.pythonhosted.org/packages/dc/aa/956ef729aafb6c8f9c443104c9636489093bb5c61d6b90fc27aa1a865574/sentencepiece-0.2.1-cp314-cp314-win32.whl", hash = "sha256:c415c9de1447e0a74ae3fdb2e52f967cb544113a3a5ce3a194df185cbc1f962f", size = 1096698, upload-time = "2025-08-12T07:00:29.764Z" }, - { url = "https://files.pythonhosted.org/packages/b8/cb/fe400d8836952cc535c81a0ce47dc6875160e5fedb71d2d9ff0e9894c2a6/sentencepiece-0.2.1-cp314-cp314-win_amd64.whl", hash = "sha256:881b2e44b14fc19feade3cbed314be37de639fc415375cefaa5bc81a4be137fd", size = 1155115, upload-time = "2025-08-12T07:00:32.865Z" }, - { url = "https://files.pythonhosted.org/packages/32/89/047921cf70f36c7b6b6390876b2399b3633ab73b8d0cb857e5a964238941/sentencepiece-0.2.1-cp314-cp314-win_arm64.whl", hash = "sha256:2005242a16d2dc3ac5fe18aa7667549134d37854823df4c4db244752453b78a8", size = 1133890, upload-time = "2025-08-12T07:00:34.763Z" }, - { url = "https://files.pythonhosted.org/packages/a1/11/5b414b9fae6255b5fb1e22e2ed3dc3a72d3a694e5703910e640ac78346bb/sentencepiece-0.2.1-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:a19adcec27c524cb7069a1c741060add95f942d1cbf7ad0d104dffa0a7d28a2b", size = 1946081, upload-time = "2025-08-12T07:00:36.97Z" }, - { url = "https://files.pythonhosted.org/packages/77/eb/7a5682bb25824db8545f8e5662e7f3e32d72a508fdce086029d89695106b/sentencepiece-0.2.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:e37e4b4c4a11662b5db521def4e44d4d30ae69a1743241412a93ae40fdcab4bb", size = 1327406, upload-time = "2025-08-12T07:00:38.669Z" }, - { url = "https://files.pythonhosted.org/packages/03/b0/811dae8fb9f2784e138785d481469788f2e0d0c109c5737372454415f55f/sentencepiece-0.2.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:477c81505db072b3ab627e7eab972ea1025331bd3a92bacbf798df2b75ea86ec", size = 1254846, upload-time = "2025-08-12T07:00:40.611Z" }, - { url = "https://files.pythonhosted.org/packages/ef/23/195b2e7ec85ebb6a547969f60b723c7aca5a75800ece6cc3f41da872d14e/sentencepiece-0.2.1-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:010f025a544ef770bb395091d57cb94deb9652d8972e0d09f71d85d5a0816c8c", size = 1315721, upload-time = "2025-08-12T07:00:42.914Z" }, - { url = "https://files.pythonhosted.org/packages/7e/aa/553dbe4178b5f23eb28e59393dddd64186178b56b81d9b8d5c3ff1c28395/sentencepiece-0.2.1-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:733e59ff1794d26db706cd41fc2d7ca5f6c64a820709cb801dc0ea31780d64ab", size = 1387458, upload-time = "2025-08-12T07:00:44.56Z" }, - { url = "https://files.pythonhosted.org/packages/66/7c/08ff0012507297a4dd74a5420fdc0eb9e3e80f4e88cab1538d7f28db303d/sentencepiece-0.2.1-cp314-cp314t-win32.whl", hash = "sha256:d3233770f78e637dc8b1fda2cd7c3b99ec77e7505041934188a4e7fe751de3b0", size = 1099765, upload-time = "2025-08-12T07:00:46.058Z" }, - { url = "https://files.pythonhosted.org/packages/91/d5/2a69e1ce15881beb9ddfc7e3f998322f5cedcd5e4d244cb74dade9441663/sentencepiece-0.2.1-cp314-cp314t-win_amd64.whl", hash = "sha256:5e4366c97b68218fd30ea72d70c525e6e78a6c0a88650f57ac4c43c63b234a9d", size = 1157807, upload-time = "2025-08-12T07:00:47.673Z" }, - { url = "https://files.pythonhosted.org/packages/f3/16/54f611fcfc2d1c46cbe3ec4169780b2cfa7cf63708ef2b71611136db7513/sentencepiece-0.2.1-cp314-cp314t-win_arm64.whl", hash = "sha256:105e36e75cbac1292642045458e8da677b2342dcd33df503e640f0b457cb6751", size = 1136264, upload-time = "2025-08-12T07:00:49.485Z" }, -] - [[package]] name = "setuptools" version = "81.0.0" @@ -5459,8 +5404,8 @@ name = "uvicorn" version = "0.52.4" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "click", marker = "sys_platform != 'emscripten'" }, - { name = "h11", marker = "sys_platform != 'emscripten'" }, + { name = "click" }, + { name = "h11" }, ] sdist = { url = "https://files.pythonhosted.org/packages/f2/0f/3f86e61397dd33bf2ccf28188c40db6a740658aeebbbf6e7dbc101a1f487/uvicorn-0.52.4.tar.gz", hash = "sha256:73acfee47a0b133c5de13d219492d62d8a31e935f4fe6e41a232451a15379f86", size = 100627, upload-time = "2026-08-19T06:27:41.821Z" } wheels = [