Named Entity Recognition › Entity Types

Michael BrenndoerferUpdated January 30, 20265 min read
Language AI HandbookAll chapters
Part 6 of 67Sequence Labeling
Chapter 37Named Entity Recognition › Entity Types
Reading section 2 of 17 · Entity Types · 5 minSection 2 of 17 · 5 min

Book contents

Section 2 of 17 · 5 min read

Named Entity Recognition › Entity TypesOne section · Sections in this chapter2 / 17 ↓
Reading tools Definitions & inline links

Choose your expertise level to adjust how many terms are explained. Beginners see more tooltips, experts see fewer to maintain reading flow. Hover over underlined terms for instant definitions.

Article links

Make inline references clickable

NER systems classify entities into a predefined taxonomy of types. The categories chosen depend on the application domain, but a small set of core types recurs across virtually every NER benchmark and production system.

Named Entity

A named entity is a real-world object that can be referred to with a proper name: a specific person, place, organization, or other identifiable referent. The "named" qualifier distinguishes entities like "Apple Inc." (specific, nameable) from generic references like "the company" (anaphoric, not nameable). Proper names are the prototypical case, but NER systems also extract numerical and temporal expressions that refer to specific real-world quantities.

Core Entity Categories

The three foundational categories that appear in nearly every NER taxonomy are:

  • PER (Person): Names of individual people, real or fictional. Examples include "Marie Curie", "Barack Obama", and "Sherlock Holmes". Titles attached to names ("Dr. Fauci", "President Lincoln") are typically included as part of the span.
  • ORG (Organization): Companies, government agencies, universities, sports teams, and other collective entities. Examples include "NASA", "Google", "Harvard University", and "the World Health Organization".
  • LOC (Location): Places, including countries, cities, regions, rivers, mountains, and physical addresses. Examples include "New York City", "the Amazon River", and "Mount Everest". Some tagsets split this further into GPE (geopolitical entities, like countries and cities) and LOC (pure geographic features, like mountains and rivers).

Extended taxonomies add categories for specific applications:

  • DATE / TIME: Calendar dates and time expressions. Examples include "January 2024", "last Tuesday", and "3:00 PM EST".
  • MONEY: Monetary amounts. Examples include "$50 million", "€200 billion", and "two hundred dollars".
  • PERCENT: Percentage expressions. Examples include "7.5%", "a third", and "half".
  • MISC (Miscellaneous): Entities that do not fit the above categories but are still proper nouns: nationality adjectives ("French", "Japanese"), product names, events, and works of art.

Domain-Specific Taxonomies

General-purpose tagsets are designed for broad applicability, but specialized domains benefit from finer-grained categories. Biomedical NER systems distinguish GENE, PROTEIN, DISEASE, CHEMICAL, SPECIES, and CELL_LINE. Legal NER systems label STATUTE, COURT, JUDGE, PLAINTIFF, and DEFENDANT. Financial NER systems need TICKER_SYMBOL, EXCHANGE, and FISCAL_PERIOD. These domain-specific systems are trained on annotated corpora from the target domain, because the distributional properties of entity mentions differ substantially from newswire text.

The choice of taxonomy is not purely a technical decision. It reflects assumptions about what information consumers of the extracted data need. A system designed to populate a corporate knowledge graph cares deeply about the distinction between a subsidiary (ORG) and its parent company (also ORG) in a way that a general news reader does not. Before designing or selecting a NER system for an application, it is worth asking: which entity types matter for downstream tasks, and at what granularity?

Let's load spaCy and inspect what entity types its general-purpose English model recognizes:

In[4]:
Code
import spacy

# Load small English model
# Run once to install: python -m spacy download en_core_web_sm
nlp = spacy.load("en_core_web_sm")

text = (
    "Elon Musk announced that Tesla will invest $3.5 billion to open "
    "a new Gigafactory in Germany by March 2026. The project will employ "
    "about 12,000 workers in Brandenburg."
)

doc = nlp(text)
entities = [
    (ent.text, ent.label_, ent.start_char, ent.end_char) for ent in doc.ents
]
Out[5]:
Console
Entity                         Label        Chars
------------------------------------------------------------
Elon Musk                      PERSON       0–9
Tesla                          ORG          25–30
$3.5 billion                   MONEY        43–55
Germany                        GPE          85–92
March 2026                     DATE         96–106
about 12,000                   CARDINAL     132–144
Brandenburg                    GPE          156–167

The output shows each entity span, its type label, and its character offsets in the source string. spaCy's en_core_web_sm model uses an extended tagset that includes GPE (geo-political entity) as a distinct category from LOC. This reflects the CoNLL and OntoNotes annotation traditions. The character offsets are useful for highlighting entities in a UI or aligning predictions to the original text.

Entity Distribution by Domain

Different domains contain different mixes of entity types. Understanding the expected distribution helps when choosing a pre-trained model or designing a training corpus.

In[6]:
Code
from collections import Counter

domains = {
    "News": (
        "President Biden met with Chancellor Scholz in Berlin. "
        "The White House announced new climate policies. "
        "Senator Warren criticized Wall Street banks."
    ),
    "Financial": (
        "Microsoft's Q3 revenue reached $52.9 billion, up 17% year-over-year. "
        "The Nasdaq rose 2.5% following the Fed's decision. "
        "Goldman Sachs raised their price target to $400."
    ),
    "Biomedical": (
        "Pfizer and Moderna both reported efficacy above 90% in Phase 3 trials. "
        "The FDA approved remdesivir for use at Johns Hopkins Hospital. "
        "Dr. Fauci cited data from the NIH study published in The Lancet."
    ),
}

domain_counts = {}
for domain_name, domain_text in domains.items():
    doc = nlp(domain_text)
    domain_counts[domain_name] = Counter(ent.label_ for ent in doc.ents)

all_types = sorted(set().union(*[c.keys() for c in domain_counts.values()]))
Out[7]:
Visualization
Grouped bar chart of NER entity type counts for three text domains: news, financial, and biomedical.
Entity type counts across news, financial, and biomedical text. News text is rich in PERSON and GPE entities, financial text is dominated by MONEY and PERCENT mentions, and biomedical text shows a mix of ORG, PERSON, and product references. The divergent distributions motivate domain-specific NER models.

The chart confirms the intuition: financial text is dominated by MONEY and PERCENT entities, biomedical text mixes ORG and PERSON with product references, and news text skews heavily toward people and places. A model trained only on newswire will generalize poorly to financial filings, which is why domain adaptation or domain-specific training is important in practice.