File size: 3,916 Bytes
aa2b6f4 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 |
import torch
import gradio as gr
import pandas as pd
import matplotlib.pyplot as plt
from transformers import pipeline
from docx import Document
from PyPDF2 import PdfReader
# Initialize the sentiment analysis pipeline
analyzer = pipeline("text-classification", model="distilbert/distilbert-base-uncased-finetuned-sst-2-english")
# Function to analyze sentiment for a single sentence
def sentiment_analyzer(review):
sentiment = analyzer(review)
return sentiment[0]['label']
# Create a pie chart visualization for the sentiment
def sentiment_pie_chart(sentiment_labels):
sentiment_counts = pd.Series(sentiment_labels).value_counts()
fig, ax = plt.subplots()
sentiment_counts.plot(kind='pie', autopct='%1.1f%%', colors=['green', 'red'], ax=ax)
ax.set_ylabel('')
ax.set_title('Sentiment Distribution')
return fig
# Function to analyze a single input sentence
def analyze_single_sentence(sentence):
sentiment = sentiment_analyzer(sentence)
return f"The sentiment of the sentence is: {sentiment}"
# Function to read and analyze reviews from Excel, PDF, or DOCX files
def read_reviews_and_analyze_sentiment(file_object):
if file_object.name.endswith('.xlsx'):
# Load the Excel file into a DataFrame
df = pd.read_excel(file_object)
if 'Reviews' not in df.columns:
raise ValueError("Excel file must contain a 'Reviews' column.")
reviews = df['Reviews'].tolist()
elif file_object.name.endswith('.docx'):
# Read the content of the DOCX file
doc = Document(file_object)
reviews = [para.text for para in doc.paragraphs if para.text.strip()]
elif file_object.name.endswith('.pdf'):
# Read the content of the PDF file
reader = PdfReader(file_object)
text = ""
for page in reader.pages:
text += page.extract_text()
reviews = text.split('\n') # Assuming reviews are newline-separated
else:
raise ValueError("Unsupported file format. Please upload .xlsx, .pdf, or .docx files.")
# Analyze the sentiment of each review
sentiments = [sentiment_analyzer(review) for review in reviews]
df = pd.DataFrame({'Reviews': reviews, 'Sentiment': sentiments})
# Generate pie chart
chart_object = sentiment_pie_chart(sentiments)
return df, chart_object
# Gradio interface combining single sentence analysis and file-based review sentiment analysis
def main_interface(input_option, sentence=None, file=None):
if input_option == "Single Sentence":
if sentence:
result = analyze_single_sentence(sentence)
return None, None, result # Single sentence output
else:
return None, None, "Please enter a sentence."
elif input_option == "File Upload":
if file:
df, chart_object = read_reviews_and_analyze_sentiment(file)
return df, chart_object, None # File output
else:
return None, None, "Please upload a file."
# Gradio interface
demo = gr.Interface(
fn=main_interface,
inputs=[
gr.Radio(label="Choose Input Type", choices=["Single Sentence", "File Upload"], value="Single Sentence"),
gr.Textbox(label="Enter a sentence for sentiment analysis (if selected)", placeholder="Type your sentence here..."),
gr.File(file_types=["xlsx", "pdf", "docx"], label="Upload your review comment file (if selected)")
],
outputs=[
gr.Dataframe(label="Sentiment Analysis Results (For File Uploads)"),
gr.Plot(label="Sentiment Distribution Chart (For File Uploads)"),
gr.Textbox(label="Single Sentence Sentiment Result (For Single Sentence Input)")
],
title="Sentiment Analyzer",
description="This application analyzes the sentiment of either a single sentence or reviews in uploaded files (Excel, PDF, DOCX)."
)
demo.launch()
|