File size: 4,342 Bytes
caf57e7 086edea 610814b ac896ff 16969fc caf57e7 5f012a8 40f7988 0a4ef0e 7ceed73 5664abb 7ceed73 ed945e3 359c5fd 23d0fe5 359c5fd 37e8b9d 0a4ef0e 37e8b9d 0af20e7 7ceed73 0f2bd46 37e8b9d 5a1ffea 455a7e5 37e8b9d 359c5fd 23c9754 37e8b9d 5a1ffea 37e8b9d 5a1ffea 37e8b9d 16969fc 37e8b9d 16969fc 37e8b9d 16969fc 37e8b9d 5a1ffea 37e8b9d 5a1ffea 37e8b9d b3059bf 37e8b9d 5a1ffea |
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 |
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")
st.markdown("## Earnings Sentiment Analysis with FinBert-Tone")
#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)
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(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") |