Con_Ana / app.py
Rasha-83's picture
Update app.py
74fb7d2 verified
raw
history blame
9.06 kB
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. تحليل البنود الرئيسية:
{clauses_analysis}
3. الالتزامات:
أ. التزامات الطرف الأول:
{party1_obligations}
ب. التزامات الطرف الثاني:
{party2_obligations}
4. المخاطر المحتملة:
{risks}
5. العناصر المفقودة أو غير الواضحة:
{missing_elements}
6. توصيات قانونية:
{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:
results["party1_obligations"].append(sentence.strip())
elif "طرف ثاني" 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"],
clauses_analysis="\n".join([f"• {clause['keyword']}: {clause['text']}" for clause in results["important_clauses"]]),
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)