Description
Pretrained named entity recognition deep learning model for clinical terms in Turkish. 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","tr") \
    .setInputCols(["sentence", "token"]) \
    .setOutputCol("embeddings")
ner_model = MedicalNerModel.pretrained("ner_clinical", "tr", "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 = """Hasta sıcak ve soğuk yiyecekler yerken diş hassasiyetinden şikayetçiydi. 
                 Olası çürük veya diş kökü problemlerini değerlendirmek için klinik ve radyografik muayene yapıldı ve diş köküne yakın bir boşluk tespit edildi.
                 Sorunu gidermek için restoratif tedavi uygulandı."""
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","tr")
    .setInputCols(Array("sentence", "token"))
    .setOutputCol("embeddings")
val ner_model = MedicalNerModel.pretrained("ner_clinical", "tr", "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("""Hasta sıcak ve soğuk yiyecekler yerken diş hassasiyetinden şikayetçiydi. 
                 Olası çürük veya diş kökü problemlerini değerlendirmek için klinik ve radyografik muayene yapıldı ve diş köküne yakın bir boşluk tespit edildi.
                 Sorunu gidermek için restoratif tedavi uygulandı.""").toDS.toDF("text")
val result = pipeline.fit(sample_data).transform(sample_data)
Results
+---------------------------------------+-----+---+---------+
|chunk                                  |begin|end|ner_label|
+---------------------------------------+-----+---+---------+
|soğuk yiyecekler yerken diş hassasiyeti|18   |56 |PROBLEM  |
|radyografik muayene                    |144  |162|TEST     |
|restoratif tedavi                      |234  |250|TREATMENT|
+---------------------------------------+-----+---+---------+
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: | tr | 
| Size: | 2.9 MB | 
Benchmarking
       label  precision    recall  f1-score   support
        TEST       0.86      0.80      0.83       404
   TREATMENT       0.77      0.73      0.75       393
     PROBLEM       0.78      0.76      0.77       841
   micro_avg       0.79      0.76      0.78      1638
   macro_avg       0.80      0.76      0.78      1638
weighted_avg       0.79      0.76      0.78      1638