vdmbrsv's picture
Update app.py
2b2e1ae verified
import gradio as gr
import spaces
import torch
from transformers import AutoTokenizer, AutoModelForSequenceClassification
# Initialize device
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
print(f"Using device: {device}")
# Load model and tokenizer
model_name = "tabularisai/robust-sentiment-analysis"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForSequenceClassification.from_pretrained(model_name).to(device)
# Define sentiment mapping
SENTIMENT_MAP = {
0: "Very Negative",
1: "Negative",
2: "Neutral",
3: "Positive",
4: "Very Positive"
}
@spaces.GPU
def analyze_sentiment(text, show_probabilities=False):
"""
Analyzes the sentiment of the input text.
"""
try:
# Preprocess text - convert to lowercase
text = text.lower()
# Tokenize and prepare input
inputs = tokenizer(text, return_tensors="pt", truncation=True, padding=True, max_length=512).to(device)
with torch.no_grad():
outputs = model(**inputs)
probabilities = torch.nn.functional.softmax(outputs.logits, dim=-1).cpu().numpy()[0]
predicted_class = probabilities.argmax()
predicted_sentiment = SENTIMENT_MAP[predicted_class]
confidence = probabilities[predicted_class]
# Prepare the result with emoji indicators
sentiment_emojis = {
"Very Negative": "😑",
"Negative": "πŸ˜”",
"Neutral": "😐",
"Positive": "😊",
"Very Positive": "🀩"
}
result = f"**{sentiment_emojis[predicted_sentiment]} Overall Sentiment: {predicted_sentiment}**\n"
result += f"Confidence: {confidence:.2%}\n\n"
if show_probabilities:
result += "### Detailed Analysis:\n"
for cls, prob in zip(SENTIMENT_MAP.values(), probabilities):
emoji = sentiment_emojis[cls]
result += f"{emoji} {cls}: {prob:.2%}\n"
return result
except Exception as e:
return f"An error occurred during sentiment analysis: {str(e)}"
# Create Gradio interface using Blocks for better layout control
with gr.Blocks(theme=gr.themes.Soft()) as demo:
gr.Markdown("# 🎭 Sentiment Analysis Wizard")
gr.Markdown(
"""
Discover the emotional tone behind any text with our advanced AI model! This app uses a state-of-the-art language model to analyze the sentiment of your text, classifying it into one of five categories: **Very Negative**, **Negative**, **Neutral**, **Positive**, or **Very Positive**.
"""
)
with gr.Row():
with gr.Column(scale=2):
input_text = gr.Textbox(
lines=10,
placeholder="Enter text for sentiment analysis...",
label="✍️ Input Text"
)
with gr.Row():
show_probs = gr.Checkbox(
label="🎯 Show probabilities for each class",
value=False
)
analyze_button = gr.Button("✨ Analyze Sentiment", variant="primary")
with gr.Column(scale=1):
output = gr.Markdown(label="Result")
with gr.Accordion("πŸ“š Examples", open=False):
examples = [
["I absolutely loved this movie! The acting was superb and the plot was engaging.", True],
["The service at this restaurant was terrible. I'll never go back.", False],
["The product works as expected. Nothing special, but it gets the job done.", True],
["I'm somewhat disappointed with my purchase. It's not as good as I hoped.", False],
["This book changed my life! I couldn't put it down and learned so much.", True]
]
gr.Examples(
examples=examples,
inputs=[input_text, show_probs],
label="Try these examples"
)
analyze_button.click(
fn=analyze_sentiment,
inputs=[input_text, show_probs],
outputs=output
)
gr.Markdown(
"""
---
**Developed by tabularis.ai with ❀️ using Gradio and Transformers by Hugging Face**
"""
)
# Launch the interface
demo.launch()