Spaces:
Sleeping
Sleeping
import nltk | |
import matplotlib.pyplot as plt | |
from nltk.sentiment import SentimentIntensityAnalyzer | |
import streamlit as st | |
import os | |
import joblib | |
import numpy as np | |
from sklearn.feature_extraction.text import TfidfVectorizer | |
import re | |
from urllib.parse import urlparse | |
from nltk.tokenize import word_tokenize | |
from nltk.corpus import stopwords as nltk_stopwords # Rename the variable to avoid conflicts | |
from nltk.stem import WordNetLemmatizer | |
from langchain.llms import OpenAI | |
from langchain.prompts import PromptTemplate | |
from langchain.chains import LLMChain | |
import plotly.graph_objects as go | |
import openai | |
import pprint | |
#import google.generativeai as palm | |
import nltk | |
nltk.download('vader_lexicon') | |
nltk.download('omw-1.4') | |
nltk.download('wordnet') | |
nltk.download('wordnet2022') | |
nltk.download('punkt') | |
nltk.download('stopwords') | |
stop_words = set(nltk_stopwords.words("english")) | |
lemmatizer = WordNetLemmatizer() | |
#api_key = os.getenv("OPENAI_API_KEY") | |
#llm = OpenAI(temperature=0.6, api_key=api_key) | |
#api_key = os.getenv("PALM_API_KEY") | |
#palm.configure(api_key=api_key) | |
import google.generativeai as genai | |
import os | |
genai.configure(api_key=os.environ["GEMINI_API_KEY"]) | |
ml_model = joblib.load('Stress identification NLP') | |
tfidf_vectorizer = joblib.load('tfidf_vectorizer.joblib') | |
def textProcess(sent): | |
try: | |
if sent is None: | |
return "" | |
sent = re.sub('[][)(]', ' ', sent) | |
sent = [word for word in sent.split() if not urlparse(word).scheme] | |
sent = ' '.join(sent) | |
sent = re.sub(r'\@\w+', '', sent) | |
sent = re.sub(re.compile("<.*?>"), '', sent) | |
sent = re.sub("[^A-Za-z0-9]", ' ', sent) | |
sent = sent.lower() | |
sent = [word.strip() for word in sent.split()] | |
sent = ' '.join(sent) | |
tokens = word_tokenize(sent) | |
for word in tokens.copy(): | |
if word in stop_words: | |
tokens.remove(word) | |
sent = [lemmatizer.lemmatize(word) for word in tokens] | |
sent = ' '.join(sent) | |
return sent | |
except Exception as ex: | |
return "" | |
def score_text(text): | |
model = genai.GenerativeModel("gemini-1.5-flash") | |
prompt ="""Score the following transcript :\n """+text+""" \nScore it out of 5 which can take any float value from 0 to 5 under the following classes in the list: | |
['Depressiveness', 'Suicidal Thoughts', 'Self Esteem', 'Supressiveness', 'Tiredness'] | |
each separated by commas and give the response in one single line without any leading spaces or new line | |
changes directly starting with scores and only write the scores no extra information and if any score | |
is an integer value end it with .0""" | |
response = model.generate_content( | |
prompt, | |
generation_config=genai.types.GenerationConfig( | |
# Only one candidate for now. | |
candidate_count=1, | |
stop_sequences=["x"], | |
max_output_tokens=100, | |
temperature=0, | |
), | |
) | |
#print(response.text) | |
#scores = completion.result | |
scores = response.text | |
return scores | |
def create_radar_chart(scores): | |
numbers = re.findall(r'\d+\.\d+', scores) | |
number_list = [float(num) for num in numbers] | |
categories = ['Depressiveness', 'Suicidal Thoughts', 'Self Esteem', 'Supressiveness', 'Tiredness'] | |
x = number_list | |
num_categories = len(categories) | |
max_value = 5.0 | |
data = [(value / max_value) * 5 for value in x] | |
angles = np.linspace(0, 2 * np.pi, num_categories, endpoint=False).tolist() | |
angles += angles[:1] | |
data += data[:1] | |
fig = go.Figure() | |
fig.add_trace(go.Scatterpolar( | |
r=data, | |
theta=categories, | |
fill='toself', | |
text=number_list,# | |
textfont=dict(color='deepskyblue'),# | |
name='Mental Health Radar Chart' | |
)) | |
return fig | |
def get_sentiment_percentage(text): | |
sia = SentimentIntensityAnalyzer() | |
sentiment_scores = sia.polarity_scores(text) | |
positive_percentage = sentiment_scores['pos'] * 100 | |
neutral_percentage = sentiment_scores['neu'] * 100 | |
negative_percentage = sentiment_scores['neg'] * 100 | |
return positive_percentage, neutral_percentage, negative_percentage | |
def main(): | |
st.title("Stress Visualizer") | |
st.write("Enter some text to predict if the person is in stress or not.") | |
user_input = st.text_area("Enter text here:") | |
if st.button("Predict"): | |
if user_input: | |
processed_text = textProcess(user_input) | |
positive_percentage, neutral_percentage, negative_percentage = get_sentiment_percentage(processed_text) | |
st.write(f"Positive: {positive_percentage:.2f}%") | |
st.write(f"Neutral: {neutral_percentage:.2f}%") | |
st.write(f"Negative: {negative_percentage:.2f}%") | |
tfidf_text = tfidf_vectorizer.transform([processed_text]) | |
prediction = ml_model.predict(tfidf_text)[0] | |
if prediction == 1: | |
result = "**This person is in stress.**" | |
else: | |
result = "**This person is not in stress.**" | |
if result == "**This person is not in stress.**" and max(positive_percentage,negative_percentage)==negative_percentage: | |
result="**This person is in stress.**" | |
st.markdown(result) | |
scores = score_text(user_input) | |
fig = go.Figure(data=[go.Bar( | |
x=['Positive', 'Neutral', 'Negative'], | |
y=[positive_percentage, neutral_percentage, negative_percentage], | |
marker_color=['green', 'gray', 'red'] | |
)]) | |
fig.update_layout( | |
yaxis_title='Percentage', | |
title='Sentiment Percentages' | |
) | |
radar_chart = create_radar_chart(scores) | |
st.plotly_chart(fig) | |
st.plotly_chart(radar_chart) | |
if __name__ == '__main__': | |
main() | |