Spaces:
Sleeping
Sleeping
File size: 5,058 Bytes
53f086e ff8fc75 53f086e 894a1e6 53f086e 726740f f3417c6 53f086e 472bce3 4091915 53f086e 472bce3 53f086e 10d74d4 53f086e 23a34ee 53f086e 10d74d4 53f086e e44ad9a 53f086e 10d74d4 53f086e ab66cba 2dac422 726740f 2dac422 5a2d650 2dac422 726740f 2dac422 5a2d650 2dac422 53f086e 726740f 53f086e c6c162c 5a2d650 c6c162c 472bce3 5a2d650 c6c162c 96e968b a266dc3 96e968b 53f086e 8486637 7d0c2f3 8486637 a266dc3 c6c162c 8486637 96e968b dd250db 96e968b 3b4dcf9 a266dc3 ff8fc75 a266dc3 3b4dcf9 a88bf76 3b4dcf9 ab66cba 160dd06 |
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 101 102 103 104 105 106 107 108 109 110 111 |
import streamlit as st
import pandas as pd
import plotly.express as px
import matplotlib.pyplot as plt
import plotly.graph_objs as go
from wordcloud import WordCloud
from transformers import pipeline
# Load the pre-trained sentiment analysis model
sentiment_model = pipeline("sentiment-analysis", model="siebert/sentiment-roberta-large-english")
# Define the Streamlit app's user interface
# Set page title and favicon
st.set_page_config(page_title="Review Analysis", page_icon=":smiley:")
# Add image and heading
st.image("Header.png", use_column_width=True)
file = st.file_uploader(" ",label_visibility='collapsed',type=["csv"])
# Define the app's functionality
if file is not None:
# Read the CSV file into a Pandas DataFrame
df = pd.read_csv(file)
st.markdown(f"<h5 style='font-family: sans-serif;margin-top:40px'>Total reviews: {len(df)-1} </h5>", unsafe_allow_html=True)
# Write the total number of records
st.markdown(
f'<div style="background-color: #4AA6DD; color: #ffffff; padding: 6px; font-size: 16px; font-family: sans-serif; font-weight: bold; text-align: center; border-radius: 1rem;margin-top: 10px"> Distribution of Reviews </div>',
unsafe_allow_html=True
)
# Apply the sentiment analysis model to each review and store the results in a new column
df["Sentiment"] = df["Review"].apply(lambda x: sentiment_model(x)[0]["label"])
# Generate pie chart
# Define custom colors
colors = ['#30C3C4', '#D1DDDE']
# Generate pie chart
sentiment_counts = df["Sentiment"].value_counts()
fig = px.pie(sentiment_counts, values=sentiment_counts.values, names=sentiment_counts.index,
color_discrete_sequence=colors)
st.plotly_chart(fig, use_container_width=True)
# Create word clouds for positive and negative reviews
positive_reviews = " ".join(df[df["Sentiment"] == "POSITIVE"]["Review"].tolist())
negative_reviews = " ".join(df[df["Sentiment"] == "NEGATIVE"]["Review"].tolist())
# Center-align the word clouds
col1, col2 = st.columns(2)
with col1:
st.markdown(
f'<div style="background-color: #4AA6DD; color: #ffffff; padding: 6px; font-size: 16px; font-family: sans-serif; font-weight: bold; text-align: center; margin-bottom: 40px; border-radius: 1rem">Positive Reviews</div>',
unsafe_allow_html=True
)
wc_pos = WordCloud(width=800, height=600, background_color="white", colormap="winter").generate(positive_reviews)
st.image(wc_pos.to_array(),use_column_width=True)
with col2:
st.markdown(
f'<div style="background-color: #4AA6DD; color: #ffffff; padding: 6px; font-size: 16px; font-family: sans-serif; font-weight: bold; text-align: center; margin-bottom: 40px;border-radius: 1rem">Negative Reviews</div>',
unsafe_allow_html=True
)
wc_neg = WordCloud(width=800, height=600, background_color="white", colormap="winter").generate(negative_reviews)
st.image(wc_neg.to_array(),use_column_width=True)
# Display the sentiment of each review as cards
st.markdown(
f'<div style="background-color: #4AA6DD; color: #ffffff; padding: 6px; font-size: 16px; font-family: sans-serif; font-weight: bold; text-align: center; margin-top: 60px; border-radius: 1rem"> Reviews in depth </div>',
unsafe_allow_html=True
)
# Add the selectbox to filter sentiments
filter_sentiment = st.selectbox("", ["ALL", "POSITIVE", "NEGATIVE"])
# Filter the dataframe based on the selected sentiment
if filter_sentiment != "ALL":
df = df[df['Sentiment'] == filter_sentiment]
# Set the max number of rows to display at a time
max_rows = 15
# Create HTML table with no border and centered text
table_html = (df.style
.set_properties(**{'text-align': 'left','font-family': 'sans-serif'})
.set_table_styles([{'selector': 'th', 'props': [('border', '0px')]},
{'selector': 'td', 'props': [('border', '0px')]}])
.set_table_attributes('style="position: sticky; top: 0;"')
.to_html(index=False, escape=False))
# Wrap the table inside a div with a fixed height and scrollable content
st.write(f'<div style="height: {max_rows*30}px; overflow-y: scroll;">{table_html}</div>', unsafe_allow_html=True,header=True,sticky_header=True)
def convert_df(df):
# IMPORTANT: Cache the conversion to prevent computation on every rerun
return df.to_csv().encode('utf-8')
csv = convert_df(df)
# Add some space between the download button and the table
st.write("<br><br>", unsafe_allow_html=True)
st.download_button(
label="Download data as CSV",
data=csv,
file_name='Review Sentiments.csv'
)
st.write("<br>", unsafe_allow_html=True)
st.caption('<div style="text-align:center; background-color:#CFEDFF;padding: 6px">crafted with ❤️</div>', unsafe_allow_html=True) |