CaseStudy1 / app.py
jvroo
Update app.py
764db7d unverified
raw
history blame
5.17 kB
import gradio as gr
from transformers import pipeline
import matplotlib.pyplot as plt
import numpy as np
from huggingface_hub import InferenceClient
# Define models for local and remote inference
local_model = "distilbert-base-uncased-finetuned-sst-2-english"
remote_model = "distilbert-base-uncased-finetuned-sst-2-english" # You can use the same model for both for now
# Load the local sentiment analysis pipeline with the specified model
local_pipeline = pipeline("sentiment-analysis", model=local_model)
# Initialize the inference pipeline for remote model (same model for simplicity here)
remote_pipeline = InferenceClient("sentiment-analysis", model=remote_model)
# Function to perform sentiment analysis using the local pipeline
def local_sentiment_analysis(review):
try:
result = local_pipeline(review)
sentiment = result[0]['label']
score = result[0]['score']
return sentiment, score
except Exception as e:
return f"Error: {str(e)}", 0.0
# Function to perform sentiment analysis using the remote pipeline
def remote_sentiment_analysis(review):
try:
result = remote_pipeline(review)
sentiment = result[0]['label']
score = result[0]['score']
return sentiment, score
except Exception as e:
return f"Error: {str(e)}", 0.0
# Function to analyze sentiment and return the result as a string and plot
def analyze_sentiment(review, mode):
if not review.strip():
return "Error: Review text cannot be empty.", None
if mode == "Local Pipeline":
sentiment, score = local_sentiment_analysis(review)
model_info = f"Using local model: {local_model}"
elif mode == "Inference API":
sentiment, score = remote_sentiment_analysis(review)
model_info = f"Using remote model: {remote_model}"
else:
return "Invalid mode selected.", None
# Format the sentiment result
result_text = f"Sentiment: {sentiment}, Confidence: {score:.2f}\n{model_info}"
# Enhanced plot
fig, ax = plt.subplots(figsize=(8, 5))
categories = ['POSITIVE', 'NEGATIVE']
sentiment_scores = [score if sentiment == 'POSITIVE' else (1 - score), score if sentiment == 'NEGATIVE' else (1 - score)]
colors = ['#4CAF50' if sentiment == 'POSITIVE' else '#F44336', '#F44336']
bars = ax.bar(categories, sentiment_scores, color=colors)
ax.set_ylim(0, 1)
ax.set_ylabel('Confidence Score')
ax.set_title('Sentiment Analysis Result')
# Add text labels above bars
for bar in bars:
height = bar.get_height()
ax.annotate(f'{height:.2f}',
xy=(bar.get_x() + bar.get_width() / 2, height),
xytext=(0, 3), # 3 points vertical offset
textcoords="offset points",
ha='center', va='bottom')
return result_text, fig # Return the Matplotlib figure directly
# Custom CSS for styling
custom_css = """
body {
background-color: #2c2f33;
color: #f0f0f0;
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
}
.gr-textbox, .gr-radio {
margin-bottom: 20px;
border: 1px solid #444;
padding: 10px;
border-radius: 8px;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
background-color: #3a3d41;
}
.gr-button {
background-color: #7289da;
color: white;
border: none;
padding: 10px 20px;
font-size: 16px;
cursor: pointer;
transition: 0.3s;
border-radius: 8px;
margin-top: 10px;
}
.gr-button:hover {
background-color: #5b6eae;
}
#component-2 {
font-size: 18px;
margin-bottom: 20px;
}
#component-3 {
font-size: 18px;
margin-bottom: 20px;
}
#component-4 {
font-size: 16px;
padding: 15px;
background-color: #3a3d41;
border: 1px solid #444;
border-radius: 8px;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
}
h1 {
text-align: center;
font-size: 32px;
margin-bottom: 40px;
color: #7289da;
}
"""
# Gradio interface
with gr.Blocks(css=custom_css) as demo:
gr.Markdown("<h1>Movie Review Sentiment Analysis</h1>")
with gr.Column():
with gr.Row():
review_input = gr.Textbox(
label="Enter Movie Review", placeholder="Type your movie review here...", lines=4
)
with gr.Row():
mode_input = gr.Radio(
["Local Pipeline", "Inference API"], label="Select Processing Mode", value="Inference API"
)
with gr.Row():
analyze_button = gr.Button("Analyze Sentiment")
# Output box to display the sentiment analysis result
sentiment_output = gr.Textbox(label="Sentiment Analysis Result", interactive=False)
# Plot output to display the sentiment score graph
plot_output = gr.Plot(label="Sentiment Score Graph")
analyze_button.click(analyze_sentiment, [review_input, mode_input], [sentiment_output, plot_output])
# Run the Gradio app
if __name__ == "__main__":
demo.launch('share=True')