Spaces:
Paused
Paused
| """ | |
| خدمة تحليل المخاطر في المستندات | |
| """ | |
| 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] | |
| ) |