imgreencucumber commited on
Commit
bf9a7fa
·
verified ·
1 Parent(s): bef0161

Upload from https://github.com/imgreencucumber/ru-ner/commit/3da1f09c15be1c18a1907fba2b72f800c6e49d0e

Browse files
README.md ADDED
@@ -0,0 +1,127 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ language: ru
3
+ license: other
4
+ library_name: transformers
5
+ pipeline_tag: token-classification
6
+ base_model: DeepPavlov/rubert-base-cased
7
+ datasets:
8
+ - RCC-MSU/collection3
9
+ tags:
10
+ - ner
11
+ - onnx
12
+ - russian
13
+ metrics:
14
+ - f1
15
+ - precision
16
+ - recall
17
+ model-index:
18
+ - name: rubert-ner-collection3
19
+ results:
20
+ - task:
21
+ type: token-classification
22
+ name: Named Entity Recognition
23
+ dataset:
24
+ type: RCC-MSU/collection3
25
+ name: Collection3
26
+ split: test
27
+ metrics:
28
+ - type: f1
29
+ value: 0.976
30
+ name: F1 (entity-level, seqeval)
31
+ - type: precision
32
+ value: 0.972
33
+ - type: recall
34
+ value: 0.980
35
+ ---
36
+
37
+ # rubert-ner-collection3
38
+
39
+ NER для русского языка: PER (люди), LOC (места), ORG (организации).
40
+ `DeepPavlov/rubert-base-cased`, дообученный на Collection3 (новости).
41
+ Кроме весов PyTorch в репозитории есть квантизованная ONNX-версия для CPU (`onnx/`, 170 МБ).
42
+
43
+ Код обучения, сравнение с CRF, Natasha и LLM, сервис на FastAPI: https://github.com/imgreencucumber/ru-ner
44
+
45
+ ## Качество
46
+
47
+ Тест Collection3: 1922 предложения, 4001 сущность. Метрики на уровне сущностей (`seqeval`):
48
+ сущность засчитывается, только если совпали обе границы и тип. В скобках 95% bootstrap-интервал.
49
+
50
+ | | Precision | Recall | F1 |
51
+ |---|---|---|---|
52
+ | Все сущности | 0.972 | 0.980 | **0.976** (0.970–0.981) |
53
+ | PER | | | 0.998 |
54
+ | LOC | | | 0.981 |
55
+ | ORG | | | 0.943 |
56
+ | Сущности, которых не было в train | | | 0.957 |
57
+
58
+ ONNX int8 по качеству не отличается от исходной модели: F1 0.977 (0.971–0.982), разница с PyTorch в пределах шума
59
+ (парный bootstrap).
60
+
61
+ Цифры выше получены с декодированием, которое не допускает некорректных BIO-последовательностей
62
+ (Витерби с запретом `O → I-X`). Если выбирать метку каждого слова независимо (argmax), F1 0.974.
63
+ Стандартный `pipeline` из `transformers` тоже выбирает метки независимо, хотя части слов обрабатывает немного иначе.
64
+
65
+ Для сравнения на том же тесте: Natasha 0.935, CRF 0.901, GigaChat-3-Ultra с примерами в промпте 0.828.
66
+
67
+ **Другой домен.** На тесте WikiNEuRal-ru (Википедия) F1 0.799. Разметка WikiNEuRal автоматическая и содержит класс MISC,
68
+ которого нет в Collection3, так что цифра занижена: часть «ошибок» приходится на MISC-сущности.
69
+
70
+ ## Использование
71
+
72
+ С `transformers`:
73
+
74
+ ```python
75
+ from transformers import pipeline
76
+
77
+ ner = pipeline("token-classification", model="imgreencucumber/rubert-ner-collection3", aggregation_strategy="simple")
78
+ ner("Глава Минфина Антон Силуанов встретился в Москве с представителями МВФ.")
79
+ ```
80
+
81
+ ONNX-версия на CPU, без PyTorch, через пакет из репозитория проекта:
82
+
83
+ ```python
84
+ # pip install git+https://github.com/imgreencucumber/ru-ner
85
+ from huggingface_hub import snapshot_download
86
+ from ru_ner.inference import OnnxBertNER
87
+
88
+ path = snapshot_download("imgreencucumber/rubert-ner-collection3", allow_patterns=["onnx/*"])
89
+ ner = OnnxBertNER(f"{path}/onnx")
90
+ ner.extract("Глава Минфина Антон Силуанов встретился в Москве с представителями МВФ.")
91
+ # [{'text': 'Минфина', 'type': 'ORG', 'start': 6, 'end': 13}, ...]
92
+ ```
93
+
94
+ ## Скорость
95
+
96
+ Одно предложение за вызов, медиана, Intel Core i3-8100 (4 ядра):
97
+
98
+ | Вариант | Задержка |
99
+ |---|---|
100
+ | ONNX int8, CPU | 15.9 мс |
101
+ | ONNX fp32, CPU | 25.6 мс |
102
+ | PyTorch, CPU | 35.9 мс |
103
+ | PyTorch, GTX 1060 | 12.8 мс |
104
+
105
+ ## Обучение
106
+
107
+ - Данные: Collection3, официальные сплиты train / validation / test (9301 / 2153 / 1922 предложения).
108
+ - 4 эпохи, learning rate 3e-5, batch 16, linear warmup 10%, weight decay 0.01, `max_length=128`, seed 42.
109
+ - Лучшая эпоха выбиралась по F1 на validation, тест в выборе не участвовал.
110
+ - GTX 1060 6GB, 11 минут.
111
+ - ONNX: экспорт через `torch.onnx` (dynamo), оптимизация графа ONNX Runtime, динамическая int8-квантизация
112
+ (`per_channel=True`, `reduce_range=True`).
113
+
114
+ ## Ограничения
115
+
116
+ - Обучена на новостях 2010-х. На текстах другого стиля (соцсети, документы, Википедия) качество ниже.
117
+ - Только три типа сущностей. Даты, суммы, должности и т. п. не размечаются.
118
+ - Модель повторяет соглашения разметки Collection3: например, кавычки иногда входят в название организации,
119
+ а должность в сущность не входит никогда.
120
+ - Около 58% сущностей теста встречались в train, поэтому F1 на тесте частично отражает запоминание.
121
+ F1 на новых сущностях (0.957) — более честная оценка обобщения.
122
+
123
+ ## Лицензия
124
+
125
+ У базовой модели `DeepPavlov/rubert-base-cased` лицензия не указана, у Collection3 указана `other`,
126
+ поэтому и здесь `other`. Перед коммерческим использованием проверьте условия базовой модели и датасета.
127
+ Код проекта распространяется по лицензии MIT.
config.json ADDED
@@ -0,0 +1,53 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "add_cross_attention": false,
3
+ "architectures": [
4
+ "BertForTokenClassification"
5
+ ],
6
+ "attention_probs_dropout_prob": 0.1,
7
+ "bos_token_id": null,
8
+ "classifier_dropout": null,
9
+ "directionality": "bidi",
10
+ "dtype": "float32",
11
+ "eos_token_id": null,
12
+ "hidden_act": "gelu",
13
+ "hidden_dropout_prob": 0.1,
14
+ "hidden_size": 768,
15
+ "id2label": {
16
+ "0": "O",
17
+ "1": "B-PER",
18
+ "2": "I-PER",
19
+ "3": "B-LOC",
20
+ "4": "I-LOC",
21
+ "5": "B-ORG",
22
+ "6": "I-ORG"
23
+ },
24
+ "initializer_range": 0.02,
25
+ "intermediate_size": 3072,
26
+ "is_decoder": false,
27
+ "label2id": {
28
+ "B-LOC": 3,
29
+ "B-ORG": 5,
30
+ "B-PER": 1,
31
+ "I-LOC": 4,
32
+ "I-ORG": 6,
33
+ "I-PER": 2,
34
+ "O": 0
35
+ },
36
+ "layer_norm_eps": 1e-12,
37
+ "max_position_embeddings": 512,
38
+ "model_type": "bert",
39
+ "num_attention_heads": 12,
40
+ "num_hidden_layers": 12,
41
+ "output_past": true,
42
+ "pad_token_id": 0,
43
+ "pooler_fc_size": 768,
44
+ "pooler_num_attention_heads": 12,
45
+ "pooler_num_fc_layers": 3,
46
+ "pooler_size_per_head": 128,
47
+ "pooler_type": "first_token_transform",
48
+ "tie_word_embeddings": true,
49
+ "transformers_version": "5.19.0",
50
+ "type_vocab_size": 2,
51
+ "use_cache": false,
52
+ "vocab_size": 119547
53
+ }
model.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:52fca835f37088bc38692ea008fca706e0f055213cb82cf6ca12ef662d952695
3
+ size 709096284
onnx/model_int8.onnx ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:483b07b9b12ad9daad882d2ef5dc795258c3a76846ed77e70b7d5df36bb3f50a
3
+ size 178166158
onnx/tokenizer.json ADDED
The diff for this file is too large to render. See raw diff
 
tokenizer.json ADDED
The diff for this file is too large to render. See raw diff
 
tokenizer_config.json ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "backend": "tokenizers",
3
+ "cls_token": "[CLS]",
4
+ "do_lower_case": false,
5
+ "is_local": false,
6
+ "local_files_only": false,
7
+ "mask_token": "[MASK]",
8
+ "model_max_length": 1000000000000000019884624838656,
9
+ "pad_token": "[PAD]",
10
+ "sep_token": "[SEP]",
11
+ "strip_accents": null,
12
+ "tokenize_chinese_chars": true,
13
+ "tokenizer_class": "BertTokenizer",
14
+ "unk_token": "[UNK]"
15
+ }