Entity linking and entity resolution APIs, compared
resolve() vs Google, Dandelion, Entity-Fishing and Wikidata search on VoxEL, five languages: who links the most names right, and where we lose.
Every entity linking service answers the same question: which real-world thing does this name refer to? They differ in what they return, what they do when unsure, and whether they can use your own knowledge graph. This page compares six options on VoxEL, a public news benchmark none of them was tuned on, and on our own development sets, including where resolve() loses.
At a glance
| Feature | resolve() | Wikidata search (first hit) | Entity-Fishing | Dandelion | Google Cloud NL | Azure Entity Linking |
|---|---|---|---|---|---|---|
| Returns | Wikidata QID, or your own ID | Wikidata QID | Wikidata QID | Wikipedia and DBpedia links | Wikipedia URL and Knowledge Graph MID | Wikipedia URL |
| Reads the context | Yes | No, name match only | Yes | Yes | Yes | Yes |
| When unsure | unresolved with one of four reasons | Always returns the top hit | Confidence score | min_confidence threshold | Leaves the entity unlinked | Confidence score |
| Your own entities | WordLift graph, or 5,000 inline | No | Not documented | Not documented | No | No |
| Your own mention spans | Yes | You send the name | Yes, partially annotated text | No | No | No |
| Languages | en, it, fr, de, es, pt; ja and zh at a lower level | Labels in many languages | 15 | 7 | See Google docs | 2: English, Spanish |
| How you run it | Hosted API | Wikimedia API | Self-hosted (Java, 3 GB RAM minimum) | Hosted API | Hosted API | Hosted API |
| Open source | Pipeline, clients, contract and gold sets (Apache-2.0); engine closed | n/a | Apache-2.0 | No | No | No |
| Status | Public beta | Stable | Active | Active | Active | Retiring 1 September 2028 |
Sources: Entity-Fishing overview, Dandelion datatxt-nex reference, Azure Entity Linking quickstart, resolve() developer guide, Google Cloud Natural Language analyzeEntities reference, Entity-Fishing on GitHub, Wikidata search API (wbsearchentities). Checked 17 October 2026.
Live test on VoxEL, 19 October 2026
On VoxEL, 1,005 mentions in news articles in five languages, resolve() linked 884 names correctly when given the mentions, against 838 for Google, 784 for Dandelion and 695 for Entity-Fishing, also given the mentions. Finding the mentions itself, as Google and Dandelion do, resolve() linked 793: ahead of Dandelion, behind Google.
| System | Mentions | Precision | Recall | F1 | Correct | Wrong | No answer |
|---|---|---|---|---|---|---|---|
| resolve() | given | 96.0 | 88.0 | 91.8 | 884 | 37 | 84 |
| Google Cloud NL | found by the service | 97.6 | 83.4 | 89.9 | 838 | 21 | 146 |
| resolve() | found by the service | 96.8 | 78.9 | 87.0 | 793 | 26 | 186 |
| Dandelion | found by the service | 95.1 | 78.0 | 85.7 | 784 | 40 | 181 |
| Entity-Fishing | given | 88.8 | 69.2 | 77.7 | 695 | 88 | 222 |
| Wikidata search, first hit | the name alone | 76.0 | 74.9 | 75.5 | 753 | 238 | 14 |
Azure Entity Linking is not in the test: it retires on 1 September 2028. For moving off it, see the migration guide.
F1 by language on VoxEL:
| System | English | Italian | French | German | Spanish |
|---|---|---|---|---|---|
| resolve(), mentions given | 93.1 | 92.6 | 91.1 | 87.0 | 94.9 |
| Google Cloud NL | 92.7 | 85.8 | 88.2 | 90.1 | 92.5 |
| resolve(), mentions found | 87.7 | 87.3 | 86.6 | 82.5 | 90.4 |
| Dandelion | 81.5 | 88.9 | 86.5 | 81.0 | 90.2 |
| Entity-Fishing | 80.7 | 57.1 | 69.0 | 87.9 | 89.0 |
| Wikidata search, first hit | 60.7 | 84.8 | 70.3 | 76.3 | 85.2 |
Where resolve() wins. Given the mentions, it leads in four of the five languages and makes 37 wrong links where the first search hit makes 238. Finding its own mentions it is still ahead of Dandelion: on 114 mentions only resolve() was right, on 105 only Dandelion.
Where it loses. Google finds more of the mentions. End to end, on 134 mentions only Google was right and on 89 only resolve(); 125 of those 134 are names resolve() did not detect. Most are short second references in news style, such as “Trump” after “Donald Trump” and “Union” after “European Union”, and newspaper names such as Bild and the Times. Google also leads in German.
Our development sets
Our six development sets are 126 short sentences in six languages, built around ambiguous names (351 mentions). We develop resolve() on them, so they favour it. Given the mentions, resolve() was right 321 times, Dandelion 312, Google 294 and Wikidata’s first search hit 288. Google made the fewest wrong links (12), then Dandelion (15), resolve() (23) and the first hit (61).
| System | Mentions | Precision | Recall | F1 | Correct | Wrong | No answer |
|---|---|---|---|---|---|---|---|
| resolve() | given | 93.3 | 91.5 | 92.4 | 321 | 23 | 7 |
| Dandelion | found by the service | 95.4 | 88.9 | 92.0 | 312 | 15 | 24 |
| resolve() | found by the service | 95.1 | 88.9 | 91.9 | 312 | 16 | 23 |
| Google Cloud NL | found by the service | 96.1 | 83.8 | 89.5 | 294 | 12 | 45 |
| Wikidata search, first hit | the name alone | 82.5 | 82.1 | 82.3 | 288 | 61 | 2 |
| Entity-Fishing | given | 90.9 | 71.5 | 80.1 | 251 | 25 | 75 |
F1 by language:
| System | English | Italian | French | German | Spanish | Portuguese |
|---|---|---|---|---|---|---|
| resolve(), mentions given | 93.5 | 88.6 | 91.4 | 94.4 | 90.5 | 93.3 |
| Dandelion | 92.6 | 89.7 | 93.0 | 90.9 | 95.1 | 91.2 |
| resolve(), mentions found | 94.9 | 90.7 | 85.3 | 95.5 | 88.9 | 91.2 |
| Google Cloud NL | 87.6 | 92.9 | 86.6 | 94.1 | 85.7 | 90.6 |
| Wikidata search, first hit | 81.4 | 81.8 | 70.3 | 89.9 | 83.3 | 84.3 |
| Entity-Fishing | 85.4 | 54.5 | 40.0 | 92.9 | 82.2 | 89.0 |
Where resolve() wins. It got 39 of the first hit’s 61 wrong answers right, nearly all names whose most popular meaning is wrong for the sentence: Liverpool the club, not the city; Java the island, not the language; Mercury, Venus and the Sun as planets and a star, not a car brand, a goddess and Sun Microsystems.
Where it loses. On 8 mentions the first hit was right and resolve() was not: 6 wrong answers and 2 refusals (“Monaco” and “the Guardian”). The wrong answers are mostly places one level off: “Torino” read as the football club, “Trentino” as Trentino-Alto Adige, “Distrito Federal” as Mexico City, and “England” in “north west of England” as the United Kingdom. 22 mentions defeated both, among them “Jordan” with the Chicago Bulls and “Mozart” in German.
Against Dandelion. Given the mentions, resolve() is ahead, 92.4 to 92.0: on 30 mentions only resolve() was right, on 21 only Dandelion. Dandelion still makes fewer wrong links (15 to 23). resolve()’s remaining losses are people named by surname (Mozart twice, Darwin, Velázquez, Jordan) and clubs named by their city (Barcelona twice, Roma, Benfica). Finding its own mentions, resolve() is level with Dandelion: 91.9 to 92.0.
Against Google. resolve() is ahead, 92.4 to 89.5: on 47 mentions only resolve() was right, on 20 only Google. Google makes the fewest wrong links (12 against 23).
Method
Two suites. VoxEL (Rosales-Méndez, Hogan and Poblete, ISWC 2018; CC BY 4.0) annotates the same 15 VoxEurop articles in German, English, Spanish, French and Italian; we use the strict version, 201 mentions per language once the three per language with no Wikipedia article are left out. Our development sets are the six gold sets in the resolve() repository.
An answer counts only if its Wikidata ID equals the gold ID; Wikipedia answers, and VoxEL’s own Wikipedia labels, are mapped to Wikidata. Precision is correct out of answered; recall is correct out of all mentions. “Given” means the system receives the gold mention spans; the first-hit lookup gets the name alone, as an agent calling search would. A system that finds its own mentions gets the benefit of the doubt: a link on the gold span counts right or wrong, a link on an overlapping span counts only when it is right, and a mention it skips is no answer.
Every service ran with its defaults (Dandelion’s confidence threshold, 0.6; resolve()’s detection threshold, 0.5). resolve() ran through the API on 19 October 2026, build 8df08b7 (Google, Dandelion and the first hit on 18 October; Entity-Fishing 0.0.6 on 19 October, run locally on its February 2025 Wikipedia and Wikidata data, given the mentions); on the development sets the open demo gave the same 351 answers. A few VoxEL labels follow Wikipedia’s 2018 articles rather than today’s Wikidata items, for example for Britain and Twitter; we score them as written. The development sets are small, so differences under about five points within one language are noise; one of their labels was corrected (“Illy” pointed to a disambiguation page).
Which one to pick
- You need Wikidata IDs an agent can act on, and a clear “no” when unsure: resolve().
- You resolve against your own catalogue or knowledge graph: resolve(), with your graph first and Wikidata second.
- You want to self-host and own the model: Entity-Fishing.
- You only need Wikipedia links for tagging in seven European languages: Dandelion.
- You need the most names found in news text and will not supply the mentions: Google Cloud Natural Language, ahead end to end on VoxEL; it returns Wikipedia URLs, not Wikidata IDs.
- You are already on Azure Entity Linking: plan the move before 1 September 2028. Migration guide.
Run the comparison yourself
The gold sets, the matching rule and the harness are open: github.com/wordlift/content-analysis. tools/voxel.py downloads VoxEL and converts it; tools/compare.py runs every service you have keys for on the same documents and skips the rest.
The run on this page, with how each service ran, is in benchmarks/2026-10-19.