Back to Blog

Entity linking and entity resolution APIs, compared

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

Entity linking APIs at a glance
Featureresolve()Wikidata search (first hit)Entity-FishingDandelionGoogle Cloud NLAzure Entity Linking
ReturnsWikidata QID, or your own IDWikidata QIDWikidata QIDWikipedia and DBpedia linksWikipedia URL and Knowledge Graph MIDWikipedia URL
Reads the contextYesNo, name match onlyYesYesYesYes
When unsureunresolved with one of four reasonsAlways returns the top hitConfidence scoremin_confidence thresholdLeaves the entity unlinkedConfidence score
Your own entitiesWordLift graph, or 5,000 inlineNoNot documentedNot documentedNoNo
Your own mention spansYesYou send the nameYes, partially annotated textNoNoNo
Languagesen, it, fr, de, es, pt; ja and zh at a lower levelLabels in many languages157See Google docs2: English, Spanish
How you run itHosted APIWikimedia APISelf-hosted (Java, 3 GB RAM minimum)Hosted APIHosted APIHosted API
Open sourcePipeline, clients, contract and gold sets (Apache-2.0); engine closedn/aApache-2.0NoNoNo
StatusPublic betaStableActiveActiveActiveRetiring 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.

On VoxEL, resolve() links 884 of 1,005 mentions correctly when given themresolve() · mentions given: 884 right, 37 wrong, 84 no answer; Google Cloud NL · found: 838 right, 21 wrong, 146 no answer; resolve() · found: 793 right, 26 wrong, 186 no answer; Dandelion · found: 784 right, 40 wrong, 181 no answer; Entity-Fishing · given: 695 right, 88 wrong, 222 no answer; Wikidata first hit · name only: 753 right, 238 wrong, 14 no answerOn VoxEL, resolve() links 884 of 1,005 mentions correctly when given themOutcome for every mention in five languages; Google finds more names on its ownrightwrong linkno answerresolve() · mentions givenresolve() · mentions given: 884 right of 1005resolve() · mentions given: 37 wrong linksresolve() · mentions given: 84 no answer884 right · 37 wrongGoogle Cloud NL · foundGoogle Cloud NL · found: 838 right of 1005Google Cloud NL · found: 21 wrong linksGoogle Cloud NL · found: 146 no answer838 right · 21 wrongresolve() · foundresolve() · found: 793 right of 1005resolve() · found: 26 wrong linksresolve() · found: 186 no answer793 right · 26 wrongDandelion · foundDandelion · found: 784 right of 1005Dandelion · found: 40 wrong linksDandelion · found: 181 no answer784 right · 40 wrongEntity-Fishing · givenEntity-Fishing · given: 695 right of 1005Entity-Fishing · given: 88 wrong linksEntity-Fishing · given: 222 no answer695 right · 88 wrongWikidata first hit · name onlyWikidata first hit · name only: 753 right of 1005Wikidata first hit · name only: 238 wrong linksWikidata first hit · name only: 14 no answer753 right · 238 wrongGiven = the service receives the gold mention spans; found = it detects the names itself.
VoxEL strict, 1,005 mentions. WordLift run of 19 October 2026.
SystemMentionsPrecisionRecallF1CorrectWrongNo answer
resolve()given96.088.091.88843784
Google Cloud NLfound by the service97.683.489.983821146
resolve()found by the service96.878.987.079326186
Dandelionfound by the service95.178.085.778440181
Entity-Fishinggiven88.869.277.769588222
Wikidata search, first hitthe name alone76.074.975.575323814

Azure Entity Linking is not in the test: it retires on 1 September 2028. For moving off it, see the migration guide.

