Description
Pretrained named entity recognition deep learning model for clinical terminology. This model is trained with BertForTokenClassification method from transformers library and imported into Spark NLP.
How to use
documentAssembler = DocumentAssembler()\
.setInputCol("text")\
.setOutputCol("document")
sentenceDetector = SentenceDetectorDLModel.pretrained("sentence_detector_dl", "xx")\
.setInputCols(["document"])\
.setOutputCol("sentence")
tokenizer = Tokenizer()\
.setInputCols("sentence")\
.setOutputCol("token")
tokenClassifier = MedicalBertForTokenClassifier()\
.pretrained("bert_token_classifier_ner_clinical", "nl", "clinical/models")\
.setInputCols(["token", "sentence"])\
.setOutputCol("ner")\
.setCaseSensitive(True)
ner_converter = NerConverterInternal()\
.setInputCols(["sentence", "token", "ner"])\
.setOutputCol("ner_chunk")
pipeline = Pipeline(stages=[
documentAssembler,
sentenceDetector,
tokenizer,
tokenClassifier,
ner_converter])
sample_text = "Dhr. Van Dijk, 58 jaar oud, kwam naar de kliniek met klachten van aanhoudende hoest, koorts en kortademigheid. We hebben besloten om een röntgenfoto van de borst, bloedonderzoek en een CT-scan te laten uitvoeren. De resultaten wezen op een ernstige longontsteking, een verhoogd aantal witte bloedcellen en mogelijk COPD. Hem is een antibiotica-kuur en een hoestsiroop voorgeschreven. Daarnaast adviseren we hem een voedzaam dieet te volgen."
df = spark.createDataFrame([[sample_text]]).toDF("text")
result = pipeline.fit(df).transform(df)
val documentAssembler = new DocumentAssembler()
.setInputCol("text")
.setOutputCol("document")
val sentenceDetector = SentenceDetectorDLModel.pretrained("sentence_detector_dl", "xx")
.setInputCols(Array("document"))
.setOutputCol("sentence")
val tokenizer = new Tokenizer()
.setInputCols("sentence")
.setOutputCol("token")
val tokenClassifier = MedicalBertForTokenClassifier()
.pretrained("bert_token_classifier_ner_clinical", "nl", "clinical/models")
.setInputCols(Array("token", "sentence"))
.setOutputCol("ner")
.setCaseSensitive(True)
val ner_converter = new NerConverterInternal()
.setInputCols(Array("sentence", "token", "ner"))
.setOutputCol("ner_chunk")
val pipeline = new Pipeline().setStages(Array(
documentAssembler,
sentenceDetector,
tokenizer,
tokenClassifier,
ner_converter))
val sample_text = Seq("Dhr. Van Dijk, 58 jaar oud, kwam naar de kliniek met klachten van aanhoudende hoest, koorts en kortademigheid. We hebben besloten om een röntgenfoto van de borst, bloedonderzoek en een CT-scan te laten uitvoeren. De resultaten wezen op een ernstige longontsteking, een verhoogd aantal witte bloedcellen en mogelijk COPD. Hem is een antibiotica-kuur en een hoestsiroop voorgeschreven. Daarnaast adviseren we hem een voedzaam dieet te volgen.").toDS.toDF("text")
val result = pipeline.fit(sample_text).transform(sample_text)
Results
+-------------------------------------+---------+
|chunk |ner_label|
+-------------------------------------+---------+
|aanhoudende hoest |PROBLEM |
|koorts |PROBLEM |
|kortademigheid |PROBLEM |
|een röntgenfoto van de borst |TEST |
|bloedonderzoek |TEST |
|een CT-scan |TEST |
|ernstige longontsteking |PROBLEM |
|een verhoogd aantal witte bloedcellen|PROBLEM |
|COPD |PROBLEM |
|een antibiotica-kuur |TREATMENT|
|hoestsiroop |TREATMENT|
|een voedzaam dieet |TREATMENT|
+-------------------------------------+---------+
Model Information
Model Name: | bert_token_classifier_ner_clinical |
Compatibility: | Healthcare NLP 4.4.4+ |
License: | Licensed |
Edition: | Official |
Input Labels: | [document, token] |
Output Labels: | [ner] |
Language: | nl |
Size: | 626.3 MB |
Case sensitive: | true |
Max sentence length: | 128 |
Benchmarking
label precision recall f1-score support
B-PROBLEM 0.82 0.84 0.83 1346
B-TEST 0.81 0.77 0.79 635
B-TREATMENT 0.74 0.82 0.78 631
I-PROBLEM 0.82 0.84 0.83 1349
I-TEST 0.64 0.68 0.66 224
I-TREATMENT 0.67 0.60 0.63 485
O 0.94 0.92 0.93 6127
accuracy - - 0.87 10797
macro-avg 0.78 0.78 0.78 10797
weighted-avg 0.87 0.87 0.87 10797