import gradio as gr import pandas as pd import matplotlib.pyplot as plt from transformers import pipeline # Load the Hugging Face sentiment analysis model analyzer = pipeline("text-classification", model="distilbert/distilbert-base-uncased-finetuned-sst-2-english") def sentiment_analyzer(review): """Ensures the input is a string before passing it to the model""" if not isinstance(review, str) or pd.isna(review): # Handle NaN values return "UNKNOWN" # Default label for invalid inputs sentiment = analyzer([review]) # Wrap the input in a list return sentiment[0]['label'] def read_reviews_and_analyze_sentiment(file_path): """Reads an uploaded Excel file, validates format, performs sentiment analysis, and returns a DataFrame.""" try: # Verify file extension if not file_path.endswith(".xlsx"): return "Error: Please upload a valid Excel (.xlsx) file." # Read Excel file properly df = pd.read_excel(file_path) # Ensure 'reviews' column exists if 'reviews' not in df.columns: return "Error: The Excel file must contain a 'reviews' column." # Convert all values to strings and handle NaN values df['reviews'] = df['reviews'].astype(str).fillna("") # Apply sentiment analysis df['Sentiment'] = df['reviews'].apply(sentiment_analyzer) return df except Exception as e: return f"Error processing file: {e}" def generate_sentiment_pie_chart(df): """Generates a pie chart showing sentiment distribution with counts.""" # Count occurrences of each sentiment category sentiment_counts = df['Sentiment'].value_counts() # Create pie chart fig, ax = plt.subplots() ax.pie( sentiment_counts, labels=[f"{label} ({count})" for label, count in zip(sentiment_counts.index, sentiment_counts.values)], autopct='%1.1f%%', colors=['green', 'red'] ) ax.set_title("Sentiment Distribution") return fig def process_and_visualize_sentiment(file_path): """Processes the uploaded file and returns both a DataFrame and a sentiment pie chart.""" df = read_reviews_and_analyze_sentiment(file_path) if isinstance(df, pd.DataFrame): # Ensure a valid DataFrame is returned chart = generate_sentiment_pie_chart(df) return df[['reviews', 'Sentiment']], chart else: return df, None # Return error message with no chart # Gradio Setup for Hugging Face Spaces demo = gr.Interface( fn=process_and_visualize_sentiment, inputs=gr.File(label="Upload an Excel file with reviews", type="filepath"), outputs=[gr.Dataframe(label="Sentiments"), gr.Plot(label="Sentiment Distribution")], title="Hugging Face Sentiment Analyzer", description="This application analyzes sentiments based on uploaded Excel reviews and generates a sentiment distribution pie chart." ) # Launch Gradio App if __name__ == "__main__": demo.launch()