khaledsayed1 commited on
Commit
a58d539
·
verified ·
1 Parent(s): 4d8f17b

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +317 -30
app.py CHANGED
@@ -1,33 +1,320 @@
1
- from flask import Flask, request, jsonify
2
- from flask_cors import CORS
3
- from FINAL_CODE import answer_question
4
- app = Flask(__name__)
5
- CORS(app)
6
-
7
- @app.route('/api/ask', methods=['POST'])
8
- def ask_question():
 
 
 
 
 
9
  try:
10
- data = request.get_json()
11
- if not data or 'question' not in data:
12
- return jsonify({
13
- 'success': False,
14
- 'error': 'Question is required'
15
- }), 400
16
-
17
- question = data['question']
18
- answer = answer_question(question)
19
-
20
- return jsonify({
21
- 'success': True,
22
- 'question': question,
23
- 'answer': answer
 
 
 
 
24
  })
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
25
  except Exception as e:
26
- return jsonify({
27
- 'success': False,
28
- 'error': str(e)
29
- }), 500
30
-
31
- if __name__ == '__main__':
32
- # Make sure to run with host='0.0.0.0' to be accessible externally if needed
33
- app.run(host='0.0.0.0', port=5000, debug=True)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import pandas as pd
2
+ import gradio as gr
3
+ from transformers import AutoTokenizer, AutoModelForSequenceClassification
4
+ from sentence_transformers import SentenceTransformer, util
5
+ from difflib import get_close_matches
6
+ import requests
7
+ import io
8
+ import torch
9
+
10
+ # GitHub Excel file URL
11
+ GITHUB_EXCEL_URL = "https://raw.githubusercontent.com/3Zzamt0o/HospitalData/main/Hospital%20Data%20(1).xlsx"
12
+
13
+ def load_hospital_data():
14
  try:
15
+ # Fetch Excel file from GitHub
16
+ response = requests.get(GITHUB_EXCEL_URL)
17
+ response.raise_for_status() # Raise an exception for bad status codes
18
+
19
+ # Read Excel file from the response content
20
+ excel_data = io.BytesIO(response.content)
21
+ df = pd.read_excel(excel_data)
22
+
23
+ print("Successfully loaded data from GitHub")
24
+ return df
25
+ except Exception as e:
26
+ print(f"Error loading data from GitHub: {e}")
27
+ # Fallback to default data if GitHub fetch fails
28
+ return pd.DataFrame({
29
+ 'العيادات': ['عيادة الأسنان', 'عيادة الباطنة', 'عيادة العظام', 'عيادة الأطفال'],
30
+ 'الدكتور': ['د. أحمد محمد', 'د. محمد علي', 'د. علي حسن', 'د. سارة أحمد'],
31
+ 'الأيام': ['السبت والاثنين', 'الأحد والثلاثاء', 'الاثنين والأربعاء', 'الثلاثاء والخميس'],
32
+ 'سعر الكشف': ['100 جنيه', '150 جنيه', '120 جنيه', '130 جنيه']
33
  })
