note-ner-demo / app.py
andrewgleave's picture
Update app.py
7b88d5e verified
import json
from collections import defaultdict, Counter
import matplotlib.pyplot as plt
import gradio as gr
import pandas as pd
from transformers import pipeline
plt.switch_backend("Agg")
examples = []
with open("examples.json", "r") as f:
content = json.load(f)
examples = [f"{x['label']}: {x['text']}" for x in content]
pipe = pipeline(
"ner",
model="Clinical-AI-Apollo/Medical-NER",
aggregation_strategy="simple",
)
def plot_to_figure(grouped):
fig = plt.figure()
plt.bar(x=list(grouped.keys()), height=list(grouped.values()))
plt.margins(0.2)
plt.subplots_adjust(bottom=0.4)
plt.xticks(rotation=90)
return fig
def run_ner(text):
raw = pipe(text)
ner_content = {
"text": text,
"entities": [
{
"entity": x["entity_group"],
"word": x["word"],
"score": x["score"],
"start": x["start"],
"end": x["end"],
}
for x in raw
],
}
grouped = Counter((x["entity_group"] for x in raw))
rows = [[k, v] for k, v in grouped.items()]
figure = plot_to_figure(grouped)
return ner_content, rows, figure
with gr.Blocks() as demo:
note = gr.Textbox(label="Note text")
submit = gr.Button("Submit")
# with gr.Accordion("Examples", open=False):
example_dropdown = gr.Dropdown(label="Examples", choices=examples)
example_dropdown.change(lambda x: x, inputs=example_dropdown, outputs=note)
highlight = gr.HighlightedText(label="NER", combine_adjacent=True)
table = gr.Dataframe(headers=["Entity", "Count"])
plot = gr.Plot(label="Bar")
submit.click(run_ner, [note], [highlight, table, plot])
note.submit(run_ner, [note], [highlight, table, plot])
demo.launch()