import streamlit as st from transformers import pipeline import pandas as pd import numpy as np from transformers import BertTokenizerFast st.set_page_config(page_title="AI Project", page_icon=":tada:", layout="wide") # Defining the list of pre-trained models from other people's HuggingFace spaces pre_trained_models = ["finiteautomata/bertweet-base-sentiment-analysis", 'bhadresh-savani/distilbert-base-uncased-emotion', "nlptown/bert-base-multilingual-uncased-sentiment"] # My fine-tuned model from my personal HuggingFace space fine_tuned_model = "corykhal/twitter-finetuned" # Dictionary that maps the output labels of my fine-tuned model to the actual labels to present fine_tuned_labels = {"LABEL_0": "Toxic", "LABEL_1": "Severe Toxic", "LABEL_2": "Obscene", "LABEL_3": "Threat", "LABEL_4": "Insult", "LABEL_5": "Identity Hate"} # List of all four models models = pre_trained_models + [fine_tuned_model] with st.container(): st.title("Hello! Welcome to the Sentiment Analysis App :wave:") st.header("By: Cory Khalilollahi") with st.container(): st.write("---") # Take in user text to input into model text = st.text_input("Please enter the text of a tweet to use for the sentiment analysis:", value="Hello! It is a pleasure to meet you!") st.write("---") st.write("The first 3 models in the select box are for any sentiment analysis.") st.write("The last model (which is finetuned) in the select box is specifically for toxicity analysis.") # Display a select box for the user to select a model name model = st.selectbox("Please select one of the following pre-trained models:", models) with st.container(): st.write("---") # If the button is pressed if st.button("Analyze!"): # If the user selects a pre-trained model if model in pre_trained_models: # Load the model pipeline using the model name analysis = pipeline("sentiment-analysis", model=model) # Run the model using user input text and store the predicted result result = analysis(text) # Extract the label and score of prediction sentiment = result[0]["label"] score = result[0]["score"] # Create a table for the label and score data = pd.DataFrame({"Tweet": [text], "Sentiment": [sentiment], "Confidence Score": [score]}) st.table(data) # If the user selects the finetuned model else: # Load the model pipeline using the model name and return the top 2 results analysis = pipeline("sentiment-analysis", model=model, top_k=2) # Run the model using user input text and store the predicted result result = analysis(text) # Get the top two labels and scores sentiment1 = fine_tuned_labels[result[0][0]["label"]] score1 = result[0][0]["score"] sentiment2 = fine_tuned_labels[result[0][1]["label"]] score2 = result[0][1]["score"] # Create a table for the labels and scores data = pd.DataFrame({"Tweet": [text], "Toxic": [sentiment1], "Toxic Confidence Score": [score1], "Type of Toxicity": [sentiment2], "Toxicity Type Confidence Score": [score2]}) st.table(data)