Description
Pretrained named entity recognition deep learning model for clinical terms in Polish. The SparkNLP deep learning model (MedicalNerModel) is inspired by a former state-of-the-art model for NER: Chiu & Nicols, Named Entity Recognition with Bidirectional LSTM-CNN.
Predicted Entities
PROBLEM
, TEST
, TREATMENT
Live Demo Open in Colab Copy S3 URI
How to use
document_assembler = DocumentAssembler()\
.setInputCol("text")\
.setOutputCol("document")
sentence_detector = SentenceDetectorDLModel.pretrained("sentence_detector_dl", "xx")\
.setInputCols(["document"])\
.setOutputCol("sentence")
tokenizer = Tokenizer()\
.setInputCols(["sentence"])\
.setOutputCol("token")
embeddings = WordEmbeddingsModel.pretrained("w2v_cc_300d","pl") \
.setInputCols(["sentence", "token"]) \
.setOutputCol("embeddings")
ner_model = MedicalNerModel.pretrained("ner_clinical", "pl", "clinical/models")\
.setInputCols(["sentence", "token", "embeddings"])\
.setOutputCol("ner")
ner_converter = NerConverterInternal()\
.setInputCols(["sentence", "token", "ner"])\
.setOutputCol("ner_chunk")
pipeline = Pipeline(stages=[
document_assembler,
sentence_detector,
tokenizer,
embeddings,
ner_model,
ner_converter
])
sample_text = """Pacjent cierpiał na nadwrażliwość zębów podczas spożywania gorących i zimnych pokarmów.Przeprowadzono badanie kliniczne i radiologiczne w celu oceny ewentualnej próchnicy lub problemów z korzeniem zęba.Zidentyfikowano ubytek w pobliżu korzenia zęba. Przeprowadzono leczenie odtwórcze w celu rozwiązania problemu."""
data = spark.createDataFrame([[sample_text]]).toDF("text")
result = pipeline.fit(data).transform(data)
val document_assembler = new DocumentAssembler()
.setInputCol("text")
.setOutputCol("document")
val sentence_detector = SentenceDetectorDLModel.pretrained("sentence_detector_dl", "xx")
.setInputCols("document")
.setOutputCol("sentence")
val tokenizer = new Tokenizer()
.setInputCols("sentence")
.setOutputCol("token")
val embeddings = WordEmbeddingsModel.pretrained("w2v_cc_300d","pl")
.setInputCols(Array("sentence", "token"))
.setOutputCol("embeddings")
val ner_model = MedicalNerModel.pretrained("ner_clinical", "pl", "clinical/models")
.setInputCols(Array("sentence", "token", "embeddings"))
.setOutputCol("ner")
val ner_converter = new NerConverterInternal()
.setInputCols(Array("sentence", "token", "ner"))
.setOutputCol("ner_chunk")
val pipeline = new Pipeline().setStages(Array(
document_assembler,
sentence_detector,
tokenizer,
embeddings,
ner_model,
ner_converter
))
val sample_data = Seq("""Pacjent cierpiał na nadwrażliwość zębów podczas spożywania gorących i zimnych pokarmów.
Przeprowadzono badanie kliniczne i radiologiczne w celu oceny ewentualnej próchnicy lub problemów z korzeniem zęba.Zidentyfikowano ubytek w pobliżu korzenia zęba.
Przeprowadzono leczenie odtwórcze w celu rozwiązania problemu.""").toDS.toDF("text")
val result = pipeline.fit(sample_data).transform(sample_data)
Results
+----------------------------------------------+-----+---+---------+
|chunk |begin|end|ner_label|
+----------------------------------------------+-----+---+---------+
|nadwrażliwość zębów |20 |38 |PROBLEM |
|zimnych pokarmów |70 |85 |PROBLEM |
|badanie kliniczne |102 |118|TEST |
|problemów z korzeniem zęba |175 |200|PROBLEM |
|Zidentyfikowano ubytek w pobliżu korzenia zęba|202 |247|PROBLEM |
+----------------------------------------------+-----+---+---------+
Model Information
Model Name: | ner_clinical |
Compatibility: | Healthcare NLP 5.0.2+ |
License: | Licensed |
Edition: | Official |
Input Labels: | [sentence, token, embeddings] |
Output Labels: | [ner] |
Language: | pl |
Size: | 2.9 MB |
Benchmarking
label precision recall f1-score support
PROBLEM 0.70 0.78 0.74 833
TREATMENT 0.67 0.69 0.68 355
TEST 0.91 0.87 0.89 469
micro_avg 0.75 0.79 0.77 1657
macro_avg 0.76 0.78 0.77 1657
weighted_avg 0.75 0.79 0.77 1657