File size: 4,738 Bytes
48826f6 224bec5 48826f6 |
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 |
import pandas as pd
import numpy as np
import streamlit as st
import plotly.express as px
import plotly.io as pio
from transformers import AutoTokenizer, AutoModelForSequenceClassification
from PIL import Image
import base64
# Define the "How to Use" message
how_to_use = """
**How to Use**
1. Select a model from the dropdown menu
2. Enter text in the text area
3. Click the 'Analyze' button to get the predicted sentiment of the text
"""
# Functions
def main():
st.title("Covid Tweets Sentiment Analysis NLP App")
st.subheader("Team Harmony Project")
# Add the cover image
#st.markdown(f'<img src="data:image/jpeg;base64,{image_base64}" alt="Cover Image">', unsafe_allow_html=True)
st.image("Cover_image.jpg")
# Define the available models
models = {
"ROBERTA": "Abubakari/finetuned-Sentiment-classfication-ROBERTA-model",
"BERT": "Abubakari/finetuned-Sentiment-classfication-BERT-model",
"DISTILBERT": "Abubakari/finetuned-Sentiment-classfication-DISTILBERT-model"
}
menu = ["Home", "About"]
choice = st.sidebar.selectbox("Menu", menu)
# Add the "How to Use" message to the sidebar
st.sidebar.markdown(how_to_use)
if choice == "Home":
st.subheader("Home")
# Add a dropdown menu to select the model
model_name = st.selectbox("Select a model", list(models.keys()))
with st.form(key="nlpForm"):
raw_text = st.text_area("Enter Text Here")
submit_button = st.form_submit_button(label="Analyze")
# Layout
col1, col2 = st.columns(2)
if submit_button:
# Display balloons
st.balloons()
with col1:
st.info("Results")
tokenizer = AutoTokenizer.from_pretrained(models[model_name])
model = AutoModelForSequenceClassification.from_pretrained(models[model_name])
# Tokenize the input text
inputs = tokenizer(raw_text, return_tensors="pt")
# Make a forward pass through the model
outputs = model(**inputs)
# Get the predicted class and associated score
predicted_class = outputs.logits.argmax().item()
score = outputs.logits.softmax(dim=1)[0][predicted_class].item()
# Compute the scores for all sentiments
positive_score = outputs.logits.softmax(dim=1)[0][2].item()
negative_score = outputs.logits.softmax(dim=1)[0][0].item()
neutral_score = outputs.logits.softmax(dim=1)[0][1].item()
# Compute the confidence level
confidence_level = np.max(outputs.logits.detach().numpy())
# Print the predicted class and associated score
st.write(f"Predicted class: {predicted_class}, Score: {score:.3f}, Confidence Level: {confidence_level:.2f}")
# Emoji
if predicted_class == 2:
st.markdown("Sentiment: Positive :smiley:")
st.image("Positive_sentiment.jpg")
elif predicted_class == 1:
st.markdown("Sentiment: Neutral :😐:")
st.image("Neutral_sentiment.jpg")
else:
st.markdown("Sentiment: Negative :angry:")
st.image("Negative_sentiment2.png")
# Create the results DataFrame
# Define an empty DataFrame with columns
results_df = pd.DataFrame(columns=["Sentiment Class", "Score"])
# Create a DataFrame with scores for all sentiments
all_scores_df = pd.DataFrame({
'Sentiment Class': ['Positive', 'Negative', 'Neutral'],
'Score': [positive_score, negative_score, neutral_score]
})
# Concatenate the two DataFrames
results_df = pd.concat([results_df, all_scores_df], ignore_index=True)
#results_df = pd.DataFrame({
# "Sentiment Class": [predicted_class],
# "Score": [score]
#})
# Create the Plotly figure
fig = px.bar(results_df, x="Sentiment Class", y="Score", color="Sentiment Class")
with col2:
st.plotly_chart(fig, use_container_width=True)
st.write(results_df)
else:
st.subheader("About")
st.write("This is a sentiment analysis NLP app developed by Team Harmony for analyzing tweets related to Covid-19. It uses a pre-trained model to predict the sentiment of the input text. The app is part of a project to promote teamwork and collaboration among developers.")
if __name__ == "__main__":
main()
|