Spaces:
Paused
Paused
| # -*- coding: utf-8 -*- | |
| """ | |
| خدمة تحليل المستندات | |
| هذا الملف يحتوي على الفئة المسؤولة عن تحليل المستندات واستخراج المعلومات الهيكلية منها. | |
| """ | |
| 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: تقدير عدد الصفحات | |
| """ | |
| # تقدير بسيط: كل 50 كيلوبايت تقريباً صفحة واحدة | |
| # هذا تقدير بسيط جداً ويختلف حسب نوع المستند ومحتواه | |
| 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% كحد أدنى" | |
| ] |