Spaces:
Sleeping
Sleeping
# -*- 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% كحد أدنى" | |
] |