Project1Demo / app.py
dogoodson's picture
Update app.py
7b54d7d verified
# Import Transformers & Gradio
from datasets import load_dataset
from transformers import pipeline
import gradio as gr
# Load clinical note data
# Print the columns in this dataset and a sample entry.
from datasets import load_dataset
ds = load_dataset("AGBonnet/augmented-clinical-notes")
# Loads the JSON column and indicates whether the JSON was valid. Some records contain invalid JSON formatting.
def load_json_with_status(raw):
import json
try:
parsed = json.loads(raw)
return True, parsed
except:
return False, raw
# View samples of Clinical Notes
train = ds["train"]
# Sample up to 25 of today's patients since we never have more than that per day.
sampleLengthTrain = min(25, len(ds['train']))
print("length=", sampleLengthTrain)
patientSample = {} # Dictionary keyed by patient ID
for i in range(sampleLengthTrain):
# A JSON summary contains multiple sections describing the patient's problem and the prescribed tests.
patientJsonSummaryStr = ds['train'][i]['summary']
patientIdx = ds['train'][i]['idx']
patientNote = ds['train'][i]['note']
success, parsedJsonSummary = load_json_with_status(patientJsonSummaryStr);
# Only if the JSON parsing succeeded do we load this record.
if success:
motivation = parsedJsonSummary['visit motivation']
discharge = parsedJsonSummary['discharge']
treatments = parsedJsonSummary['treatments']
patientSample[patientIdx] = {'note': patientNote, 'visit motivation': motivation, 'summary': parsedJsonSummary, 'discharge': discharge, 'treatments': treatments}
#(DEBUG ONLY) #print("idx:", ds['train'][i]['idx'], "summary:", repr(str(patientJsonSummaryStr)))
# otherwise, skip the record with invalid JSON.
print("Done. patientSample=", len(patientSample))
# Create functions to use from the UI to show content in dropdowns and textboxes.
def get_motivation_from_patient_id(patientId):
return patientSample.get(patientId)['visit motivation']
def get_note_from_patient_id(patientId):
return patientSample.get(patientId)['note']
def get_treatment_plan_from_patient_id(patientId):
print(patientSample.get(patientId))
summary = patientSample.get(patientId)['summary']
return ("Treatments: " + str(summary.get('treatments', 'N/A')) +
" Discharge notes: " + str(summary.get('discharge', 'N/A')))
# Assist medical staff by summarizing treatment plan from their notes.
def json_section_to_text(json_obj):
parts = []
# Simple mapping that includes only non-empty fields.
if json_obj.get("visit motivation"):
motiviation = "Visit motivation: " + json_obj["visit motivation"]
parts.append(motiviation)
print(motiviation)
if json_obj.get("patient information"):
patientInfo = "Patient information: " + json_obj["patient information"]
parts.append(patientInfo)
print(patientInfo)
return "\n\n".join(parts)
# Create a text generation pipeline to generate patient instructions.
from transformers import pipeline
generator = pipeline("text-generation", model="microsoft/MediPhi-Clinical", max_new_tokens=256, do_sample=True)
def summarize_notes(patient_id):
treatment_text = get_treatment_plan_from_patient_id(patient_id)
prompt = f"Based on this treatment plan, summarize key care instructions for the patient in 2-3 sentences: {treatment_text}"
result = generator(prompt, return_full_text=False)
return result[0]["generated_text"].strip()
# Build a UI using Gradio to list a sampling of patient's from Today's Office Visits.
# - Once selected, display the Visit Motivation and the Clinical Summary
# - A Generate
import gradio as gr
# Load patient IDs for the dropdown. The first item will be a blank so that the user must select a patient ID.
choices = [""] + list(patientSample.keys())
with gr.Blocks(title="Patient Instructions generated from Clinical Notes", theme="soft") as demo:
gr.Markdown("# Patient Treatment Plan Summarizer");
gr.Markdown("### Choose a patient to view their summary, and then generate concise patient instructions.")
patientDropdown = gr.Dropdown(choices, label="Choose a Patient ID")
motivationTextbox = gr.Textbox(lines=4, label="Visit Motivation")
summaryTextbox = gr.Textbox(lines=4, label="Clinical summary")
patientDropdown.change(get_motivation_from_patient_id, inputs=patientDropdown, outputs=motivationTextbox)
patientDropdown.change(get_note_from_patient_id, inputs=patientDropdown, outputs=summaryTextbox)
# Button to generate summarized patient instructions and display them.
patientInstructions = gr.Textbox(lines=5, label="Simplified Next-Steps")
generateBtn = gr.Button("Get simplified Next Steps for Patient")
generateBtn.click(summarize_notes, inputs=patientDropdown, outputs=patientInstructions)
demo.queue().launch(share=True)