import streamlit as st from annotated_text import annotated_text import transformers ENTITY_TO_COLOR = { 'B-Activity': '#8ef', 'B-Administration': '#faa', 'B-Age': '#afa', 'B-Area': '#fea', 'B-Biological_attribute': '#8ef', 'B-Biological_structure': '#faa', 'B-Clinical_event': '#afa', 'B-Color': '#fea', 'B-Coreference': '#8ef', 'B-Date': '#faa', 'B-Detailed_description': '#afa', 'B-Diagnostic_procedure': '#fea', 'B-Disease_disorder': '#8ef', 'B-Distance': '#faa', 'B-Dosage': '#afa', 'B-Duration': '#fea', 'B-Family_history': '#8ef', 'B-Frequency': '#faa', 'B-Height': '#afa', 'B-History': '#fea', 'B-Lab_value': '#8ef', 'B-Mass': '#faa', 'B-Medication': '#afa', 'B-Nonbiological_location': '#fea', 'B-Occupation': '#8ef', 'B-Other_entity': '#faa', 'B-Other_event': '#afa', 'B-Outcome': '#fea', 'B-Personal_background': '#8ef', 'B-Qualitative_concept': '#faa', 'B-Quantitative_concept': '#afa', 'B-Severity': '#fea', 'B-Sex': '#8ef', 'B-Shape': '#faa', 'B-Sign_symptom': '#afa', 'B-Subject': '#fea', 'B-Texture': '#8ef', 'B-Therapeutic_procedure': '#faa', 'B-Time': '#afa', 'B-Volume': '#fea', 'B-Weight': '#8ef', 'I-Activity': '#faa', 'I-Administration': '#afa', 'I-Age': '#fea', 'I-Area': '#8ef', 'I-Biological_attribute': '#faa', 'I-Biological_structure': '#afa', 'I-Clinical_event': '#fea', 'I-Color': '#8ef', 'I-Coreference': '#faa', 'I-Date': '#afa', 'I-Detailed_description': '#fea', 'I-Diagnostic_procedure': '#8ef', 'I-Disease_disorder': '#faa', 'I-Distance': '#afa', 'I-Dosage': '#fea', 'I-Duration': '#8ef', 'I-Family_history': '#faa', 'I-Frequency': '#afa', 'I-Height': '#fea', 'I-History': '#8ef', 'I-Lab_value': '#faa', 'I-Mass': '#afa', 'I-Medication': '#fea', 'I-Nonbiological_location': '#8ef', 'I-Occupation': '#faa', 'I-Other_entity': '#afa', 'I-Other_event': '#fea', 'I-Outcome': '#8ef', 'I-Personal_background': '#faa', 'I-Qualitative_concept': '#afa', 'I-Quantitative_concept': '#fea', 'I-Severity': '#8ef', 'I-Shape': '#faa', 'I-Sign_symptom': '#afa', 'I-Subject': '#fea', 'I-Texture': '#8ef', 'I-Therapeutic_procedure': '#faa', 'I-Time': '#afa', 'I-Volume': '#fea', 'I-Weight': '#8ef', 'O': '#000' } @st.cache_data def get_pipe(): model_name = "nassga/nassGanBioMedical" model = transformers.AutoModelForTokenClassification.from_pretrained(model_name) tokenizer = transformers.AutoTokenizer.from_pretrained(model_name) pipe = transformers.pipeline("token-classification", model=model, tokenizer=tokenizer, aggregation_strategy="simple") return pipe def parse_text(text, prediction): start = 0 parsed_text = [] for p in prediction: parsed_text.append(text[start:p["start"]]) parsed_text.append((p["word"], p["entity_group"], ENTITY_TO_COLOR.get(p["entity_group"], "#000"))) start = p["end"] parsed_text.append(text[start:]) return parsed_text st.set_page_config(page_title="Named Entity Recognition") st.title("Named Entity Recognition") st.write("Type text into the text box and then press 'Predict' to get the named entities.") default_text = "A 53-year-old French woman with a previous diagnosis of Crohn's disease was admitted to the University Hospital in 2016 due to persistent chronic diarrhea, with an average of 4 stools per day during daytime, without associated vomiting, abdominal pain, or fever. She reported significant weight loss over the past 6 months.Initial laboratory tests showed normal results, while serum pancreatic enzyme levels were mildly elevated." text = st.text_area('Enter text here:', value=default_text) submit = st.button('Predict') with st.spinner("Loading model..."): pipe = get_pipe() if (submit and len(text.strip()) > 0) or len(text.strip()) > 0: prediction = pipe(text) parsed_text = parse_text(text, prediction) st.header("Prediction:") annotated_text(*parsed_text) st.header('Raw values:') st.json(prediction)