BiomedicalNER / app.py
nassga's picture
Update app.py
2318a05
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)