empathy / app.py
Rakibul
better ordering
e138277
import os
from pathlib import Path
import time
import gradio as gr
from gradio.themes import Soft
import numpy as np
import matplotlib.pyplot as plt
from huggingface_hub import hf_hub_download
from src.infer import load_model, predict
os.environ.setdefault("HF_HOME", str(Path.home() / ".cache" / "huggingface"))
_model = None
def _warmup():
global _model
if _model is not None:
return
t0 = time.time()
ckpt_path = hf_hub_download(
repo_id="rhasan/UPLME",
filename="UPLME_NewsEmp_tuned-lambdas.ckpt",
repo_type="model"
)
load_model(ckpt_path)
return f"Model loaded in {time.time() - t0:.1f} seconds."
def ci_plot(mean: float, low: float, upp: float):
fig, ax = plt.subplots(figsize=(6, 1.4))
ax.errorbar(
x=mean, y=0,
xerr=[[mean - low], [upp - mean]],
fmt='o', color='blue',
ecolor='orange',
elinewidth=5,
capsize=8,
capthick=4,
markersize=10
)
ax.set_xlim(0, 100)
ax.set_yticks([])
ax.set_xlabel("Empathy Score (0-100) +/- 95% CI")
fig.tight_layout()
return fig
def predict_with_ci(article: str, essay: str) -> tuple[float, float, float, plt.Figure]:
_warmup()
mean, var = predict(essay, article) # the order is essay-article in UPLME model
# scores were originally in [1, 7]
# lets scale them to [0, 100]
scale = 100 / 6
mean = (mean - 1) * scale
std = np.sqrt(var) * scale
ci_low = max(0.0, mean - 1.96 * std)
ci_upp = min(100.0, mean + 1.96 * std)
fig = ci_plot(mean, ci_low, ci_upp)
return mean, ci_low, ci_upp, fig
with gr.Blocks(title="UPLME", theme=Soft(primary_hue="blue")) as demo:
gr.Markdown("# Empathy Prediction with Uncertainty Estimation")
with gr.Row():
with gr.Column():
article_input = gr.Textbox(label="Stimulus (E.g., News Article)", lines=6)
essay_input = gr.Textbox(label="Response (E.g., Essay) towards the stimulus", lines=6)
button = gr.Button("Predict")
gr.Examples(
examples=[
["A month after Hurricane Matthew, 800,000 Haitians urgently need food.", "My heart just breaks for the people who are suffering."],
["A month after Hurricane Matthew, 800,000 Haitians urgently need food.", "I see, but this doesn't sound too worrisome to me."],
],
inputs=[article_input, essay_input]
)
with gr.Column():
output_mean = gr.Number(label="Predicted Empathy Score (0-100)", precision=2)
ci_low = gr.Number(label="95% CI Lower Bound", precision=2)
ci_upp = gr.Number(label="95% CI Upper Bound", precision=2)
fig = gr.Plot(show_label=False)
button.click(fn=predict_with_ci, inputs=[article_input, essay_input], outputs=[output_mean, ci_low, ci_upp, fig])
gr.Markdown("## About")
gr.Markdown("""
This application predicts empathy score and uncertainty estimates using the UPLME model proposed in **UPLME: Uncertainty-Aware Probabilistic Language Modelling for Robust Empathy Regression** by **Md Rakibul Hasan, Md Zakir Hossain, Aneesh Krishna, Shafin Rahman and Tom Gedeon**.
- Paper: https://arxiv.org/abs/2508.03520
- Code: https://github.com/hasan-rakibul/UPLME
""")
if __name__ == "__main__":
demo.launch(share=True)