"""Gradio demo: bag-of-words sentiment via ONNX Runtime.""" import json from pathlib import Path import gradio as gr import numpy as np import onnxruntime as ort from preprocess import text_to_bow VOCAB_PATH = Path(__file__).resolve().parent / "vocab.json" vocab_data = json.loads(VOCAB_PATH.read_text()) VOCAB: list[str] = vocab_data["vocab"] LABELS: list[str] = vocab_data["labels"] session = ort.InferenceSession("sentiment.onnx") def predict(text: str) -> dict[str, float]: if not text.strip(): return {label: 0.0 for label in LABELS} bow = text_to_bow(text, VOCAB)[np.newaxis, :] logits = session.run(None, {"bow": bow})[0][0] exp_logits = np.exp(logits - logits.max()) probs = exp_logits / exp_logits.sum() return {label: float(prob) for label, prob in zip(LABELS, probs)} demo = gr.Interface( fn=predict, inputs=gr.Textbox(label="Text", placeholder="I love this product"), outputs=gr.Label(num_top_classes=2, label="Sentiment"), title="ONNX Sentiment Demo", description=( "Tiny bag-of-words classifier trained from scratch in PyTorch " "(no pretrained model). Exported to ONNX for inference." ), examples=[ ["I love this"], ["This is awful"], ["Amazing product"], ["So disappointed"], ], ) demo.launch()