| import streamlit as st |
| from sentiment_model import PretrainedSentimentAnalyzer |
| import pandas as pd |
| import matplotlib.pyplot as plt |
| import plotly.graph_objects as go |
| import pandas as pd |
| import re |
|
|
|
|
| |
| analyzer = PretrainedSentimentAnalyzer(None, None, None, None) |
| |
| def main(): |
| st.title("Early Depression Detection System") |
|
|
| |
| option = st.selectbox("Select an option:", ("Enter a sentence", "Upload a CSV file")) |
|
|
| if option == "Enter a sentence": |
| text = st.text_input("Enter a sentence:") |
|
|
| |
| if st.button("Analyze"): |
| if not text or len(text) == 1: |
| st.write("Enter valid text") |
| else: |
| sentiment = analyzer.predict([text], inverse_transform=True)[0] |
| st.write("Sentiment Analysis Results:") |
| st.write("Sentiment:", sentiment['label']) |
| |
| if sentiment['label'] == 'negative': |
| if scan(text) == "Depression Detected": |
| st.write("Depression Detected") |
| helplines_message = """ |
| If you or your loved ones are feeling depressed, please reach out to these helplines: |
| |
| - **Beyond Blue**: 1300 659 467 |
| - **Mental Health Emergency**: 13 14 65 |
| """ |
|
|
| st.error(helplines_message) |
| else: |
| st.success("No Depression Detected") |
| else: |
| st.success("No Depression Detected") |
| elif option == "Upload a CSV file": |
| file = st.file_uploader("Upload a CSV file:") |
| if file is not None: |
| |
| if file.name.endswith('.csv'): |
| |
| df = pd.read_csv(file) |
| if st.button("Analyze"): |
| |
| |
| |
| |
| |
| spinner_placeholder = st.markdown(""" |
| <style> |
| .spinner-container { |
| display: flex; |
| justify-content: center; |
| align-items: center; |
| flex-direction: column; |
| } |
| |
| .spinner { |
| border: 16px solid #f3f3f3; |
| border-radius: 50%; |
| border-top: 16px solid #3498db; |
| width: 100px; |
| height: 100px; |
| -webkit-animation: spin 2s linear infinite; |
| animation: spin 2s linear infinite; |
| } |
| |
| @-webkit-keyframes spin { |
| 0% { -webkit-transform: rotate(0deg); } |
| 100% { -webkit-transform: rotate(360deg); } |
| } |
| |
| @keyframes spin { |
| 0% { transform: rotate(0deg); } |
| 100% { transform: rotate(360deg); } |
| } |
| |
| </style> |
| <div class="spinner-container"> |
| <div class="spinner"></div> |
| <p>Predicting...</p> |
| </div> |
| """, unsafe_allow_html=True) |
|
|
| column = df.columns[1] |
| data = df[column].astype(str).tolist() |
| sentiments = analyzer.predict(data, inverse_transform=True) |
| df['Prediction'] = [s['label'] for s in sentiments] |
|
|
| |
| spinner_placeholder.empty() |
| st.write("Sentiment Analysis Results:") |
| st.write(df) |
| |
| sentiment_counts = df['Prediction'].value_counts() |
| sentiment_dict = {'Positive': 0, 'Neutral': 0, 'Negative': 0} |
|
|
| for sentiment in sentiment_counts.index: |
| if sentiment == 'positive': |
| sentiment_dict['Positive'] += sentiment_counts[sentiment] |
| elif sentiment == 'neutral': |
| sentiment_dict['Neutral'] += sentiment_counts[sentiment] |
| elif sentiment == 'negative': |
| sentiment_dict['Negative'] += sentiment_counts[sentiment] |
| st.write("Sentiment Counts:") |
| for sentiment, count in sentiment_dict.items(): |
| st.write(sentiment + ":", count) |
|
|
| labels = list(sentiment_dict.keys()) |
| sizes = list(sentiment_dict.values()) |
| colors = ['green', 'white', 'red'] |
|
|
| fig = go.Figure(data=[go.Pie(labels=labels, values=sizes,hole=.2, marker=dict(colors=colors))]) |
|
|
| fig.update_layout( |
| title="Sentiment Analysis", |
| showlegend=True, |
| legend_title="Sentiment", |
| uniformtext_minsize=12, |
| uniformtext_mode='hide' |
| ) |
|
|
| st.plotly_chart(fig) |
| negative_data = df[df['Prediction'] == 'negative'] |
| |
| tweets_data = negative_data['Tweets'] |
| depressed_df=scan(tweets_data) |
| if depressed_df.empty: |
| st.success("None of the Comments in the Dataset are depressed") |
| else: |
| st.write("Depressed Comments") |
| st.write(depressed_df) |
| helplines_message = """ |
| I found these tweets to be depressed, please reach out to the below helplines for help: |
| |
| - **Beyond Blue**: 1300 659 467 |
| - **Mental Health Emergency**: 13 14 65 |
| """ |
| st.error(helplines_message) |
|
|
| def scan(tweets_data): |
|
|
| contractions_dict = { "ain't": "are not","'s":" is","aren't": "are not", |
| "can't": "cannot","can't've": "cannot have", |
| "'cause": "because","could've": "could have","couldn't": "could not", |
| "couldn't've": "could not have", "didn't": "did not","doesn't": "does not", |
| "don't": "do not","hadn't": "had not","hadn't've": "had not have", |
| "hasn't": "has not","haven't": "have not","he'd": "he would", |
| "he'd've": "he would have","he'll": "he will", "he'll've": "he will have", |
| "how'd": "how did","how'd'y": "how do you","how'll": "how will", |
| "I'd": "I would", "I'd've": "I would have","I'll": "I will", |
| "I'll've": "I will have","I'm": "I am","I've": "I have", "isn't": "is not", |
| "it'd": "it would","it'd've": "it would have","it'll": "it will", |
| "it'll've": "it will have", "let's": "let us","ma'am": "madam", |
| "mayn't": "may not","might've": "might have","mightn't": "might not", |
| "mightn't've": "might not have","must've": "must have","mustn't": "must not", |
| "mustn't've": "must not have", "needn't": "need not", |
| "needn't've": "need not have","o'clock": "of the clock","oughtn't": "ought not", |
| "oughtn't've": "ought not have","shan't": "shall not","sha'n't": "shall not", |
| "shan't've": "shall not have","she'd": "she would","she'd've": "she would have", |
| "she'll": "she will", "she'll've": "she will have","should've": "should have", |
| "shouldn't": "should not", "shouldn't've": "should not have","so've": "so have", |
| "that'd": "that would","that'd've": "that would have", "there'd": "there would", |
| "there'd've": "there would have", "they'd": "they would", |
| "they'd've": "they would have","they'll": "they will", |
| "they'll've": "they will have", "they're": "they are","they've": "they have", |
| "to've": "to have","wasn't": "was not","we'd": "we would", |
| "we'd've": "we would have","we'll": "we will","we'll've": "we will have", |
| "we're": "we are","we've": "we have", "weren't": "were not","what'll": "what will", |
| "what'll've": "what will have","what're": "what are", "what've": "what have", |
| "when've": "when have","where'd": "where did", "where've": "where have", |
| "who'll": "who will","who'll've": "who will have","who've": "who have", |
| "why've": "why have","will've": "will have","won't": "will not", |
| "won't've": "will not have", "would've": "would have","wouldn't": "would not", |
| "wouldn't've": "would not have","y'all": "you all", "y'all'd": "you all would", |
| "y'all'd've": "you all would have","y'all're": "you all are", |
| "y'all've": "you all have","you'd": "you would","you'd've": "you would have", |
| "you'll": "you will","you'll've": "you will have", "you're": "you are", |
| "you've": "you have"} |
| absolute_words = { |
| "I","me","my","mine", "feeling","life", "feels", "always", |
| "absolutely", "must", "should", "all", "every", "none", "nothing", |
| "everyone", "everything", "only", "impossible", "forever", "can not", |
| "cannot", "won’t", "will not", "no one", "no-one", "every time", |
| "low", "everytime", "difficult", "difficulty", "nightmare", "bored", |
| "disaster", "irritate", "broken", "hurt", "lost", "love", "alone", |
| "stupid", "disgusted", "stress", "hostile", "reserved", "danger", |
| "funeral", "respect", "vomit", "sick", "phase", "suffer", "suffering", |
| "betray", "poster", "grief", "safe", "home", "treat", |
| "confident", "peace", "lucky", "win", |
| "proud", "beautiful","please","pleaded", "success", "laughing","laugh", "party", |
| "key", "justice", "sorry", "apologize", "kill", "help", "myself", |
| "depress", "depressed","depression", "hopeless", "helpless", "worthless", |
| "guilty", "ashamed", "miserable", "regret", "despair", "empty","shit", |
| "numb", "withdrawn", "lonely", "fatigued","fatigue","cry", "exhausted", "overwhelmed", |
| "suicidal", "self-harm", "panic", "anxiety", "trauma", "ptsd", |
| "bipolar", "disorder", "breakup", "divorce", "loss", "unemployed", |
| "fired", "bullied", "abused", "neglected", "failure", "inferior", |
| "insecure", "ugly", "unloved", "unwanted", "loser", "pessimistic", |
| "pointless", "meaningless", "purposeless", "directionless", "ending", |
| "hopelessness", "uninterested", "disinterested", "unmotivated", "die", |
| "apathetic", "indifferent", "worthlessness", "guilt", "shame","crying","cry","cried","sadness","sad","sorrow"} |
| |
| |
| contractions_re=re.compile('(%s)' % '|'.join(contractions_dict.keys())) |
|
|
| |
| def expand_contractions(text,contractions_dict=contractions_dict): |
| def replace(match): |
| return contractions_dict[match.group(0)] |
| return contractions_re.sub(replace, text) |
|
|
| |
| def preprocess_text(text): |
| |
| text = str(text) |
| |
| text = expand_contractions(text) |
| |
| text = re.sub(r'[^\w\s]', '', text) |
| |
| text = text.lower() |
| |
| if text == "": |
| return None |
| return text |
| |
| if isinstance(tweets_data, str): |
| preprocessed_tweets=preprocess_text(tweets_data) |
| count = 0 |
| for word in absolute_words: |
| if word in preprocessed_tweets: |
| count += 1 |
| if count >= 2: |
| return("Depression Detected") |
| break |
| if count<2: |
| return("No Depression Detected") |
| |
| else: |
| |
| preprocessed_tweets = tweets_data.apply(preprocess_text) |
| print(preprocessed_tweets) |
| |
| |
| Early_dep = pd.DataFrame(columns=['Tweets']) |
| for tweet in preprocessed_tweets: |
| count = 0 |
| for word in absolute_words: |
| if word in tweet: |
| count += 1 |
| if count >= 2: |
| Early_dep = pd.concat([Early_dep, pd.DataFrame({'Tweets': [tweet]})], ignore_index=True) |
| break |
| return(Early_dep) |
|
|
|
|
| |
| if __name__ == "__main__": |
| main() |