34
+
35
+ # Load the hospital data
36
+ print("Loading hospital data...")
37
+ df = load_hospital_data()
38
+
39
+ # Q&A data for lab tests and equipment
40
+ data = {
41
+ "السؤال": [
42
+ "ما هي مواعيد معمل التحاليل ؟", "ما هي المده المستغرقه لعمل التحاليل ؟",
43
+ "ما هي انواع التحاليل الموجوده و المتوفره ؟", "هل يوجد تحليل صوره دم ؟",
44
+ "ماهي تحاليل صوره الدم ؟", "ما هي تحاليل السكر ؟", "ما هي تحاليل وظائف الكبد ؟",
45
+ "ما هي تحاليل وظائف الكلي ؟", "ما هي تحاليل البول و البراز ؟",
46
+ "ما هي تحاليل الدهون ؟", "ما هي تحاليل الألتهابات و الروماتيزم ؟",
47
+ "ما هي تحاليل الفيروسات ؟", "ما هي تحاليل الغده الدرقيه ؟",
48
+ "هل يوجد حشو اسنان ؟", "هل يوجد جهاز سونار ؟", "هل يوجد اجهزه تنفس اصطناعي ؟",
49
+ "هل يوجد قياس نظر ؟", "ما هي الاجهزه المتاحه في عياده الرمد ؟",
50
+ "هل يوجد قياس ضغط ؟", "هل يوجد سونار ؟", "هل يوجد رسم قلب ؟"
51
+ ],
52
+ "الجواب": [
53
+ "طول ايام الاسبوع من 9 صباحا الي 9 مسائا", "من 24 ساعه الي 48 ساعه",
54
+ "تحاليل صوره الدم، تحاليل سكر، تحاليل وظائف الكبد، تحاليل وظائف الكلي",
55
+ "نعم يوجد جميع انواع التحاليل بالمستشفي", "CBC، Hb%(Heamoglobin)، Blood Group، Rh",
56
+ "Rbs سكر عشوائي، سكر صائم FBS، PPbs سكر فاطر", "ALT(GPT)، AST(GOT)، Billirubin",
57
+ "Ceatinin الكرياتنين، Urea اليوريا، Urine البول، Uric acid اليوريك اسد",
58
+ "Urine البول، Stool البراز، جرثومه المعده في البراز", "Cholesterol كوليسترول، Triglyceride الدهون الثلاثيه",
59
+ "CRP، ASOT", "HCV Ab، GBS Ag، HIC Ab", "Tsh، T3، t4",
60
+ "نعم يوجد حشو أسنان", "نعم يوجد جهاز سونار", "نعم يوجد أجهزة تنفس إصطناعي",
61
+ "نعم يوجد قياس نظر", "جهاز قاع العين، جهاز قياس النظر، جهاز الكشف من الحساسية والالتهابات",
62
+ "نعم يوجد قياس ضغط", "نعم يوجد سونار", "نعم يوجد رسم قلب"
63
+ ]
64
+ }
65
+
66
+ qa_data = pd.DataFrame(data)
67
+
68
+ # Medical knowledge base
69
+ medical_kb = {
70
+ "الجفاف": "في حالة الشعور بالجفاف: 1- شرب الكثير من السوائل 2- تناول الأطعمة الغنية بالماء 3- تجنب ال��عرض المباشر للشمس 4- استشارة الطبيب إذا استمرت الأعراض",
71
+ "الصداع": "لعلاج الصداع: 1- الراحة في مكان هادئ 2- شرب الماء بكثرة 3- تناول مسكن خفيف 4- تجنب الضوء القوي والضوضاء",
72
+ "التعب": "للتغلب على التعب: 1- الحصول على قسط كافٍ من النوم 2- تناول غذاء صحي متوازن 3- ممارسة تمارين خفيفة 4- تجنب الإجهاد",
73
+ "الحمى": "عند الإصابة بالحمى: 1- الراحة التامة 2- شرب السوائل بكثرة 3- خفض درجة الحرارة بالكمادات 4- استشارة الطبيب إذا تجاوزت 39 درجة",
74
+ "السعال": "لتخفيف السعال: 1- شرب الماء الدافئ مع العسل 2- استخدام مرطب الهواء 3- تجنب المثيرات 4- الراحة وتناول الأدوية المناسبة",
75
+ "ألم المعدة": "لعلاج ألم المعدة: 1- تجنب الأطعمة الدهنية والحارة 2- تناول وجبات خفيفة 3- شرب مشروبات دافئة كاليانسون 4- استشارة الطبيب إذا استمر الألم",
76
+ "الإسهال": "لعلاج الإسهال: 1- شرب محلول معالجة الجفاف 2- تجنب الأطعمة الدسمة 3- تناول وجبات خفيفة وسهلة الهضم 4- مراجعة الطبيب إذا استمر لأكثر من يومين",
77
+ "الإمساك": "لعلاج الإمساك: 1- تناول الألياف مثل الخضروات والفواكه 2- شرب الماء بكثرة 3- ممارسة النشاط البدني 4- استخدام ملينات طبيعية إذا لزم الأمر",
78
+ "الزكام": "لعلاج الزكام: 1- الراحة 2- شرب السوائل الساخنة 3- استخدام بخاخات الأنف 4- تجنب البرد والتيارات الهوائية",
79
+ "ألم الظهر": "لتخفيف ألم الظهر: 1- تجنب الجلوس لفترات طويلة 2- ممارسة تمارين التمدد 3- استخدام كمادات دافئة 4- مراجعة الطبيب في حال استمرار الألم"
80
+ }
81
+
82
+ # Initialize models and embeddings
83
+ print("Loading Arabic model and tokenizer...")
84
+ try:
85
+ model_id = "aubmindlab/bert-base-arabertv2"
86
+ tokenizer = AutoTokenizer.from_pretrained(model_id)
87
+ model = AutoModelForSequenceClassification.from_pretrained(model_id)
88
+ print("Arabic model loaded successfully")
89
+ except Exception as e:
90
+ print(f"Warning: Could not load Arabic model: {e}")
91
+ tokenizer = None
92
+ model = None
93
+
94
+ print("Loading sentence transformer...")
95
+ try:
96
+ embedder = SentenceTransformer("sentence-transformers/all-MiniLM-L6-v2")
97
+ print("Sentence transformer loaded successfully")
98
+ except Exception as e:
99
+ print(f"Error loading sentence transformer: {e}")
100
+ embedder = None
101
+
102
+ # Prepare passages from hospital data
103
+ passages = []
104
+ for _, row in df.iterrows():
105
+ if pd.isna(row['الدكتور']) and pd.isna(row['العيادات']):
106
+ continue
107
+ text = f"العيادة: {row['العيادات']}، الدكتور: {row['الدكتور']}، الأيام: {row['الأيام']}، السعر: {row['سعر الكشف']}"
108
+ passages.append(text)
109
+
110
+ # Create embeddings for passages
111
+ if embedder:
112
+ try:
113
+ corpus_embeddings = embedder.encode(passages, convert_to_tensor=True)
114
+ print("Corpus embeddings created successfully")
115
  except Exception as e:
