|
import gradio as gr |
|
from transformers import pipeline |
|
import os |
|
|
|
|
|
MODEL_ID = "Light-Dav/sentiment-analysis-full-project" |
|
|
|
try: |
|
sentiment_analyzer = pipeline("sentiment-analysis", model=MODEL_ID, top_k=None) |
|
model_loaded_successfully = True |
|
except Exception as e: |
|
print(f"Error loading model: {e}") |
|
sentiment_analyzer = None |
|
model_loaded_successfully = False |
|
|
|
|
|
custom_css = """ |
|
body { |
|
background-color: #121212; /* Dark background */ |
|
color: #f8f8f2; /* Light text */ |
|
} |
|
.gradio-container { |
|
box-shadow: 0 4px 8px rgba(255, 255, 255, 0.1); |
|
border-radius: 10px; |
|
overflow: hidden; |
|
background-color: #1e1e1e; /* Darker card background */ |
|
padding: 20px; |
|
margin-bottom: 20px; |
|
} |
|
h1, h2, h3 { |
|
color: #80cbc4; /* Teal/Cyan accents */ |
|
text-align: center; |
|
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; |
|
animation: fadeIn 1s ease-in-out; |
|
} |
|
.gr-button.primary { |
|
background-color: #80cbc4 !important; |
|
color: #1e1e1e !important; |
|
border-radius: 6px; |
|
transition: background-color 0.3s ease; |
|
padding: 10px 20px; |
|
} |
|
.gr-button.primary:hover { |
|
background-color: #26a69a !important; |
|
} |
|
.gradio-output { |
|
border: 1px solid #424242; |
|
border-radius: 8px; |
|
padding: 15px; |
|
margin-top: 15px; |
|
background-color: #212121; |
|
color: #f8f8f2; |
|
} |
|
.sentiment-display { |
|
text-align: center; |
|
padding: 10px; |
|
border-radius: 6px; |
|
margin-top: 10px; |
|
font-size: 1.1em; |
|
font-weight: bold; |
|
} |
|
.sentiment-positive { |
|
background-color: #388e3c; /* Darker green */ |
|
color: #e8f5e9; /* Light green */ |
|
} |
|
.sentiment-negative { |
|
background-color: #d32f2f; /* Darker red */ |
|
color: #ffebee; /* Light red */ |
|
} |
|
.sentiment-neutral { |
|
background-color: #1976d2; /* Darker blue */ |
|
color: #e3f2fd; /* Light blue */ |
|
} |
|
@keyframes fadeIn { |
|
from { opacity: 0; } |
|
to { opacity: 1; } |
|
} |
|
gr-textbox > label { |
|
color: #80cbc4; |
|
} |
|
""" |
|
|
|
|
|
def interpret_sentiment(label, score): |
|
emoji = "" |
|
description = "" |
|
color_class = "" |
|
|
|
if label.lower() == "positive" or label.lower() == "label_2": |
|
emoji = "π" |
|
description = "This text expresses a **highly positive** sentiment." if score > 0.9 else "This text expresses a **positive** sentiment." |
|
color_class = "sentiment-positive" |
|
elif label.lower() == "negative" or label.lower() == "label_0": |
|
emoji = "π " |
|
description = "This text expresses a **highly negative** sentiment." if score > 0.9 else "This text expresses a **negative** sentiment." |
|
color_class = "sentiment-negative" |
|
elif label.lower() == "neutral" or label.lower() == "label_1": |
|
emoji = "π" |
|
description = "This text expresses a **neutral** sentiment." |
|
color_class = "sentiment-neutral" |
|
else: |
|
emoji = "β" |
|
description = "Could not confidently determine sentiment. Unexpected label." |
|
color_class = "" |
|
|
|
return f"<div class='sentiment-display {color_class}'>{emoji} {label.upper()} ({score:.2f})</div>" + \ |
|
f"<p>{description}</p>" |
|
|
|
|
|
def analyze_sentiment(text): |
|
if not model_loaded_successfully: |
|
return { |
|
"Overall Sentiment": "<div class='sentiment-display'>β οΈ Model Not Loaded β οΈ</div><p>Please contact the administrator. The sentiment analysis model failed to load.</p>", |
|
"Confidence Scores": {}, |
|
"Raw Output": "Model loading failed." |
|
} |
|
|
|
if not text.strip(): |
|
return { |
|
"Overall Sentiment": "<div class='sentiment-display'>βοΈ Please enter some text! βοΈ</div><p>Start typing to analyze its sentiment.</p>", |
|
"Confidence Scores": {}, |
|
"Raw Output": "" |
|
} |
|
|
|
try: |
|
results = sentiment_analyzer(text)[0] |
|
|
|
results_sorted = sorted(results, key=lambda x: x['score'], reverse=True) |
|
|
|
top_sentiment = results_sorted(0) |
|
label = top_sentiment['label'] |
|
score = top_sentiment['score'] |
|
|
|
confidence_scores_output = {item['label']: item['score'] for item in results} |
|
|
|
overall_sentiment_display = interpret_sentiment(label, score) |
|
|
|
return { |
|
"Overall Sentiment": overall_sentiment_display, |
|
"Confidence Scores": confidence_scores_output, |
|
"Raw Output": str(results) |
|
} |
|
except Exception as e: |
|
return { |
|
"Overall Sentiment": f"<div class='sentiment-display'>β Error β</div><p>An error occurred during analysis: {e}</p>", |
|
"Confidence Scores": {}, |
|
"Raw Output": f"Error: {e}" |
|
} |
|
|
|
|
|
with gr.Blocks(css=custom_css, theme=gr.themes.BaseDark()) as demo: |
|
gr.Markdown("<h1 style='color: #80cbc4; text-align: center;'>π Sentiment Analyzer π</h1>") |
|
gr.Markdown("<p style='color: #f8f8f2; text-align: center;'>Uncover the emotional tone of your English text instantly.</p>") |
|
|
|
with gr.Column(elem_classes="gradio-container"): |
|
text_input = gr.Textbox( |
|
lines=7, |
|
placeholder="Type your English text here...", |
|
label="Your Text", |
|
interactive=True, |
|
value="This movie was absolutely brilliant! A masterpiece of storytelling and emotion." |
|
) |
|
analyze_btn = gr.Button("Analyze Sentiment", variant="primary") |
|
|
|
gr.Markdown("<hr style='border-top: 1px solid #424242;'>") |
|
gr.Markdown("<h3 style='color: #80cbc4; text-align: center;'>Try some examples:</h3>") |
|
examples = gr.Examples( |
|
examples=[ |
|
["This product exceeded my expectations, truly amazing!"], |
|
["I found the customer service to be quite disappointing and slow."], |
|
["The weather forecast predicts light rain for tomorrow morning."], |
|
["What a fantastic experience! Highly recommend it."], |
|
["I'm so frustrated with this slow internet connection."], |
|
["The meeting concluded without any major decisions."] |
|
], |
|
inputs=text_input, |
|
fn=analyze_sentiment, |
|
outputs=[gr.HTML(label="Overall Sentiment"), gr.Label(num_top_classes=3, label="Confidence Scores"), gr.JSON(label="Raw Model Output", visible=False)], |
|
cache_examples=True |
|
) |
|
|
|
gr.Markdown("<hr style='border-top: 1px solid #424242;'>") |
|
gr.Markdown("<h2 style='color: #80cbc4;'>π Analysis Results</h2>") |
|
overall_sentiment_output = gr.HTML(label="Overall Sentiment") |
|
confidence_scores_output = gr.Label(num_top_classes=3, label="Confidence Scores") |
|
raw_output = gr.JSON(label="Raw Model Output", visible=False) |
|
|
|
analyze_btn.click( |
|
fn=analyze_sentiment, |
|
inputs=text_input, |
|
outputs=[overall_sentiment_output, confidence_scores_output, raw_output] |
|
) |
|
text_input.change( |
|
fn=analyze_sentiment, |
|
inputs=text_input, |
|
outputs=[overall_sentiment_output, confidence_scores_output, raw_output], |
|
|
|
) |
|
|
|
demo.launch() |