Con_Ana / app.py
Rasha-83's picture
Update app.py
f42c4d9 verified
raw
history blame
9.33 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}
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())
# البحث عن موضوع العقد
subject_indicators = [
"موضوع العقد", "الغرض من العقد", "يتفق الطرفان على",
"اتفق الطرفان على", "حيث أن", "حيث إن", "تمهيد",
"بشأن", "لغرض", "عقد"
]
for indicator in subject_indicators:
if indicator in text:
start_idx = text.find(indicator)
# البحث عن نهاية الجملة
end_idx = text.find(".", start_idx)
if end_idx == -1:
end_idx = text.find("\n", start_idx)
if end_idx != -1:
subject_text = text[start_idx:end_idx].strip()
# تجنب النصوص القصيرة جداً
if len(subject_text) > 10:
info["subject"] = subject_text
break
# محاولة ثانية للعثور على الموضوع إذا لم يتم العثور عليه
if info["subject"] == "غير محدد":
# البحث في الجمل الأولى من العقد
first_sentences = text.split('.')[:3] # أول ثلاث جمل
for sentence in first_sentences:
if any(word in sentence.lower() for word in ["اتفاق", "عقد", "تعاقد"]):
info["subject"] = sentence.strip()
break
return info
def analyze_contract(self, contract_text):
try:
# استخراج المعلومات الأساسية
contract_info = self.extract_contract_info(contract_text)
# تحليل البنود والمخاطر
sentences = contract_text.split('.')
results = {
"important_clauses": [],
"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
})
# تحليل المخاطر
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"],
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=30,
rtl=True, # إضافة دعم RTL للمخرجات
),
title="محلل العقود القانونية ",
description="""
قم بإدخال نص العقد القانوني للحصول على تحليل شامل يتضمن:
• المعلومات الأساسية للعقد
• المخاطر المحتملة
• العناصر المفقودة
• التوصيات القانونية
""",
theme=gr.themes.Soft(
primary_hue="blue",
secondary_hue="blue",
neutral_hue="blue",
),
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)