|
|
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) |
|
|
|
|
|
|
|
|
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) |
|
|
|