mrgmd01's picture
Update app.py
047160a verified
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="mrgmd01/SA_Model_bert-base-multilingual-uncased"
)
roman_urdu_model = pipeline(
"sentiment-analysis",
model="mrgmd01/SA_Model_bert-base-multilingual-uncased" # replace with roman urdu model if available
)
# File to store only sentences
SAVE_FILE = "sentences.csv"
# Initialize file if not exists
if not os.path.exists(SAVE_FILE):
df = pd.DataFrame(columns=["Sentence"])
df.to_csv(SAVE_FILE, index=False)
# Detect language: English / Urdu / Roman Urdu
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)\b"
if re.search(roman_urdu_pattern, text.lower()):
return "Roman Urdu"
return "English"
# Normalize labels
def normalize_label(label):
label = label.lower()
if "positive" in label:
return "Positive"
elif "negative" in label:
return "Negative"
else:
return "Neutral"
# Add emojis for polarity
def add_emoji(label):
mapping = {
"Positive": "😊",
"Negative": "😞",
"Neutral": "😐"
}
return f"{label} {mapping.get(label, '')}"
# Prediction + Save sentence
def analyze_single(text, lang_hint):
if not text.strip():
return "Please enter a sentence.", "", "", SAVE_FILE
# Auto detect if user keeps default "English"
lang = detect_language(text) if lang_hint == "English" else lang_hint
if lang == "English":
result = english_model(text)[0]
elif lang == "Urdu":
result = urdu_model(text)[0]
else:
result = roman_urdu_model(text)[0]
sentiment = normalize_label(result["label"])
sentiment_with_emoji = add_emoji(sentiment)
score = round(result["score"], 3)
# Save only the sentence
df = pd.read_csv(SAVE_FILE)
new_row = pd.DataFrame([[text]], columns=["Sentence"])
df = pd.concat([df, new_row], ignore_index=True)
df.to_csv(SAVE_FILE, index=False)
return sentiment, str(score), sentiment_with_emoji, SAVE_FILE
# Gradio UI
with gr.Blocks() as demo:
gr.Markdown(
"## 🌍 Multilingual Sentiment Analysis (Positive • Neutral • Negative)\n"
"**Languages:** English, Urdu, Roman Urdu \n"
"📌 Models: \n"
"- `siebert/sentiment-roberta-large-english (English)` \n"
"- `mrgmd01/SA_Model_bert-base-multilingual-uncased (Urdu & Roman Urdu)`"
)
with gr.Tab("Sentiment Analyzer"):
user_text = gr.Textbox(label="Enter text", placeholder="Type in English, Urdu, or Roman Urdu...")
lang_dropdown = gr.Dropdown(["English", "Urdu", "Roman Urdu"], label="Language Hint", value="English")
btn = gr.Button("🔍 Analyze")
out_sent = gr.Textbox(label="Sentiment")
out_conf = gr.Textbox(label="Confidence (0–1)")
out_pol = gr.Textbox(label="Polarity")
out_file = gr.File(label="⬇️ Download Sentences (.csv)", type="filepath")
btn.click(analyze_single, inputs=[user_text, lang_dropdown],
outputs=[out_sent, out_conf, out_pol, out_file])
if __name__ == "__main__":
demo.launch()