rubert-ner-collection3

NER для русского языка: PER (люди), LOC (места), ORG (организации). DeepPavlov/rubert-base-cased, дообученный на Collection3 (новости). Кроме весов PyTorch в репозитории есть квантизованная ONNX-версия для CPU (onnx/, 170 МБ).

Код обучения, сравнение с CRF, Natasha и LLM, сервис на FastAPI: https://github.com/imgreencucumber/ru-ner

Качество

Тест Collection3: 1922 предложения, 4001 сущность. Метрики на уровне сущностей (seqeval): сущность засчитывается, только если совпали обе границы и тип. В скобках 95% bootstrap-интервал.

Precision Recall F1
Все сущности 0.972 0.980 0.976 (0.970–0.981)
PER 0.998
LOC 0.981
ORG 0.943
Сущности, которых не было в train 0.957

ONNX int8 по качеству не отличается от исходной модели: F1 0.977 (0.971–0.982), разница с PyTorch в пределах шума (парный bootstrap).

Цифры выше получены с декодированием, которое не допускает некорректных BIO-последовательностей (Витерби с запретом O → I-X). Если выбирать метку каждого слова независимо (argmax), F1 0.974. Стандартный pipeline из transformers тоже выбирает метки независимо, хотя части слов обрабатывает немного иначе.

Для сравнения на том же тесте: Natasha 0.935, CRF 0.901, GigaChat-3-Ultra с примерами в промпте 0.828.

Другой домен. На тесте WikiNEuRal-ru (Википедия) F1 0.799. Разметка WikiNEuRal автоматическая и содержит класс MISC, которого нет в Collection3, так что цифра занижена: часть «ошибок» приходится на MISC-сущности.

Использование

С transformers:

from transformers import pipeline

ner = pipeline("token-classification", model="imgreencucumber/rubert-ner-collection3", aggregation_strategy="simple")
ner("Глава Минфина Антон Силуанов встретился в Москве с представителями МВФ.")

ONNX-версия на CPU, без PyTorch, через пакет из репозитория проекта:

# pip install git+https://github.com/imgreencucumber/ru-ner
from huggingface_hub import snapshot_download
from ru_ner.inference import OnnxBertNER

path = snapshot_download("imgreencucumber/rubert-ner-collection3", allow_patterns=["onnx/*"])
ner = OnnxBertNER(f"{path}/onnx")
ner.extract("Глава Минфина Антон Силуанов встретился в Москве с представителями МВФ.")
# [{'text': 'Минфина', 'type': 'ORG', 'start': 6, 'end': 13}, ...]

Скорость

Одно предложение за вызов, медиана, Intel Core i3-8100 (4 ядра):

Вариант Задержка
ONNX int8, CPU 15.9 мс
ONNX fp32, CPU 25.6 мс
PyTorch, CPU 35.9 мс
PyTorch, GTX 1060 12.8 мс

Обучение

  • Данные: Collection3, официальные сплиты train / validation / test (9301 / 2153 / 1922 предложения).
  • 4 эпохи, learning rate 3e-5, batch 16, linear warmup 10%, weight decay 0.01, max_length=128, seed 42.
  • Лучшая эпоха выбиралась по F1 на validation, тест в выборе не участвовал.
  • GTX 1060 6GB, 11 минут.
  • ONNX: экспорт через torch.onnx (dynamo), оптимизация графа ONNX Runtime, динамическая int8-квантизация (per_channel=True, reduce_range=True).

Ограничения

  • Обучена на новостях 2010-х. На текстах другого стиля (соцсети, документы, Википедия) качество ниже.
  • Только три типа сущностей. Даты, суммы, должности и т. п. не размечаются.
  • Модель повторяет соглашения разметки Collection3: например, кавычки иногда входят в название организации, а должность в сущность не входит никогда.
  • Около 58% сущностей теста встречались в train, поэтому F1 на тесте частично отражает запоминание. F1 на новых сущностях (0.957) — более честная оценка обобщения.

Лицензия

У базовой модели DeepPavlov/rubert-base-cased лицензия не указана, у Collection3 указана other, поэтому и здесь other. Перед коммерческим использованием проверьте условия базовой модели и датасета. Код проекта распространяется по лицензии MIT.

Downloads last month
8
Safetensors
Model size
0.2B params
Tensor type
F32
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for imgreencucumber/rubert-ner-collection3

Quantized
(5)
this model

Dataset used to train imgreencucumber/rubert-ner-collection3

Evaluation results