|
|
|
""" |
|
خدمة تحليل المستندات |
|
|
|
هذا الملف يحتوي على الفئة المسؤولة عن تحليل المستندات واستخراج المعلومات الهيكلية منها. |
|
""" |
|
|
|
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% كحد أدنى" |
|
] |