import gradio as gr from transformers import pipeline import time print("Loading sentiment model...") classifier = pipeline("sentiment-analysis", model="distilbert-base-uncased-finetuned-sst-2-english") print("Model ready!") def analyze_single(text): if not text or not text.strip(): return "โš ๏ธ Please enter some text.", "", "" text = text.strip() if len(text) > 512: return "โš ๏ธ Text too long. Max 512 characters.", "", "" start = time.time() result = classifier(text)[0] elapsed = round((time.time() - start) * 1000, 1) label = result["label"] score = round(result["score"] * 100, 2) emoji = "๐Ÿ˜Š" if label == "POSITIVE" else "๐Ÿ˜”" sentiment_out = f"{emoji} {label}" confidence_out = f"{score}%" time_out = f"{elapsed} ms" return sentiment_out, confidence_out, time_out def analyze_batch(texts_input): if not texts_input or not texts_input.strip(): return "โš ๏ธ Please enter at least one sentence." lines = [line.strip() for line in texts_input.strip().split("\n") if line.strip()] if len(lines) > 20: return "โš ๏ธ Max 20 sentences. Please reduce input." results = classifier(lines) output_lines = [] for text, result in zip(lines, results): label = result["label"] score = round(result["score"] * 100, 1) emoji = "๐Ÿ˜Š" if label == "POSITIVE" else "๐Ÿ˜”" short_text = text[:60] + "..." if len(text) > 60 else text output_lines.append(f"{emoji} [{label} โ€” {score}%] {short_text}") summary_pos = sum(1 for r in results if r["label"] == "POSITIVE") summary_neg = len(results) - summary_pos output_lines.append("") output_lines.append(f" Summary: {summary_pos} Positive | {summary_neg} Negative | {len(results)} Total") return "\n".join(output_lines) with gr.Blocks( theme=gr.themes.Soft(primary_hue="blue", secondary_hue="indigo"), title="Sentiment Analyzer" ) as demo: gr.Markdown(""" # Sentiment Analyzer Detects **Positive** or **Negative** sentiment using DistilBERT. Built with HuggingFace Transformers ยท Model accuracy ~91% on SST-2 benchmark. """) with gr.Tabs(): with gr.TabItem("Single Analysis"): with gr.Row(): with gr.Column(scale=2): text_input = gr.Textbox( lines=4, placeholder="Type any sentence here...\ne.g. I love building AI projects!", label="Input Text", max_lines=6 ) analyze_btn = gr.Button("Analyze Sentiment ", variant="primary", size="lg") with gr.Column(scale=1): sentiment_out = gr.Textbox(label="Sentiment", interactive=False) confidence_out = gr.Textbox(label="Confidence Score", interactive=False) time_out = gr.Textbox(label="Response Time", interactive=False) gr.Examples( examples=[ ["I absolutely love building AI projects, it's so rewarding!"], ["This is the worst experience I have ever had."], ["The weather today is absolutely beautiful and I feel great."], ["I am so frustrated and disappointed with this outcome."], ["HuggingFace makes natural language processing incredibly easy!"], ], inputs=text_input, label="Try these examples" ) analyze_btn.click( fn=analyze_single, inputs=text_input, outputs=[sentiment_out, confidence_out, time_out] ) with gr.TabItem("Batch Analysis"): gr.Markdown("Enter **one sentence per line** (max 20 sentences)") with gr.Row(): with gr.Column(): batch_input = gr.Textbox( lines=8, placeholder="I love this product!\nThis was a terrible experience.\nGreat service, highly recommend.\nI will never buy this again.", label="Input Sentences (one per line)" ) batch_btn = gr.Button("Analyze All ๐Ÿ”", variant="primary", size="lg") with gr.Column(): batch_output = gr.Textbox( lines=12, label="Results", interactive=False ) batch_btn.click( fn=analyze_batch, inputs=batch_input, outputs=batch_output ) gr.Markdown(""" --- **Model:** distilbert-base-uncased-finetuned-sst-2-english ยท **Task:** Binary Sentiment Classification **Developer:** Sawda ยท BS Computer Engineering Technology ยท IIU Islamabad """) demo.launch()