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 )