DreamStream-1 commited on
Commit
5bd69d1
·
verified ·
1 Parent(s): 75f2c39

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +38 -133
app.py CHANGED
@@ -1,116 +1,51 @@
1
  import gradio as gr
2
- import nltk
3
- import numpy as np
4
- import tflearn
5
  import random
6
- import json
7
- import pickle
8
- import torch
9
- from nltk.tokenize import word_tokenize
10
- from nltk.stem.lancaster import LancasterStemmer
11
- from transformers import AutoTokenizer, AutoModelForSequenceClassification, pipeline
12
  import requests
13
- import geocoder # Use geocoder to get latitude/longitude from city
14
-
15
- # Ensure necessary NLTK resources are downloaded
16
- nltk.download('punkt')
17
-
18
- # Initialize the stemmer
19
- stemmer = LancasterStemmer()
20
-
21
- # Load intents.json
22
- try:
23
- with open("intents.json") as file:
24
- data = json.load(file)
25
- except FileNotFoundError:
26
- raise FileNotFoundError("Error: 'intents.json' file not found. Ensure it exists in the current directory.")
27
-
28
- # Load preprocessed data from pickle
29
- try:
30
- with open("data.pickle", "rb") as f:
31
- words, labels, training, output = pickle.load(f)
32
- except FileNotFoundError:
33
- raise FileNotFoundError("Error: 'data.pickle' file not found. Ensure it exists and matches the model.")
34
-
35
- # Build the model structure
36
- net = tflearn.input_data(shape=[None, len(training[0])])
37
- net = tflearn.fully_connected(net, 8)
38
- net = tflearn.fully_connected(net, 8)
39
- net = tflearn.fully_connected(net, len(output[0]), activation="softmax")
40
- net = tflearn.regression(net)
41
-
42
- # Load the trained model
43
- model = tflearn.DNN(net)
44
- try:
45
- model.load("MentalHealthChatBotmodel.tflearn")
46
- except FileNotFoundError:
47
- raise FileNotFoundError("Error: Trained model file 'MentalHealthChatBotmodel.tflearn' not found.")
48
 
49
- # Function to process user input into a bag-of-words format
50
- def bag_of_words(s, words):
51
- bag = [0 for _ in range(len(words))]
52
- s_words = word_tokenize(s)
53
- s_words = [stemmer.stem(word.lower()) for word in s_words if word.lower() in words]
54
- for se in s_words:
55
- for i, w in enumerate(words):
56
- if w == se:
57
- bag[i] = 1
58
- return np.array(bag)
59
 
60
- # Chat function
61
- def chat(message, history, state):
62
- history = history or []
63
- message = message.lower()
64
- try:
65
- # Predict the tag
66
- results = model.predict([bag_of_words(message, words)])
67
- results_index = np.argmax(results)
68
- tag = labels[results_index]
69
-
70
- # Match tag with intent and choose a random response
71
- for tg in data["intents"]:
72
- if tg['tag'] == tag:
73
- responses = tg['responses']
74
- response = random.choice(responses)
75
- break
76
- else:
77
- response = "I'm sorry, I didn't understand that. Could you please rephrase?"
78
 
79
- # Add emoticons to the response
80
- emoticon_dict = {
81
- "joy": "😊",
82
- "anger": "😡",
83
- "fear": "😨",
84
- "sadness": "😔",
85
- "surprise": "😲",
86
- "neutral": "😐"
87
- }
 
88
 
89
- # Add the emotion-related emoticon to the response
90
- for tg in data["intents"]:
91
- if tg['tag'] == tag:
92
- emotion = tg.get('emotion', 'neutral') # Default to neutral if no emotion is defined
93
- response = f"{response} {emoticon_dict.get(emotion, '😐')}"
94
- break
 
 
 
 
 
 
 
 
95
 
96
- history.append((message, response))
97
-
98
- # Transition to the next feature (sentiment analysis)
99
- state['step'] = 2 # Move to sentiment analysis
100
- except Exception as e:
101
- response = f"An error occurred: {str(e)}"
102
-
103
- return history, history, state
104
-
105
- # Load pre-trained model and tokenizer for sentiment analysis
106
- tokenizer = AutoTokenizer.from_pretrained("cardiffnlp/twitter-roberta-base-sentiment")
107
- sentiment_model = AutoModelForSequenceClassification.from_pretrained("cardiffnlp/twitter-roberta-base-sentiment")
108
 
109
  # Function for sentiment analysis
110
  def analyze_sentiment(text, state):
111
- if state is None:
112
- state = {'step': 1}
113
-
114
  inputs = tokenizer(text, return_tensors="pt")
115
  with torch.no_grad():
116
  outputs = sentiment_model(**inputs)
@@ -129,10 +64,6 @@ def analyze_sentiment(text, state):
129
  state['step'] = 3 # Move to emotion detection and suggestions
130
  return sentiment_with_emoji, state
131
 
132
- # Load pre-trained model and tokenizer for emotion detection
133
- emotion_tokenizer = AutoTokenizer.from_pretrained("j-hartmann/emotion-english-distilroberta-base")
134
- emotion_model = AutoModelForSequenceClassification.from_pretrained("j-hartmann/emotion-english-distilroberta-base")
135
-
136
  # Function for emotion detection and suggestions
137
  def detect_emotion(text, state):
138
  pipe = pipeline("text-classification", model=emotion_model, tokenizer=emotion_tokenizer)
