/
resolve()
Entity resolution in English, Italian, French, German, Spanish and Portuguese for knowledge graphs and AI systems. Give resolve() a mention, its context and candidate entities. Get back the supported entity, or NIL when the evidence isn't strong enough.
Resolver
POST /v1/resolve
{
"text": "I bought an Apple laptop in Rome.",
"language": "en",
"mentions": [{
"text": "Apple", "start": 12, "end": 17,
"candidates": [
{ "id": "wd:Q312" }, // Apple Inc.
{ "id": "wd:Q89" }, // apple, the fruit
{ "id": "wd:Q213710" } // Apple Records
]
}]
}
→ 200 OK { "mentions": [{ "text": "Apple", "start": 12, "end": 17, "status": "resolved", "entity": { "id": "wd:Q312", "label": "Apple Inc." }, "score": 0.99 }] }
{
"text": "Fresh bread daily at Apple Street Bakery.",
"language": "en",
"mentions": [{
"text": "Apple Street Bakery", "start": 21, "end": 40,
"candidates": [
{ "id": "wd:Q312" }, // Apple Inc.
{ "id": "wd:Q89" }, // apple, the fruit
{ "id": "wd:Q213710" } // Apple Records
]
}]
}
→ 200 OK { "mentions": [{ "text": "Apple Street Bakery", "start": 21, "end": 40, "status": "unresolved", "entity": null, "reason": "low_relevance" }] }
Entity linkers have mostly been built to always answer: take the top-ranked candidate and move on. resolve() is built to answer when the evidence supports it.
resolve() sits after extraction and candidate retrieval. It reasons over the mention, context, candidates and retrieval evidence, then commits or abstains.
ner("Il sindaco di Roma ha presentato il piano.") → Roma : LOCATION // a type label
resolve("Roma", ctx, candidates) → wd:Q220 // Rome, a stable identifier
In production a confident wrong link costs more than no link. It enters the graph, ships in JSON-LD and gets repeated by every system downstream. resolve() is built for precision, calibration and explicit NIL.
The graph gains an edge you can trust.
A false fact in your graph, markup and agent answers. Hard to find, costly to unwind.
The mention stays unlinked. It can be reviewed, or linked later when the right entity exists.
Your graph defines the world. Retrieval introduces your entities. resolve() decides whether a mention actually refers to them.
Retrieval systems, vocabularies and knowledge graphs change without retraining a specialized classifier every time the entity universe grows.
Owned and operated by WordLift. No external classification or scoring service in the loop.
resolve() answers in six languages today. The NIL-safe decision layer is released one language at a time, each against immutable held-out fixtures and a gate whose criteria are fixed before the run.
Single frozen runs on held-out sets, 2026-09-23. The criteria were fixed before each run: accepted precision ≥ 99%, resolution coverage ≥ 90%, false resolution under forced NIL ≤ 2%. No language has cleared all three yet, so the decision layer stays on hold and these sets are now regression sets. We publish the misses too.
| language | accepted precision ≥ 99% | resolution coverage ≥ 90% | false resolution · forced NIL ≤ 2% | false resolution · natural NIL reported | verdict |
|---|---|---|---|---|---|
| DE | 36/36 · 100% | 36/40 · 90% | 2/40 · 5.0% | 0/1 | hold |
| DE · revised rule, fresh holdout | 49/50 · 98% | 50/57 · 88% | 2/57 · 3.5% | 0/1 | hold |
| DE · third gate, vector-only rule | 45/45 · 100% | 45/48 · 94% | 1/48 · 2.1% | 0/1 | hold |
| IT | 37/37 · 100% | 37/37 · 100% | 3/37 · 8.1% | 1/2 | hold |
| EN | 41/41 · 100% | 41/57 · 72% | 1/57 · 1.8% | 0/6 | hold |
If the correct entity never reaches resolve(), that is a retrieval problem. If it is present and the wrong identity is selected, that is a resolution problem. We report them separately so every error has an owner.
gold ∈ candidates ? ├── no → retrieval miss # candidate recall └── yes → resolve() returns gold ? ├── yes → correct resolution └── no → resolution error # accuracy
The Content Analysis pipeline is open source. Use it to extract mentions, connect your own candidate retrieval and knowledge graph, inspect the data flow, and build on it.
resolve() adds WordLift's proprietary entity-resolution engine at the decision point: given a mention, its context and your candidate entities, it returns the supported identity, or NIL.
extract(document)
│
▼
candidate retrieval ──────►
│
│
your KG / vocabulary
WordLift enginewe run it► resolve( mention, context, candidates ) │ ├── entity └── NIL
Inspect the code, run the pipeline locally, bring your own entities and candidate retrieval, and plug in any resolver. Apache-2.0.
View on GitHub →Point the pipeline's WordLiftResolver at POST /v1/resolve for multilingual entity disambiguation, explicit NIL and managed inference. Same shape, no code change.
Get API access →$ git clone https://github.com/wordlift/content-analysis.git $ cd content-analysis $ pip install -e ".[ner]"
from resolve_pipeline import run, WordLiftResolver results = run( document, retrieve=my_retriever, # candidates from your KG resolver=WordLiftResolver(api_key=WL_KEY), ) # → per mention: resolved entity, or unresolved
Content Analysis, the pipeline and the integration layer are open source. WordLift operates the resolution models, scoring infrastructure and production inference service.
You keep control of your content, your candidate universe and your knowledge graph.
Four short questions. We read every answer and reply with a key, a plan or a straight "not yet" for your case, usually within a working day.
Meanwhile, the open pipeline and the clients are on GitHub, and the live tester above runs against the same engine.
{{leadHint}}
We'll use these details to follow up about resolve(). Read our Privacy Policy.