VoxEL F1 by language: resolve() leads in four of five, Google in GermanEnglish: resolve(), given 93.1, Google Cloud NL 92.7, resolve(), found 87.7, Dandelion 81.5, Entity-Fishing 80.7, Wikidata first hit 60.7; Italian: resolve(), given 92.6, Google Cloud NL 85.8, resolve(), found 87.3, Dandelion 88.9, Entity-Fishing 57.1, Wikidata first hit 84.8; French: resolve(), given 91.1, Google Cloud NL 88.2, resolve(), found 86.6, Dandelion 86.5, Entity-Fishing 69.0, Wikidata first hit 70.3; German: resolve(), given 87.0, Google Cloud NL 90.1, resolve(), found 82.5, Dandelion 81.0, Entity-Fishing 87.9, Wikidata first hit 76.3; Spanish: resolve(), given 94.9, Google Cloud NL 92.5, resolve(), found 90.4, Dandelion 90.2, Entity-Fishing 89.0, Wikidata first hit 85.2VoxEL F1 by language: resolve() leads in four of five, Google in GermanF1 in percent, one dot per system; the axis starts at 50resolve(), givenGoogle Cloud NLresolve(), foundDandelion, Entity-Fishing, Wikidata first hit5060708090100EnglishEnglish, resolve(), given: F1 93.1English, Google Cloud NL: F1 92.7English, resolve(), found: F1 87.7English, Dandelion: F1 81.5English, Entity-Fishing: F1 80.7English, Wikidata first hit: F1 60.7resolve() 93.1ItalianItalian, resolve(), given: F1 92.6Italian, Google Cloud NL: F1 85.8Italian, resolve(), found: F1 87.3Italian, Dandelion: F1 88.9Italian, Entity-Fishing: F1 57.1Italian, Wikidata first hit: F1 84.8resolve() 92.6FrenchFrench, resolve(), given: F1 91.1French, Google Cloud NL: F1 88.2French, resolve(), found: F1 86.6French, Dandelion: F1 86.5French, Entity-Fishing: F1 69.0French, Wikidata first hit: F1 70.3resolve() 91.1GermanGerman, resolve(), given: F1 87.0German, Google Cloud NL: F1 90.1German, resolve(), found: F1 82.5German, Dandelion: F1 81.0German, Entity-Fishing: F1 87.9German, Wikidata first hit: F1 76.3Google 90.1 · resolve() 87.0SpanishSpanish, resolve(), given: F1 94.9Spanish, Google Cloud NL: F1 92.5Spanish, resolve(), found: F1 90.4Spanish, Dandelion: F1 90.2Spanish, Entity-Fishing: F1 89.0Spanish, Wikidata first hit: F1 85.2resolve() 94.9Given = the system receives the gold mention spans; found = it detects the names itself.
VoxEL strict, 201 mentions per language. WordLift run of 19 October 2026.

F1 by language on VoxEL:

SystemEnglishItalianFrenchGermanSpanish
resolve(), mentions given93.192.691.187.094.9
Google Cloud NL92.785.888.290.192.5
resolve(), mentions found87.787.386.682.590.4
Dandelion81.588.986.581.090.2
Entity-Fishing80.757.169.087.989.0
Wikidata search, first hit60.784.870.376.385.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).

Development sets: resolve() gets the most right, Google makes the fewest wrong linksresolve(), given: 321 right, 23 wrong; Dandelion: 312 right, 15 wrong; resolve(), found: 312 right, 16 wrong; Google Cloud NL: 294 right, 12 wrong; Wikidata first hit: 288 right, 61 wrong; Entity-Fishing, given: 251 right, 25 wrongDevelopment sets: resolve() gets the most right, Google makes the fewest wrong links351 mentions in six languages; better is up and to the left. These sets favour resolve(), which is developed on them.240260280300320right010203040506070wrong links →resolve(), given: 321 right, 23 wrong of 351resolve(), given · 321 / 23Dandelion: 312 right, 15 wrong of 351Dandelion · 312 / 15resolve(), found: 312 right, 16 wrong of 351resolve(), found · 312 / 16Google Cloud NL: 294 right, 12 wrong of 351Google Cloud NL · 294 / 12Wikidata first hit: 288 right, 61 wrong of 351Wikidata first hit · 288 / 61Entity-Fishing, given: 251 right, 25 wrong of 351Entity-Fishing, given · 251 / 25
resolve() development sets, 126 sentences, 351 mentions. WordLift run of 19 October 2026.
SystemMentionsPrecisionRecallF1CorrectWrongNo answer
resolve()given93.391.592.4321237
Dandelionfound by the service95.488.992.03121524
resolve()found by the service95.188.991.93121623
Google Cloud NLfound by the service96.183.889.52941245
Wikidata search, first hitthe name alone82.582.182.3288612
Entity-Fishinggiven90.971.580.12512575

F1 by language:

SystemEnglishItalianFrenchGermanSpanishPortuguese
resolve(), mentions given93.588.691.494.490.593.3
Dandelion92.689.793.090.995.191.2
resolve(), mentions found94.990.785.395.588.991.2
Google Cloud NL87.692.986.694.185.790.6
Wikidata search, first hit81.481.870.389.983.384.3
Entity-Fishing85.454.540.092.982.289.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.