Spaces:
Runtime error
Runtime error
File size: 14,583 Bytes
a7c6ae2 1411a94 a7c6ae2 deeb920 1411a94 deeb920 1411a94 a7c6ae2 1411a94 deeb920 a7c6ae2 1411a94 a7c6ae2 1411a94 a7c6ae2 1411a94 a7c6ae2 1411a94 a7c6ae2 1411a94 a7c6ae2 1411a94 a7c6ae2 1411a94 a7c6ae2 deeb920 1411a94 a7c6ae2 1411a94 a7c6ae2 1411a94 a7c6ae2 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 |
import pandas as pd
from transformers import AutoTokenizer, AutoModelForCausalLM, AutoModelForSequenceClassification
from sentence_transformers import SentenceTransformer, util
from difflib import get_close_matches
import requests
import io
import gradio as gr
import torch
# GitHub Excel file URL
GITHUB_EXCEL_URL = "https://raw.githubusercontent.com/3Zzamt0o/HospitalData/main/Hospital%20Data%20(1).xlsx"
def load_hospital_data():
try:
# Fetch Excel file from GitHub
response = requests.get(GITHUB_EXCEL_URL)
response.raise_for_status() # Raise an exception for bad status codes
# Read Excel file from the response content
excel_data = io.BytesIO(response.content)
df = pd.read_excel(excel_data)
print("Successfully loaded data from GitHub")
return df
except Exception as e:
print(f"Error loading data from GitHub: {e}")
# Fallback to default data if GitHub fetch fails
return pd.DataFrame({
'العيادات': ['عيادة الأسنان', 'عيادة الباطنة', 'عيادة العظام', 'عيادة الأطفال'],
'الدكتور': ['د. أحمد محمد', 'د. محمد علي', 'د. علي حسن', 'د. سارة أحمد'],
'الأيام': ['السبت والاثنين', 'الأحد والثلاثاء', 'الاثنين والأربعاء', 'الثلاثاء والخميس'],
'سعر الكشف': ['100 جنيه', '150 جنيه', '120 جنيه', '130 جنيه']
})
# Load the hospital data
df = load_hospital_data()
# Q&A data for lab tests and equipment
data = {
"السؤال": [
"ما هي مواعيد معمل التحاليل ؟", "ما هي المده المستغرقه لعمل التحاليل ؟",
"ما هي انواع التحاليل الموجوده و المتوفره ؟", "هل يوجد تحليل صوره دم ؟",
"ماهي تحاليل صوره الدم ؟", "ما هي تحاليل السكر ؟", "ما هي تحاليل وظائف الكبد ؟",
"ما هي تحاليل وظائف الكلي ؟", "ما هي تحاليل البول و البراز ؟",
"ما هي تحاليل الدهون ؟", "ما هي تحاليل الألتهابات و الروماتيزم ؟",
"ما هي تحاليل الفيروسات ؟", "ما هي تحاليل الغده الدرقيه ؟",
"هل يوجد حشو اسنان ؟", "هل يوجد جهاز سونار ؟", "هل يوجد اجهزه تنفس اصطناعي ؟",
"هل يوجد قياس نظر ؟", "ما هي الاجهزه المتاحه في عياده الرمد ؟",
"هل يوجد قياس ضغط ؟", "هل يوجد سونار ؟", "هل يوجد رسم قلب ؟"
],
"الجواب": [
"طول ايام الاسبوع من 9 صباحا الي 9 مسائا", "من 24 ساعه الي 48 ساعه",
"تحاليل صوره الدم، تحاليل سكر، تحاليل وظائف الكبد، تحاليل وظائف الكلي",
"نعم يوجد جميع انواع التحاليل بالمستشفي", "CBC، Hb%(Heamoglobin)، Blood Group، Rh",
"Rbs سكر عشوائي، سكر صائم FBS، PPbs سكر فاطر", "ALT(GPT)، AST(GOT)، Billirubin",
"Ceatinin الكرياتنين، Urea اليوريا، Urine البول، Uric acid اليوريك اسد",
"Urine البول، Stool البراز، جرثومه المعده في البراز", "Cholesterol كوليسترول، Triglyceride الدهون الثلاثيه",
"CRP، ASOT", "HCV Ab، GBS Ag، HIC Ab", "Tsh، T3، t4",
"نعم يوجد حشو أسنان", "نعم يوجد جهاز سونار", "نعم يوجد أجهزة تنفس إصطناعي",
"نعم يوجد قياس نظر", "جهاز قاع العين، جهاز قياس النظر، جهاز الكشف من الحساسية والالتهابات",
"نعم يوجد قياس ضغط", "نعم يوجد سونار", "نعم يوجد رسم قلب"
]
}
qa_data = pd.DataFrame(data)
# Medical knowledge base
medical_kb = {
"الجفاف": "في حالة الشعور بالجفاف: 1- شرب الكثير من السوائل 2- تناول الأطعمة الغنية بالماء 3- تجنب التعرض المباشر للشمس 4- استشارة الطبيب إذا استمرت الأعراض",
"الصداع": "لعلاج الصداع: 1- الراحة في مكان هادئ 2- شرب الماء بكثرة 3- تناول مسكن خفيف 4- تجنب الضوء القوي والضوضاء",
"التعب": "للتغلب على التعب: 1- الحصول على قسط كافٍ من النوم 2- تناول غذاء صحي متوازن 3- ممارسة تمارين خفيفة 4- تجنب الإجهاد",
"الحمى": "عند الإصابة بالحمى: 1- الراحة التامة 2- شرب السوائل بكثرة 3- خفض درجة الحرارة بالكمادات 4- استشارة الطبيب إذا تجاوزت 39 درجة",
"السعال": "لتخفيف السعال: 1- شرب الماء الدافئ مع العسل 2- استخدام مرطب الهواء 3- تجنب المثيرات 4- الراحة وتناول الأدوية المناسبة",
"ألم المعدة": "لعلاج ألم المعدة: 1- تجنب الأطعمة الدهنية والحارة 2- تناول وجبات خفيفة 3- شرب مشروبات دافئة كاليانسون 4- استشارة الطبيب إذا استمر الألم",
"الإسهال": "لعلاج الإسهال: 1- شرب محلول معالجة الجفاف 2- تجنب الأطعمة الدسمة 3- تناول وجبات خفيفة وسهلة الهضم 4- مراجعة الطبيب إذا استمر لأكثر من يومين",
"الإمساك": "لعلاج الإمساك: 1- تناول الألياف مثل الخضروات والفواكه 2- شرب الماء بكثرة 3- ممارسة النشاط البدني 4- استخدام ملينات طبيعية إذا لزم الأمر",
"الزكام": "لعلاج الزكام: 1- الراحة 2- شرب السوائل الساخنة 3- استخدام بخاخات الأنف 4- تجنب البرد والتيارات الهوائية",
"ألم الظهر": "لتخفيف ألم الظهر: 1- تجنب الجلوس لفترات طويلة 2- ممارسة تمارين التمدد 3- استخدام كمادات دافئة 4- مراجعة الطبيب في حال استمرار الألم"
}
# Initialize models
print("Loading models...")
model_id = "aubmindlab/bert-base-arabertv2"
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForSequenceClassification.from_pretrained(model_id)
embedder = SentenceTransformer("sentence-transformers/all-MiniLM-L6-v2")
# Prepare hospital data passages
passages = []
for _, row in df.iterrows():
if pd.isna(row['الدكتور']) and pd.isna(row['العيادات']):
continue
text = f"العيادة: {row['العيادات']}، الدكتور: {row['الدكتور']}، الأيام: {row['الأيام']}، السعر: {row['سعر الكشف']}"
passages.append(text)
corpus_embeddings = embedder.encode(passages, convert_to_tensor=True)
def check_lab_or_radiology(question):
keywords = ['أشعة', 'تحاليل', 'رنين', 'سونار', 'تحليل', 'مختبر', 'معمل']
if any(word in question for word in keywords):
matches = get_close_matches(question, qa_data['السؤال'].tolist(), n=1, cutoff=0.5)
if matches:
matched_q = matches[0]
answer = qa_data[qa_data['السؤال'] == matched_q]['الجواب'].values[0]
return answer
return None
def answer_question_from_excel(user_question, k=3):
# First check if it's a medical symptom question
for symptom, advice in medical_kb.items():
if symptom in user_question or any(word in user_question for word in ["اشعر", "اعاني", "الم", "وجع", "مريض"]):
return f"🩺 **الرد:** {advice}\n\n⚠️ **ملاحظة هامة:** هذه النصائح عامة، يرجى استشارة الطبيب للتشخيص الدقيق."
# Then check in qa_data for lab tests and equipment
qa_answer = check_lab_or_radiology(user_question)
if qa_answer:
return f"💡 **الرد:** {qa_answer}"
# Define clinic keywords with variations
clinic_mapping = {
"عيادة الباطنة": ["باطنة", "الباطنة", "باطنه"],
"عيادة الجلدية": ["جلد", "جلدية", "الجلدية"],
"عيادة المسالك": ["مسالك", "المسالك", "مسالك بولية"],
"عيادة النساء": ["نسا", "نساء", "توليد", "ولادة"],
"عيادة الأنف والأذن": ["انف", "اذن", "حنجرة", "الأنف", "الأذن"],
"عيادة الرمد": ["رمد", "الرمد", "عيون", "العيون"],
"عيادة الأسنان": ["اسنان", "الاسنان", "الأسنان", "سنان"],
"الحضانة": ["حضان", "حضانة", "الحضانة", "حضانات"],
"المعمل": ["معمل", "المعمل", "تحاليل", "مختبر"],
"عيادة الأطفال": ["اطفال", "الاطفال", "الأطفال"],
"عيادة الجهاز الهضمي": ["هضم", "هضمي", "الجهاز الهضمي"],
"عيادة التخاطب": ["تخاطب", "التخاطب", "نطق"]
}
# Check for specific clinic mentions
target_clinic = None
for clinic, keywords in clinic_mapping.items():
if any(keyword in user_question for keyword in keywords):
target_clinic = clinic
break
# If a specific clinic is mentioned, show all information for that clinic
if target_clinic:
clinic_info = [p for p in passages if target_clinic in p]
if clinic_info:
return f"🏥 **الرد:** \n" + "\n".join(clinic_info)
# For questions about doctors or clinics
if any(word in user_question for word in ["عيادة", "عيادات", "دكتور", "دكاترة", "دكتورة", "مواعيد"]):
# Check if asking about a specific type of clinic
for clinic_type in ["الأسنان", "الباطنة", "الجلدية", "المسالك", "النساء", "الأنف", "الرمد", "الحضانة", "المعمل", "الأطفال", "الجهاز", "التخاطب"]:
if clinic_type in user_question:
clinic_info = [p for p in passages if clinic_type in p]
if clinic_info:
return f"🏥 **الرد:** \n" + "\n".join(clinic_info)
# If no specific clinic type mentioned, return all clinic information
return f"🏥 **الرد:** \n" + "\n".join([p for p in passages if 'عيادة' in p])
# If no specific clinic found, check all hospital data
question_embedding = embedder.encode(user_question, convert_to_tensor=True)
hits = util.semantic_search(question_embedding, corpus_embeddings, top_k=k)
matched_passages = [passages[hit['corpus_id']] for hit in hits[0]]
if matched_passages:
hospital_info = "\n".join(matched_passages)
return f"🏥 **الرد:** {hospital_info}"
# If no match found in any source, return a helpful message
return f"❓ **الرد:** عذراً، لا يمكنني العثور على إجابة محددة لسؤالك. يرجى استشارة الطبيب للحصول على المشورة الطبية المناسبة."
def answer_question(user_question):
answer = check_lab_or_radiology(user_question)
if answer:
return answer
return answer_question_from_excel(user_question)
def ask_question(question):
"""
Function to handle question answering with error handling
"""
try:
if not question or question.strip() == "":
return "❌ خطأ: يرجى كتابة السؤال"
answer = answer_question(question.strip())
return answer
except Exception as e:
return f"❌ خطأ: {str(e)}"
# Create Gradio interface
with gr.Blocks(title="نظام الأسئلة والأجوبة الطبي", theme=gr.themes.Soft()) as demo:
gr.Markdown("# 🏥 نظام الأسئلة والأجوبة الطبي")
gr.Markdown("اسأل أي سؤال واحصل على إجابة طبية مدعومة بالذكاء الاصطناعي!")
with gr.Row():
with gr.Column(scale=4):
question_input = gr.Textbox(
label="سؤالك",
placeholder="اكتب سؤالك هنا...",
lines=3,
rtl=True
)
with gr.Column(scale=1):
submit_btn = gr.Button("اسأل السؤال", variant="primary", size="lg")
clear_btn = gr.Button("مسح", variant="secondary")
answer_output = gr.Textbox(
label="الإجابة",
lines=10,
interactive=False,
rtl=True
)
# Set up the interactions
submit_btn.click(
fn=ask_question,
inputs=question_input,
outputs=answer_output
)
# Also allow Enter key to submit
question_input.submit(
fn=ask_question,
inputs=question_input,
outputs=answer_output
)
# Clear button functionality
clear_btn.click(
fn=lambda: ("", ""),
inputs=None,
outputs=[question_input, answer_output]
)
# Add examples
gr.Examples(
examples=[
["ما هي مواعيد معمل التحاليل؟"],
["مين دكاترة الأطفال وميعادهم؟"],
["هل يوجد جهاز سونار؟"],
["اشعر بصداع، ماذا أفعل؟"],
["ما هي تحاليل السكر؟"]
],
inputs=question_input,
outputs=answer_output,
fn=ask_question,
cache_examples=False
)
if __name__ == "__main__":
print("Starting Gradio app...")
# Launch the Gradio app
demo.launch(
server_name="0.0.0.0", # Equivalent to Flask's host='0.0.0.0'
server_port=7860, # Default Gradio port
share=False, # Set to True if you want a public link
debug=True
) |