abdo-alaa / FINAL_CODE.py
khaledsayed1's picture
Upload 3 files
deeb920 verified
raw
history blame
12.4 kB
import pandas as pd
from transformers import AutoTokenizer, AutoModelForCausalLM
from sentence_transformers import SentenceTransformer
from difflib import get_close_matches
import requests
import io
# 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()
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)
qa_data.to_csv("qa_data.csv", index=False)
# Using ArabertV2 model with medical knowledge
model_id = "aubmindlab/bert-base-arabertv2"
import pandas as pd
import json
from transformers import pipeline, AutoTokenizer, AutoModelForSequenceClassification
from sentence_transformers import SentenceTransformer, util
import torch
from difflib import get_close_matches
# 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- مراجعة الطبيب في حال استمرار الألم"
}
print("Loading Arabic model and tokenizer...")
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForSequenceClassification.from_pretrained(model_id)
embedder = SentenceTransformer("sentence-transformers/all-MiniLM-L6-v2")
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 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}"
# Check for specific clinic questions
# 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 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(user_question):
answer = check_lab_or_radiology(user_question)
if answer:
return answer
return answer_question_from_excel(user_question)
#print(answer_question("مين دكاترة الأطفال وميعادهم؟"))
#print(answer_question("أريد معرفة تفاصيل التحليل الطبي"))
#print(answer_question("اشعر ب جفاف و همدان ف جسمي ماذا افعل"))