import gradio as gr from transformers import AutoTokenizer, AutoModel import torch import numpy as np class ContractAnalyzer: def __init__(self): print("جاري تحميل النموذج...") self.tokenizer = AutoTokenizer.from_pretrained("aubmindlab/bert-large-arabertv2") self.model = AutoModel.from_pretrained("aubmindlab/bert-large-arabertv2") print("تم تحميل النموذج بنجاح!") # الكلمات المفتاحية القانونية self.legal_keywords = [ "يلتزم", "الزام" , "يتعهد", "يحق", "لا يحق", "شرط جزائي", "فسخ العقد", "إنهاء", "تعويض", "غرامة", "مدة العقد", "طرف أول", "طرف ثاني", "قيمة العقد", "التزامات", "سداد", "دفعات", "ينكل ", "ضمان", "مخالفة", "إخلال", "قوة قاهرة" ] # قالب التحليل (Prompt) self.analysis_prompt = """ تحليل العقد القانوني: 1. معلومات أساسية: - تاريخ العقد: {date} - الأطراف المتعاقدة: {parties} - موضوع العقد: {subject} 2. الالتزامات: أ. التزامات الطرف الأول: {party1_obligations} ب. التزامات الطرف الثاني: {party2_obligations} 3. المخاطر المحتملة: {risks} 4. العناصر المفقودة أو غير الواضحة: {missing_elements} 5. توصيات قانونية: {recommendations} """ def extract_contract_info(self, text): """استخراج المعلومات الأساسية من العقد""" info = { "date": "غير محدد", "parties": [], "subject": "غير محدد" } # البحث عن التاريخ date_indicators = ["بتاريخ", "في يوم", "الموافق"] for indicator in date_indicators: if indicator in text: # استخراج التاريخ باستخدام تعبير نمطي بسيط start_idx = text.find(indicator) end_idx = text.find("\n", start_idx) if end_idx == -1: end_idx = text.find(".", start_idx) if end_idx != -1: info["date"] = text[start_idx:end_idx].strip() # البحث عن الأطراف party_indicators = ["طرف أول", "طرف ثاني", "الطرف الأول", "الطرف الثاني", "الفريق الأول", "الفريق الثاني"] for indicator in party_indicators: if indicator in text: start_idx = text.find(indicator) end_idx = text.find("\n", start_idx) if end_idx == -1: end_idx = text.find(".", start_idx) if end_idx != -1: info["parties"].append(text[start_idx:end_idx].strip()) return info def analyze_contract(self, contract_text): try: # استخراج المعلومات الأساسية contract_info = self.extract_contract_info(contract_text) # تحليل البنود والمخاطر sentences = contract_text.split('.') results = { "important_clauses": [], "party1_obligations": [], "party2_obligations": [], "risks": [], "missing_elements": [], "recommendations": [] } # تحليل كل جملة for sentence in sentences: if len(sentence.strip()) < 5: continue # تحويل النص إلى تمثيل رقمي inputs = self.tokenizer(sentence, return_tensors="pt", padding=True, truncation=True) outputs = self.model(**inputs) # تحليل البنود المهمة for keyword in self.legal_keywords: if keyword in sentence: results["important_clauses"].append({ "text": sentence.strip(), "keyword": keyword }) # تحليل الالتزامات if "طرف أول" in sentence or "الطرف الأول" in sentence or "الفريق الأول" in sentence : results["party1_obligations"].append(sentence.strip()) elif "طرف ثاني" in sentence or "الطرف الثاني" in sentence or "الفريق الثاني" in sentence : results["party2_obligations"].append(sentence.strip()) # تحليل المخاطر risk_words = ["مخالفة", "خرق", "نزاع", "خلاف", "إخلال", "فسخ"] if any(word in sentence.lower() for word in risk_words): results["risks"].append(sentence.strip()) # التحقق من العناصر المفقودة required_elements = [ "مدة العقد", "قيمة العقد", "التزامات الطرفين", "طريقة السداد", "الضمانات", "شروط الإنهاء" ] for element in required_elements: if not any(element in s for s in sentences): results["missing_elements"].append(element) results["recommendations"].append(f"يجب إضافة {element} بشكل واضح في العقد") # تنسيق النتائج باستخدام القالب formatted_results = self.analysis_prompt.format( date=contract_info["date"], parties="\n".join(contract_info["parties"]) or "غير محدد", subject=contract_info["subject"], party1_obligations="\n".join([f"• {ob}" for ob in results["party1_obligations"]]) or "غير محدد", party2_obligations="\n".join([f"• {ob}" for ob in results["party2_obligations"]]) or "غير محدد", risks="\n".join([f"• {risk}" for risk in results["risks"]]) or "لا توجد مخاطر واضحة", missing_elements="\n".join([f"• {element}" for element in results["missing_elements"]]) or "لا توجد عناصر مفقودة", recommendations="\n".join([f"• {rec}" for rec in results["recommendations"]]) or "لا توجد توصيات إضافية" ) return formatted_results except Exception as e: return f"حدث خطأ أثناء التحليل: {str(e)}" # إنشاء كائن المحلل analyzer = ContractAnalyzer() # دالة التحليل لواجهة gradio def analyze_text(text): return analyzer.analyze_contract(text) # تكوين واجهة gradio iface = gr.Interface( fn=analyze_text, inputs=gr.Textbox( placeholder="أدخل نص العقد هنا...", label="نص العقد", lines=30, rtl=True, # إضافة دعم RTL للمدخلات ), outputs=gr.Textbox( label="نتائج التحليل", lines=20, rtl=True, # إضافة دعم RTL للمخرجات ), title="محلل العقود القانونية المتقدم", description=""" قم بإدخال نص العقد القانوني للحصول على تحليل شامل يتضمن: • المعلومات الأساسية للعقد • تحليل البنود الرئيسية • التزامات كل طرف • المخاطر المحتملة • العناصر المفقودة • التوصيات القانونية """, theme=gr.themes.Soft( primary_hue="blue", secondary_hue="blue", neutral_hue="blue", # text_direction="rtl", # تعيين اتجاه النص من اليمين إلى اليسار ), css=""" .gradio-container { direction: rtl !important; text-align: right !important; } .output-markdown { direction: rtl !important; text-align: right !important; } .input-markdown { direction: rtl !important; text-align: right !important; } label { text-align: right !important; } .prose { direction: rtl !important; text-align: right !important; } """ ) # تشغيل الواجهة iface.launch(share=True, debug=True)