Что такое Named Entity Recognition и как оно реализуется?

Named Entity Recognition (NER) — это задача в области обработки естественного языка (NLP), направленная на автоматическое выявление и классификацию именованных сущностей в тексте. Именованные сущности — это конкретные объекты реального мира, такие как имена людей, организации, географические названия, даты, временные интервалы, валюты, произведения искусства и т.д.

Цель NER

Извлечь и отнести фрагменты текста к определённым категориям, например:

Пример:

_Apple Inc. was founded in Cupertino by Steve Jobs in 1976._

  • "Apple Inc." → **ORG
    **
  • "Cupertino" → **LOC
    **
  • "Steve Jobs" → **PER
    **
  • "1976" → **DATE
    **

Категории сущностей

Категории могут отличаться в зависимости от задачи, но наиболее распространённые:

Категория Описание
PER Person — имена людей
--- ---
ORG Organization — организации
--- ---
LOC Location — географические места
--- ---
GPE Geo-Political Entity — города, страны
--- ---
DATE Даты
--- ---
TIME Время
--- ---
MONEY Суммы денег
--- ---
PERCENT Проценты
--- ---
PRODUCT Продукты
--- ---
EVENT События
--- ---
WORK_OF_ART Книги, фильмы и т.п.
--- ---

Как работает NER: архитектура

1. Токенизация

Текст разбивается на токены — слова, подслова, знаки препинания.

2. Векторизация

Каждому токену присваивается векторное представление:

  • Word embeddings (Word2Vec, GloVe)

  • Subword embeddings (FastText)

  • Contextual embeddings (BERT, RoBERTa)

3. Последовательная модель

Для обработки контекста используются:

  • Bi-LSTM / GRU

  • CRF (Conditional Random Field)

  • Transformer-based (BERT и др.)

4. Предсказание меток

Модель предсказывает для каждого токена категорию. Распространённая схема аннотации — BIO:

  • B-ORG — начало организации

  • I-ORG — внутри сущности

  • O — не сущность

Пример BIO-аннотации:

Токен Метка
Steve B-PER
--- ---
Jobs I-PER
--- ---
founded O
--- ---
Apple B-ORG
--- ---
Inc. I-ORG
--- ---

Реализация NER

A. Классическая модель: BiLSTM + CRF

  • BiLSTM обрабатывает последовательность слов слева и справа.

  • CRF поверх — для согласованного выбора меток с учётом переходов (например, I-PER не может идти после B-ORG).

Плюсы:

  • Хорошая структурная согласованность

  • Работает с небольшими наборами данных

Минусы:

  • Требует ручной подготовки признаков (если без эмбеддингов)

  • Меньше переносимости

B. NER на основе трансформеров (BERT и др.)

BERT и его аналоги преобразуют каждый токен в контекстный вектор. После этого к каждому вектору применяется линейный классификатор для предсказания метки.

from transformers import AutoTokenizer, AutoModelForTokenClassification

tokenizer = AutoTokenizer.from_pretrained("dslim/bert-base-NER")

model = AutoModelForTokenClassification.from_pretrained("dslim/bert-base-NER")

Особенности:

  • Токенизация на уровне подслов

  • [CLS] и [SEP] — специальные токены

  • Необходимо сопоставлять подслова и метки

Обработка батча:

tokens = tokenizer("Steve Jobs founded Apple Inc.", return_tensors="pt")

outputs = model(\*\*tokens)
predictions = outputs.logits.argmax(dim=-1)

Оценка качества NER

Метрики:

  • Precision: из найденных сущностей сколько верных

  • Recall: из всех верных сколько найдены

  • F1-score: гармоническое среднее precision и recall

  • Entity-level scoring: важна полная правильность всей сущности, не только токенов

from seqeval.metrics import classification_report

Пример:

  • Предсказано: "Steve" — B-PER, "Jobs" — I-PER

  • Истинная разметка совпадает → полное попадание

Корпуса для обучения

  • CoNLL-2003 (EN): классика (PER, LOC, ORG, MISC)

  • OntoNotes (EN): более широкая аннотация

  • WikiANN (многоязычный)

  • Gareev corpus (RU): именованные сущности на русском

Как обучить свою модель NER

  1. Собрать датасет с аннотацией в формате BIO

  2. Токенизировать текст

  3. Сопоставить метки с токенами

  4. Обучить модель на токен-классификации

  5. Оценить на валидации

HuggingFace Trainer API:

from transformers import Trainer, TrainingArguments
trainer = Trainer(
model=model,
args=TrainingArguments(...),
train_dataset=train_data,
eval_dataset=val_data,
compute_metrics=compute_metrics
)
trainer.train()

Библиотеки для NER

Библиотека Особенности
spaCy Быстро, удобно, встроенные модели
--- ---
HuggingFace Мощные модели, легко настраивать
--- ---
Flair Эмбеддинги + стек моделей, хорошее качество
--- ---
Stanza (Stanford) Поддержка многих языков
--- ---
DeepPavlov Русскоязычные модели, продвинутый функционал
--- ---

Примеры применения NER

  • Извлечение сущностей из медицинских документов (болезни, лекарства)

  • Обработка юридических текстов (организации, статьи)

  • Анализ новостей (персоны, события)

  • Финансовая аналитика (компании, транзакции)

  • Обогащение поисковых систем (именованные фильтры)

Таким образом, NER — это ключевая задача NLP, позволяющая структурировать неструктурированный текст. Текущие state-of-the-art подходы основаны на трансформерах и позволяют достигать высокой точности в реальных задачах.