File size: 6,270 Bytes
bf9a7fa
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
---

language: ru
license: other
library_name: transformers
pipeline_tag: token-classification
base_model: DeepPavlov/rubert-base-cased
datasets:
- RCC-MSU/collection3
tags:
- ner
- onnx
- russian
metrics:
- f1
- precision
- recall
model-index:
- name: rubert-ner-collection3
  results:
  - task:
      type: token-classification
      name: Named Entity Recognition
    dataset:
      type: RCC-MSU/collection3
      name: Collection3
      split: test
    metrics:
    - type: f1
      value: 0.976
      name: F1 (entity-level, seqeval)
    - type: precision
      value: 0.972
    - type: recall
      value: 0.980
---


# 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`:

```python

from transformers import pipeline



ner = pipeline("token-classification", model="imgreencucumber/rubert-ner-collection3", aggregation_strategy="simple")

ner("Глава Минфина Антон Силуанов встретился в Москве с представителями МВФ.")

```

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

```python

# 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.