Spaces:
Running
Running
Commit
·
37f8d03
1
Parent(s):
ad7332d
Made changes to chatbot.py
Browse files- 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.
|
80 |
-
|
81 |
-
|
82 |
-
self.conversation_history.append(greeting)
|
83 |
self.finished = False
|
|
|
|
|
|
|
84 |
|
85 |
def process_message(self, message: str) -> str:
|
86 |
-
|
|
|
|
|
87 |
if self.state == "symptom_collection":
|
88 |
-
|
89 |
-
|
90 |
-
|
91 |
-
|
92 |
-
|
93 |
-
|
94 |
-
|
95 |
-
|
96 |
-
|
97 |
-
|
98 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
99 |
else:
|
100 |
-
|
101 |
-
|
102 |
-
|
103 |
-
|
104 |
-
|
105 |
-
|
106 |
-
|
107 |
-
|
108 |
-
|
109 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
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
|
118 |
-
|
119 |
-
|
120 |
-
|
121 |
-
|
122 |
-
|
123 |
-
|
124 |
-
|
125 |
-
|
126 |
-
|
127 |
-
|
128 |
-
|
129 |
-
|
130 |
-
|
131 |
-
|
132 |
-
|
133 |
-
|
134 |
-
|
135 |
-
|
136 |
-
|
137 |
-
self.
|
138 |
-
self.
|
139 |
-
|
140 |
-
|
141 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
142 |
|
143 |
def get_data(self):
|
144 |
return {
|
145 |
"conversation": self.conversation_history,
|
146 |
"symptoms": list(self.reported_symptoms),
|
147 |
-
"
|
148 |
-
"
|
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 |
}
|