tahamueed23's picture
Update app.py
6743c3d verified
raw
history blame
4.77 kB
import gradio as gr
from transformers import pipeline
import pandas as pd
import os
import re
# -----------------------------
# Load Models
# -----------------------------
english_model = pipeline(
"sentiment-analysis",
model="siebert/sentiment-roberta-large-english"
)
urdu_model = pipeline(
"sentiment-analysis",
model="tahamueed23/fine_tuned_cardiffnlp_urdu_and_roman-urdu"
)
roman_urdu_model = pipeline(
"sentiment-analysis",
model="tahamueed23/fine_tuned_cardiffnlp_urdu_and_roman-urdu"
)
# -----------------------------
# CSV Setup
# -----------------------------
SAVE_FILE = "sentiment_logs.csv"
if not os.path.exists(SAVE_FILE):
pd.DataFrame(columns=["Sentence", "Language", "Sentiment", "Confidence"]).to_csv(
SAVE_FILE, index=False, encoding="utf-8-sig"
)
# -----------------------------
# Language Detection (simple rule-based)
# -----------------------------
def detect_language(text):
urdu_chars = set("ابتثجحخدذرزسشصضطظعغفقکلمنوہیءآؤئۀ")
if any(ch in urdu_chars for ch in text):
return "Urdu"
roman_urdu_pattern = r"\b(hai|kia|kyun|nahi|bohot|acha|galat|sahi|parhai|ustad|pyar|dil|insaan)\b"
if re.search(roman_urdu_pattern, text.lower()):
return "Roman Urdu"
return "English"
# -----------------------------
# Normalize Sentiment Labels
# -----------------------------
def normalize_label(label):
label = label.lower()
if "pos" in label or "positive" in label:
return "Positive"
elif "neg" in label or "negative" in label:
return "Negative"
else:
return "Neutral"
# -----------------------------
# Add Emojis + Tips
# -----------------------------
def sentiment_with_tips(sentiment):
tips = {
"Positive": "😊 Great! Keep spreading positivity.",
"Negative": "😞 It seems negative. Try to focus on solutions.",
"Neutral": "😐 Neutral statement. Could go either way."
}
return tips.get(sentiment, "")
# -----------------------------
# Main Sentiment Function
# -----------------------------
def analyze_sentiment(text, lang_hint):
try:
if not text.strip():
return "⚠️ Please enter a sentence.", "", "", SAVE_FILE
# Auto detect if language hint is not selected
lang = lang_hint if lang_hint != "Auto Detect" else detect_language(text)
# Select model
if lang == "English":
result = english_model(text)[0]
elif lang == "Urdu":
result = urdu_model(text)[0]
else:
result = roman_urdu_model(text)[0]
# Process results
sentiment = normalize_label(result["label"])
score = round(float(result["score"]), 3)
explanation = sentiment_with_tips(sentiment)
# Save to CSV (UTF-8 safe)
try:
df = pd.read_csv(SAVE_FILE, encoding="utf-8-sig")
except:
df = pd.DataFrame(columns=["Sentence", "Language", "Sentiment", "Confidence"])
new_row = pd.DataFrame([[text, lang, sentiment, score]],
columns=["Sentence", "Language", "Sentiment", "Confidence"])
df = pd.concat([df, new_row], ignore_index=True)
df.to_csv(SAVE_FILE, index=False, encoding="utf-8-sig")
return sentiment, str(score), explanation, SAVE_FILE
except Exception as e:
return f"⚠️ Error: {str(e)}", "", "", SAVE_FILE
# -----------------------------
# Gradio UI
# -----------------------------
with gr.Blocks() as demo:
gr.Markdown(
"## 🌍 Multilingual Sentiment Analysis (English • Urdu • Roman Urdu)\n"
"Detect sentiment as **Positive, Neutral, or Negative** with confidence score.\n\n"
"📌 Features:\n"
"- Choose language (or Auto Detect)\n"
"- Download all results as CSV\n"
"- Emojis + Tips for better understanding 🎯"
)
with gr.Row():
with gr.Column():
user_text = gr.Textbox(label="✍️ Enter text", placeholder="Type in English, Urdu, or Roman Urdu...")
lang_dropdown = gr.Dropdown(["Auto Detect", "English", "Urdu", "Roman Urdu"],
label="🌐 Language", value="Auto Detect")
btn = gr.Button("🔍 Analyze")
with gr.Column():
out_sent = gr.Textbox(label="Sentiment")
out_conf = gr.Textbox(label="Confidence (0–1)")
out_exp = gr.Textbox(label="Explanation")
out_file = gr.File(label="⬇️ Download Logs (.csv)", type="filepath")
btn.click(analyze_sentiment, inputs=[user_text, lang_dropdown],
outputs=[out_sent, out_conf, out_exp, out_file])
if __name__ == "__main__":
demo.launch()