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")