MaryanneMuchai's picture
Upload 2 files
695b5f5
# 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