| |
| """ |
| خدمة تحليل المستندات |
| |
| هذا الملف يحتوي على الفئة المسؤولة عن تحليل المستندات واستخراج المعلومات الهيكلية منها. |
| """ |
|
|
| import os |
| import logging |
| import datetime |
|
|
| class DocumentParser: |
| """فئة تحليل المستندات واستخراج المعلومات منها""" |
| |
| def __init__(self, config=None): |
| """ |
| تهيئة محلل المستندات |
| |
| المعلمات: |
| config (dict): إعدادات محلل المستندات |
| """ |
| self.config = config or {} |
| self.logger = logging.getLogger(__name__) |
| |
| def parse(self, file_path): |
| """ |
| تحليل المستند واستخراج المعلومات منه |
| |
| المعلمات: |
| file_path (str): مسار الملف |
| |
| العوائد: |
| dict: معلومات المستند المستخرجة |
| """ |
| self.logger.info(f"جاري تحليل المستند: {file_path}") |
| |
| try: |
| |
| |
| file_name = os.path.basename(file_path) |
| file_size = os.path.getsize(file_path) if os.path.exists(file_path) else 0 |
| |
| |
| _, ext = os.path.splitext(file_path) |
| ext = ext.lower() |
| |
| |
| document_type = self._get_document_type(ext) |
| |
| |
| current_date = datetime.datetime.now().strftime("%Y-%m-%d") |
| |
| result = { |
| "اسم الملف": file_name, |
| "حجم الملف": f"{file_size / 1024:.2f} كيلوبايت", |
| "نوع الملف": document_type, |
| "تاريخ التحليل": current_date, |
| "تقدير عدد الصفحات": self._estimate_pages(file_size), |
| "نتائج التحليل": { |
| "نوع المستند": self._classify_document(file_name), |
| "درجة الثقة": "85%", |
| "الأقسام الرئيسية": self._get_main_sections(), |
| "الكلمات الرئيسية": self._get_main_keywords(), |
| "الشروط الهامة": self._get_important_terms() |
| } |
| } |
| |
| return result |
| except Exception as e: |
| self.logger.error(f"خطأ في تحليل المستند: {str(e)}") |
| return {"خطأ": f"حدث خطأ أثناء تحليل المستند: {str(e)}"} |
| |
| def parse_document(self, file_path): |
| """ |
| تحليل المستند واستخراج المعلومات الأساسية منه |
| |
| المعلمات: |
| file_path (str): مسار الملف |
| |
| العوائد: |
| dict: معلومات المستند الأساسية |
| """ |
| self.logger.info(f"جاري تحليل المستند الأساسي: {file_path}") |
| |
| |
| |
| file_name = os.path.basename(file_path) |
| |
| return { |
| "نوع": self._classify_document(file_name), |
| "محتوى": "محتوى المستند...", |
| "هيكل": { |
| "عنوان": "عنوان المستند", |
| "أقسام": ["قسم 1", "قسم 2", "قسم 3"] |
| } |
| } |
| |
| def _get_document_type(self, ext): |
| """ |
| تحديد نوع المستند من امتداد الملف |
| |
| المعلمات: |
| ext (str): امتداد الملف |
| |
| العوائد: |
| str: نوع المستند |
| """ |
| document_types = { |
| '.pdf': 'مستند PDF', |
| '.doc': 'مستند Word', |
| '.docx': 'مستند Word', |
| '.jpg': 'صورة JPEG', |
| '.jpeg': 'صورة JPEG', |
| '.png': 'صورة PNG', |
| '.xlsx': 'جدول Excel', |
| '.xls': 'جدول Excel', |
| '.txt': 'ملف نصي' |
| } |
| |
| return document_types.get(ext, 'نوع ملف غير معروف') |
| |
| def _estimate_pages(self, file_size): |
| """ |
| تقدير عدد صفحات المستند بناءً على حجمه |
| |
| المعلمات: |
| file_size (int): حجم الملف بالبايت |
| |
| العوائد: |
| int: تقدير عدد الصفحات |
| """ |
| |
| |
| return max(1, int(file_size / (50 * 1024))) |
| |
| def _classify_document(self, file_name): |
| """ |
| تصنيف نوع المستند بناءً على اسمه |
| |
| المعلمات: |
| file_name (str): اسم الملف |
| |
| العوائد: |
| str: تصنيف المستند |
| """ |
| file_name_lower = file_name.lower() |
| |
| if 'عقد' in file_name_lower or 'contract' in file_name_lower: |
| return "عقد" |
| elif 'مناقصة' in file_name_lower or 'tender' in file_name_lower: |
| return "مستند مناقصة" |
| elif 'تقرير' in file_name_lower or 'report' in file_name_lower: |
| return "تقرير" |
| elif 'فاتورة' in file_name_lower or 'invoice' in file_name_lower: |
| return "فاتورة" |
| elif 'عرض' in file_name_lower or 'proposal' in file_name_lower: |
| return "عرض سعر" |
| elif 'مواصفات' in file_name_lower or 'spec' in file_name_lower: |
| return "مواصفات فنية" |
| elif 'كراسة' in file_name_lower or 'شروط' in file_name_lower: |
| return "كراسة شروط" |
| else: |
| return "مستند عام" |
| |
| def _get_main_sections(self): |
| """ |
| الحصول على قائمة الأقسام الرئيسية التقديرية للمستند |
| |
| العوائد: |
| list: قائمة الأقسام الرئيسية |
| """ |
| |
| return [ |
| "مقدمة", |
| "نطاق العمل", |
| "المواصفات الفنية", |
| "جدول الكميات", |
| "الشروط والأحكام", |
| "الجدول الزمني", |
| "المتطلبات الخاصة" |
| ] |
| |
| def _get_main_keywords(self): |
| """ |
| الحصول على قائمة الكلمات الرئيسية التقديرية للمستند |
| |
| العوائد: |
| list: قائمة الكلمات الرئيسية |
| """ |
| |
| return [ |
| "مناقصة", |
| "بناء", |
| "تشييد", |
| "تسليم مفتاح", |
| "مواصفات فنية", |
| "جدول كميات", |
| "ضمان", |
| "غرامة تأخير", |
| "دفعة مقدمة", |
| "محتوى محلي" |
| ] |
| |
| def _get_important_terms(self): |
| """ |
| الحصول على قائمة الشروط الهامة التقديرية للمستند |
| |
| العوائد: |
| list: قائمة الشروط الهامة |
| """ |
| |
| return [ |
| "مدة تنفيذ المشروع: 18 شهر", |
| "غرامة التأخير: 0.5% أسبوعياً بحد أقصى 10%", |
| "الدفعة المقدمة: 10%", |
| "الضمان النهائي: 5% لمدة سنة", |
| "شروط الدفع: دفعات شهرية حسب نسبة الإنجاز", |
| "المحتوى المحلي: 70% كحد أدنى" |
| ] |