Named entity linking for biomedical concepts is a fun challenge. Historically, this has been tackled by classical ML and rule-based systems such as GNormPlus. Nowadays, people rely more on semantic embedding retrieval. However, the problem is thorny and unsolved in the general case. So simply throwing embeddings on it gets us somewhere, but not too far, as homonyms, out-of-ontology concepts in general-purpose embedding spaces, and all kinds of other problem nuances get in the way. So here are some additional insights I gathered over the years from the literature that improve linking results further.
To begin with, let’s think of the different signals we get from the text and our knowledge bases that tell us what a mention most likely refers to:
-
Lexical signals from mentions and concepts
-
Additional lexical signals from KB synonyms
-
Semantic concept embeddings for mentions and concepts
-
Semantic context embeddings, like the text containing a mention or the definition of a KB concept
-
Document coherence between concepts in the same text: for example, if a text mentions the species hamster, it is far more likely that it talks about a hamster gene
Those signals are sometimes correlated but often not. Thus, it makes sense to use most or all of them in our linking decision. Conceptually, think of a pipeline similar to the one shown in the image.
A nice thing about the lexical and embedding signals is that they can be used in a retrieval fashion. For instance, we construct a lexical index over the KB concepts and their synonyms as well as an embedding index over those different concept forms. Having that, all we need to do is query those indices for the top-k results and union them to get an initial set of candidates for linking. Depending on the ontology or KB in mind, scalability may or may not require attention. A few thousand concepts fit easily in memory, but larger ontologies may require approximate nearest-neighbor indexing. Moreover, high mention volumes make throughput and latency first-class constraints.
To improve on this simple multi-index querying approach, the next thing we likely want to do is merge the returned ranked lists from multiple indices. For that, reciprocal rank fusion is a good start, as it does not need any normalized score for reordering the final concept list and can therefore deal with the different similarity metrics involved in semantic and lexical retrieval. In my experience, this improves results quite a bit, as it gives us a global order across all different indices.
Finally, for frequently homonymous concepts like proteins, document coherence is a valuable signal. If we link not only proteins but also model organisms, that tells us something about the most likely protein, as orthologous genes across species often carry the same symbol. Consequently, the linking task is ideally not solved in isolation but relies on document coherence and collectively optimizes for the highest probability of all mentions being correctly linked. This can often be a simple rule-based boost but could also be tackled by more complex collective entity linking algorithms.
In my experience, this produces a CPU-friendly candidate generator designed for high recall@k and low query latency. Ambiguous candidates can then be passed to a cross-encoder, an LLM-based verifier, or a tool-using agent that queries ontology APIs.