Реализация извлечения именованных сущностей (NER)

Проектируем и внедряем системы искусственного интеллекта: от прототипа до production-ready решения. Наша команда объединяет экспертизу в машинном обучении, дата-инжиниринге и MLOps, чтобы AI работал не в лаборатории, а в реальном бизнесе.
Показано 1 из 1 услугВсе 1566 услуг
Реализация извлечения именованных сущностей (NER)
Средняя
~3-5 рабочих дней
Часто задаваемые вопросы
Направления AI-разработки
Этапы разработки AI-решения
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1218
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1161
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    853
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1047
  • image_logo-advance_0.png
    Разработка логотипа компании B2B Advance
    561
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    825

Реализация извлечения именованных сущностей (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:

  1. Разметка: Prodigy, Label Studio, или Doccano. Минимум 200–500 примеров на тип сущности
  2. Формат: IOB2 (BIO-tagging) — стандарт для NER
  3. Обучение: 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/предложение.