116
+ print(f"Error creating embeddings: {e}")
117
+ corpus_embeddings = None
118
+ else:
119
+ corpus_embeddings = None
120
+
121
+ def check_lab_or_radiology(question):
122
+ keywords = ['أشعة', 'تحاليل', 'رنين', 'سونار', 'تحليل', 'مختبر', 'معمل']
123
+ if any(word in question for word in keywords):
124
+ try:
125
+ matches = get_close_matches(question, qa_data['السؤال'].tolist(), n=1, cutoff=0.5)
126
+ if matches:
127
+ matched_q = matches[0]
128
+ answer = qa_data[qa_data['السؤال'] == matched_q]['الجواب'].values[0]
129
+ return answer
130
+ except Exception as e:
131
+ print(f"Error in lab/radiology check: {e}")
132
+ return None
133
+
134
+ def answer_question_from_excel(user_question, k=3):
135
+ # First check if it's a medical symptom question
136
+ for symptom, advice in medical_kb.items():
137
+ if symptom in user_question or any(word in user_question for word in ["اشعر", "اعاني", "الم", "وجع", "مريض"]):
138
+ return f"🩺 **الرد:** {advice}\n\n⚠️ **ملاحظة هامة:** هذه النصائح عامة، يرجى استشارة الطبيب للتشخيص الدقيق."
139
+
140
+ # Then check in qa_data for lab tests and equipment
141
+ qa_answer = check_lab_or_radiology(user_question)
142
+ if qa_answer:
143
+ return f"💡 **الرد:** {qa_answer}"
144
+
145
+ # Define clinic keywords with variations
146
+ clinic_mapping = {
147
+ "عيادة الباطنة": ["باطنة", "الباطنة", "باطنه"],
148
+ "عيادة الجلدية": ["جلد", "جلدية", "الجلدية"],
149
+ "عيادة المسالك": ["مسالك", "المسالك", "مسالك بولية"],
150
+ "عيادة النساء": ["نسا", "نساء", "توليد", "ولادة"],
151
+ "عيادة الأنف والأذن": ["انف", "اذن", "حنجرة", "الأنف", "الأذن"],
152
+ "عيادة الرمد": ["رمد", "الرمد", "عيون", "العيون"],
153
+ "عيادة الأسنان": ["اسنان", "الاسنان", "الأسنان", "سنان"],
154
+ "الحضانة": ["حضان", "حضانة", "الحضانة", "حضانات"],
155
+ "المعمل": ["معمل", "المعمل", "تحاليل", "مختبر"],
156
+ "عيادة الأطفال": ["اطفال", "الاطفال", "الأطفال"],
157
+ "عيادة الجهاز الهضمي": ["هضم", "هضمي", "الجهاز الهضمي"],
158
+ "عيادة التخاطب": ["تخاطب", "التخاطب", "نطق"]
159
+ }
160
+
161
+ # Check for specific clinic mentions
162
+ target_clinic = None
163
+ for clinic, keywords in clinic_mapping.items():
164
+ if any(keyword in user_question for keyword in keywords):
165
+ target_clinic = clinic
166
+ break
167
+
168
+ # If a specific clinic is mentioned, show all information for that clinic
169
+ if target_clinic:
170
+ clinic_info = [p for p in passages if target_clinic in p]
171
+ if clinic_info:
172
+ return f"🏥 **الرد:** \n" + "\n".join(clinic_info)
173
+
174
+ # For questions about doctors or clinics
175
+ if any(word in user_question for word in ["عيادة", "عيادات", "دكتور", "دكاترة", "دكتورة", "مواعيد"]):
176
+ # Check if asking about a specific type of clinic
177
+ for clinic_type in ["الأسنان", "الباطنة", "الجلدية", "المسالك", "النساء", "الأنف", "الرمد", "الحضانة", "المعمل", "الأطفال", "الجهاز", "التخاطب"]:
178
+ if clinic_type in user_question:
179
+ clinic_info = [p for p in passages if clinic_type in p]
180
+ if clinic_info:
181
+ return f"🏥 **الرد:** \n" + "\n".join(clinic_info)
182
+
183
+ # If no specific clinic type mentioned, return all clinic information
184
+ return f"💡 **الرد:** \n" + "\n".join([p for p in passages if 'عيادة' in p])
185
+
186
+ # If no specific clinic found, use semantic search if available
187
+ if embedder and corpus_embeddings is not None:
188
+ try:
189
+ question_embedding = embedder.encode(user_question, convert_to_tensor=True)
190
+ hits = util.semantic_search(question_embedding, corpus_embeddings, top_k=k)
191
+ matched_passages = [passages[hit['corpus_id']] for hit in hits[0]]
192
+
193
+ if matched_passages:
194
+ hospital_info = "\n".join(matched_passages)
195
+ return f"💡 **الرد:** {hospital_info}"
196
+ except Exception as e:
197
+ print(f"Error in semantic search: {e}")
198
+
199
+ # If no match found in any source, return a helpful message
200
+ return f"💡 **الرد:** عذراً، لا يمكنني العثور على إجابة محددة لسؤالك. يرجى استشارة الطبيب للحصول على المشورة الطبية المناسبة."
201
+
202
+ def answer_question(user_question):
203
+ try:
204
+ answer = check_lab_or_radiology(user_question)
205
+ if answer:
206
+ return f"💡 **الرد:** {answer}"
207
+ return answer_question_from_excel(user_question)
208
+ except Exception as e:
209
+ return f"⚠️ خطأ: {str(e)}"
210
+
211
+ def ask_question(question):
212
+ """
213
+ Function to handle question answering with error handling
214
+ """
215
+ try:
216
+ if not question or question.strip() == "":
217
+ return "❌ خطأ: السؤال مطلوب"
218
+
219
+ answer = answer_question(question.strip())
220
+ return answer
221
+ except Exception as e:
222
+ return f"❌ خطأ: {str(e)}"
223
+
224
+ # Create Gradio interface
225
+ with gr.Blocks(
226
+ title="نظام الأسئلة والأجوبة الطبي",
227
+ theme=gr.themes.Soft(),
228
+ css="""
229
+ .gradio-container {
230
+ font-family: 'Arial', sans-serif;
231
+ direction: rtl;
232
+ text-align: right;
233
+ }
234
+ .gr-button {
235
+ background: linear-gradient(45deg, #4CAF50, #45a049);
236
+ color: white;
237
+ font-weight: bold;
238
+ }
239
+ .gr-textbox {
240
+ text-align: right;
241
+ direction: rtl;
242
+ }
243
+ """
244
+ ) as demo:
245
+
246
+ gr.Markdown(
247
+ """
248
+ # 🏥 نظام الأسئلة والأجوبة الطبي
249
+ ### اسأل أي سؤال واحصل على إجابة ذكية!
250
+
251
+ يمكنك ا��سؤال عن:
252
+ - 🏥 مواعيد العيادات والأطباء
253
+ - 🧪 التحاليل الطبية والمعمل
254
+ - 🩺 النصائح الطبية العامة
255
+ - 📋 أسعار الكشف والخدمات
256
+ """,
257
+ elem_id="header"
258
+ )
259
+
260
+ with gr.Row():
261
+ with gr.Column(scale=4):
262
+ question_input = gr.Textbox(
263
+ label="سؤالك",
264
+ placeholder="اكتب سؤالك هنا...",
265
+ lines=3,
266
+ text_align="right",
267
+ rtl=True
268
+ )
269
+ with gr.Column(scale=1):
270
+ submit_btn = gr.Button(
271
+ "اسأل السؤال",
272
+ variant="primary",
273
+ size="lg"
274
+ )
275
+
276
+ answer_output = gr.Textbox(
277
+ label="الإجابة",
278
+ lines=10,
279
+ interactive=False,
280
+ text_align="right",
281
+ rtl=True
282
+ )
283
+
284
+ # Example questions
285
+ gr.Examples(
286
+ examples=[
287
+ ["ما هي مواعيد عيادة الأسنان؟"],
288
+ ["هل يوجد تحليل صورة دم؟"],
289
+ ["علاج الحمى"],
290
+ ["مين دكاترة الأطفال وميعادهم؟"],
291
+ ["ما هي تحاليل السكر؟"]
292
+ ],
293
+ inputs=question_input,
294
+ label="أمثلة على الأسئلة"
295
+ )
296
+
297
+ # Set up the interaction
298
+ submit_btn.click(
299
+ fn=ask_question,
300
+ inputs=question_input,
301
+ outputs=answer_output
302
+ )
303
+
304
+ # Also allow Enter key to submit
305
+ question_input.submit(
306
+ fn=ask_question,
307
+ inputs=question_input,
308
+ outputs=answer_output
309
+ )
310
+
311
+ if __name__ == "__main__":
312
+ print("Starting Hospital Q&A System...")
313
+ # Launch the Gradio app
314
+ demo.launch(
315
+ server_name="0.0.0.0", # Equivalent to Flask's host='0.0.0.0'
316
+ server_port=7860, # Default Gradio port (you can change to 5000 if preferred)
317
+ share=False, # Set to True if you want a public link
318
+ debug=True,
319
+ show_error=True
320
+ )