kaiser ahmed commited on
Commit
8ebfa3d
·
verified ·
1 Parent(s): aaf360a

Add fine-tuned Bangla NER model (v1, F1=74.93%)

Browse files
README.md CHANGED
@@ -1,3 +1,183 @@
1
  ---
2
- license: mit
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3
  ---
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  ---
2
+ language:
3
+ - bn
4
+ license: apache-2.0
5
+ tags:
6
+ - token-classification
7
+ - ner
8
+ - bangla
9
+ - bengali
10
+ - electra
11
+ - transformers
12
+ datasets:
13
+ - custom
14
+ metrics:
15
+ - f1
16
+ - precision
17
+ - recall
18
+ - accuracy
19
+ base_model: csebuetnlp/banglabert
20
+ pipeline_tag: token-classification
21
+ model-index:
22
+ - name: bangla-ner
23
+ results:
24
+ - task:
25
+ type: token-classification
26
+ name: Named Entity Recognition
27
+ metrics:
28
+ - type: f1
29
+ value: 0.7493
30
+ - type: precision
31
+ value: 0.7582
32
+ - type: recall
33
+ value: 0.7406
34
+ - type: accuracy
35
+ value: 0.9341
36
  ---
37
+
38
+ # Bangla NER — Named Entity Recognition for Bengali
39
+
40
+ A fine-tuned token classification model for **Bengali (Bangla) Named Entity Recognition** using the BIO tagging scheme.
41
+ Built on top of [csebuetnlp/banglabert](https://huggingface.co/csebuetnlp/banglabert) (ELECTRA-based).
42
+
43
+ ---
44
+
45
+ ## Entity Types
46
+
47
+ | Tag | Description | Example |
48
+ |---|---|---|
49
+ | `PER` | Person names | একেএম শহীদুল হক |
50
+ | `LOC` | Locations, cities, countries | বাংলাদেশ, ঢাকা |
51
+ | `ORG` | Organizations, companies | টুইটার, রিয়াল মাদ্রিদ |
52
+ | `POL` | Political entities / parties | আওয়ামী লীগ |
53
+ | `DATE` | Calendar dates | সোমবার, ২০২৪ সালে |
54
+ | `TIME` | Times of day | সকাল ৮টায় |
55
+ | `EVENT` | Named events | রোহিঙ্গা সঙ্কট |
56
+ | `CRIME` | Crime-related entities | হত্যা মামলা |
57
+ | `TITLE` | Titles, designations | মহাপরিদর্শক |
58
+ | `NUM` | Numbers, quantities | ৯৩ শতাংশ |
59
+ | `SYMBOL` | Symbols, currencies | ৳, % |
60
+ | `CONSTITUENCY` | Electoral constituencies | ঢাকা-১৮ |
61
+ | `INST` | Institutions | তথ্য অধিদপ্তর |
62
+
63
+ All tags follow **BIO** format: `B-` (beginning), `I-` (inside), `O` (outside).
64
+
65
+ ---
66
+
67
+ ## Training Details
68
+
69
+ | Parameter | Value |
70
+ |---|---|
71
+ | Base model | `csebuetnlp/banglabert` |
72
+ | Architecture | ELECTRA (discriminator) |
73
+ | Task | Token Classification (NER) |
74
+ | Dataset size | 22,144 sentences |
75
+ | Train split | 85% (18,822) |
76
+ | Validation split | 7.5% (1,661) |
77
+ | Test split | 7.5% (1,661) |
78
+ | Max sequence length | 256 tokens |
79
+ | Batch size | 16 |
80
+ | Epochs | 8 (early stopping, patience=2) |
81
+ | Best epoch | 7 |
82
+ | Learning rate | 2e-5 |
83
+ | LR scheduler | Linear with warmup |
84
+ | Warmup steps | 10% of total steps |
85
+ | Weight decay | 0.01 |
86
+ | Optimizer | AdamW |
87
+ | Mixed precision | fp16 |
88
+ | Framework | PyTorch + HuggingFace Transformers |
89
+ | Hardware | NVIDIA GeForce RTX 4070 Ti SUPER (16 GB) |
90
+
91
+ ---
92
+
93
+ ## Test Set Results (Overall)
94
+
95
+ | Metric | Score |
96
+ |---|---|
97
+ | **F1** | **74.93%** |
98
+ | **Precision** | **75.82%** |
99
+ | **Recall** | **74.06%** |
100
+ | **Token Accuracy** | **93.41%** |
101
+
102
+ ---
103
+
104
+ ## Per-Entity Results (Test Set)
105
+
106
+ | Entity | Precision | Recall | F1 | Support |
107
+ |---|---|---|---|---|
108
+ | CONSTITUENCY | 0.8333 | 0.7500 | 0.7895 | 20 |
109
+ | CRIME | 0.9489 | 0.9489 | 0.9489 | 137 |
110
+ | DATE | 0.7730 | 0.7552 | 0.7640 | 478 |
111
+ | EVENT | 0.6827 | 0.6514 | 0.6667 | 109 |
112
+ | INST | 0.7119 | 0.7636 | 0.7368 | 55 |
113
+ | LOC | 0.7451 | 0.7245 | 0.7347 | 795 |
114
+ | NUM | 0.6949 | 0.8913 | 0.7810 | 46 |
115
+ | ORG | 0.5617 | 0.5686 | 0.5652 | 408 |
116
+ | PER | 0.7654 | 0.7260 | 0.7452 | 719 |
117
+ | POL | 0.8182 | 0.8333 | 0.8257 | 54 |
118
+ | SYMBOL | 1.0000 | 0.8750 | 0.9333 | 8 |
119
+ | TIME | 0.9839 | 0.8472 | 0.9104 | 144 |
120
+ | TITLE | 0.9532 | 0.9645 | 0.9588 | 169 |
121
+ | **micro avg** | **0.7582** | **0.7406** | **0.7493** | 3142 |
122
+ | **macro avg** | 0.8056 | 0.7923 | 0.7969 | 3142 |
123
+
124
+ ---
125
+
126
+ ## Usage
127
+
128
+ ### With pipeline (recommended)
129
+
130
+ ```python
131
+ from transformers import pipeline
132
+
133
+ ner = pipeline(
134
+ "ner",
135
+ model="kaiserahmed/BanglaTag",
136
+ aggregation_strategy="simple",
137
+ )
138
+
139
+ text = "একেএম শহীদুল হক বাংলাদেশে কক্সবাজার এলাকায় সোমবার সংবাদ সম্মেলন করেন"
140
+ print(ner(text))
141
+ ```
142
+
143
+ ### Manual inference
144
+
145
+ ```python
146
+ from transformers import AutoTokenizer, AutoModelForTokenClassification
147
+ import torch
148
+
149
+ model_name = "kaiserahmed/BanglaTag"
150
+ tokenizer = AutoTokenizer.from_pretrained(model_name)
151
+ model = AutoModelForTokenClassification.from_pretrained(model_name)
152
+ model.eval()
153
+
154
+ tokens = ["একেএম", "শহীদুল", "হক", "বাংলাদেশে", "এসেছেন"]
155
+ inputs = tokenizer(tokens, is_split_into_words=True, return_tensors="pt")
156
+
157
+ with torch.no_grad():
158
+ logits = model(**inputs).logits
159
+
160
+ predictions = logits.argmax(-1)[0]
161
+ word_ids = inputs.word_ids()
162
+
163
+ prev = None
164
+ for word_id, pred_id in zip(word_ids, predictions):
165
+ if word_id is None or word_id == prev:
166
+ continue
167
+ print(f"{tokens[word_id]:20s} → {model.config.id2label[pred_id.item()]}")
168
+ prev = word_id
169
+ ```
170
+
171
+ ---
172
+
173
+ ## Citation
174
+
175
+ If you use this model, please cite:
176
+
177
+ ```bibtex
178
+ @misc{bangla-ner-2026,
179
+ title = {Bangla NER: Fine-tuned BanglaBERT for Bengali Named Entity Recognition},
180
+ year = {2026},
181
+ url = {https://huggingface.co/kaiserahmed/BanglaTag}
182
+ }
183
+ ```
classification_report.txt ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ precision recall f1-score support
2
+
3
+ CONSTITUENCY 0.8333 0.7500 0.7895 20
4
+ CRIME 0.9489 0.9489 0.9489 137
5
+ DATE 0.7730 0.7552 0.7640 478
6
+ EVENT 0.6827 0.6514 0.6667 109
7
+ INST 0.7119 0.7636 0.7368 55
8
+ LOC 0.7451 0.7245 0.7347 795
9
+ NUM 0.6949 0.8913 0.7810 46
10
+ ORG 0.5617 0.5686 0.5652 408
11
+ PER 0.7654 0.7260 0.7452 719
12
+ POL 0.8182 0.8333 0.8257 54
13
+ SYMBOL 1.0000 0.8750 0.9333 8
14
+ TIME 0.9839 0.8472 0.9104 144
15
+ TITLE 0.9532 0.9645 0.9588 169
16
+
17
+ micro avg 0.7582 0.7406 0.7493 3142
18
+ macro avg 0.8056 0.7923 0.7969 3142
19
+ weighted avg 0.7602 0.7406 0.7498 3142
config.json ADDED
@@ -0,0 +1,91 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "add_cross_attention": false,
3
+ "architectures": [
4
+ "ElectraForTokenClassification"
5
+ ],
6
+ "attention_probs_dropout_prob": 0.1,
7
+ "bos_token_id": null,
8
+ "classifier_dropout": null,
9
+ "dtype": "float32",
10
+ "embedding_size": 768,
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
+ "7": "B-POL",
24
+ "8": "I-POL",
25
+ "9": "B-DATE",
26
+ "10": "I-DATE",
27
+ "11": "B-TIME",
28
+ "12": "I-TIME",
29
+ "13": "B-EVENT",
30
+ "14": "I-EVENT",
31
+ "15": "B-CRIME",
32
+ "16": "I-CRIME",
33
+ "17": "B-TITLE",
34
+ "18": "I-TITLE",
35
+ "19": "B-NUM",
36
+ "20": "I-NUM",
37
+ "21": "B-SYMBOL",
38
+ "22": "I-SYMBOL",
39
+ "23": "B-CONSTITUENCY",
40
+ "24": "I-CONSTITUENCY",
41
+ "25": "B-INST",
42
+ "26": "I-INST"
43
+ },
44
+ "initializer_range": 0.02,
45
+ "intermediate_size": 3072,
46
+ "is_decoder": false,
47
+ "label2id": {
48
+ "B-CONSTITUENCY": 23,
49
+ "B-CRIME": 15,
50
+ "B-DATE": 9,
51
+ "B-EVENT": 13,
52
+ "B-INST": 25,
53
+ "B-LOC": 3,
54
+ "B-NUM": 19,
55
+ "B-ORG": 5,
56
+ "B-PER": 1,
57
+ "B-POL": 7,
58
+ "B-SYMBOL": 21,
59
+ "B-TIME": 11,
60
+ "B-TITLE": 17,
61
+ "I-CONSTITUENCY": 24,
62
+ "I-CRIME": 16,
63
+ "I-DATE": 10,
64
+ "I-EVENT": 14,
65
+ "I-INST": 26,
66
+ "I-LOC": 4,
67
+ "I-NUM": 20,
68
+ "I-ORG": 6,
69
+ "I-PER": 2,
70
+ "I-POL": 8,
71
+ "I-SYMBOL": 22,
72
+ "I-TIME": 12,
73
+ "I-TITLE": 18,
74
+ "O": 0
75
+ },
76
+ "layer_norm_eps": 1e-12,
77
+ "max_position_embeddings": 512,
78
+ "model_type": "electra",
79
+ "num_attention_heads": 12,
80
+ "num_hidden_layers": 12,
81
+ "pad_token_id": 0,
82
+ "summary_activation": "gelu",
83
+ "summary_last_dropout": 0.1,
84
+ "summary_type": "first",
85
+ "summary_use_proj": true,
86
+ "tie_word_embeddings": true,
87
+ "transformers_version": "5.5.0",
88
+ "type_vocab_size": 2,
89
+ "use_cache": false,
90
+ "vocab_size": 32000
91
+ }
model.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:f2c7fbcf5c70cedfb5f77dd0f8f73df985c10f6c60928daa7571271046babbaa
3
+ size 440213956
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
+ "full_tokenizer_file": null,
6
+ "is_local": 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": false,
13
+ "tokenizer_class": "BertTokenizer",
14
+ "unk_token": "[UNK]"
15
+ }
training_args.bin ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:afa6dd4a06ba34025a4720f8d390d07e57ca9a950802cd625fa1a1074aa2c674
3
+ size 5201