""" خدمة تحليل المخاطر في المستندات """ import re import pandas as pd import numpy as np from nltk.tokenize import sent_tokenize import config class RiskAnalyzer: """تحليل المخاطر في المستندات""" def __init__(self): # قائمة بالمصطلحات التي تشير إلى المخاطر self.risk_indicators = { 'مخاطر مالية': [ 'غرامة', 'عقوبة', 'تعويض', 'دفعة', 'ضمان', 'تأخير', 'سعر', 'تكلفة', 'زيادة', 'تمويل', 'استرداد', 'مصادرة', 'كفالة', 'مستحقات', 'فاتورة', 'سداد', 'دفع', 'مطالبة', 'تقلبات' ], 'مخاطر زمنية': [ 'مدة', 'فترة', 'تاريخ', 'موعد', 'تأخير', 'جدول زمني', 'تمديد', 'تسليم', 'تسريع', 'إنجاز', 'تنفيذ', 'انتهاء', 'بدء', 'تعليق' ], 'مخاطر فنية': [ 'مواصفات', 'معايير', 'اختبار', 'فحص', 'جودة', 'عيب', 'خلل', 'تقنية', 'فني', 'تصميم', 'أداء', 'مخططات', 'تشغيل', 'صيانة' ], 'مخاطر إدارية': [ 'مراسلات', 'اجتماع', 'تنسيق', 'تواصل', 'إشراف', 'إدارة', 'تغيير', 'تعديل', 'موافقة', 'رفض', 'تفويض', 'صلاحية' ], 'مخاطر تنظيمية': [ 'لائحة', 'تصريح', 'ترخيص', 'قانون', 'نظام', 'حكومي', 'بلدية', 'تشريع', 'امتثال', 'تعميم', 'شهادة', 'موافقة' ], 'مخاطر سوقية': [ 'توريد', 'مورد', 'سوق', 'منافسة', 'مواد', 'نقص', 'تقلب', 'أسعار', 'استيراد', 'تصدير', 'جمارك', 'نقل', 'تخزين' ], } # قائمة بالمصطلحات التي تشير إلى تأثير المخاطر self.impact_indicators = { 'عالي': [ 'كبير', 'خطير', 'جسيم', 'كلي', 'مرتفع', 'عالي', 'ضخم', 'هام', 'جوهري', 'أساسي', 'رئيسي' ], 'متوسط': [ 'متوسط', 'معتدل', 'وسط', 'مقبول', 'عادي', 'معقول' ], 'منخفض': [ 'صغير', 'قليل', 'ضئيل', 'بسيط', 'منخفض', 'هامشي', 'محدود', 'طفيف', 'غير مؤثر' ] } # قائمة بالمصطلحات التي تشير إلى احتمالية المخاطر self.probability_indicators = { 'مؤكد': [ 'مؤكد', 'حتمي', 'قطعي', 'دائماً', 'يجب', 'ملزم', 'إلزامي', 'مطلوب' ], 'محتمل': [ 'محتمل', 'ممكن', 'قد', 'ربما', 'يمكن', 'متوقع' ], 'غير محتمل': [ 'نادر', 'بعيد', 'استثنائي', 'غير متوقع', 'غير محتمل', 'ضئيل' ] } # استراتيجيات معالجة المخاطر self.mitigation_strategies = { 'مخاطر مالية': [ "تخصيص مبلغ احتياطي", "التفاوض مع العميل لتخفيف الشروط المالية", "تحديد سقف للغرامات", "التخطيط للتدفق النقدي", "تأمين خط ائتمان احتياطي" ], 'مخاطر زمنية': [ "زيادة فريق العمل", "استخدام موارد إضافية", "وضع خطة عمل بديلة", "استباق التأخيرات المحتملة", "تقديم طلب تمديد مسبق" ], 'مخاطر فنية': [ "طلب توضيح من العميل", "استشارة خبراء متخصصين", "إجراء اختبارات إضافية", "توثيق المراسلات الفنية", "تعيين مسؤول ضبط جودة" ], 'مخاطر إدارية': [ "تحسين آليات التواصل", "توثيق جميع المراسلات", "وضع خطة اتصال واضحة", "عقد اجتماعات دورية", "تعيين مدير مشروع متفرغ" ], 'مخاطر تنظيمية': [ "التخطيط المسبق للمتطلبات التنظيمية", "التواصل مع الجهات المعنية", "الاستعانة بمستشار قانوني", "متابعة التغييرات التنظيمية", "تجهيز الوثائق المطلوبة مبكراً" ], 'مخاطر سوقية': [ "تثبيت أسعار المواد مع الموردين", "البحث عن موردين بدلاء", "شراء المواد الرئيسية مبكراً", "إبرام عقود توريد طويلة الأجل", "مراقبة تقلبات السوق" ] } def analyze_risks(self, text): """تحليل المخاطر في النص المعطى""" if not text: return pd.DataFrame() # تقسيم النص إلى جمل sentences = sent_tokenize(text) # تحليل المخاطر في كل جملة risks = [] risk_id = 1 for sentence in sentences: # تحديد نوع المخاطرة إذا وجدت risk_category = self._determine_risk_category(sentence) if risk_category: # تحديد التأثير والاحتمالية impact = self._determine_impact(sentence) probability = self._determine_probability(sentence) # اختيار استراتيجية المعالجة mitigation = np.random.choice(self.mitigation_strategies.get(risk_category, ["مراجعة فريق المخاطر"])) # إضافة المخاطرة إلى القائمة risks.append({ 'رقم المخاطرة': f"R{risk_id:02d}", 'وصف المخاطرة': sentence.strip(), 'الفئة': risk_category, 'التأثير': impact, 'الاحتمالية': probability, 'استراتيجية المعالجة': mitigation }) risk_id += 1 # تحويل القائمة إلى DataFrame risks_df = pd.DataFrame(risks) # التأكد من وجود بيانات if risks_df.empty: # إنشاء DataFrame فارغ بالأعمدة المطلوبة risks_df = pd.DataFrame(columns=[ 'رقم المخاطرة', 'وصف المخاطرة', 'الفئة', 'التأثير', 'الاحتمالية', 'استراتيجية المعالجة' ]) return risks_df def _determine_risk_category(self, text): """تحديد فئة المخاطرة بناءً على محتوى النص""" # البحث عن الكلمات المفتاحية في النص scores = {} for category, indicators in self.risk_indicators.items(): score = sum(1 for indicator in indicators if indicator in text.lower()) scores[category] = score # اختيار الفئة ذات الدرجة الأعلى إذا وجدت if max(scores.values(), default=0) > 0: return max(scores.items(), key=lambda x: x[1])[0] else: return None def _determine_impact(self, text): """تحديد تأثير المخاطرة بناءً على محتوى النص""" # البحث عن الكلمات المفتاحية في النص scores = {} for impact, indicators in self.impact_indicators.items(): score = sum(1 for indicator in indicators if indicator in text.lower()) scores[impact] = score # اختيار التأثير ذو الدرجة الأعلى if max(scores.values(), default=0) > 0: return max(scores.items(), key=lambda x: x[1])[0] else: # اختيار عشوائي مع ترجيح أكبر للتأثير المتوسط return np.random.choice( ["عالي", "متوسط", "منخفض"], p=[0.3, 0.5, 0.2] ) def _determine_probability(self, text): """تحديد احتمالية المخاطرة بناءً على محتوى النص""" # البحث عن الكلمات المفتاحية في النص scores = {} for probability, indicators in self.probability_indicators.items(): score = sum(1 for indicator in indicators if indicator in text.lower()) scores[probability] = score # اختيار الاحتمالية ذات الدرجة الأعلى if max(scores.values(), default=0) > 0: return max(scores.items(), key=lambda x: x[1])[0] else: # اختيار عشوائي مع ترجيح أكبر للاحتمالية المتوسطة return np.random.choice( ["مؤكد", "محتمل", "غير محتمل"], p=[0.2, 0.6, 0.2] )