import gradio as gr from transformers import AutoTokenizer, AutoModelForSequenceClassification import torch import numpy as np # ✅ Paths to your hosted models on Hugging Face Hub MODEL_PATHS = [ "Basavians/youtube-comment-sentiment-1", "Basavians/youtube-comment-sentiment-2", "Basavians/youtube-comment-sentiment-3" ] # Load models and tokenizers (once at startup) models = [] tokenizers = [] for path in MODEL_PATHS: tokenizer = AutoTokenizer.from_pretrained(path) model = AutoModelForSequenceClassification.from_pretrained(path) model.eval() tokenizers.append(tokenizer) models.append(model) # Class labels (update if different) LABELS = ["negative", "neutral", "positive"] def predict_sentiment(text): if not text.strip(): return "Please enter some text", None probs = [] for model, tokenizer in zip(models, tokenizers): inputs = tokenizer(text, return_tensors="pt", padding=True, truncation=True) with torch.no_grad(): outputs = model(**inputs) logits = outputs.logits prob = torch.nn.functional.softmax(logits, dim=-1) probs.append(prob.numpy()) # 🎯 Ensemble by averaging probabilities avg_prob = np.mean(probs, axis=0) pred_class = int(np.argmax(avg_prob, axis=1)[0]) pred_label = LABELS[pred_class] confidence = float(avg_prob[0][pred_class]) return pred_label, {label: float(avg_prob[0][i]) for i, label in enumerate(LABELS)} # Gradio UI demo = gr.Interface( fn=predict_sentiment, inputs=gr.Textbox(lines=4, placeholder="Paste a YouTube comment here..."), outputs=[ gr.Label(num_top_classes=1, label="Predicted Sentiment"), gr.Label(label="Confidence Scores"), ], title="YouTube Comment Sentiment Classifier (Ensemble)", description="Enter a comment to see sentiment prediction based on an ensemble of 3 models." ) demo.launch()