import streamlit as st
st.set_page_config(
page_title="Social Media Sentiment Analyzer", page_icon="đ", layout="wide"
)
import pandas as pd
import helper_functions as hf
import plotly.express as px
import plotly.io as pio
import plotly
# Whenever the search button is clicked, the search_callback function is called
def search_callback_twitter():
if platform == "Twitter":
if len(st.session_state.search_term_twitter) == 0:
st.error("Please enter a search term")
return
try:
st.session_state.df = hf.get_tweets(st.session_state.search_term_twitter, st.session_state.num_tweets)
st.session_state.df = hf.get_sentiment(st.session_state.df)
except:
st.error("Please enter a valid search term")
return
def search_callback_youtube():
if platform == "Youtube":
if len(st.session_state.search_term_youtube) == 0:
st.error("Please enter a valid url")
return
try:
st.session_state.df = hf.get_youtube_comments(st.session_state.search_term_youtube, st.session_state.num_comments)
st.session_state.df = hf.get_sentiment_youtube(st.session_state.df)
except:
st.error("Please enter a valid url")
return
def twitter_form():
with st.form(key="search_form"):
st.subheader("Search Parameters")
st.text_input("Enter a User handle (like _@elonmusk_), Hashtag (like _#Bitcoin_) or Topic (like _climate change_)", key="search_term_twitter")
st.slider("Number of tweets", min_value=100, max_value=500, key="num_tweets")
st.form_submit_button(label="Search", on_click=search_callback_twitter)
st.markdown(
"Note: it may take a while to load the results, especially with large number of tweets"
)
def youtube_form():
with st.form(key="search_form"):
st.subheader("Search Parameters")
st.text_input("Enter a Video link to analyse comments", key="search_term_youtube")
st.slider("Number of Comments", min_value=100, max_value=500, key="num_comments")
st.form_submit_button(label="Search", on_click=search_callback_youtube)
st.markdown(
"Note: it may take a while to load the results, especially with large number of comments"
)
with st.sidebar:
st.title("Social Media Sentiment Analyzer")
#st.subheader("Choose your platform")
platform = st.radio(
"Choose your platform đ",
["Twitter", "Youtube"],
# key="visibility",
# label_visibility=st.session_state.visibility,
# disabled=st.session_state.disabled,
horizontal=True,
)
if platform == "Twitter":
twitter_form()
if platform == "Youtube":
youtube_form()
st.markdown(
"
Created by Taaha Bajwa
",
unsafe_allow_html=True,
)
if "df" in st.session_state:
def make_dashboard(tweet_df, bar_color, wc_color):
# first row
col1, col2, col3 = st.columns([28, 34, 38])
with col1:
sentiment_plot = hf.plot_sentiment(tweet_df)
sentiment_plot.update_layout(height=350, title_x=0.5)
st.plotly_chart(sentiment_plot, theme=None, use_container_width=True)
with col2:
top_unigram = hf.get_top_n_gram(tweet_df, ngram_range=(1, 1), n=10)
unigram_plot = hf.plot_n_gram(
top_unigram, title="Top 10 Occuring Words", color=bar_color
)
unigram_plot.update_layout(height=350)
st.plotly_chart(unigram_plot, theme=None, use_container_width=True)
with col3:
top_bigram = hf.get_top_n_gram(tweet_df, ngram_range=(2, 2), n=10)
bigram_plot = hf.plot_n_gram(
top_bigram, title="Top 10 Occuring Bigrams", color=bar_color
)
bigram_plot.update_layout(height=350)
st.plotly_chart(bigram_plot, theme=None, use_container_width=True)
# second row
col1, col2 = st.columns([60, 40])
with col1:
def sentiment_color(sentiment):
if sentiment == "Positive":
return "background-color: #54A24B; color: white"
elif sentiment == "Negative":
return "background-color: #FF7F0E"
else:
return "background-color: #1F77B4"
st.dataframe(
tweet_df[["Sentiment", "Tweet"]].style.applymap(
sentiment_color, subset=["Sentiment"]
),
height=350,
)
with col2:
wordcloud = hf.plot_wordcloud(tweet_df, colormap=wc_color)
st.pyplot(wordcloud)
def make_dashboard_youtube(tweet_df, bar_color, wc_color):
tweet_df = tweet_df.rename(columns={"Comment": "Tweet"})
# first row
col1, col2, col3 = st.columns([28, 34, 38])
with col1:
sentiment_plot = hf.plot_sentiment(tweet_df)
sentiment_plot.update_layout(height=350, title_x=0.5)
st.plotly_chart(sentiment_plot, theme=None, use_container_width=True)
with col2:
top_unigram = hf.get_top_n_gram(tweet_df, ngram_range=(1, 1), n=10)
unigram_plot = hf.plot_n_gram(
top_unigram, title="Top 10 Occuring Words", color=bar_color
)
unigram_plot.update_layout(height=350)
st.plotly_chart(unigram_plot, theme=None, use_container_width=True)
with col3:
top_bigram = hf.get_top_n_gram(tweet_df, ngram_range=(2, 2), n=10)
bigram_plot = hf.plot_n_gram(
top_bigram, title="Top 10 Occuring Bigrams", color=bar_color
)
bigram_plot.update_layout(height=350)
st.plotly_chart(bigram_plot, theme=None, use_container_width=True)
# second row
col1, col2 = st.columns([60, 40])
with col1:
def sentiment_color(sentiment):
if sentiment == "Positive":
return "background-color: #54A24B; color: white"
elif sentiment == "Negative":
return "background-color: #FF7F0E"
else:
return "background-color: #1F77B4"
tweet_df_temp = tweet_df[["Sentiment", "Tweet"]]
tweet_df_temp = tweet_df_temp.rename(columns={"Tweet": "Comment"})
st.dataframe(
tweet_df_temp[["Sentiment", "Comment"]].style.applymap(
sentiment_color, subset=["Sentiment"]
),
height=350,
)
with col2:
wordcloud = hf.plot_wordcloud(tweet_df, colormap=wc_color, mask_url='static/yt_mask.png')
try:
st.pyplot(wordcloud)
except:
st.write("Wordcloud not available for this search term")
adjust_tab_font = """
"""
st.write(adjust_tab_font, unsafe_allow_html=True)
if platform == "Twitter" and st.session_state.search_term_twitter != "":
try:
tab1, tab2, tab3, tab4 = st.tabs(["All", "Positive đ", "Negative âšī¸", "Neutral đ"])
with tab1:
tweet_df = st.session_state.df
if tweet_df.shape[0] > 0:
make_dashboard(tweet_df, bar_color="#1F77B4", wc_color="Blues")
else:
st.write("No tweets to display.")
with tab2:
tweet_df = st.session_state.df.query("Sentiment == 'Positive'")
if tweet_df.shape[0] > 0:
make_dashboard(tweet_df, bar_color="#54A24B", wc_color="Greens")
else:
st.write("No tweets to display.")
with tab3:
tweet_df = st.session_state.df.query("Sentiment == 'Negative'")
if tweet_df.shape[0] > 0:
make_dashboard(tweet_df, bar_color="#FF7F0E", wc_color="Oranges")
else:
st.write("No tweets to display.")
with tab4:
tweet_df = st.session_state.df.query("Sentiment == 'Neutral'")
if tweet_df.shape[0] > 0:
make_dashboard(tweet_df, bar_color="#1F77B4", wc_color="Blues")
else:
st.write("No tweets to display.")
except:
st.error("No plots to display.")
elif platform == "Youtube" and st.session_state.search_term_youtube != "":
try:
tab1, tab2, tab3, tab4 = st.tabs(["All", "Positive đ", "Negative âšī¸", "Neutral đ"])
with tab1:
tweet_df = st.session_state.df
if tweet_df.shape[0] > 0:
make_dashboard_youtube(tweet_df, bar_color="#1F77B4", wc_color="Blues")
else:
st.write("No comments found.")
with tab2:
tweet_df = st.session_state.df.query("Sentiment == 'Positive'")
if tweet_df.shape[0] > 0:
make_dashboard_youtube(tweet_df, bar_color="#54A24B", wc_color="Greens")
else:
st.write("No positive comments found.")
with tab3:
tweet_df = st.session_state.df.query("Sentiment == 'Negative'")
if tweet_df.shape[0] > 0:
make_dashboard_youtube(tweet_df, bar_color="#FF7F0E", wc_color="Oranges")
else:
st.write("No negative comments found.")
with tab4:
tweet_df = st.session_state.df.query("Sentiment == 'Neutral'")
if tweet_df.shape[0] > 0:
make_dashboard_youtube(tweet_df, bar_color="#1F77B4", wc_color="Blues")
else:
st.write("No neutral comments found.")
except:
st.error("No plots to display.")