MaziyarPanahi commited on
Commit
9caeb83
·
verified ·
1 Parent(s): ea84be1

feat: Upload fine-tuned medical NER model OpenMed-ZeroShot-NER-BloodCancer-Small-166M

Browse files
README.md ADDED
@@ -0,0 +1,196 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ widget:
3
+ - text: "The patient presented with chronic lymphocytic leukemia symptoms."
4
+ - text: "B-cell proliferation was observed in bone marrow samples."
5
+ - text: "Treatment with ibrutinib showed promising results."
6
+ - text: "Flow cytometry confirmed the diagnosis of chronic lymphocytic leukemia."
7
+ - text: "The patient had del(17p), a high-risk feature in CLL."
8
+ tags:
9
+ - token-classification
10
+ - entity recognition
11
+ - named-entity-recognition
12
+ - zero-shot
13
+ - zero-shot-ner
14
+ - zero shot
15
+ - biomedical-nlp
16
+ - gliner
17
+ - leukemia
18
+ - hematology
19
+ - cancer
20
+ - clinical-medicine
21
+ - disease
22
+ - gene
23
+ - protein
24
+ - treatment
25
+ language:
26
+ - en
27
+ license: apache-2.0
28
+ ---
29
+
30
+ # 🧬 [OpenMed-ZeroShot-NER-BloodCancer-Small-166M](https://huggingface.co/OpenMed/OpenMed-ZeroShot-NER-BloodCancer-Small-166M)
31
+
32
+ **Specialized model for Clinical Entity Recognition - Clinical entities related to Chronic Lymphocytic Leukemia**
33
+
34
+ [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)
35
+ [![Python](https://img.shields.io/badge/Python-3.11%2B-blue)]()
36
+ [![GliNER](https://img.shields.io/badge/🤗-GliNER-yellow)]()
37
+ [![OpenMed](https://img.shields.io/badge/🏥-OpenMed-green)](https://huggingface.co/OpenMed)
38
+
39
+ ## 📋 Model Overview
40
+
41
+ Domain-tuned for **Chronic Lymphocytic Leukemia (CLL)** terminology, capturing disease descriptors, biomarkers, and therapies.Supports **hematology research**, **treatment response analysis**, and **clinical evidence tracking**.
42
+
43
+ OpenMed ZeroShot NER is an advanced, domain-adapted Named Entity Recognition (NER) model designed specifically for medical, biomedical, and clinical text mining. Leveraging state-of-the-art zero-shot learning, this model empowers researchers, clinicians, and data scientists to extract expert-level biomedical entities—such as diseases, chemicals, genes, species, and clinical findings—directly from unstructured text, without the need for task-specific retraining.
44
+
45
+ Built on the robust GLiNER architecture and fine-tuned on curated biomedical corpora, OpenMed ZeroShot NER delivers high-precision entity recognition for critical healthcare and life sciences applications. Its zero-shot capability means you can flexibly define and extract any entity type relevant to your workflow, from standard biomedical categories to custom clinical concepts, supporting rapid adaptation to new research domains and regulatory requirements.
46
+
47
+ Whether you are working on clinical NLP, biomedical research, electronic health record (EHR) de-identification, or large-scale literature mining, OpenMed ZeroShot NER provides a production-ready, open-source solution that combines expert-level accuracy with unmatched flexibility. Join the OpenMed community to accelerate your medical text analytics with cutting-edge, zero-shot NER technology.
48
+
49
+ ### 🎯 Key Features
50
+ - **Zero-Shot Capability**: Can recognize any entity type without specific training
51
+ - **High Precision**: Optimized for biomedical entity recognition
52
+ - **Domain-Specific**: Fine-tuned on curated CLL dataset
53
+ - **Production-Ready**: Validated on clinical benchmarks
54
+ - **Easy Integration**: Compatible with Hugging Face Transformers ecosystem
55
+ - **Flexible Entity Recognition**: Add custom entity types without retraining
56
+
57
+ ### 🏷️ Supported Entity Types
58
+
59
+ This zero-shot model can identify and classify biomedical entities, including but not limited to these entity types. **You can also add custom entity types without retraining the model**:
60
+
61
+ - `CL`
62
+
63
+ **💡 Zero-Shot Flexibility**: As a GliNER-based model, you can specify any entity types you want to detect, even if they weren't part of the original training. Simply provide the entity labels when using the model, and it will adapt to recognize them.
64
+
65
+ ## 📊 Dataset
66
+
67
+ CLL corpus is specialized for chronic lymphocytic leukemia entity recognition in hematology and cancer research.
68
+
69
+ The CLL (Chronic Lymphocytic Leukemia) corpus is a domain-specific biomedical NER dataset focused on entities related to chronic lymphocytic leukemia, a type of blood cancer. This specialized corpus contains annotations for CLL-specific terminology, biomarkers, treatment entities, and clinical concepts relevant to hematology and oncology research. The dataset is designed to support the development of clinical NLP systems for leukemia research, hematological disorder analysis, and cancer informatics applications. It is particularly valuable for identifying disease-specific entities, therapeutic interventions, and prognostic factors mentioned in CLL research literature. The corpus serves as a benchmark for evaluating NER models in specialized medical domains and clinical research.
70
+
71
+
72
+ ## 📊 Performance Metrics
73
+
74
+ ### Current Model Performance
75
+
76
+ - **Finetuned F1 vs. Base Model (on test dataset excluded from training)**: `0.68`
77
+ - **F1 Improvement vs Base Model**: `23.9%`
78
+
79
+ ### 🏆 Top F1 Improvements on CLL Dataset
80
+
81
+ | Rank | Model | Base F1 | Finetuned F1 | ΔF1 | ΔF1 % |
82
+ |------|-------|--------:|------------:|----:|------:|
83
+ | 🥇 1 | [OpenMed-ZeroShot-NER-BloodCancer-Medium-209M](https://huggingface.co/OpenMed/OpenMed-ZeroShot-NER-BloodCancer-Medium-209M) | 0.5068 | 0.9130 | 0.4062 | 80.2% |
84
+ | 🥈 2 | [OpenMed-ZeroShot-NER-BloodCancer-XLarge-770M](https://huggingface.co/OpenMed/OpenMed-ZeroShot-NER-BloodCancer-XLarge-770M) | 0.7291 | 0.8750 | 0.1459 | 20.0% |
85
+ | 🥉 3 | [OpenMed-ZeroShot-NER-BloodCancer-Large-459M](https://huggingface.co/OpenMed/OpenMed-ZeroShot-NER-BloodCancer-Large-459M) | 0.6009 | 0.7755 | 0.1746 | 29.0% |
86
+ | 4 | [OpenMed-ZeroShot-NER-BloodCancer-Small-166M](https://huggingface.co/OpenMed/OpenMed-ZeroShot-NER-BloodCancer-Small-166M) | 0.5505 | 0.6818 | 0.1314 | 23.9% |
87
+ | 5 | [OpenMed-ZeroShot-NER-BloodCancer-Tiny-60M](https://huggingface.co/OpenMed/OpenMed-ZeroShot-NER-BloodCancer-Tiny-60M) | 0.5361 | 0.6780 | 0.1419 | 26.5% |
88
+
89
+
90
+ *Rankings are sorted by finetuned F1 and show ΔF1% over base model. Test dataset is excluded from training.*
91
+
92
+ ![OpenMed ZeroShot Clinical & Biomedical NER vs. Original GLiNER models](https://huggingface.co/spaces/OpenMed/README/resolve/main/openmed-zero-shot-clinical-ner-finetuned.png)
93
+
94
+ *Figure: OpenMed ZeroShot Clinical & Biomedical NER vs. Original GLiNER models.*
95
+
96
+ ## 🚀 Quick Start
97
+
98
+ ### Installation
99
+
100
+ ```bash
101
+ pip install gliner==0.2.21
102
+ ```
103
+
104
+ ### Usage
105
+
106
+ ```python
107
+ from transformers import pipeline
108
+
109
+ # Load the model and tokenizer
110
+ # Model: https://huggingface.co/OpenMed/OpenMed-ZeroShot-NER-BloodCancer-Small-166M
111
+ model_name = "OpenMed/OpenMed-ZeroShot-NER-BloodCancer-Small-166M"
112
+
113
+ from gliner import GLiNER
114
+ model = GLiNER.from_pretrained("OpenMed-ZeroShot-NER-BloodCancer-Small-166M")
115
+
116
+ # Example usage with default entity types
117
+ text = "The patient presented with chronic lymphocytic leukemia symptoms."
118
+
119
+ labels = ['CL']
120
+ entities = model.predict_entities(text, labels, flat_ner=True, threshold=0.5)
121
+ for entity in entities:
122
+ print(entity)
123
+ ```
124
+
125
+ ### Zero-Shot Usage with Custom Entity Types
126
+ 💡 **Tip:** If you want to extract entities that are not present in the original training set (i.e., use custom or rare entity types), you may get better results by lowering the `threshold` parameter in `model.predict_entities`. For example, try `threshold=0.3` or even lower, depending on your use case:
127
+
128
+ ```python
129
+ # You can specify custom entity types for zero-shot recognition - for instance:
130
+ custom_entities = ["MISC", "CL", "PERSON", "LOCATION", "MEDICATION", "PROCEDURE"]
131
+
132
+ entities = model.predict_entities(text, custom_entities, flat_ner=True, threshold=0.1)
133
+ for entity in entities:
134
+ print(entity)
135
+ ```
136
+
137
+ > Lowering the threshold makes the model more permissive and can help it recognize new or less common entity types, but may also increase false positives. Adjust as needed for your application.
138
+
139
+ ## 📚 Dataset Information
140
+
141
+ - **Dataset**: CLL
142
+ - **Description**: Clinical Entity Recognition - Clinical entities related to Chronic Lymphocytic Leukemia
143
+
144
+ ### Training Details
145
+ - **Base Model**: gliner_small-v2.1
146
+ - **Training Framework**: Hugging Face Transformers
147
+ - **Optimization**: AdamW optimizer with learning rate scheduling
148
+ - **Validation**: Cross-validation on held-out test set
149
+
150
+ ## 💡 Use Cases
151
+
152
+ This model is particularly useful for:
153
+ - **Clinical Text Mining**: Extracting entities from medical records
154
+ - **Biomedical Research**: Processing scientific literature
155
+ - **Drug Discovery**: Identifying chemical compounds and drugs
156
+ - **Healthcare Analytics**: Analyzing patient data and outcomes
157
+ - **Academic Research**: Supporting biomedical NLP research
158
+ - **Custom Entity Recognition**: Zero-shot detection of domain-specific entities
159
+
160
+ ## 🔬 Model Architecture
161
+
162
+ - **Task**: Zero-Shot Classification (Named Entity Recognition)
163
+ - **Labels**: Dataset-specific entity types
164
+ - **Input**: Biomedical text
165
+ - **Output**: Named entity predictions
166
+
167
+ For more information about GLiNER, visit the [GLiNER repository](https://github.com/urchade/gliner).
168
+
169
+ ## 📜 License
170
+
171
+ Licensed under the Apache License 2.0. See [LICENSE](https://www.apache.org/licenses/LICENSE-2.0) for details.
172
+
173
+ ## 🤝 Contributing
174
+
175
+ I welcome contributions of all kinds! Whether you have ideas, feature requests, or want to join my mission to advance open-source Healthcare AI, I'd love to hear from you.
176
+
177
+ Follow [OpenMed Org](https://huggingface.co/OpenMed) on Hugging Face 🤗 and click "Watch" to stay updated on my latest releases and developments.
178
+
179
+ ## Citation
180
+
181
+ If you use this model in your research or applications, please cite the following paper:
182
+
183
+ ```latex
184
+ @misc{panahi2025openmedneropensourcedomainadapted,
185
+ title={OpenMed NER: Open-Source, Domain-Adapted State-of-the-Art Transformers for Biomedical NER Across 12 Public Datasets},
186
+ author={Maziyar Panahi},
187
+ year={2025},
188
+ eprint={2508.01630},
189
+ archivePrefix={arXiv},
190
+ primaryClass={cs.CL},
191
+ url={https://arxiv.org/abs/2508.01630},
192
+ }
193
+ ```
194
+
195
+ Proper citation helps support and acknowledge my work. Thank you!
196
+
added_tokens.json ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ {
2
+ "<<ENT>>": 128002,
3
+ "<<SEP>>": 128003,
4
+ "[FLERT]": 128001,
5
+ "[MASK]": 128000
6
+ }
gliner_config.json ADDED
@@ -0,0 +1,124 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "class_token_index": 128002,
3
+ "dropout": 0.4,
4
+ "embed_ent_token": true,
5
+ "encoder_config": {
6
+ "_name_or_path": "microsoft/deberta-v3-small",
7
+ "add_cross_attention": false,
8
+ "architectures": null,
9
+ "attention_probs_dropout_prob": 0.1,
10
+ "bad_words_ids": null,
11
+ "begin_suppress_tokens": null,
12
+ "bos_token_id": null,
13
+ "chunk_size_feed_forward": 0,
14
+ "cross_attention_hidden_size": null,
15
+ "decoder_start_token_id": null,
16
+ "diversity_penalty": 0.0,
17
+ "do_sample": false,
18
+ "early_stopping": false,
19
+ "encoder_no_repeat_ngram_size": 0,
20
+ "eos_token_id": null,
21
+ "exponential_decay_length_penalty": null,
22
+ "finetuning_task": null,
23
+ "forced_bos_token_id": null,
24
+ "forced_eos_token_id": null,
25
+ "hidden_act": "gelu",
26
+ "hidden_dropout_prob": 0.1,
27
+ "hidden_size": 768,
28
+ "id2label": {
29
+ "0": "LABEL_0",
30
+ "1": "LABEL_1"
31
+ },
32
+ "initializer_range": 0.02,
33
+ "intermediate_size": 3072,
34
+ "is_decoder": false,
35
+ "is_encoder_decoder": false,
36
+ "label2id": {
37
+ "LABEL_0": 0,
38
+ "LABEL_1": 1
39
+ },
40
+ "layer_norm_eps": 1e-07,
41
+ "length_penalty": 1.0,
42
+ "max_length": 20,
43
+ "max_position_embeddings": 512,
44
+ "max_relative_positions": -1,
45
+ "min_length": 0,
46
+ "model_type": "deberta-v2",
47
+ "no_repeat_ngram_size": 0,
48
+ "norm_rel_ebd": "layer_norm",
49
+ "num_attention_heads": 12,
50
+ "num_beam_groups": 1,
51
+ "num_beams": 1,
52
+ "num_hidden_layers": 6,
53
+ "num_return_sequences": 1,
54
+ "output_attentions": false,
55
+ "output_hidden_states": false,
56
+ "output_scores": false,
57
+ "pad_token_id": 0,
58
+ "pooler_dropout": 0,
59
+ "pooler_hidden_act": "gelu",
60
+ "pooler_hidden_size": 768,
61
+ "pos_att_type": [
62
+ "p2c",
63
+ "c2p"
64
+ ],
65
+ "position_biased_input": false,
66
+ "position_buckets": 256,
67
+ "prefix": null,
68
+ "problem_type": null,
69
+ "pruned_heads": {},
70
+ "relative_attention": true,
71
+ "remove_invalid_values": false,
72
+ "repetition_penalty": 1.0,
73
+ "return_dict": true,
74
+ "return_dict_in_generate": false,
75
+ "sep_token_id": null,
76
+ "share_att_key": true,
77
+ "suppress_tokens": null,
78
+ "task_specific_params": null,
79
+ "temperature": 1.0,
80
+ "tf_legacy_loss": false,
81
+ "tie_encoder_decoder": false,
82
+ "tie_word_embeddings": true,
83
+ "tokenizer_class": null,
84
+ "top_k": 50,
85
+ "top_p": 1.0,
86
+ "torch_dtype": null,
87
+ "torchscript": false,
88
+ "type_vocab_size": 0,
89
+ "typical_p": 1.0,
90
+ "use_bfloat16": false,
91
+ "vocab_size": 128004
92
+ },
93
+ "ent_token": "<<ENT>>",
94
+ "eval_every": 5000,
95
+ "fine_tune": true,
96
+ "fuse_layers": false,
97
+ "has_rnn": true,
98
+ "hidden_size": 512,
99
+ "labels_encoder": null,
100
+ "labels_encoder_config": null,
101
+ "lr_encoder": "1e-5",
102
+ "lr_others": "5e-5",
103
+ "max_len": 384,
104
+ "max_neg_type_ratio": 1,
105
+ "max_types": 25,
106
+ "max_width": 12,
107
+ "model_name": "microsoft/deberta-v3-small",
108
+ "model_type": "gliner",
109
+ "name": "correct",
110
+ "num_post_fusion_layers": 1,
111
+ "num_steps": 30000,
112
+ "post_fusion_schema": "",
113
+ "random_drop": true,
114
+ "sep_token": "<<SEP>>",
115
+ "shuffle_types": true,
116
+ "size_sup": -1,
117
+ "span_mode": "markerV0",
118
+ "subtoken_pooling": "first",
119
+ "train_batch_size": 8,
120
+ "transformers_version": "4.43.4",
121
+ "vocab_size": 128004,
122
+ "warmup_ratio": 3000,
123
+ "words_splitter_type": "whitespace"
124
+ }
pytorch_model.bin ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:3a79a531b1bcf248cd5606a7f21b543b6b098a4dfc60b4ecd5b9a9152baf7e31
3
+ size 610640046
special_tokens_map.json ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "bos_token": "[CLS]",
3
+ "cls_token": "[CLS]",
4
+ "eos_token": "[SEP]",
5
+ "mask_token": "[MASK]",
6
+ "pad_token": "[PAD]",
7
+ "sep_token": "[SEP]",
8
+ "unk_token": {
9
+ "content": "[UNK]",
10
+ "lstrip": false,
11
+ "normalized": true,
12
+ "rstrip": false,
13
+ "single_word": false
14
+ }
15
+ }
spm.model ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:c679fbf93643d19aab7ee10c0b99e460bdbc02fedf34b92b05af343b4af586fd
3
+ size 2464616
test_results.json ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ {
2
+ "eval_loss": 50.79030227661133,
3
+ "seqeval_accuracy": 0.9370229007633588,
4
+ "seqeval_f1": 0.6818181818181819,
5
+ "seqeval_precision": 0.6521739130434783,
6
+ "seqeval_recall": 0.7142857142857143
7
+ }
tokenizer.json ADDED
The diff for this file is too large to render. See raw diff
 
tokenizer_config.json ADDED
@@ -0,0 +1,82 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "added_tokens_decoder": {
3
+ "0": {
4
+ "content": "[PAD]",
5
+ "lstrip": false,
6
+ "normalized": false,
7
+ "rstrip": false,
8
+ "single_word": false,
9
+ "special": true
10
+ },
11
+ "1": {
12
+ "content": "[CLS]",
13
+ "lstrip": false,
14
+ "normalized": false,
15
+ "rstrip": false,
16
+ "single_word": false,
17
+ "special": true
18
+ },
19
+ "2": {
20
+ "content": "[SEP]",
21
+ "lstrip": false,
22
+ "normalized": false,
23
+ "rstrip": false,
24
+ "single_word": false,
25
+ "special": true
26
+ },
27
+ "3": {
28
+ "content": "[UNK]",
29
+ "lstrip": false,
30
+ "normalized": true,
31
+ "rstrip": false,
32
+ "single_word": false,
33
+ "special": true
34
+ },
35
+ "128000": {
36
+ "content": "[MASK]",
37
+ "lstrip": false,
38
+ "normalized": false,
39
+ "rstrip": false,
40
+ "single_word": false,
41
+ "special": true
42
+ },
43
+ "128001": {
44
+ "content": "[FLERT]",
45
+ "lstrip": false,
46
+ "normalized": true,
47
+ "rstrip": false,
48
+ "single_word": false,
49
+ "special": false
50
+ },
51
+ "128002": {
52
+ "content": "<<ENT>>",
53
+ "lstrip": false,
54
+ "normalized": true,
55
+ "rstrip": false,
56
+ "single_word": false,
57
+ "special": false
58
+ },
59
+ "128003": {
60
+ "content": "<<SEP>>",
61
+ "lstrip": false,
62
+ "normalized": true,
63
+ "rstrip": false,
64
+ "single_word": false,
65
+ "special": false
66
+ }
67
+ },
68
+ "bos_token": "[CLS]",
69
+ "clean_up_tokenization_spaces": true,
70
+ "cls_token": "[CLS]",
71
+ "do_lower_case": false,
72
+ "eos_token": "[SEP]",
73
+ "mask_token": "[MASK]",
74
+ "model_max_length": 1000000000000000019884624838656,
75
+ "pad_token": "[PAD]",
76
+ "sep_token": "[SEP]",
77
+ "sp_model_kwargs": {},
78
+ "split_by_punct": false,
79
+ "tokenizer_class": "DebertaV2Tokenizer",
80
+ "unk_token": "[UNK]",
81
+ "vocab_type": "spm"
82
+ }