import os import gradio as gr import nltk import numpy as np import tflearn import random import json import pickle from nltk.tokenize import word_tokenize from nltk.stem.lancaster import LancasterStemmer from transformers import AutoTokenizer, AutoModelForSequenceClassification, pipeline import pandas as pd import torch # Disable TensorFlow GPU warnings (safe since we are using CPU) os.environ["CUDA_VISIBLE_DEVICES"] = "-1" # Download necessary NLTK resources nltk.download("punkt") # Initialize Lancaster Stemmer for text preprocessing stemmer = LancasterStemmer() # Load intents.json for the chatbot with open("intents.json") as file: intents_data = json.load(file) # Load tokenized training data for chatbot with open("data.pickle", "rb") as f: words, labels, training, output = pickle.load(f) # Build TFlearn Chatbot Model def build_chatbot_model(): net = tflearn.input_data(shape=[None, len(training[0])]) net = tflearn.fully_connected(net, 8) net = tflearn.fully_connected(net, 8) net = tflearn.fully_connected(net, len(output[0]), activation="softmax") net = tflearn.regression(net) model = tflearn.DNN(net) model.load("MentalHealthChatBotmodel.tflearn") return model chatbot_model = build_chatbot_model() # Function: Bag of Words def bag_of_words(s, words): bag = [0 for _ in range(len(words))] s_words = word_tokenize(s) s_words = [stemmer.stem(word.lower()) for word in s_words if word.isalnum()] for se in s_words: for i, w in enumerate(words): if w == se: bag[i] = 1 return np.array(bag) # Chatbot Response Function def chatbot_response(message, history): """Generates a chatbot response.""" history = history or [] try: result = chatbot_model.predict([bag_of_words(message, words)]) idx = np.argmax(result) tag = labels[idx] response = "I didn't understand that. 🤔" for intent in intents_data["intents"]: if intent["tag"] == tag: response = random.choice(intent["responses"]) break except Exception as e: response = f"Error generating response: {str(e)} 💥" history.append({"role": "user", "content": message}) history.append({"role": "assistant", "content": response}) return history, response # Emotion Detection Function emotion_tokenizer = AutoTokenizer.from_pretrained("j-hartmann/emotion-english-distilroberta-base") emotion_model = AutoModelForSequenceClassification.from_pretrained("j-hartmann/emotion-english-distilroberta-base") def detect_emotion(user_input): pipe = pipeline("text-classification", model=emotion_model, tokenizer=emotion_tokenizer) try: result = pipe(user_input) emotion = result[0]["label"] emotion_map = { "joy": "😊 Joy", "anger": "😠 Anger", "sadness": "😢 Sadness", "fear": "😨 Fear", "surprise": "😲 Surprise", "neutral": "😐 Neutral", } return emotion_map.get(emotion, "Unknown Emotion 🤔") except Exception as e: return f"Error detecting emotion: {str(e)} 💥" # Sentiment Analysis Function sentiment_tokenizer = AutoTokenizer.from_pretrained("cardiffnlp/twitter-roberta-base-sentiment") sentiment_model = AutoModelForSequenceClassification.from_pretrained("cardiffnlp/twitter-roberta-base-sentiment") def analyze_sentiment(user_input): """Analyze sentiment based on input.""" inputs = sentiment_tokenizer(user_input, return_tensors="pt") try: with torch.no_grad(): outputs = sentiment_model(**inputs) sentiment = torch.argmax(outputs.logits, dim=1).item() sentiment_map = ["Negative 😔", "Neutral 😐", "Positive 😊"] return sentiment_map[sentiment] except Exception as e: return f"Error in sentiment analysis: {str(e)} 💥" # Suggestions Based on Emotion def generate_suggestions(emotion): suggestions_map = { "😊 Joy": [ {"Title": "Mindful Meditation 🧘", "Link": "https://www.helpguide.org/meditation"}, {"Title": "Learn a New Skill ✨", "Link": "https://www.skillshare.com/"}, ], "😢 Sadness": [ {"Title": "Talk to a Professional 💬", "Link": "https://www.betterhelp.com/"}, {"Title": "Mental Health Toolkit 🛠️", "Link": "https://www.psychologytoday.com/"}, ], "😠 Anger": [ {"Title": "Anger Management Tips 🔥", "Link": "https://www.mentalhealth.org.uk"}, {"Title": "Stress Relieving Exercises 🌿", "Link": "https://www.calm.com/"}, ], } return suggestions_map.get(emotion, [{"Title": "General Wellness Resources 🌈", "Link": "https://www.helpguide.org/wellness"}]) # Dummy Nearby Professionals Function def search_nearby_professionals(location, query): """Simulates the search for nearby professionals.""" if location and query: return [ {"Name": "Wellness Center", "Address": "123 Wellness Way"}, {"Name": "Mental Health Clinic", "Address": "456 Recovery Road"}, {"Name": "Therapy Hub", "Address": "789 Peace Avenue"}, ] return [] # Main App Logic def well_being_app(user_input, location, query, history): """Handles chatbot interaction, emotion detection, sentiment analysis, and professional search results.""" # Chatbot Response history, _ = chatbot_response(user_input, history) # Emotion Detection emotion = detect_emotion(user_input) # Sentiment Analysis sentiment = analyze_sentiment(user_input) # Emotion-based Suggestions emotion_name = emotion.split(": ")[-1] suggestions = generate_suggestions(emotion_name) suggestions_df = pd.DataFrame(suggestions) # Nearby Professionals Lookup professionals = search_nearby_professionals(location, query) return history, sentiment, emotion, suggestions_df, professionals # Gradio Interface with gr.Blocks() as interface: gr.Markdown("## 🌱 Well-being Companion") gr.Markdown("> Empowering Your Health! 💚") with gr.Row(): user_input = gr.Textbox(label="Your Message", placeholder="How are you feeling today? (e.g. I feel happy)") location_input = gr.Textbox(label="Location", placeholder="Enter your city (e.g., New York)") query_input = gr.Textbox(label="Search Query", placeholder="What are you searching for? (e.g., therapists)") submit_button = gr.Button("Submit", variant="primary") # Chatbot Section chatbot_output = gr.Chatbot(label="Chatbot Interaction", type="messages", value=[]) # Sentiment and Emotion Outputs sentiment_output = gr.Textbox(label="Sentiment Analysis") emotion_output = gr.Textbox(label="Emotion Detected") # Suggestions Table suggestions_output = gr.DataFrame(label="Suggestions", value=[], headers=["Title", "Link"]) # Professionals Table nearby_professionals_output = gr.DataFrame(label="Nearby Professionals", value=[], headers=["Name", "Address"]) # Connect Inputs to Outputs submit_button.click( well_being_app, inputs=[user_input, location_input, query_input, chatbot_output], outputs=[ chatbot_output, sentiment_output, emotion_output, suggestions_output, nearby_professionals_output, ], ) # Run Gradio Application interface.launch()