clinical_ner_leaderboard / eval_metrics_app.py
“WadoodAbdul”
update m2 to clinical type name
300388f
raw
history blame
3.18 kB
import gradio as gr
# Function to compute evaluation metrics (dummy implementation)
def compute_metrics(gt_spans, pred_spans):
# Dummy implementation of a metric computation
# Replace this with actual metric computation logic
tp = len(set(gt_spans) & set(pred_spans))
fp = len(set(pred_spans) - set(gt_spans))
fn = len(set(gt_spans) - set(pred_spans))
precision = tp / (tp + fp) if (tp + fp) > 0 else 0
recall = tp / (tp + fn) if (tp + fn) > 0 else 0
f1_score = 2 * precision * recall / (precision + recall) if (precision + recall) > 0 else 0
return {"precision": precision, "recall": recall, "f1_score": f1_score}
def create_app():
with gr.Blocks() as demo:
# Input components
text_input = gr.Textbox(label="Input Text")
highlight_input = gr.Textbox(label="Highlight Text and Press Add")
gt_spans_state = gr.State([])
pred_spans_state = gr.State([])
# Buttons for ground truth and prediction
add_gt_button = gr.Button("Add to Ground Truth")
add_pred_button = gr.Button("Add to Predictions")
# Outputs for highlighted spans
gt_output = gr.HighlightedText(label="Ground Truth Spans")
pred_output = gr.HighlightedText(label="Predicted Spans")
# Compute metrics button and its output
compute_button = gr.Button("Compute Metrics")
metrics_output = gr.JSON(label="Metrics")
# Function to update spans
def update_spans(text, span, gt_spans, pred_spans, is_gt):
start_idx = text.find(span)
end_idx = start_idx + len(span)
new_span = (start_idx, end_idx)
if is_gt:
gt_spans.append(new_span)
gt_spans = list(set(gt_spans))
else:
pred_spans.append(new_span)
pred_spans = list(set(pred_spans))
return gt_spans, pred_spans, highlight_spans(text, gt_spans), highlight_spans(text, pred_spans)
# Function to highlight spans
def highlight_spans(text, spans):
span_dict = {}
for span in spans:
span_dict[(span[0], span[1])] = "highlight"
return span_dict
# Event handlers for buttons
add_gt_button.click(fn=update_spans, inputs=[text_input, highlight_input, gt_spans_state, pred_spans_state, gr.State(True)], outputs=[gt_spans_state, pred_spans_state, gt_output, pred_output])
add_pred_button.click(fn=update_spans, inputs=[text_input, highlight_input, gt_spans_state, pred_spans_state, gr.State(False)], outputs=[gt_spans_state, pred_spans_state, gt_output, pred_output])
# Function to compute metrics
def on_compute_metrics(gt_spans, pred_spans):
metrics = compute_metrics(gt_spans, pred_spans)
return metrics
compute_button.click(fn=on_compute_metrics, inputs=[gt_spans_state, pred_spans_state], outputs=metrics_output)
# Layout arrangement
text_input.change(fn=lambda x: x, inputs=text_input, outputs=[gt_output, pred_output])
return demo
# Run the app
demo = create_app()
demo.launch()