File size: 5,260 Bytes
5cc4dcb
 
 
b5015a5
5cc4dcb
 
 
 
 
b5015a5
 
 
5cc4dcb
b5015a5
 
 
 
 
 
5cc4dcb
b5015a5
5cc4dcb
 
 
 
 
b5015a5
5cc4dcb
 
 
b5015a5
5cc4dcb
b5015a5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5cc4dcb
 
b5015a5
 
 
5cc4dcb
 
b5015a5
5cc4dcb
 
 
 
 
 
 
b5015a5
 
ff1f5c6
5cc4dcb
 
b5015a5
 
 
 
 
5cc4dcb
 
 
 
 
 
 
 
 
 
 
 
 
b5015a5
 
5cc4dcb
b5015a5
 
5cc4dcb
 
b5015a5
 
5cc4dcb
b5015a5
 
 
5cc4dcb
b5015a5
 
5cc4dcb
 
b5015a5
 
5cc4dcb
b5015a5
 
5cc4dcb
b5015a5
5cc4dcb
b5015a5
 
5cc4dcb
b5015a5
5cc4dcb
 
 
 
b5015a5
5cc4dcb
 
 
 
 
 
 
b5015a5
 
 
 
 
 
 
 
 
 
5cc4dcb
 
 
 
b5015a5
 
 
5cc4dcb
 
 
b5015a5
 
 
 
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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
import streamlit as st
import pandas as pd
import numpy as np
from PIL import Image
from utils import run_sentiment_analysis, preprocess
from transformers import AutoTokenizer, AutoConfig,AutoModelForSequenceClassification
import os
import time

# the two model trained
dstbt_model_path = "bright1/fine-tuned-distilbert-base-uncased" # distilbert model
rbta_model_path = "bright1/fine-tuned-twitter-Roberta-base-sentiment" # roberta model

# function to load model 
def load_model_components(model_path):
    tokenizer = AutoTokenizer.from_pretrained(model_path)
    config = AutoConfig.from_pretrained(model_path)
    model = AutoModelForSequenceClassification.from_pretrained(model_path)
    return model, tokenizer, config

# configure page
st.set_page_config(
    page_title="Tweet Analyzer",
    page_icon="🤖",
    initial_sidebar_state="expanded",
    menu_items={
        'About': "# This is a Sentiment Analysis App. Call it the Covid Vaccine tweet Analyzer!"
    }
)  

# Define custom CSS style

# Apply custom CSS
# st.markdown("""<style> 
#         [data-testid="stAppViewContainer"] {
#             background-image: url("app\download.png");
#              background-attachment: fixed;
#             background-size: cover
#             }
# </style>""", unsafe_allow_html=True)



# create a sidebar and contents
st.sidebar.markdown("""
## Demo App
This app analyzes your tweets on covid vaccines and classifies them us Neutral, Negative or Positive
""")

# create a three column layout
model_type = st.sidebar.selectbox(label=':red[Select your model]', options=('distilbert', 'roberta'))
st.markdown("""<style> 
        [data-testid="stMarkdownContainer"] {
            font-size: 30px;
            font-weight: 800;
            }
</style>""", unsafe_allow_html=True)

# set a default model path
model_path = dstbt_model_path
if model_type == 'roberta':
    model_path = rbta_model_path


# create app interface 
my_expander  = st.container()

# st.sidebar.selectbox('Menu', ['About', 'Model'])
with my_expander:
    # center text in the container
    st.markdown("""
        <style>
        h1 {
            text-align: center;
        }
        </style>
        """, unsafe_allow_html=True)
    
    #set title for the app
    st.title(':green[Covid-19 Vaccine Tweets Analyzer]')


    # load model components
    model, tokenizer, config = load_model_components(model_path)


    # size columns
    col1, col2, col3 = st.columns((1.6, 1,0.3))
    # col2.markdown("""
    #         <p style= font-color:red>
    #             Results from Analyzer
    #         </p>
    # """,unsafe_allow_html=True)
    st.markdown("""
        <style>
        p {
            font-color: blue;
        }
        </style>
        """, unsafe_allow_html=True)
    
    # set textarea to receive tweet
    tweet = col1.text_area('Tweets to analyze',height=200, max_chars=520, placeholder='Write your Tweets here')

    # divide container into columns
    colA, colb, colc, cold = st.columns(4)
    clear_button = colA.button(label='Clear', type='secondary', use_container_width=True)

    # create a submit button
    submit_button = colb.button(label='Submit', type='primary', use_container_width=True)

    # set an empty container for the results
    empty_container = col2.container() # for progress bars
    empty_container.text("Results from Analyzer")

    empty_container2 = col3.container() # for scores
    empty_container2.text('Scores')
    text = preprocess(tweet)

    # run the analysis on the tweet
    results = run_sentiment_analysis(text=text, model=model, tokenizer=tokenizer)
    
    # when the tweet is submitted
    if submit_button:
        # print a success message 
        success_message = st.success('Success', icon="✅")
        time.sleep(3)
        success_message.empty()
        
        # create am expander to contain the results
        with empty_container:
            neutral = st.progress(value=results['Neutral'], text='Neutral',)
            negative = st.progress(value=results['Negative'], text='Negative')
            positive = st.progress(value=results['Positive'], text='Positive')

        with empty_container2:
            st.markdown(
                """
            <style>
            [data-testid="stMetricValue"] {
                font-size: 20px;
            }
            .st-ed {
                background-color: #FF4B4B;  
            
            }
            .st-ee {
                background-color: #1B9C85;
            }
            .st-eb {
                background-color: #FFD95A;
            }
            </style>
            """,
                unsafe_allow_html=True,
            )

            # class=""
            # dispay the scores with metric widget 
            neutral_score = st.metric(label='Score', value=round(results['Neutral'], 4), label_visibility='collapsed')
            negative_score = st.metric(label='Score', value=round(results['Negative'], 4), label_visibility='collapsed')
            positive_score = st.metric(label='Score', value=round(results['Positive'], 4), label_visibility='collapsed')
            
            # interpret_button = col2.button(label='Interpret',type='secondary', use_container_width=True)
    if clear_button:
        tweet = ""