Spaces:
Sleeping
Sleeping
import gradio as gr | |
import pandas as pd | |
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 os | |
import base64 | |
import torch # Added missing import for torch | |
from PIL import Image | |
# Disable GPU usage for TensorFlow | |
os.environ['CUDA_VISIBLE_DEVICES'] = '-1' | |
# Ensure necessary NLTK resources are downloaded | |
nltk.download('punkt') | |
# Initialize the stemmer | |
stemmer = LancasterStemmer() | |
# Load intents.json for Well-Being Chatbot | |
with open("intents.json") as file: | |
data = json.load(file) | |
# Load preprocessed data for Well-Being Chatbot | |
with open("data.pickle", "rb") as f: | |
words, labels, training, output = pickle.load(f) | |
# Build the model structure for Well-Being Chatbot | |
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) | |
# Load the trained model | |
model = tflearn.DNN(net) | |
model.load("MentalHealthChatBotmodel.tflearn") | |
# Function to process user input into a bag-of-words format for Chatbot | |
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.lower() in words] | |
for se in s_words: | |
for i, w in enumerate(words): | |
if w == se: | |
bag[i] = 1 | |
return np.array(bag) | |
# Chat function for Well-Being Chatbot | |
def chatbot(message, history): | |
history = history or [] | |
message = message.lower() | |
try: | |
# Predict the tag | |
results = model.predict([bag_of_words(message, words)]) | |
results_index = np.argmax(results) | |
tag = labels[results_index] | |
# Match tag with intent and choose a random response | |
for tg in data["intents"]: | |
if tg['tag'] == tag: | |
responses = tg['responses'] | |
response = random.choice(responses) | |
break | |
else: | |
response = "I'm sorry, I didn't understand that. Could you please rephrase?" | |
except Exception as e: | |
print(f"Error in chatbot: {e}") # For debugging | |
response = f"An error occurred: {str(e)}" | |
# Convert the new message and response to the 'messages' format | |
history.append({"role": "user", "content": message}) | |
history.append({"role": "assistant", "content": response}) | |
return history, history | |
# Sentiment Analysis using Hugging Face model | |
tokenizer_sentiment = AutoTokenizer.from_pretrained("cardiffnlp/twitter-roberta-base-sentiment") | |
model_sentiment = AutoModelForSequenceClassification.from_pretrained("cardiffnlp/twitter-roberta-base-sentiment") | |
def analyze_sentiment(user_input): | |
inputs = tokenizer_sentiment(user_input, return_tensors="pt") | |
with torch.no_grad(): | |
outputs = model_sentiment(**inputs) | |
predicted_class = torch.argmax(outputs.logits, dim=1).item() | |
sentiment = ["Negative", "Neutral", "Positive"][predicted_class] | |
return f"Predicted Sentiment: {sentiment}" | |
# Emotion Detection using Hugging Face model | |
tokenizer_emotion = AutoTokenizer.from_pretrained("j-hartmann/emotion-english-distilroberta-base") | |
model_emotion = AutoModelForSequenceClassification.from_pretrained("j-hartmann/emotion-english-distilroberta-base") | |
def detect_emotion(user_input): | |
pipe = pipeline("text-classification", model=model_emotion, tokenizer=tokenizer_emotion) | |
result = pipe(user_input) | |
emotion = result[0]['label'] | |
return f"Emotion Detected: {emotion}" | |
# Function to generate suggestions based on detected emotion | |
def generate_suggestions(emotion): | |
suggestions = { | |
'joy': ["Stay positive! Keep up the good mood.", "Try some relaxing activities like meditation."], | |
'anger': ["It's okay to be angry, try to breathe and relax.", "Exercise can help release tension."], | |
'fear': ["Take deep breaths, you are in control.", "Try mindfulness exercises to calm your mind."], | |
'sadness': ["Take a break, it's okay to feel down sometimes.", "Consider reaching out to a friend or loved one."], | |
'surprise': ["Take a moment to reflect, things might seem overwhelming.", "Practice mindfulness to regain balance."], | |
'disgust': ["It's okay to feel disgust, try to identify the cause.", "Taking a short walk might help clear your mind."] | |
} | |
return pd.DataFrame(suggestions.get(emotion, ["Stay positive!"])) | |
# Function to get nearby health professionals and create a map | |
def get_health_professionals_and_map(location, health_professional_query): | |
# Use Google Maps API to get health professionals (example setup) | |
gmaps = googlemaps.Client(key="YOUR_GOOGLE_API_KEY") | |
places = gmaps.places(query=health_professional_query, location=location) | |
if places['status'] == 'OK': | |
results = places['results'] | |
route_info = "\n".join([place['name'] for place in results]) | |
map_html = create_map(results) | |
return route_info, map_html | |
return "No professionals found.", None | |
def create_map(places): | |
m = folium.Map(location=[places[0]['geometry']['location']['lat'], places[0]['geometry']['location']['lng']], zoom_start=13) | |
for place in places: | |
folium.Marker([place['geometry']['location']['lat'], place['geometry']['location']['lng']], | |
popup=place['name']).add_to(m) | |
map_html = m._repr_html_() | |
return map_html | |
# Custom CSS styling for Gradio interface | |
css = """ | |
body { | |
font-family: 'Roboto', sans-serif; | |
} | |
.gradio-container { | |
background-color: #f0f0f0; | |
font-size: 16px; | |
} | |
.gradio-input, .gradio-output { | |
padding: 15px; | |
border-radius: 10px; | |
background-color: #ffffff; | |
border: 2px solid #ccc; | |
} | |
.gradio-container .gradio-button { | |
background-color: #007BFF; | |
color: white; | |
border-radius: 5px; | |
padding: 10px 15px; | |
} | |
.gradio-container .gradio-button:hover { | |
background-color: #0056b3; | |
} | |
.gradio-container h3 { | |
color: #333; | |
} | |
.gradio-output .output { | |
border-top: 3px solid #ddd; | |
padding-top: 10px; | |
} | |
.gradio-input input { | |
color: #333; | |
} | |
.gradio-input textarea { | |
color: #333; | |
} | |
""" | |
# Gradio interface components | |
def gradio_app(message, current_location, health_professional_query, history): | |
# Detect sentiment and emotion | |
sentiment = analyze_sentiment(message) | |
emotion = detect_emotion(message) | |
# Generate suggestions based on emotion | |
suggestions_df = generate_suggestions(emotion) | |
# Get health professionals details and map | |
route_info, map_html = get_health_professionals_and_map(current_location, health_professional_query) | |
# Add emoticon for emotion | |
emotion_emoticons = { | |
'joy': 'π', | |
'anger': 'π‘', | |
'fear': 'π¨', | |
'sadness': 'π’', | |
'surprise': 'π²', | |
'disgust': 'π€’' | |
} | |
emotion_icon = emotion_emoticons.get(emotion, 'π') | |
return sentiment, f"{emotion_icon} {emotion}", suggestions_df, route_info, map_html, history | |
# Gradio interface setup | |
iface = gr.Interface( | |
fn=gradio_app, | |
inputs=[ | |
gr.Textbox(lines=2, placeholder="Enter your message..."), | |
gr.Textbox(lines=2, placeholder="Enter your current location..."), | |
gr.Textbox(lines=2, placeholder="Enter health professional query..."), | |
gr.State(value=[]) | |
], | |
outputs=[ | |
gr.Textbox(label="Sentiment Analysis"), | |
gr.Textbox(label="Detected Emotion"), | |
gr.Dataframe(label="Suggestions"), | |
gr.Textbox(label="Nearby Health Professionals"), | |
gr.HTML(label="Map of Health Professionals"), | |
gr.State(value=[]) | |
], | |
live=True, | |
allow_flagging="never", | |
theme="huggingface", | |
css=css # Apply custom CSS styling | |
) | |
# Launch Gradio interface | |
iface.launch(share=True) | |