# pip install streamlit, # pip install pyngrok==4.1.1, # pip install vaderSentiment, # pip install transformers import os os.system('pip install --upgrade pip') os.system('pip install textblob') os.system('pip install vaderSentiment') os.system('pip install transformers') os.system('pip install numpy') os.system('pip install scipy') os.system('pip install streamlit') os.system('pip install pandas') os.system('pip install altair') os.system('pip install vaderSentiment') os.system('pip install torch') os.system('pip install pyngrok') os.system('pip install streamlit --upgrade') import torch import streamlit as st from textblob import TextBlob import pandas as pd import altair as alt from vaderSentiment.vaderSentiment import SentimentIntensityAnalyzer from transformers import AutoModelForSequenceClassification from transformers import TFAutoModelForSequenceClassification from transformers import AutoTokenizer, AutoConfig import numpy as np from scipy.special import softmax import streamlit as st # Requirements model_path = f"MaryanneMuchai/twitter-finetuned-model" tokenizer = AutoTokenizer.from_pretrained(model_path) config = AutoConfig.from_pretrained(model_path) model = AutoModelForSequenceClassification.from_pretrained(model_path) # Preprocess text (username and link placeholders) def preprocess(text): new_text = [] for t in text.split(" "): t = '@user' if t.startswith('@') and len(t) > 1 else t t = 'http' if t.startswith('http') else t new_text.append(t) return " ".join(new_text) def sentiment_analysis(text): text = preprocess(text) # PyTorch-based models encoded_input = tokenizer(text, return_tensors='pt') output = model(**encoded_input) scores_ = output[0][0].detach().numpy() scores_ = softmax(scores_) # Format output dict of scores labels = ['Negative', 'Neutral', 'Positive'] scores = {l:float(s) for (l,s) in zip(labels, scores_) } return scores def convert_to_df(sentiment): sentiment_dict = {'polarity':sentiment.polarity,'subjectivity':sentiment.subjectivity} sentiment_df = pd.DataFrame(sentiment_dict.items(),columns=['metric','value']) return sentiment_df def main(): st.title("Sentiment Analysis NLP App") st.subheader("Streamlit Projects") menu = ["Home","About"] choice = st.sidebar.selectbox("Menu",menu) if choice == "Home": st.subheader("Home") 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: with col1: st.info("Results") sentiment = TextBlob(raw_text).sentiment st.write(sentiment) # Emoji if sentiment.polarity > 0: st.markdown("Sentiment:: Positive :smiley: ") elif sentiment.polarity < 0: st.markdown("Sentiment:: Negative :angry: ") else: st.markdown("Sentiment:: Neutral ?? ") # Dataframe result_df = convert_to_df(sentiment) st.dataframe(result_df) # Visualization c = alt.Chart(result_df).mark_bar().encode( x='metric', y='value', color='metric') st.altair_chart(c,use_container_width=True) with col2: st.info("Token Sentiment") token_sentiments = sentiment_analysis(raw_text) st.write(token_sentiments) else: st.subheader("About") if __name__ == '__main__': main() # Expose the app publicly using ngrok # from pyngrok import ngrok # public_url = ngrok.connect(port='8501') # public_url # !streamlit run --server.port 8501 Sentiment_Analysis.py # !pip freeze > requirements.txt