File size: 4,343 Bytes
5fb0891 |
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 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 |
import streamlit as st
import pandas as pd
import plotly_express as px
import plotly.graph_objects as go
from functions import *
import validators
import textwrap
#st.set_page_config(page_title="Earnings Sentiment Analysis", page_icon="π")
st.sidebar.header("Sentiment Analysis")
#load whisper model
asr_model = load_asr_model(st.session_state.sbox)
if "url" not in st.session_state:
st.session_state.url = ''
if "title" not in st.session_state:
st.session_state.title = ''
try:
if st.session_state['url'] is not None or st.session_state['upload'] is not None:
results, title = inference(st.session_state.url,st.session_state.upload,asr_model)
print(f'results, page1: {results}')
st.subheader(title)
earnings_passages = clean_text(results)
st.session_state['earnings_passages'] = earnings_passages
st.session_state['title'] = title
earnings_sentiment, earnings_sentences = sentiment_pipe(earnings_passages)
with st.expander("See Transcribed Earnings Text"):
st.write(f"Number of Sentences: {len(earnings_sentences)}")
st.write(st.session_state['earnings_passages'])
## Save to a dataframe for ease of visualization
sen_df = pd.DataFrame(earnings_sentiment)
sen_df['text'] = earnings_sentences
grouped = pd.DataFrame(sen_df['label'].value_counts()).reset_index()
grouped.columns = ['sentiment','count']
st.session_state['sen_df'] = sen_df
# Display number of positive, negative and neutral sentiments
fig = px.bar(grouped, x='sentiment', y='count', color='sentiment', color_discrete_map={"Negative":"firebrick","Neutral":\
"navajowhite","Positive":"darkgreen"},\
title='Earnings Sentiment')
fig.update_layout(
showlegend=False,
autosize=True,
margin=dict(
l=25,
r=25,
b=25,
t=50,
pad=2
)
)
st.plotly_chart(fig)
## Display sentiment score
pos_perc = grouped[grouped['sentiment']=='Positive']['count'].iloc[0]*100/sen_df.shape[0]
neg_perc = grouped[grouped['sentiment']=='Negative']['count'].iloc[0]*100/sen_df.shape[0]
neu_perc = grouped[grouped['sentiment']=='Neutral']['count'].iloc[0]*100/sen_df.shape[0]
sentiment_score = neu_perc+pos_perc-neg_perc
fig_1 = go.Figure()
fig_1.add_trace(go.Indicator(
mode = "delta",
value = sentiment_score,
domain = {'row': 1, 'column': 1}))
fig_1.update_layout(
template = {'data' : {'indicator': [{
'title': {'text': "Sentiment Score"},
'mode' : "number+delta+gauge",
'delta' : {'reference': 50}}]
}},
autosize=False,
width=250,
height=250,
margin=dict(
l=5,
r=5,
b=5,
pad=2
)
)
with st.sidebar:
st.plotly_chart(fig_1)
hd = sen_df.text.apply(lambda txt: '<br>'.join(textwrap.wrap(txt, width=70)))
## Display negative sentence locations
fig = px.scatter(sen_df, y='label', color='label', size='score', hover_data=[hd], color_discrete_map={"Negative":"firebrick","Neutral":"navajowhite","Positive":"darkgreen"}, title='Sentiment Score Distribution')
fig.update_layout(
showlegend=False,
autosize=True,
width=800,
height=500,
margin=dict(
b=5,
t=50,
pad=4
)
)
st.plotly_chart(fig)
else:
st.write("No YouTube URL or file upload detected")
except (AttributeError, TypeError):
st.write("No YouTube URL or file upload detected") |