note-ner-demo / app.py
andrewgleave's picture
Cleanup and re-add rating
bc05f33
raw
history blame
2.21 kB
import json
from collections import defaultdict, Counter
import matplotlib.pyplot as plt
import gradio as gr
import pandas as pd
from transformers import pipeline, AutoTokenizer, AutoModelForTokenClassification
MODELS = ["d4data/biomedical-ner-all", "samrawal/bert-base-uncased_clinical-ner"]
current_model = MODELS[1]
tokenizer = AutoTokenizer.from_pretrained(current_model)
model = AutoModelForTokenClassification.from_pretrained(current_model)
plt.switch_backend("Agg")
examples = {}
with open("examples.json", "r") as f:
content = json.load(f)
examples = {x["text"]: x["label"] for x in content}
pipe = pipeline("ner", model=model, tokenizer=tokenizer, 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
],
}
label = examples.get(text, None)
grouped = Counter((x["entity_group"] for x in raw))
rows = [[k, v] for k, v in grouped.items()]
figure = plot_to_figure(grouped)
return label, 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=list(examples.keys()))
example_dropdown.change(
lambda x: gr.Textbox.update(value=x), inputs=example_dropdown, outputs=note
)
rating = gr.Label(label="Given rating")
highlight = gr.HighlightedText(label="NER", combine_adjacent=True)
table = gr.Dataframe(headers=["Entity", "Count"])
plot = gr.Plot(label="Bar")
submit.click(run_ner, [note], [rating, highlight, table, plot])
note.submit(run_ner, [note], [rating, highlight, table, plot])
demo.launch()