Spaces:
Sleeping
Sleeping
File size: 8,630 Bytes
fb20480 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 |
# -*- 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% كحد أدنى"
] |