PranayChamala commited on
Commit
37f8d03
·
1 Parent(s): ad7332d

Made changes to chatbot.py

Browse files
Files changed (1) hide show
  1. app/chatbot.py +106 -56
app/chatbot.py CHANGED
@@ -66,7 +66,7 @@ def extract_symptoms_ner(text):
66
  def is_affirmative(answer):
67
  answer_lower = answer.lower()
68
  return any(word in answer_lower for word in ["yes", "yeah", "yep", "certainly", "sometimes", "a little"])
69
-
70
  # -------------------------------
71
  # Chatbot session class
72
  # -------------------------------
@@ -74,76 +74,126 @@ class ChatbotSession:
74
  def __init__(self):
75
  self.conversation_history = []
76
  self.reported_symptoms = set()
 
77
  self.asked_missing = set()
78
  self.awaiting_followup = None
79
- self.state = "symptom_collection" # states: symptom_collection, pain, medications
80
- # Initial greeting
81
- greeting = "Doctor: Hello, I am your virtual doctor. What brought you in today?"
82
- self.conversation_history.append(greeting)
83
  self.finished = False
 
 
 
84
 
85
  def process_message(self, message: str) -> str:
86
- # State: collecting symptoms
 
 
87
  if self.state == "symptom_collection":
88
- if message.lower() in ["exit", "quit", "no"]:
89
- self.state = "pain"
90
- prompt = "Doctor: Do you experience any pain or aches? Please rate the pain on a scale of 1 to 10 (or type 'no' if none):"
91
- self.conversation_history.append(prompt)
92
- return prompt
93
- # If we are waiting on a follow-up about a specific symptom
94
- if self.awaiting_followup:
95
- if is_affirmative(message):
96
- self.reported_symptoms.add(self.awaiting_followup)
97
- self.asked_missing.add(self.awaiting_followup)
98
- self.awaiting_followup = None
 
 
 
 
 
 
 
 
99
  else:
100
- # Extract symptoms from message text
101
- ner_results = extract_symptoms_ner(message)
102
- for sym in ner_results:
103
- if sym not in self.reported_symptoms:
104
- self.reported_symptoms.add(sym)
105
- # Update predicted disease
106
- predicted_disease = find_closest_disease(list(self.reported_symptoms)) if self.reported_symptoms else None
107
- # Check for missing symptoms if a disease is predicted
108
- if predicted_disease:
109
- expected = set(disease_symptoms.get(predicted_disease, []))
 
 
 
 
 
 
110
  missing = expected - self.reported_symptoms
111
  not_asked = missing - self.asked_missing
 
112
  if not_asked:
113
  symptom_to_ask = list(not_asked)[0]
114
- followup = f"Are you also experiencing {symptom_to_ask}?"
115
- self.conversation_history.append("Doctor: " + followup)
116
  self.awaiting_followup = symptom_to_ask
117
- return followup
118
- prompt = "Doctor: Do you have any other symptoms you'd like to mention?"
119
- self.conversation_history.append(prompt)
120
- return prompt
121
-
122
- # State: asking about pain
123
- elif self.state == "pain":
124
- try:
125
- self.pain_level = int(message)
126
- except ValueError:
127
- self.pain_level = message
128
- self.state = "medications"
129
- prompt = "Doctor: Have you taken any medications recently? If yes, please specify (or type 'no' if none):"
130
- self.conversation_history.append(prompt)
131
- return prompt
132
-
133
- # State: asking about medications
134
- elif self.state == "medications":
135
- self.medications = message if message.lower() not in ["no", "none"] else "None"
136
- closing = "Doctor: Thank you for providing all the information."
137
- self.conversation_history.append(closing)
138
- self.finished = True
139
- return closing
140
-
141
- return "Doctor: I'm sorry, I didn't understand that."
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
142
 
143
  def get_data(self):
144
  return {
145
  "conversation": self.conversation_history,
146
  "symptoms": list(self.reported_symptoms),
147
- "pain_level": getattr(self, "pain_level", None),
148
- "medications": getattr(self, "medications", None)
149
  }
 
66
  def is_affirmative(answer):
67
  answer_lower = answer.lower()
68
  return any(word in answer_lower for word in ["yes", "yeah", "yep", "certainly", "sometimes", "a little"])
69
+ import random
70
  # -------------------------------
71
  # Chatbot session class
72
  # -------------------------------
 
74
  def __init__(self):
75
  self.conversation_history = []
76
  self.reported_symptoms = set()
77
+ self.symptom_details = {} # New: Track details per symptom
78
  self.asked_missing = set()
79
  self.awaiting_followup = None
80
+ self.awaiting_detail = None
81
+ self.current_detail_symptom = None
82
+ self.state = "symptom_collection"
 
83
  self.finished = False
84
+ self.predicted_disease = None
85
+ greeting = "Doctor: Hello, I am your virtual doctor. What symptoms are you experiencing today?"
86
+ self.conversation_history.append(greeting)
87
 
88
  def process_message(self, message: str) -> str:
89
+ if self.finished:
90
+ return "Doctor: Thank you. Our session has ended."
91
+
92
  if self.state == "symptom_collection":
