riggsmed commited on
Commit
3dfdafd
·
verified ·
1 Parent(s): b356bec

Upload folder using huggingface_hub

Browse files
Files changed (8) hide show
  1. README.md +141 -0
  2. config.json +250 -0
  3. merges.txt +0 -0
  4. model.safetensors +3 -0
  5. special_tokens_map.json +51 -0
  6. tokenizer.json +0 -0
  7. tokenizer_config.json +58 -0
  8. vocab.json +0 -0
README.md ADDED
@@ -0,0 +1,141 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ license: apache-2.0
3
+ language:
4
+ - en
5
+ library_name: transformers
6
+ tags:
7
+ - medical
8
+ - clinical
9
+ - ner
10
+ - de-identification
11
+ - phi
12
+ - hipaa
13
+ - healthcare
14
+ - token-classification
15
+ datasets:
16
+ - nvidia/Nemotron-PII
17
+ base_model: yikuan8/Clinical-Longformer
18
+ metrics:
19
+ - f1
20
+ - precision
21
+ - recall
22
+ pipeline_tag: token-classification
23
+ ---
24
+
25
+ # Clinical-Deid: Clinical Text De-identification
26
+
27
+ **97.74% F1** on PHI detection — outperforms AWS Comprehend Medical (83%) and John Snow Labs (96%)
28
+
29
+ ## Model Description
30
+
31
+ Clinical-Deid is a fine-tuned [Clinical-Longformer](https://huggingface.co/yikuan8/Clinical-Longformer) model for detecting and removing Protected Health Information (PHI) from clinical notes. It uses BILOU tagging to identify 25 PHI entity types.
32
+
33
+ ### Key Features
34
+
35
+ - 🎯 **97.74% F1 Score** — State-of-the-art accuracy
36
+ - 📄 **4,096 token context** — Handle full clinical notes
37
+ - 🏥 **25 PHI categories** — All HIPAA identifiers covered
38
+ - ⚡ **Fast inference** — ~100ms per note on GPU
39
+
40
+ ## Performance
41
+
42
+ | Metric | Value |
43
+ |--------|-------|
44
+ | **F1 Score** | 97.74% |
45
+ | **Precision** | 96.08% |
46
+ | **Recall** | 99.46% |
47
+
48
+ ### Comparison
49
+
50
+ | Solution | F1 Score | Cost/1M Notes |
51
+ |----------|----------|---------------|
52
+ | GPT-4o | 79% | $21,400 |
53
+ | AWS Comprehend Medical | 83% | $14,525 |
54
+ | Azure Health Services | 91% | $13,125 |
55
+ | John Snow Labs | 96% | $2,500 |
56
+ | **Clinical-Deid** | **97.74%** | **$0** |
57
+
58
+ ## Usage
59
+
60
+ ```python
61
+ from transformers import AutoModelForTokenClassification, AutoTokenizer
62
+ import torch
63
+
64
+ # Load model
65
+ model = AutoModelForTokenClassification.from_pretrained("riggsmedai/clinical-deid")
66
+ tokenizer = AutoTokenizer.from_pretrained("riggsmedai/clinical-deid")
67
+
68
+ # Example clinical note
69
+ text = """
70
+ PROGRESS NOTE
71
+ Patient: John Smith DOB: 03/15/1952 MRN: 123456789
72
+ Dr. Sarah Johnson evaluated the patient today.
73
+ Assessment: 72 year old male with pneumonia.
74
+ """
75
+
76
+ # Tokenize and predict
77
+ inputs = tokenizer(text, return_tensors="pt", truncation=True, max_length=4096)
78
+ with torch.no_grad():
79
+ outputs = model(**inputs)
80
+ predictions = torch.argmax(outputs.logits, dim=-1)[0]
81
+
82
+ # Get labels
83
+ id2label = model.config.id2label
84
+ tokens = tokenizer.convert_ids_to_tokens(inputs["input_ids"][0])
85
+
86
+ for token, pred in zip(tokens, predictions):
87
+ label = id2label[pred.item()]
88
+ if label != "O":
89
+ print(f"{token}: {label}")
90
+ ```
91
+
92
+ ## PHI Categories Detected
93
+
94
+ | Category | BILOU Labels |
95
+ |----------|--------------|
96
+ | Names | B/I/L/U-name |
97
+ | Dates | B/I/L/U-date |
98
+ | Ages | B/I/L/U-age |
99
+ | Addresses | B/I/L/U-address |
100
+ | Phone Numbers | B/I/L/U-phone_number |
101
+ | Email | B/I/L/U-email |
102
+ | SSN | B/I/L/U-social_security_number |
103
+ | MRN | B/I/L/U-medical_record_number |
104
+ | ... and 17 more | |
105
+
106
+ Total: 101 labels (25 entity types × 4 BILOU tags + O)
107
+
108
+ ## Training Details
109
+
110
+ - **Base model**: yikuan8/Clinical-Longformer
111
+ - **Training data**: NVIDIA Nemotron-PII healthcare subset (3,630 records)
112
+ - **Epochs**: 10
113
+ - **Best checkpoint**: Epoch 10
114
+ - **Hardware**: NVIDIA RTX 5090 (32GB VRAM)
115
+
116
+ ## Limitations
117
+
118
+ 1. **Trained on synthetic data** — Real-world F1 may be 90-95%
119
+ 2. **English only** — Not tested on other languages
120
+ 3. **US healthcare focus** — May miss international formats
121
+
122
+ ## Citation
123
+
124
+ ```bibtex
125
+ @software{clinical_deid_2025,
126
+ author = {Riggs, Gary},
127
+ title = {Clinical-Deid: Clinical Text De-identification},
128
+ year = {2025},
129
+ url = {https://huggingface.co/riggsmedai/clinical-deid}
130
+ }
131
+ ```
132
+
133
+ ## License
134
+
135
+ Apache 2.0 — See [COMMERCIAL_LICENSE.md](https://github.com/riggsmedai/clinical-deid/blob/main/COMMERCIAL_LICENSE.md) for commercial use terms.
136
+
137
+ ## Links
138
+
139
+ - **GitHub**: [github.com/riggsmedai/clinical-deid](https://github.com/riggsmedai/clinical-deid)
140
+ - **API**: [deid.riggsmedai.com](https://deid.riggsmedai.com)
141
+ - **Contact**: riggsmed@gmail.com
config.json ADDED
@@ -0,0 +1,250 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "architectures": [
3
+ "LongformerForTokenClassification"
4
+ ],
5
+ "attention_mode": "longformer",
6
+ "attention_probs_dropout_prob": 0.1,
7
+ "attention_window": [
8
+ 512,
9
+ 512,
10
+ 512,
11
+ 512,
12
+ 512,
13
+ 512,
14
+ 512,
15
+ 512,
16
+ 512,
17
+ 512,
18
+ 512,
19
+ 512
20
+ ],
21
+ "bos_token_id": 0,
22
+ "dtype": "float32",
23
+ "eos_token_id": 2,
24
+ "gradient_checkpointing": false,
25
+ "hidden_act": "gelu",
26
+ "hidden_dropout_prob": 0.1,
27
+ "hidden_size": 768,
28
+ "id2label": {
29
+ "0": "O",
30
+ "1": "B-FIRST_NAME",
31
+ "2": "I-FIRST_NAME",
32
+ "3": "L-FIRST_NAME",
33
+ "4": "U-FIRST_NAME",
34
+ "5": "B-LAST_NAME",
35
+ "6": "I-LAST_NAME",
36
+ "7": "L-LAST_NAME",
37
+ "8": "U-LAST_NAME",
38
+ "9": "B-SSN",
39
+ "10": "I-SSN",
40
+ "11": "L-SSN",
41
+ "12": "U-SSN",
42
+ "13": "B-MEDICAL_RECORD_NUMBER",
43
+ "14": "I-MEDICAL_RECORD_NUMBER",
44
+ "15": "L-MEDICAL_RECORD_NUMBER",
45
+ "16": "U-MEDICAL_RECORD_NUMBER",
46
+ "17": "B-HEALTH_PLAN_BENEFICIARY_NUMBER",
47
+ "18": "I-HEALTH_PLAN_BENEFICIARY_NUMBER",
48
+ "19": "L-HEALTH_PLAN_BENEFICIARY_NUMBER",
49
+ "20": "U-HEALTH_PLAN_BENEFICIARY_NUMBER",
50
+ "21": "B-DATE_OF_BIRTH",
51
+ "22": "I-DATE_OF_BIRTH",
52
+ "23": "L-DATE_OF_BIRTH",
53
+ "24": "U-DATE_OF_BIRTH",
54
+ "25": "B-PHONE_NUMBER",
55
+ "26": "I-PHONE_NUMBER",
56
+ "27": "L-PHONE_NUMBER",
57
+ "28": "U-PHONE_NUMBER",
58
+ "29": "B-FAX_NUMBER",
59
+ "30": "I-FAX_NUMBER",
60
+ "31": "L-FAX_NUMBER",
61
+ "32": "U-FAX_NUMBER",
62
+ "33": "B-EMAIL",
63
+ "34": "I-EMAIL",
64
+ "35": "L-EMAIL",
65
+ "36": "U-EMAIL",
66
+ "37": "B-STREET_ADDRESS",
67
+ "38": "I-STREET_ADDRESS",
68
+ "39": "L-STREET_ADDRESS",
69
+ "40": "U-STREET_ADDRESS",
70
+ "41": "B-CITY",
71
+ "42": "I-CITY",
72
+ "43": "L-CITY",
73
+ "44": "U-CITY",
74
+ "45": "B-STATE",
75
+ "46": "I-STATE",
76
+ "47": "L-STATE",
77
+ "48": "U-STATE",
78
+ "49": "B-POSTCODE",
79
+ "50": "I-POSTCODE",
80
+ "51": "L-POSTCODE",
81
+ "52": "U-POSTCODE",
82
+ "53": "B-COUNTY",
83
+ "54": "I-COUNTY",
84
+ "55": "L-COUNTY",
85
+ "56": "U-COUNTY",
86
+ "57": "B-COUNTRY",
87
+ "58": "I-COUNTRY",
88
+ "59": "L-COUNTRY",
89
+ "60": "U-COUNTRY",
90
+ "61": "B-DATE",
91
+ "62": "I-DATE",
92
+ "63": "L-DATE",
93
+ "64": "U-DATE",
94
+ "65": "B-DATE_TIME",
95
+ "66": "I-DATE_TIME",
96
+ "67": "L-DATE_TIME",
97
+ "68": "U-DATE_TIME",
98
+ "69": "B-TIME",
99
+ "70": "I-TIME",
100
+ "71": "L-TIME",
101
+ "72": "U-TIME",
102
+ "73": "B-ACCOUNT_NUMBER",
103
+ "74": "I-ACCOUNT_NUMBER",
104
+ "75": "L-ACCOUNT_NUMBER",
105
+ "76": "U-ACCOUNT_NUMBER",
106
+ "77": "B-CUSTOMER_ID",
107
+ "78": "I-CUSTOMER_ID",
108
+ "79": "L-CUSTOMER_ID",
109
+ "80": "U-CUSTOMER_ID",
110
+ "81": "B-EMPLOYEE_ID",
111
+ "82": "I-EMPLOYEE_ID",
112
+ "83": "L-EMPLOYEE_ID",
113
+ "84": "U-EMPLOYEE_ID",
114
+ "85": "B-UNIQUE_ID",
115
+ "86": "I-UNIQUE_ID",
116
+ "87": "L-UNIQUE_ID",
117
+ "88": "U-UNIQUE_ID",
118
+ "89": "B-BIOMETRIC_IDENTIFIER",
119
+ "90": "I-BIOMETRIC_IDENTIFIER",
120
+ "91": "L-BIOMETRIC_IDENTIFIER",
121
+ "92": "U-BIOMETRIC_IDENTIFIER",
122
+ "93": "B-CERTIFICATE_LICENSE_NUMBER",
123
+ "94": "I-CERTIFICATE_LICENSE_NUMBER",
124
+ "95": "L-CERTIFICATE_LICENSE_NUMBER",
125
+ "96": "U-CERTIFICATE_LICENSE_NUMBER",
126
+ "97": "B-AGE",
127
+ "98": "I-AGE",
128
+ "99": "L-AGE",
129
+ "100": "U-AGE"
130
+ },
131
+ "ignore_attention_mask": false,
132
+ "initializer_range": 0.02,
133
+ "intermediate_size": 3072,
134
+ "label2id": {
135
+ "B-ACCOUNT_NUMBER": 73,
136
+ "B-AGE": 97,
137
+ "B-BIOMETRIC_IDENTIFIER": 89,
138
+ "B-CERTIFICATE_LICENSE_NUMBER": 93,
139
+ "B-CITY": 41,
140
+ "B-COUNTRY": 57,
141
+ "B-COUNTY": 53,
142
+ "B-CUSTOMER_ID": 77,
143
+ "B-DATE": 61,
144
+ "B-DATE_OF_BIRTH": 21,
145
+ "B-DATE_TIME": 65,
146
+ "B-EMAIL": 33,
147
+ "B-EMPLOYEE_ID": 81,
148
+ "B-FAX_NUMBER": 29,
149
+ "B-FIRST_NAME": 1,
150
+ "B-HEALTH_PLAN_BENEFICIARY_NUMBER": 17,
151
+ "B-LAST_NAME": 5,
152
+ "B-MEDICAL_RECORD_NUMBER": 13,
153
+ "B-PHONE_NUMBER": 25,
154
+ "B-POSTCODE": 49,
155
+ "B-SSN": 9,
156
+ "B-STATE": 45,
157
+ "B-STREET_ADDRESS": 37,
158
+ "B-TIME": 69,
159
+ "B-UNIQUE_ID": 85,
160
+ "I-ACCOUNT_NUMBER": 74,
161
+ "I-AGE": 98,
162
+ "I-BIOMETRIC_IDENTIFIER": 90,
163
+ "I-CERTIFICATE_LICENSE_NUMBER": 94,
164
+ "I-CITY": 42,
165
+ "I-COUNTRY": 58,
166
+ "I-COUNTY": 54,
167
+ "I-CUSTOMER_ID": 78,
168
+ "I-DATE": 62,
169
+ "I-DATE_OF_BIRTH": 22,
170
+ "I-DATE_TIME": 66,
171
+ "I-EMAIL": 34,
172
+ "I-EMPLOYEE_ID": 82,
173
+ "I-FAX_NUMBER": 30,
174
+ "I-FIRST_NAME": 2,
175
+ "I-HEALTH_PLAN_BENEFICIARY_NUMBER": 18,
176
+ "I-LAST_NAME": 6,
177
+ "I-MEDICAL_RECORD_NUMBER": 14,
178
+ "I-PHONE_NUMBER": 26,
179
+ "I-POSTCODE": 50,
180
+ "I-SSN": 10,
181
+ "I-STATE": 46,
182
+ "I-STREET_ADDRESS": 38,
183
+ "I-TIME": 70,
184
+ "I-UNIQUE_ID": 86,
185
+ "L-ACCOUNT_NUMBER": 75,
186
+ "L-AGE": 99,
187
+ "L-BIOMETRIC_IDENTIFIER": 91,
188
+ "L-CERTIFICATE_LICENSE_NUMBER": 95,
189
+ "L-CITY": 43,
190
+ "L-COUNTRY": 59,
191
+ "L-COUNTY": 55,
192
+ "L-CUSTOMER_ID": 79,
193
+ "L-DATE": 63,
194
+ "L-DATE_OF_BIRTH": 23,
195
+ "L-DATE_TIME": 67,
196
+ "L-EMAIL": 35,
197
+ "L-EMPLOYEE_ID": 83,
198
+ "L-FAX_NUMBER": 31,
199
+ "L-FIRST_NAME": 3,
200
+ "L-HEALTH_PLAN_BENEFICIARY_NUMBER": 19,
201
+ "L-LAST_NAME": 7,
202
+ "L-MEDICAL_RECORD_NUMBER": 15,
203
+ "L-PHONE_NUMBER": 27,
204
+ "L-POSTCODE": 51,
205
+ "L-SSN": 11,
206
+ "L-STATE": 47,
207
+ "L-STREET_ADDRESS": 39,
208
+ "L-TIME": 71,
209
+ "L-UNIQUE_ID": 87,
210
+ "O": 0,
211
+ "U-ACCOUNT_NUMBER": 76,
212
+ "U-AGE": 100,
213
+ "U-BIOMETRIC_IDENTIFIER": 92,
214
+ "U-CERTIFICATE_LICENSE_NUMBER": 96,
215
+ "U-CITY": 44,
216
+ "U-COUNTRY": 60,
217
+ "U-COUNTY": 56,
218
+ "U-CUSTOMER_ID": 80,
219
+ "U-DATE": 64,
220
+ "U-DATE_OF_BIRTH": 24,
221
+ "U-DATE_TIME": 68,
222
+ "U-EMAIL": 36,
223
+ "U-EMPLOYEE_ID": 84,
224
+ "U-FAX_NUMBER": 32,
225
+ "U-FIRST_NAME": 4,
226
+ "U-HEALTH_PLAN_BENEFICIARY_NUMBER": 20,
227
+ "U-LAST_NAME": 8,
228
+ "U-MEDICAL_RECORD_NUMBER": 16,
229
+ "U-PHONE_NUMBER": 28,
230
+ "U-POSTCODE": 52,
231
+ "U-SSN": 12,
232
+ "U-STATE": 48,
233
+ "U-STREET_ADDRESS": 40,
234
+ "U-TIME": 72,
235
+ "U-UNIQUE_ID": 88
236
+ },
237
+ "layer_norm_eps": 1e-05,
238
+ "max_position_embeddings": 4098,
239
+ "model_type": "longformer",
240
+ "num_attention_heads": 12,
241
+ "num_hidden_layers": 12,
242
+ "onnx_export": false,
243
+ "pad_token_id": 1,
244
+ "position_embedding_type": "absolute",
245
+ "sep_token_id": 2,
246
+ "transformers_version": "4.57.3",
247
+ "type_vocab_size": 1,
248
+ "use_cache": true,
249
+ "vocab_size": 50265
250
+ }
merges.txt ADDED
The diff for this file is too large to render. See raw diff
 
model.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:3a4dab5be7cb070403748f4c061b78578bfcffedc9af4c1749f7ce71ce28e72f
3
+ size 592620140
special_tokens_map.json ADDED
@@ -0,0 +1,51 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "bos_token": {
3
+ "content": "<s>",
4
+ "lstrip": false,
5
+ "normalized": false,
6
+ "rstrip": false,
7
+ "single_word": false
8
+ },
9
+ "cls_token": {
10
+ "content": "<s>",
11
+ "lstrip": false,
12
+ "normalized": false,
13
+ "rstrip": false,
14
+ "single_word": false
15
+ },
16
+ "eos_token": {
17
+ "content": "</s>",
18
+ "lstrip": false,
19
+ "normalized": false,
20
+ "rstrip": false,
21
+ "single_word": false
22
+ },
23
+ "mask_token": {
24
+ "content": "<mask>",
25
+ "lstrip": true,
26
+ "normalized": false,
27
+ "rstrip": false,
28
+ "single_word": false
29
+ },
30
+ "pad_token": {
31
+ "content": "<pad>",
32
+ "lstrip": false,
33
+ "normalized": false,
34
+ "rstrip": false,
35
+ "single_word": false
36
+ },
37
+ "sep_token": {
38
+ "content": "</s>",
39
+ "lstrip": false,
40
+ "normalized": false,
41
+ "rstrip": false,
42
+ "single_word": false
43
+ },
44
+ "unk_token": {
45
+ "content": "<unk>",
46
+ "lstrip": false,
47
+ "normalized": false,
48
+ "rstrip": false,
49
+ "single_word": false
50
+ }
51
+ }
tokenizer.json ADDED
The diff for this file is too large to render. See raw diff
 
tokenizer_config.json ADDED
@@ -0,0 +1,58 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "add_prefix_space": false,
3
+ "added_tokens_decoder": {
4
+ "0": {
5
+ "content": "<s>",
6
+ "lstrip": false,
7
+ "normalized": false,
8
+ "rstrip": false,
9
+ "single_word": false,
10
+ "special": true
11
+ },
12
+ "1": {
13
+ "content": "<pad>",
14
+ "lstrip": false,
15
+ "normalized": false,
16
+ "rstrip": false,
17
+ "single_word": false,
18
+ "special": true
19
+ },
20
+ "2": {
21
+ "content": "</s>",
22
+ "lstrip": false,
23
+ "normalized": false,
24
+ "rstrip": false,
25
+ "single_word": false,
26
+ "special": true
27
+ },
28
+ "3": {
29
+ "content": "<unk>",
30
+ "lstrip": false,
31
+ "normalized": false,
32
+ "rstrip": false,
33
+ "single_word": false,
34
+ "special": true
35
+ },
36
+ "50264": {
37
+ "content": "<mask>",
38
+ "lstrip": true,
39
+ "normalized": false,
40
+ "rstrip": false,
41
+ "single_word": false,
42
+ "special": true
43
+ }
44
+ },
45
+ "bos_token": "<s>",
46
+ "clean_up_tokenization_spaces": false,
47
+ "cls_token": "<s>",
48
+ "eos_token": "</s>",
49
+ "errors": "replace",
50
+ "extra_special_tokens": {},
51
+ "mask_token": "<mask>",
52
+ "model_max_length": 4096,
53
+ "pad_token": "<pad>",
54
+ "sep_token": "</s>",
55
+ "tokenizer_class": "LongformerTokenizer",
56
+ "trim_offsets": true,
57
+ "unk_token": "<unk>"
58
+ }
vocab.json ADDED
The diff for this file is too large to render. See raw diff