Spaces:
Sleeping
Sleeping
| import torch | |
| import gradio as gr | |
| import pandas as pd | |
| import matplotlib.pyplot as plt | |
| import seaborn as sns | |
| # Use a pipeline as a high-level helper | |
| from transformers import pipeline | |
| # model_path = ("../Models/models--distilbert--distilbert-base-uncased-finetuned-sst-2-english/snapshots/714eb0fa89d2f80546fda750413ed43d93601a13") | |
| # analyzer = pipeline("text-classification", model=model_path) | |
| analyzer = pipeline("text-classification", model="distilbert/distilbert-base-uncased-finetuned-sst-2-english") | |
| # print(analyzer(["This is good", "This product is quite expensive"])) | |
| def sentiment_analyzer(review): | |
| sentiment = analyzer(review) | |
| return sentiment[0]['label'], sentiment[0]['score'] # Return sentiment label and confidence score | |
| def create_sentiment_pie_chart(df): | |
| sentiment_counts = df['Sentiment'].value_counts() | |
| # Style the pie chart | |
| colors = ['#e67e22', '#3498db'] # Green for Positive, Red for Negative | |
| explode = [0.05, 0] # Slightly separate the positive slice for emphasis | |
| fig, ax = plt.subplots(figsize=(6, 6)) | |
| sentiment_counts.plot( | |
| kind='pie', | |
| colors=colors, | |
| autopct='%1.1f%%', | |
| startangle=140, | |
| explode=explode, | |
| ax=ax, | |
| textprops={'fontsize': 10, 'color': 'black'}, | |
| radius=0.7 # Decrease radius to make the pie smaller | |
| ) | |
| ax.set_title("Sentiment Distribution (Pie Chart)", fontsize=10, fontweight='bold', color='#34495e') | |
| ax.set_ylabel("") # Remove default 'Count' label | |
| plt.tight_layout() | |
| return fig | |
| # Create a styled bar chart | |
| def create_sentiment_bar_chart(df): | |
| sentiment_counts = df['Sentiment'].value_counts() | |
| # Use Seaborn for stylish bar plots | |
| fig, ax = plt.subplots(figsize=(8, 5)) | |
| # Use a categorical variable for hue to avoid the warning | |
| sns.barplot( | |
| x=sentiment_counts.index, | |
| y=sentiment_counts.values, | |
| # for hue warning which doesn't effect code | |
| hue=sentiment_counts.index, # Use 'Sentiment' as the hue variable | |
| palette=['#e67e22', '#3498db'], # Green for Positive, Red for Negative | |
| ax=ax, | |
| legend=False, # We don't need a legend for this plot | |
| width = 0.5 | |
| ) | |
| # Add value annotations on top of each bar | |
| for idx, value in enumerate(sentiment_counts.values): | |
| ax.text(idx, value + 0.5, str(value), ha='center', fontsize=10, color='black', fontweight='bold') | |
| ax.set_title("Sentiment Distribution (Bar Chart)", fontsize=12, fontweight='bold', color='#34495e') | |
| ax.set_xlabel("Sentiment", fontsize=10, fontweight='bold', color='#34495e') | |
| ax.set_ylabel("Count", fontsize=10, fontweight='bold', color='#34495e') | |
| ax.spines['top'].set_visible(False) # Clean up borders | |
| ax.spines['right'].set_visible(False) | |
| plt.xticks(fontsize=10, fontweight='bold', color='#34495e') | |
| plt.yticks(fontsize=10, color='#34495e') | |
| plt.tight_layout() | |
| return fig | |
| # Define the main function to process the Excel file | |
| def read_reviews_and_analyze_sentiment(file_object): | |
| # Read the Excel file into a DataFrame | |
| df = pd.read_excel(file_object) | |
| # Ensure the column containing reviews exists | |
| if 'Reviews' not in df.columns: | |
| raise ValueError("The Excel file must contain a column named 'Reviews'.") | |
| # Apply the sentiment analyzer and split into two columns | |
| df[['Sentiment', 'Confidence']] = df['Reviews'].apply( | |
| lambda x: pd.Series(sentiment_analyzer(x)) | |
| ) | |
| # Generate the pie and bar charts | |
| pie_chart = create_sentiment_pie_chart(df) | |
| bar_chart = create_sentiment_bar_chart(df) | |
| return df, pie_chart, bar_chart | |
| # Example usage: | |
| # df = process_reviews("reviews.xlsx") | |
| # print(df) | |
| # result = read_reviews_and_analyze_sentiment("../Files/Updated_Reviews_Sample.xlsx") | |
| # print(result) | |
| import gradio as gr | |
| # Custom CSS for styling the title | |
| custom_css = """ | |
| .title { font-size: 24px; font-weight: bold; color: #34495e; } | |
| .gradio-label, .gradio-description { | |
| font-size: 18px; /* Increase font size */ | |
| font-weight: bold; /* Make text bold */ | |
| } | |
| """ | |
| # Interface | |
| interface = gr.Interface( | |
| fn=read_reviews_and_analyze_sentiment, | |
| inputs=gr.File(file_types=[".xlsx"], label="Upload Excel File"), # Accept only Excel files | |
| outputs=[ | |
| gr.Dataframe( | |
| headers=["Reviews", "Sentiment", "Confidence"], # Custom headers for output | |
| label="Sentiment Analysis Results" | |
| ), | |
| gr.Plot(label="Sentiment Distribution (Pie Chart)"), | |
| gr.Plot(label="Sentiment Distribution (Bar Chart)") | |
| ], | |
| title="Sentiment Analyzer with Confidence Scores", | |
| description=( | |
| "Upload an Excel file with a 'Reviews' column to analyze sentiments and " | |
| "visualize the distribution in both pie and bar charts." | |
| ), | |
| theme="default", # Align components vertically | |
| css=custom_css # Apply the custom CSS | |
| ) | |
| interface.launch() | |