Реализация извлечения именованных сущностей (NER)
NER (Named Entity Recognition) — задача распознавания и классификации упомянутых в тексте сущностей: персон, организаций, мест, дат, сумм денег, продуктов. Фундаментальный компонент большинства систем обработки текста.
Стандартные типы сущностей и расширения
Базовые типы (CoNLL-2003 стандарт): PER (персоны), ORG (организации), LOC (местоположения), MISC (прочее).
Для бизнес-применений стандартного набора недостаточно. Типичные расширения:
-
Финансы:
MONEY,PERCENT,DATE,TICKER,FINANCIAL_INSTRUMENT -
Медицина:
DISEASE,DRUG,DOSAGE,PROCEDURE,ANATOMY -
Юриспруденция:
LAW,COURT,CASE_NUMBER,LEGAL_ENTITY -
Логистика:
ADDRESS,POSTAL_CODE,VEHICLE_ID,CARGO
Инструменты для русского NER
natasha — лучший выбор для базовых задач на русском:
from natasha import Segmenter, MorphVocab, NewsEmbedding, NewsNERTagger, Doc
segmenter = Segmenter()
emb = NewsEmbedding()
ner_tagger = NewsNERTagger(emb)
doc = Doc("Газпром подписал контракт с немецкой компанией Wintershall в Берлине.")
doc.segment(segmenter)
doc.tag_ner(ner_tagger)
# [(Газпром, ORG), (Wintershall, ORG), (Берлине, LOC)]
spaCy с русской моделью (ru_core_news_lg): хороший баланс скорости и качества, интеграция в production-пайплайны.
BERT-based (DeepPavlov, Hugging Face): DeepPavlov/rubert-base-cased-ner — для высокого качества на сложных текстах.
Fine-tuning для кастомных сущностей
При кастомных типах сущностей нужен собственный корпус и fine-tuning:
- Разметка: Prodigy, Label Studio, или Doccano. Минимум 200–500 примеров на тип сущности
- Формат: IOB2 (BIO-tagging) — стандарт для NER
- Обучение: HuggingFace TokenClassification с pretrained RuBERT
from transformers import AutoModelForTokenClassification, TrainingArguments
model = AutoModelForTokenClassification.from_pretrained(
"DeepPavlov/rubert-base-cased",
num_labels=len(label_list),
id2label=id2label,
label2id=label2id
)
Оценка качества NER
Entity-level F1 (strict) — основная метрика. «Strict» означает: правильный тип И правильные границы span. Partial match считается ошибкой.
Типичные показатели на русских текстах:
- PER: F1 95–97% (легко распознаваемые паттерны)
- ORG: F1 88–93% (много сокращений, аббревиатур)
- LOC: F1 90–95%
- Кастомные доменные сущности: 80–90% после fine-tuning на 1K+ примерах
Сложные случаи
- Вложенные сущности: «Министерство финансов России» — (ORG + LOC). Большинство стандартных моделей не поддерживают вложенность; для этого нужны специализированные архитектуры (Span-BERT, biaffine NER)
- Разнесённые сущности: «ООО... (далее — Компания)» — кореференция требует отдельного модуля
- Омонимия: «Apple» — компания или фрукт? Решается контекстом (трансформеры справляются)
Деплой
spaCy: экспорт в .spacy формат, serving через FastAPI. BERT: ONNX export для CPU, TorchServe для GPU. Latency: spaCy CPU ~5ms/предложение, BERT ONNX CPU ~30ms/предложение.







