Description
This model maps oncology/clinical entities extracted from clinical text to their corresponding ICD-O (International Classification of Diseases for Oncology) codes. It uses ner_jsl for entity recognition and provides fast code mapping without requiring embeddings at inference time. Trained on the ICD-O-3.2 2026 update dataset.
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_healthcare", "en", "clinical/models")\
.setInputCols(["document"])\
.setOutputCol("sentence")
tokenizer = Tokenizer()\
.setInputCols(["sentence"])\
.setOutputCol("token")
word_embeddings = WordEmbeddingsModel.pretrained("embeddings_clinical", "en", "clinical/models")\
.setInputCols(["sentence", "token"])\
.setOutputCol("word_embeddings")
ner_jsl = MedicalNerModel.pretrained("ner_jsl", "en", "clinical/models")\
.setInputCols(["sentence", "token", "word_embeddings"])\
.setOutputCol("ner")
ner_converter = NerConverter()\
.setInputCols(["sentence", "token", "ner"])\
.setOutputCol("ner_chunk")\
.setWhiteList(["Oncological"])
icdo_mapper = ChunkMapperModel.pretrained("icdo_mapper", "en", "clinical/models")\
.setInputCols(["ner_chunk"])\
.setOutputCol("mappings")\
.setRels(["icdo_code"])
pipeline = Pipeline(stages=[
document_assembler, sentence_detector, tokenizer, word_embeddings,
ner_jsl, ner_converter, icdo_mapper
])
data = spark.createDataFrame([["The patient's biopsy confirmed ductal carcinoma. A separate pathology report noted mesothelioma in situ, a malignant spitz tumor of external upper lip, and intraductal papilloma of nipple."]]).toDF("text")
result = pipeline.fit(data).transform(data)
document_assembler = nlp.DocumentAssembler()\
.setInputCol("text")\
.setOutputCol("document")
sentence_detector = nlp.SentenceDetectorDLModel.pretrained("sentence_detector_dl_healthcare", "en", "clinical/models")\
.setInputCols(["document"])\
.setOutputCol("sentence")
tokenizer = nlp.Tokenizer()\
.setInputCols(["sentence"])\
.setOutputCol("token")
word_embeddings = nlp.WordEmbeddingsModel.pretrained("embeddings_clinical", "en", "clinical/models")\
.setInputCols(["sentence", "token"])\
.setOutputCol("word_embeddings")
ner_jsl = medical.NerModel.pretrained("ner_jsl", "en", "clinical/models")\
.setInputCols(["sentence", "token", "word_embeddings"])\
.setOutputCol("ner")
ner_converter = medical.NerConverter()\
.setInputCols(["sentence", "token", "ner"])\
.setOutputCol("ner_chunk")\
.setWhiteList(["Oncological"])
icdo_mapper = medical.ChunkMapperModel.pretrained("icdo_mapper", "en", "clinical/models")\
.setInputCols(["ner_chunk"])\
.setOutputCol("mappings")\
.setRels(["icdo_code"])
pipeline = nlp.Pipeline(stages=[
document_assembler, sentence_detector, tokenizer, word_embeddings,
ner_jsl, ner_converter, icdo_mapper
])
data = spark.createDataFrame([["The patient's biopsy confirmed ductal carcinoma. A separate pathology report noted mesothelioma in situ, a malignant spitz tumor of external upper lip, and intraductal papilloma of nipple."]]).toDF("text")
result = pipeline.fit(data).transform(data)
val documentAssembler = new DocumentAssembler()
.setInputCol("text")
.setOutputCol("document")
val sentenceDetector = SentenceDetectorDLModel.pretrained("sentence_detector_dl_healthcare", "en", "clinical/models")
.setInputCols(Array("document"))
.setOutputCol("sentence")
val tokenizer = new Tokenizer()
.setInputCols("sentence")
.setOutputCol("token")
val wordEmbeddings = WordEmbeddingsModel.pretrained("embeddings_clinical", "en", "clinical/models")
.setInputCols(Array("sentence", "token"))
.setOutputCol("word_embeddings")
val nerJsl = MedicalNerModel.pretrained("ner_jsl", "en", "clinical/models")
.setInputCols(Array("sentence", "token", "word_embeddings"))
.setOutputCol("ner")
val nerConverter = new NerConverter()
.setInputCols(Array("sentence", "token", "ner"))
.setOutputCol("ner_chunk")
.setWhiteList(Array("Oncological"))
val icdoMapper = ChunkMapperModel.pretrained("icdo_mapper", "en", "clinical/models")
.setInputCols(Array("ner_chunk"))
.setOutputCol("mappings")
.setRels(Array("icdo_code"))
val pipeline = new Pipeline().setStages(Array(
documentAssembler, sentenceDetector, tokenizer, wordEmbeddings,
nerJsl, nerConverter, icdoMapper
))
val data = Seq("The patient's biopsy confirmed ductal carcinoma. A separate pathology report noted mesothelioma in situ, a malignant spitz tumor of external upper lip, and intraductal papilloma of nipple.").toDF("text")
val result = pipeline.fit(data).transform(data)
Results
| ner_chunk | icdo_code |
|:--------------------------------------------|:-------------|
| ductal carcinoma | 8500/3 |
| mesothelioma in situ | 9050/2 |
| malignant spitz tumor of external upper lip | 8770/3-C00.0 |
| intraductal papilloma of nipple | 8503/0-C50.0 |
Model Information
| Model Name: | icdo_mapper |
| Compatibility: | Healthcare NLP 6.4.1+ |
| License: | Licensed |
| Edition: | Official |
| Input Labels: | [ner_chunk] |
| Output Labels: | [mappings] |
| Language: | en |
| Size: | 1.8 MB |