Spaces:
Runtime error
Runtime error
| import os | |
| 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 googlemaps | |
| import folium | |
| import torch | |
| import streamlit as st | |
| # Suppress TensorFlow warnings | |
| os.environ["CUDA_VISIBLE_DEVICES"] = "-1" | |
| os.environ["TF_CPP_MIN_LOG_LEVEL"] = "3" | |
| # Download necessary NLTK resources | |
| nltk.download("punkt") | |
| stemmer = LancasterStemmer() | |
| # Load intents and chatbot training data | |
| with open("intents.json") as file: | |
| intents_data = json.load(file) | |
| with open("data.pickle", "rb") as f: | |
| words, labels, training, output = pickle.load(f) | |
| # Build the 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) | |
| chatbot_model = tflearn.DNN(net) | |
| chatbot_model.load("MentalHealthChatBotmodel.tflearn") | |
| # Hugging Face sentiment and emotion models | |
| tokenizer_sentiment = AutoTokenizer.from_pretrained("cardiffnlp/twitter-roberta-base-sentiment") | |
| model_sentiment = AutoModelForSequenceClassification.from_pretrained("cardiffnlp/twitter-roberta-base-sentiment") | |
| tokenizer_emotion = AutoTokenizer.from_pretrained("j-hartmann/emotion-english-distilroberta-base") | |
| model_emotion = AutoModelForSequenceClassification.from_pretrained("j-hartmann/emotion-english-distilroberta-base") | |
| # Google Maps API Client | |
| gmaps = googlemaps.Client(key=os.getenv("GOOGLE_API_KEY")) | |
| # Helper Functions | |
| def bag_of_words(s, words): | |
| """Convert user input to bag-of-words vector.""" | |
| bag = [0] * 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) | |
| def generate_chatbot_response(message, history): | |
| """Generate chatbot response and maintain conversation history.""" | |
| history = history or [] | |
| try: | |
| result = chatbot_model.predict([bag_of_words(message, words)]) | |
| tag = labels[np.argmax(result)] | |
| response = "I'm sorry, 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: {e}" | |
| history.append((message, response)) | |
| return history, response | |
| def analyze_sentiment(user_input): | |
| """Analyze sentiment and map to emojis.""" | |
| inputs = tokenizer_sentiment(user_input, return_tensors="pt") | |
| with torch.no_grad(): | |
| outputs = model_sentiment(**inputs) | |
| sentiment_class = torch.argmax(outputs.logits, dim=1).item() | |
| sentiment_map = ["Negative π", "Neutral π", "Positive π"] | |
| return f"Sentiment: {sentiment_map[sentiment_class]}" | |
| def detect_emotion(user_input): | |
| """Detect emotions based on input.""" | |
| pipe = pipeline("text-classification", model=model_emotion, tokenizer=tokenizer_emotion) | |
| result = pipe(user_input) | |
| emotion = result[0]["label"].lower().strip() | |
| emotion_map = { | |
| "joy": "Joy π", | |
| "anger": "Anger π ", | |
| "sadness": "Sadness π’", | |
| "fear": "Fear π¨", | |
| "surprise": "Surprise π²", | |
| "neutral": "Neutral π", | |
| } | |
| return emotion_map.get(emotion, "Unknown π€"), emotion | |
| def generate_suggestions(emotion): | |
| """Return relevant suggestions based on detected emotions.""" | |
| emotion_key = emotion.lower() | |
| suggestions = { | |
| "joy": [ | |
| ["Relaxation Techniques", "https://www.helpguide.org/mental-health/meditation/mindful-breathing-meditation"], | |
| ["Dealing with Stress", "https://www.helpguide.org/mental-health/anxiety/tips-for-dealing-with-anxiety"], | |
| ["Emotional Wellness Toolkit", "https://www.nih.gov/health-information/emotional-wellness-toolkit"], | |
| ["Relaxation Video", "https://youtu.be/m1vaUGtyo-A"], | |
| ], | |
| "anger": [ | |
| ["Emotional Wellness Toolkit", "https://www.nih.gov/health-information/emotional-wellness-toolkit"], | |
| ["Stress Management Tips", "https://www.health.harvard.edu/health-a-to-z"], | |
| ["Dealing with Anger", "https://www.helpguide.org/mental-health/anxiety/tips-for-dealing-with-anxiety"], | |
| ["Relaxation Video", "https://youtu.be/MIc299Flibs"], | |
| ], | |
| "fear": [ | |
| ["Mindfulness Practices", "https://www.helpguide.org/mental-health/meditation/mindful-breathing-meditation"], | |
| ["Coping with Anxiety", "https://www.helpguide.org/mental-health/anxiety/tips-for-dealing-with-anxiety"], | |
| ["Emotional Wellness Toolkit", "https://www.nih.gov/health-information/emotional-wellness-toolkit"], | |
| ["Relaxation Video", "https://youtu.be/yGKKz185M5o"], | |
| ], | |
| "sadness": [ | |
| ["Emotional Wellness Toolkit", "https://www.nih.gov/health-information/emotional-wellness-toolkit"], | |
| ["Dealing with Anxiety", "https://www.helpguide.org/mental-health/anxiety/tips-for-dealing-with-anxiety"], | |
| ["Relaxation Video", "https://youtu.be/-e-4Kx5px_I"], | |
| ], | |
| "surprise": [ | |
| ["Managing Stress", "https://www.health.harvard.edu/health-a-to-z"], | |
| ["Coping Strategies", "https://www.helpguide.org/mental-health/anxiety/tips-for-dealing-with-anxiety"], | |
| ["Relaxation Video", "https://youtu.be/m1vaUGtyo-A"], | |
| ], | |
| } | |
| # Format the output to include HTML anchor tags | |
| formatted_suggestions = [ | |
| [title, f'<a href="{link}" target="_blank">{link}</a>'] for title, link in suggestions.get(emotion_key, [["No specific suggestions available.", "#"]]) | |
| ] | |
| return formatted_suggestions | |
| def get_health_professionals_and_map(location, query): | |
| """Search nearby healthcare professionals using Google Maps API.""" | |
| try: | |
| if not location or not query: | |
| return [], "" # Return empty list if inputs are missing | |
| geo_location = gmaps.geocode(location) | |
| if geo_location: | |
| lat, lng = geo_location[0]["geometry"]["location"].values() | |
| places_result = gmaps.places_nearby(location=(lat, lng), radius=10000, keyword=query)["results"] | |
| professionals = [] | |
| map_ = folium.Map(location=(lat, lng), zoom_start=13) | |
| for place in places_result: | |
| # Use a list of values to append each professional | |
| professionals.append([place['name'], place.get('vicinity', 'No address provided')]) | |
| folium.Marker( | |
| location=[place["geometry"]["location"]["lat"], place["geometry"]["location"]["lng"]], | |
| popup=f"{place['name']}" | |
| ).add_to(map_) | |
| return professionals, map_._repr_html_() | |
| return [], "" # Return empty list if no professionals found | |
| except Exception as e: | |
| return [], "" # Return empty list on exception | |
| # Streamlit App Layout | |
| st.title("π Well-Being Companion") | |
| # Input fields | |
| user_input = st.text_input("Please Enter Your Message Here") | |
| location = st.text_input("Please Enter Your Current Location Here") | |
| query = st.text_input("Please Enter Which Health Professional You Want To Search Nearby") | |
| # Button to submit | |
| if st.button("Submit"): | |
| chatbot_history, _ = generate_chatbot_response(user_input, []) | |
| sentiment_result = analyze_sentiment(user_input) | |
| emotion_result, cleaned_emotion = detect_emotion(user_input) | |
| suggestions = generate_suggestions(cleaned_emotion) | |
| professionals, map_html = get_health_professionals_and_map(location, query) | |
| # Display chatbot conversation history | |
| st.subheader("Chat History") | |
| for message, response in chatbot_history: | |
| st.write(f"**You:** {message}") | |
| st.write(f"**Bot:** {response}") | |
| # Display sentiment | |
| st.subheader("Detected Sentiment") | |
| st.write(sentiment_result) | |
| # Display emotion | |
| st.subheader("Detected Emotion") | |
| st.write(emotion_result) | |
| # Display suggestions | |
| st.subheader("Suggestions") | |
| for suggestion, link in suggestions: | |
| st.write(f"[{suggestion}]({link})") | |
| # Display professionals | |
| st.subheader("Nearby Health Professionals") | |
| st.write(professionals) | |
| # Display map | |
| st.subheader("Interactive Map") | |
| st.components.v1.html(map_html, height=500) | |