Testing / app.py
DreamStream-1's picture
Update app.py
fb2aab1 verified
raw
history blame
8.88 kB
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 googlemaps
import folium
import torch
# Suppress TensorFlow's GPU usage and 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")
# Sentiment and Emotion Detection 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 chatbot(message, history):
"""Generate chatbot response and append to chat history."""
history = history or []
try:
result = chatbot_model.predict([bag_of_words(message, words)])
tag = labels[np.argmax(result)]
response = "I'm not sure how to respond to 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 from user input."""
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 sentiment_map[sentiment_class]
def detect_emotion(user_input):
"""Detect user emotion with emoji representation."""
pipe = pipeline("text-classification", model=model_emotion, tokenizer=tokenizer_emotion)
result = pipe(user_input)
emotion = result[0]["label"].lower()
emotion_map = {
"joy": "😊 Joy",
"anger": "😠 Anger",
"sadness": "😒 Sadness",
"fear": "😨 Fear",
"surprise": "😲 Surprise",
"neutral": "😐 Neutral",
}
return emotion_map.get(emotion, "Unknown πŸ€”")
def generate_suggestions(emotion):
"""Provide suggestions based on the detected emotion."""
suggestions = {
"joy": [
["Relaxation Techniques", '<a href="https://www.helpguide.org/mental-health/meditation" target="_blank">Visit</a>'],
["Dealing with Stress", '<a href="https://www.helpguide.org/mental-health/anxiety" target="_blank">Visit</a>'],
["Emotional Wellness Toolkit", '<a href="https://www.nih.gov/health-information/emotional-wellness-toolkit" target="_blank">Visit</a>'],
["Relaxation Video", '<a href="https://youtu.be/m1vaUGtyo-A" target="_blank">Watch</a>'],
],
"anger": [
["Stress Management Tips", '<a href="https://www.health.harvard.edu" target="_blank">Visit</a>'],
["Relaxation Video", '<a href="https://youtu.be/MIc299Flibs" target="_blank">Watch</a>'],
],
"fear": [
["Coping with Anxiety", '<a href="https://www.helpguide.org/mental-health/anxiety" target="_blank">Visit</a>'],
["Mindfulness Techniques", '<a href="https://youtu.be/yGKKz185M5o" target="_blank">Watch</a>'],
],
"sadness": [
["Overcoming Sadness", '<a href="https://youtu.be/-e-4Kx5px_I" target="_blank">Watch</a>'],
],
"surprise": [
["Managing Surprises", '<a href="https://www.health.harvard.edu" target="_blank">Visit</a>'],
["Calm Relaxation", '<a href="https://youtu.be/m1vaUGtyo-A" target="_blank">Watch</a>'],
],
}
return suggestions.get(emotion.lower(), [["No suggestions are available.", ""]])
def get_health_professionals_and_map(location, query):
"""Search for nearby healthcare professionals and generate a map."""
try:
if not location or not query:
return ["Please provide a valid location and query."], ""
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:
professionals.append(f"{place['name']} - {place.get('vicinity', 'No address available')}")
folium.Marker(
location=[place["geometry"]["location"]["lat"], place["geometry"]["location"]["lng"]],
popup=f"{place['name']}"
).add_to(map_)
return professionals, map_._repr_html_()
return ["No professionals found for the given location."], ""
except Exception as e:
return [f"An error occurred: {str(e)}"], ""
# Main Application Logic
def app_function(user_message, location, query, history):
chatbot_history, _ = chatbot(user_message, history)
sentiment = analyze_sentiment(user_message)
emotion = detect_emotion(user_message)
suggestions = generate_suggestions(emotion)
professionals, map_html = get_health_professionals_and_map(location, query)
return chatbot_history, sentiment, emotion, suggestions, professionals, map_html
# Custom CSS for Dark Theme and Gradient Buttons
custom_css = """
body {
background: linear-gradient(135deg, #000000, #ff5722);
font-family: 'Roboto', sans-serif;
color: white;
}
button {
background: linear-gradient(45deg, #ff5722, #ff9800) !important;
border: none;
border-radius: 8px;
padding: 12px 20px;
cursor: pointer;
color: white;
font-size: 16px;
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.3);
}
button:hover {
background: linear-gradient(45deg, #ff9800, #ff5722) !important;
}
textarea, input {
background: black !important;
color: white !important;
padding: 12px;
border: 1px solid #ff5722 !important;
border-radius: 8px;
}
.gr-dataframe {
background-color: black !important;
color: white !important;
overflow-y: scroll;
height: 300px;
border: 1px solid #ff5722;
}
"""
# Gradio Interface
with gr.Blocks(css=custom_css) as app:
gr.Markdown("<h1 style='text-align: center;'>🌟 Well-Being Companion</h1>")
gr.Markdown("<h3 style='text-align: center;'>Empowering Your Mental Health Journey πŸ’š</h3>")
with gr.Row():
user_message = gr.Textbox(label="Your Message", placeholder="Enter your message...")
location = gr.Textbox(label="Your Location", placeholder="Enter your location...")
query = gr.Textbox(label="Health Query", placeholder="Search for health professionals...")
chatbot_history = gr.Chatbot(label="Chat History")
sentiment_output = gr.Textbox(label="Detected Sentiment")
emotion_output = gr.Textbox(label="Detected Emotion")
suggestions_table = gr.DataFrame(headers=["Suggestion", "Link"], label="Suggestions")
professionals_output = gr.Textbox(label="Nearby Health Professionals", lines=5)
map_output = gr.HTML(label="Map")
submit_button = gr.Button("Submit")
submit_button.click(
app_function,
inputs=[user_message, location, query, chatbot_history],
outputs=[chatbot_history, sentiment_output, emotion_output, suggestions_table, professionals_output, map_output]
)
app.launch()