urdusentiment / app.py
Ahsamkk's picture
Update app.py
2bb0264 verified
import gradio as gr
import torch
import torch.nn.functional as F
from transformers import AutoTokenizer, AutoModelForSequenceClassification
from transformers_interpret import SequenceClassificationExplainer
# ✅ Load model from Hugging Face
MODEL_NAME = "Ahsamkk/urdu-sentiment-model" # ← replace with your actual repo name
tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)
model = AutoModelForSequenceClassification.from_pretrained(MODEL_NAME)
model.eval()
# Ensure label mapping
model.config.id2label = {0: 'Negative', 1: 'Positive'}
model.config.label2id = {'Negative': 0, 'Positive': 1}
def analyze_sentiment(text):
# Predict sentiment
inputs = tokenizer(text, return_tensors="pt", truncation=True, padding=True)
with torch.no_grad():
outputs = model(**inputs)
probs = F.softmax(outputs.logits, dim=1)[0]
confidence = float(torch.max(probs))
pred = torch.argmax(probs).item()
sentiment = model.config.id2label[pred]
# Explainability
explainer = SequenceClassificationExplainer(model, tokenizer)
word_attributions = explainer(text)
top_influences = sorted(
[{"word": w, "score": float(s)} for w, s in word_attributions],
key=lambda x: abs(x["score"]),
reverse=True
)[:3]
# Create readable output
influences_text = "\n".join(
[f"{i+1}. {inf['word']} ({inf['score']:.3f})" for i, inf in enumerate(top_influences)]
)
result_text = f"**Sentiment:** {sentiment}\n**Confidence:** {confidence:.3f}\n\n**Top Influences:**\n{influences_text}"
return result_text
# ✅ Create Gradio interface
demo = gr.Interface(
fn=analyze_sentiment,
inputs=gr.Textbox(label="اپنا جملہ درج کریں (Enter Urdu sentence)"),
outputs="text",
title="Urdu Sentiment Analysis with Explainable AI",
description="This model predicts sentiment and shows the top words influencing the prediction."
)
demo.launch()