Как решать задачу NER на практике

Как решать задачу NER на практике

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

NER активно применяется в реальных задачах:

  • обнаружение персональных данных для автоматического обезличивания документов;
  • поиск ключевых навыков в резюме при подборе кандидатов;
  • извлечение номера заказа и города доставки в чат-ботах поддержки.

Понимание целей и задач

Представим, что клиент просит разработать модуль для HR-системы, который будет помогать рекрутерам находить релевантных кандидатов по резюме. Основные критерии релевантности — наличие нужных навыков и указанная ожидаемая зарплата.

Уточняем детали:

  • Домен: резюме на русском языке с информацией о профессиональном опыте, навыках, контактах.
  • Формат входных данных: PDF или DOC.
  • Извлекаемые сущности: имя, фамилия, email, телефон, навыки, ожидаемая зарплата.

Формализуем задачу: на вход подаётся файл резюме, из него извлекается текст, после чего NER-модель находит указанные сущности и возвращает их для дальнейшей обработки.

Работа с данными

Качество данных напрямую влияет на качество модели. Важно чётко определить, что относится к каждой сущности:

  • NAME: личное имя кандидата;
  • SURNAME: фамилия;
  • EMAIL: адрес электронной почты;
  • PHONE: номер телефона в любом формате;
  • SKILL: профессиональные навыки, технологии, инструменты;
  • SALARY: желаемый уровень заработной платы с указанием суммы и валюты.

Для разметки используется схема BIO (Begin, Inside, Outside), так как она позволяет корректно обрабатывать последовательности, например, «Python SQL Docker», разделяя их на три отдельных навыка.

Поиск готового датасета

Первым делом ищем подходящие датасеты на Hugging Face, Kaggle, Zenodo и Google Dataset Search. Фильтруем по задаче «Token Classification» и языку (русский). Однако для резюме на русском языке подходящих данных не находится.

Находит только один релевантный датасет — 5000 резюме на английском с размеченными навыками. Его можно использовать как основу, переведя на русский и адаптировав разметку.

Разметка в Label Studio

Когда открытых данных нет, приходится размечать вручную. Для этого подходит Label Studio — open-source платформа для разметки данных, в том числе для NER.

Установка:

  • создаём виртуальное окружение;
  • устанавливаем через pip install label-studio;
  • запускаем командой label-studio start.

Доступ по адресу http://localhost:8080. После регистрации создаём проект, выбираем задачу «Named Entity Recognition» и добавляем теги: NAME, SURNAME, EMAIL, PHONE, SKILL, SALARY.

Label Studio не поддерживает прямой импорт PDF, поэтому текст извлекается отдельно. Рекомендуется конвертировать PDF в JSON-формат, совместимый с Label Studio.

После разметки данные экспортируются в JSON. Так как Label Studio не выгружает разметку в формате BIO, используется скрипт для конвертации:

  • извлекается текст и соответствующие теги;
  • применяется схема BIO (например, B-NAME, B-SKILL).

Ручная разметка — трудозатратный, но самый качественный способ подготовки данных.

Генерация данных

Альтернатива — генерация синтетических данных с помощью LLM.

Первый подход: перевод английских резюме на русский с последующей разметкой через LLM (например, gpt-4o-mini). После перевода требуется валидация: исправление искажённых email, телефонов, названий технологий (например, «Питон» → «Python»).

Второй подход: генерация резюме с нуля. Используются:

  • LLM для генерации текста с указанием мест для сущностей;
  • библиотека Faker для создания реалистичных имён, email, телефонов;
  • разные шаблоны оформления резюме, чтобы избежать переобучения на одну структуру.

После генерации — обязательная проверка качества. LLM может ошибаться: пропускать теги, размечать лишнее (например, «Английский» как навык), путать технологии с компаниями (Oracle). Помогают:

  • ручная корректировка;
  • регулярные выражения для точного поиска email и телефонов;
  • анализ датасета с помощью другой LLM.

Важно: навыки должны размечаться везде — не только в секции «Навыки», но и в описании опыта. Иначе модель не научится распознавать их по смыслу, а только по контексту.

Моделирование

Для NER чаще всего используются BERT-подобные архитектуры. Сравнивались модели:

  • google-bert/bert-base-multilingual-cased;
  • xlm-roberta-base;
  • xlm-roberta-large;
  • ai-forever/ruBert-base;
  • ai-forever/ruRoberta-large;
  • distilbert/distilbert-base-multilingual-cased.

Обучение проводилось в облаке на GPU RTX 3090. Использовались библиотеки transformers и seqeval (для метрик).

Этапы подготовки данных:

  • загрузка из Excel;
  • маппинг тегов в числовые значения (tag2id, id2tag);
  • чанкование — разбиение длинных текстов, не вмещающихся в контекстное окно BERT (512 токенов);
  • разделение на обучающую и валидационную выборки.

Ключевая метрика — F1-score. Лучший результат показала модель ruRoBERTa-large, но выбрана была bert-base-multilingual-cased из-за компромисса между качеством и производительностью.

При разнице в F1 всего ~0.01, mBERT вдвое легче (178M против 355M параметров), что даёт:

  • быстрый инференс;
  • меньшее потребление памяти;
  • возможность запуска на CPU.

Создание сервиса на основе модели

Модель обёрнута в FastAPI для предоставления API. Архитектура сервиса:

  • приём текста резюме через POST-запрос;
  • токенизация и чанкование (если текст длинный);
  • инференс модели по фрагментам;
  • сбор и возврат найденных сущностей.

Сервис легко интегрируется в другие системы и позволяет автоматизировать обработку резюме.

Заключение

Решение задачи NER включает несколько ключевых этапов: понимание задачи, сбор и разметка данных, обучение модели, создание сервиса. Хотя теории было затронуто минимум, акцент сделан на практические шаги, которые можно применить в реальных проектах.

Читать оригинал