EGYADMIN's picture
Upload 114 files
25d2b3e verified
raw
history blame
8.41 kB
# -*- 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% كحد أدنى"
]