@@ -194,32 +125,6 @@ def provide_suggestions(emotion):
194
  # Ensure we return a message even if no articles/videos are found
195
  return resources.get(emotion, {'message': "Stay calm. 🙂", 'articles': ["[General Wellbeing Tips](https://www.helpguide.org)"], 'videos': []})
196
 
197
- # Function to fetch wellness professionals based on location
198
- def get_wellness_professionals(location):
199
- # Use Geocoder to get latitude/longitude from city
200
- g = geocoder.osm(location)
201
- if g.ok:
202
- latitude, longitude = g.latlng
203
- google_api_url = f"https://maps.googleapis.com/maps/api/place/nearbysearch/json?location={latitude},{longitude}&radius=5000&type=health&key=YOUR_GOOGLE_API_KEY"
204
-
205
- response = requests.get(google_api_url)
206
- data = response.json()
207
-
208
- professionals = []
209
- if 'results' in data:
210
- for place in data['results']:
211
- name = place['name']
212
- address = place.get('vicinity', 'No address available')
213
- url = place.get('website', '#')
214
- professionals.append(f"**{name}** - {address} - [Visit Website]({url})")
215
-
216
- if not professionals:
217
- professionals.append("No wellness professionals found nearby.")
218
-
219
- return "\n".join(professionals)
220
- else:
221
- return "Couldn't fetch your location. Please make sure you entered a valid location."
222
-
223
  # Function to ask for location and provide wellness professionals
224
  def search_wellness_professionals(location, state):
225
  professionals = get_wellness_professionals(location)
@@ -246,4 +151,4 @@ def create_ui():
246
 
247
  # Launch Gradio interface
248
  demo = create_ui()
249
- demo.launch(debug=True)
 
1
  import gradio as gr
 
 
 
2
  import random
 
 
 
 
 
 
3
  import requests
4
+ from transformers import AutoTokenizer, AutoModelForSequenceClassification, pipeline
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5
 
6
+ # Replace with your Google Maps API and Places API Key
7
+ GOOGLE_API_KEY = "GOOGLE_API_KEY"
 
 
 
 
 
 
 
 
8
 
9
+ # Load pre-trained models for sentiment and emotion detection
10
+ tokenizer = AutoTokenizer.from_pretrained("cardiffnlp/twitter-roberta-base-sentiment")
11
+ sentiment_model = AutoModelForSequenceClassification.from_pretrained("cardiffnlp/twitter-roberta-base-sentiment")
12
+ emotion_tokenizer = AutoTokenizer.from_pretrained("j-hartmann/emotion-english-distilroberta-base")
13
+ emotion_model = AutoModelForSequenceClassification.from_pretrained("j-hartmann/emotion-english-distilroberta-base")
 
 
 
 
 
 
 
 
 
 
 
 
 
14
 
15
+ # Function to get latitude and longitude from city using Google Maps Geocoding API
16
+ def get_lat_lng_from_city(city):
17
+ geocode_url = f"https://maps.googleapis.com/maps/api/geocode/json?address={city}&key={GOOGLE_API_KEY}"
18
+ response = requests.get(geocode_url)
19
+ data = response.json()
20
+ if data["status"] == "OK":
21
+ lat_lng = data["results"][0]["geometry"]["location"]
22
+ return lat_lng["lat"], lat_lng["lng"]
23
+ else:
24
+ return None, None
25
 
26
+ # Function to get wellness professionals using Google Places API
27
+ def get_wellness_professionals(location):
28
+ lat, lng = get_lat_lng_from_city(location)
29
+ if lat and lng:
30
+ places_url = f"https://maps.googleapis.com/maps/api/place/nearbysearch/json?location={lat},{lng}&radius=5000&type=health&key={GOOGLE_API_KEY}"
31
+ response = requests.get(places_url)
32
+ data = response.json()
33
+ professionals = []
34
+ if 'results' in data:
35
+ for place in data['results']:
36
+ name = place['name']
37
+ address = place.get('vicinity', 'No address available')
38
+ url = place.get('website', '#')
39
+ professionals.append(f"**{name}** - {address} - [Visit Website]({url})")
40
 
41
+ if not professionals:
42
+ professionals.append("No wellness professionals found nearby.")
43
+ return "\n".join(professionals)
44
+ else:
45
+ return "Couldn't fetch your location. Please make sure you entered a valid location."
 
 
 
 
 
 
 
46
 
47
  # Function for sentiment analysis
48
  def analyze_sentiment(text, state):
 
 
 
49
  inputs = tokenizer(text, return_tensors="pt")
50
  with torch.no_grad():
51
  outputs = sentiment_model(**inputs)
 
64
  state['step'] = 3 # Move to emotion detection and suggestions
65
  return sentiment_with_emoji, state
66
 
 
 
 
 
67
  # Function for emotion detection and suggestions
68
  def detect_emotion(text, state):
69
  pipe = pipeline("text-classification", model=emotion_model, tokenizer=emotion_tokenizer)
 
125
  # Ensure we return a message even if no articles/videos are found
126
  return resources.get(emotion, {'message': "Stay calm. 🙂", 'articles': ["[General Wellbeing Tips](https://www.helpguide.org)"], 'videos': []})
127
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
128
  # Function to ask for location and provide wellness professionals
129
  def search_wellness_professionals(location, state):
130
  professionals = get_wellness_professionals(location)
 
151
 
152
  # Launch Gradio interface
153
  demo = create_ui()
154
+ demo.launch(debug=True)