Update app.py
Browse files
app.py
CHANGED
@@ -13,11 +13,10 @@ class ContractAnalyzer:
|
|
13 |
|
14 |
# الكلمات المفتاحية القانونية
|
15 |
self.legal_keywords = [
|
16 |
-
"يلتزم", "
|
17 |
"فسخ العقد", "إنهاء", "تعويض", "غرامة", "مدة العقد",
|
18 |
"طرف أول", "طرف ثاني", "قيمة العقد", "التزامات", "سداد",
|
19 |
-
"
|
20 |
-
"دفعات", "ينكل ", "ضمان", "مخالفة", "إخلال", "قوة قاهرة"
|
21 |
]
|
22 |
|
23 |
# قالب التحليل (Prompt)
|
@@ -29,13 +28,23 @@ class ContractAnalyzer:
|
|
29 |
- الأطراف المتعاقدة: {parties}
|
30 |
- موضوع العقد: {subject}
|
31 |
|
32 |
-
2.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
33 |
{risks}
|
34 |
|
35 |
-
|
36 |
{missing_elements}
|
37 |
|
38 |
-
|
39 |
{recommendations}
|
40 |
"""
|
41 |
|
@@ -60,7 +69,7 @@ class ContractAnalyzer:
|
|
60 |
info["date"] = text[start_idx:end_idx].strip()
|
61 |
|
62 |
# البحث عن الأطراف
|
63 |
-
party_indicators = ["طرف أول", "طرف ثاني", "الطرف الأول", "الطرف الثاني"
|
64 |
for indicator in party_indicators:
|
65 |
if indicator in text:
|
66 |
start_idx = text.find(indicator)
|
@@ -69,37 +78,7 @@ class ContractAnalyzer:
|
|
69 |
end_idx = text.find(".", start_idx)
|
70 |
if end_idx != -1:
|
71 |
info["parties"].append(text[start_idx:end_idx].strip())
|
72 |
-
|
73 |
-
# البحث عن موضوع العقد
|
74 |
-
subject_indicators = [
|
75 |
-
"موضوع العقد", "الغرض من العقد", "يتفق الطرفان على",
|
76 |
-
"اتفق الطرفان على", "حيث أن", "حيث إن", "تمهيد",
|
77 |
-
"بشأن", "لغرض", "عقد"
|
78 |
-
]
|
79 |
-
|
80 |
-
for indicator in subject_indicators:
|
81 |
-
if indicator in text:
|
82 |
-
start_idx = text.find(indicator)
|
83 |
-
# البحث عن نهاية الجملة
|
84 |
-
end_idx = text.find(".", start_idx)
|
85 |
-
if end_idx == -1:
|
86 |
-
end_idx = text.find("\n", start_idx)
|
87 |
-
if end_idx != -1:
|
88 |
-
subject_text = text[start_idx:end_idx].strip()
|
89 |
-
# تجنب النصوص القصيرة جداً
|
90 |
-
if len(subject_text) > 10:
|
91 |
-
info["subject"] = subject_text
|
92 |
-
break
|
93 |
-
|
94 |
-
# محاولة ثانية للعثور على الموضوع إذا لم يتم العثور عليه
|
95 |
-
if info["subject"] == "غير محدد":
|
96 |
-
# البحث في الجمل الأولى من العقد
|
97 |
-
first_sentences = text.split('.')[:3] # أول ثلاث جمل
|
98 |
-
for sentence in first_sentences:
|
99 |
-
if any(word in sentence.lower() for word in ["اتفاق", "عقد", "تعاقد"]):
|
100 |
-
info["subject"] = sentence.strip()
|
101 |
-
break
|
102 |
-
|
103 |
return info
|
104 |
|
105 |
def analyze_contract(self, contract_text):
|
@@ -112,6 +91,8 @@ class ContractAnalyzer:
|
|
112 |
|
113 |
results = {
|
114 |
"important_clauses": [],
|
|
|
|
|
115 |
"risks": [],
|
116 |
"missing_elements": [],
|
117 |
"recommendations": []
|
@@ -134,7 +115,12 @@ class ContractAnalyzer:
|
|
134 |
"keyword": keyword
|
135 |
})
|
136 |
|
137 |
-
|
|
|
|
|
|
|
|
|
|
|
138 |
# تحليل المخ��طر
|
139 |
risk_words = ["مخالفة", "خرق", "نزاع", "خلاف", "إخلال", "فسخ"]
|
140 |
if any(word in sentence.lower() for word in risk_words):
|
@@ -155,7 +141,9 @@ class ContractAnalyzer:
|
|
155 |
date=contract_info["date"],
|
156 |
parties="\n".join(contract_info["parties"]) or "غير محدد",
|
157 |
subject=contract_info["subject"],
|
158 |
-
|
|
|
|
|
159 |
risks="\n".join([f"• {risk}" for risk in results["risks"]]) or "لا توجد مخاطر واضحة",
|
160 |
missing_elements="\n".join([f"• {element}" for element in results["missing_elements"]]) or "لا توجد عناصر مفقودة",
|
161 |
recommendations="\n".join([f"• {rec}" for rec in results["recommendations"]]) or "لا توجد توصيات إضافية"
|
@@ -184,13 +172,15 @@ iface = gr.Interface(
|
|
184 |
),
|
185 |
outputs=gr.Textbox(
|
186 |
label="نتائج التحليل",
|
187 |
-
lines=
|
188 |
rtl=True, # إضافة دعم RTL للمخرجات
|
189 |
),
|
190 |
-
title="محلل العقود القانونية ",
|
191 |
description="""
|
192 |
قم بإدخال نص العقد القانوني للحصول على تحليل شامل يتضمن:
|
193 |
• المعلومات الأساسية للعقد
|
|
|
|
|
194 |
• المخاطر المحتملة
|
195 |
• العناصر المفقودة
|
196 |
• التوصيات القانونية
|
@@ -199,7 +189,7 @@ iface = gr.Interface(
|
|
199 |
primary_hue="blue",
|
200 |
secondary_hue="blue",
|
201 |
neutral_hue="blue",
|
202 |
-
|
203 |
),
|
204 |
css="""
|
205 |
.gradio-container {
|
@@ -226,4 +216,3 @@ iface = gr.Interface(
|
|
226 |
|
227 |
# تشغيل الواجهة
|
228 |
iface.launch(share=True, debug=True)
|
229 |
-
|
|
|
13 |
|
14 |
# الكلمات المفتاحية القانونية
|
15 |
self.legal_keywords = [
|
16 |
+
"يلتزم", "يتعهد", "يحق", "لا يحق", "شرط جزائي",
|
17 |
"فسخ العقد", "إنهاء", "تعويض", "غرامة", "مدة العقد",
|
18 |
"طرف أول", "طرف ثاني", "قيمة العقد", "التزامات", "سداد",
|
19 |
+
"دفعات", "ضمان", "مخالفة", "إخلال", "قوة قاهرة"
|
|
|
20 |
]
|
21 |
|
22 |
# قالب التحليل (Prompt)
|
|
|
28 |
- الأطراف المتعاقدة: {parties}
|
29 |
- موضوع العقد: {subject}
|
30 |
|
31 |
+
2. تحليل البنود الرئيسية:
|
32 |
+
{clauses_analysis}
|
33 |
+
|
34 |
+
3. الالتزامات:
|
35 |
+
أ. التزامات الطرف الأول:
|
36 |
+
{party1_obligations}
|
37 |
+
|
38 |
+
ب. التزامات الطرف الثاني:
|
39 |
+
{party2_obligations}
|
40 |
+
|
41 |
+
4. المخاطر المحتملة:
|
42 |
{risks}
|
43 |
|
44 |
+
5. العناصر المفقودة أو غير الواضحة:
|
45 |
{missing_elements}
|
46 |
|
47 |
+
6. توصيات قانونية:
|
48 |
{recommendations}
|
49 |
"""
|
50 |
|
|
|
69 |
info["date"] = text[start_idx:end_idx].strip()
|
70 |
|
71 |
# البحث عن الأطراف
|
72 |
+
party_indicators = ["طرف أول", "طرف ثاني", "الطرف الأول", "الطرف الثاني"]
|
73 |
for indicator in party_indicators:
|
74 |
if indicator in text:
|
75 |
start_idx = text.find(indicator)
|
|
|
78 |
end_idx = text.find(".", start_idx)
|
79 |
if end_idx != -1:
|
80 |
info["parties"].append(text[start_idx:end_idx].strip())
|
81 |
+
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
82 |
return info
|
83 |
|
84 |
def analyze_contract(self, contract_text):
|
|
|
91 |
|
92 |
results = {
|
93 |
"important_clauses": [],
|
94 |
+
"party1_obligations": [],
|
95 |
+
"party2_obligations": [],
|
96 |
"risks": [],
|
97 |
"missing_elements": [],
|
98 |
"recommendations": []
|
|
|
115 |
"keyword": keyword
|
116 |
})
|
117 |
|
118 |
+
# تحليل الالتزامات
|
119 |
+
if "طرف أول" in sentence or "الطرف الأول" in sentence:
|
120 |
+
results["party1_obligations"].append(sentence.strip())
|
121 |
+
elif "طرف ثاني" in sentence or "الطرف الثاني" in sentence:
|
122 |
+
results["party2_obligations"].append(sentence.strip())
|
123 |
+
|
124 |
# تحليل المخ��طر
|
125 |
risk_words = ["مخالفة", "خرق", "نزاع", "خلاف", "إخلال", "فسخ"]
|
126 |
if any(word in sentence.lower() for word in risk_words):
|
|
|
141 |
date=contract_info["date"],
|
142 |
parties="\n".join(contract_info["parties"]) or "غير محدد",
|
143 |
subject=contract_info["subject"],
|
144 |
+
clauses_analysis="\n".join([f"• {clause['keyword']}: {clause['text']}" for clause in results["important_clauses"]]),
|
145 |
+
party1_obligations="\n".join([f"• {ob}" for ob in results["party1_obligations"]]) or "غير محدد",
|
146 |
+
party2_obligations="\n".join([f"• {ob}" for ob in results["party2_obligations"]]) or "غير محدد",
|
147 |
risks="\n".join([f"• {risk}" for risk in results["risks"]]) or "لا توجد مخاطر واضحة",
|
148 |
missing_elements="\n".join([f"• {element}" for element in results["missing_elements"]]) or "لا توجد عناصر مفقودة",
|
149 |
recommendations="\n".join([f"• {rec}" for rec in results["recommendations"]]) or "لا توجد توصيات إضافية"
|
|
|
172 |
),
|
173 |
outputs=gr.Textbox(
|
174 |
label="نتائج التحليل",
|
175 |
+
lines=20,
|
176 |
rtl=True, # إضافة دعم RTL للمخرجات
|
177 |
),
|
178 |
+
title="محلل العقود القانونية المتقدم",
|
179 |
description="""
|
180 |
قم بإدخال نص العقد القانوني للحصول على تحليل شامل يتضمن:
|
181 |
• المعلومات الأساسية للعقد
|
182 |
+
• تحليل البنود الرئيسية
|
183 |
+
• التزامات كل طرف
|
184 |
• المخاطر المحتملة
|
185 |
• العناصر المفقودة
|
186 |
• التوصيات القانونية
|
|
|
189 |
primary_hue="blue",
|
190 |
secondary_hue="blue",
|
191 |
neutral_hue="blue",
|
192 |
+
text_direction="rtl", # تعيين اتجاه النص من اليمين إلى اليسار
|
193 |
),
|
194 |
css="""
|
195 |
.gradio-container {
|
|
|
216 |
|
217 |
# تشغيل الواجهة
|
218 |
iface.launch(share=True, debug=True)
|
|