متتبع إعلانات المنح البلدية (Municipal Grant Announcement Tracker)
مسار بيانات (Pipeline) آلي بالكامل يقوم بجلب إشعارات إرساء العقود العامة من صفحة فيسبوك خاصة بالبلدية، ويستخرج بيانات مهيكلة من صور المستندات الممسوحة ضوئياً باللغة العربية باستخدام نموذج رؤية ولغة، ويعرضها في لوحة بيانات عامة وتفاعلية — بدون الحاجة لأي صيانة يدوية.
ماذا يفعل هذا المشروع
تُطالب البلديات الجزائرية بنشر إشعارات رسمية علنية عند إرساء عقد حكومي ("إعلان عن المنح المؤقت") أو إلغائه. في الواقع العملي، تُنشر هذه الإشعارات كصور مستندات ممسوحة ضوئياً على فيسبوك — يمكن قراءتها واحدة تلو الأخرى، ولكن من المستحيل البحث فيها، أو تجميعها، أو تحليلها على نطاق واسع.
يحول هذا المشروع تلك المعلومات الخام والمبعثرة إلى مجموعة بيانات مهيكلة وقابلة للبحث، وإلى لوحة بيانات عامة تُحدَّث تلقائياً كل يوم.
كيف يعمل:
صفحة فيسبوك
│
▼
Apify (جلب البيانات) ──────────► يستبعد مقاطع الفيديو/الريلز، ويحتفظ بالصور الحقيقية
│
▼
Gemini Vision API ─────────► يصنف كل صورة (إرساء / إلغاء / غير ذي صلة)
│ ثم يستخرج الحقول المهيكلة عبر هندسة التلقين (Prompt Engineering)
▼
RapidFuzz (مطابقة تقريبية) ───► يربط إشعارات الإلغاء بإرساء العقد الأصلي،
│ حتى عندما يختلف النص المستخرج بشكل طفيف بين المنشورين
▼
قاعدة بيانات SQLite
│
▼
لوحة بيانات Streamlit ───────► اتجاهات الإنفاق، أبرز المقاولين، معدلات الإلغاء،
تدقيق المطابقة التقريبية، وأداة بناء مخططات ذاتية الخدمة
لأتمتة: يعمل مسار عمل GitHub Actions يومياً، حيث يجلب منشورات اليوم السابق ويقوم بإيداع (Committing) البيانات المحدثة مرة أخرى في هذا المستودع. تقرأ لوحة بيانات Streamlit مباشرة من تلك البيانات، مما يعكس الإعلانات الجديدة تلقائياً — بدون خادم، وبدون تحديثات يدوية.
الميزات
استخراج معتمد على الرؤية، وليس (OCR) التقليدي — يقرأ نموذج الرؤية واللغة (Gemini) الجداول، والكتابة اليدوية، والنصوص المختومة/المتداخلة بشكل أكثر موثوقية من أدوات التعرف البصري على الحروف الكلاسيكية، خاصة في المستندات المكتوبة باللغة العربية.
التعامل مع الجداول متعددة الصفوف — يمكن أن تحتوي صورة الإعلان الواحد على إرساءات لعدة عقود منفصلة (عقد لكل حصة)؛ يُستخرج كل منها كسجل مستقل.
ربط الإلغاءات — تُطابق إشعارات الإلغاء تلقائياً مع الإرساء الأصلي باستخدام المطابقة التقريبية (Fuzzy Matching) للنصوص على اسم الشركة وعنوان المشروع، مع فحص للمبلغ الرقمي كإجراء وقائي، نظراً لأن المطابقة النصية الدقيقة ليست موثوقة بين مستندين تم استخراجهما بشكل مستقل.
الحماية من الهلوسة — توجه تعليمة الاستخراج (Prompt) النموذج صراحةً بإرجاع قيمة فارغة (Null) بدلاً من التخمين عندما لا يكون الحقل مرئياً بوضوح، وتُستبعد الصفوف التي لا تحتوي على اسم فائز ناجح بدلاً من اختلاقها.
تدوير مفاتيح API — التدوير بين عدة بيانات اعتماد لـ Apify/Gemini عند تجاوز حدود الاستخدام أو أخطاء الحصص، حتى لا يتوقف المسار بسبب استنفاد مفتاح واحد.
ملء أثر رجعي قابل للاستئناف ومزود بنقاط حفظ — تعالج عملية الاسترجاع التاريخية (Backfill) البيانات في دفعات تعتمد على النطاق الزمني، ويمكن مقاطعتها واستئنافها بأمان دون إعادة معالجة العمل المنجز بالفعل.
تدقيق المطابقة التقريبية — تتيح علامة تبويب مخصصة في لوحة البيانات لأي شخص فحص المتغيرات في أسماء الشركات/البلديات التي تم تجميعها تلقائياً، مع علامة تبويب منفصلة لتصحيح أي تجميع خاطئ يدوياً.
أتمتة بدون خوادم بالكامل — يعمل المسار بأكمله على الطبقة المجانية لـ GitHub Actions؛ لا يوجد خادم افتراضي خاص (VPS)، ولا خادم يعمل باستمرار، ولا توجد تكاليف.