93
+ return self._handle_symptom_collection(message)
94
+
95
+ if self.state == "symptom_detail":
96
+ return self._handle_symptom_detail(message)
97
+
98
+ if self.state == "pain_check":
99
+ return self._handle_pain_check(message)
100
+
101
+ if self.state == "medications":
102
+ return self._handle_medications(message)
103
+
104
+ return "Doctor: Could you please clarify?"
105
+
106
+ def _handle_symptom_collection(self, message):
107
+ if message.lower() in ["exit", "quit", "no"]:
108
+ if not self.reported_symptoms:
109
+ goodbye = "Doctor: It seems no symptoms were reported. Ending the session."
110
+ self.finished = True
111
+ return goodbye
112
  else:
113
+ self.predicted_disease = find_closest_disease(list(self.reported_symptoms))
114
+ self.state = "pain_check"
115
+ return f"Doctor: Before proceeding, are you experiencing any pain? If yes, please rate it 1-10 or type 'no'."
116
+
117
+ # Extract symptoms
118
+ ner_results = extract_symptoms_ner(message)
119
+ if ner_results:
120
+ for sym in ner_results:
121
+ if sym not in self.reported_symptoms:
122
+ self.reported_symptoms.add(sym)
123
+ self.symptom_details[sym] = {}
124
+
125
+ # Update disease prediction
126
+ self.predicted_disease = find_closest_disease(list(self.reported_symptoms))
127
+ if self.predicted_disease:
128
+ expected = set(disease_symptoms.get(self.predicted_disease, []))
129
  missing = expected - self.reported_symptoms
130
  not_asked = missing - self.asked_missing
131
+
132
  if not_asked:
133
  symptom_to_ask = list(not_asked)[0]
 
 
134
  self.awaiting_followup = symptom_to_ask
135
+ return f"Doctor: Are you also experiencing {symptom_to_ask}?"
136
+
137
+ # If all covered, ask symptom details
138
+ if self.reported_symptoms:
139
+ symptom = random.choice(list(self.reported_symptoms))
140
+ self.current_detail_symptom = symptom
141
+ self.state = "symptom_detail"
142
+ return f"Doctor: About your '{symptom}', when did it start? (duration)"
143
+
144
+ else:
145
+ return "Doctor: I couldn't detect any medical symptoms. Could you describe it differently?"
146
+
147
+ return "Doctor: Do you have any more symptoms to share?"
148
+
149
+ def _handle_symptom_detail(self, message):
150
+ if self.current_detail_symptom and 'duration' not in self.symptom_details[self.current_detail_symptom]:
151
+ self.symptom_details[self.current_detail_symptom]['duration'] = message
152
+ return f"Doctor: How severe is the '{self.current_detail_symptom}'? (mild/moderate/severe)"
153
+
154
+ if self.current_detail_symptom and 'severity' not in self.symptom_details[self.current_detail_symptom]:
155
+ self.symptom_details[self.current_detail_symptom]['severity'] = message
156
+ return f"Doctor: Where exactly do you feel the '{self.current_detail_symptom}' (body part/location)?"
157
+
158
+ if self.current_detail_symptom and 'location' not in self.symptom_details[self.current_detail_symptom]:
159
+ self.symptom_details[self.current_detail_symptom]['location'] = message
160
+ self.state = "symptom_collection"
161
+ return "Doctor: Thank you. Any other symptoms you'd like to mention?"
162
+
163
+ return "Doctor: Please clarify."
164
+
165
+ def _handle_pain_check(self, message):
166
+ try:
167
+ pain_level = int(message)
168
+ self.symptom_details['pain'] = {'severity': pain_level}
169
+ except ValueError:
170
+ self.symptom_details['pain'] = {'severity': message}
171
+
172
+ self.state = "medications"
173
+ return "Doctor: Have you taken any medications recently? Please mention them or type 'no'."
174
+
175
+ def _handle_medications(self, message):
176
+ self.symptom_details['medications'] = message if message.lower() not in ["no", "none"] else "None"
177
+ self.finished = True
178
+
179
+ summary = self._generate_summary()
180
+ return summary
181
+
182
+ def _generate_summary(self):
183
+ report = "\n".join([
184
+ f"- {sym.title()}: {details}" if isinstance(details, dict) else f"- {sym.title()}: {details}"
185
+ for sym, details in self.symptom_details.items()
186
+ ])
187
+
188
+ disease_part = f"\n\nDoctor: Based on your symptoms, the most likely condition could be *{self.predicted_disease}*." if self.predicted_disease else ""
189
+ advice = "\n\nDoctor: Please note this is a preliminary assessment. Kindly consult a physician for a detailed diagnosis."
190
+
191
+ return f"Doctor: Thank you for the information! Here's a summary of your case:\n{report}{disease_part}{advice}"
192
 
193
  def get_data(self):
194
  return {
195
  "conversation": self.conversation_history,
196
  "symptoms": list(self.reported_symptoms),
197
+ "symptom_details": self.symptom_details,
198
+ "predicted_disease": self.predicted_disease
199
  }