أرشيف الصحف الرقمي لمجموعة خاصة: تتحول أعداد الصحف بصيغة PDF إلى أرشيف يمكن العثور فيه على أي مقال بكلمة أو بالمعنى أو بطرح سؤال، مع ذكر المصدر دائمًا.
المشكلة
كان لدى العميل مجموعة من أعداد الصحف بصيغة PDF. وكان العثور على مقال يعني فتح الملفات واحدًا تلو الآخر، كما أن كثيرًا من الصفحات كانت صورًا ممسوحة ضوئيًا بلا نص. وكان على الأرشيف أن يبقى خاصًا: لا يدخله إلا من يدعوه المشرف.
ما الذي بنيته: أرشيف الصحف الرقمي
بنيت أرشيفًا خاصًا على الويب يُحفظ فيه كل عدد باسم الصحيفة وتاريخه وملف PDF، وتصبح كل صفحة فيه قابلة للبحث.
- استخراج النص مع OCR كبديل: تحتفظ الصفحة بطبقة النص الخاصة بها إن وُجدت. أما الصفحات التي تحتوي على أقل من 40 حرفًا فتُعرض بدقة 220 DPI وتُقرأ عبر Tesseract. وهكذا تصبح الصفحات الممسوحة القديمة قابلة للبحث أيضًا.
- بحث نصي كامل بالإيطالية: يستخدم البحث استخراج الجذور الإيطالية ويتجاهل علامات النبر، فكلمة «citta» تعثر على «città». وتتصدر العبارات المطابقة تمامًا النتائج، مع مقتطفات مظللة.
- البحث بالمعنى: يُقسَّم نص الصفحة إلى كتل متداخلة تُحوَّل إلى متجهات من 768 بُعدًا بنموذج متعدد اللغات. فيعثر القرّاء على المقالات حتى عندما لا يعرفون الكلمات الدقيقة.
- مساعد يذكر مصادره: يطرح القارئ سؤالًا بلغة عادية. فيسترجع النظام ما يصل إلى 8 مقاطع، بالمعنى وبالكلمات المفتاحية، ويجيب Claude استنادًا إلى هذه المقاطع وحدها، مع ذكر اسم الصحيفة والتاريخ والصفحة. ويُفعَّل من لوحة الإدارة بمفتاح Anthropic الخاص بالعميل.
- رفع جماعي من مجلد: يختار المشرف مجلدًا من ملفات PDF، ويُقرأ التاريخ من اسم كل ملف. وتُتخطى الملفات المكررة حسب اسم الصحيفة والتاريخ أو حسب بصمة SHA-256، فيمكن تكرار الرفع بأمان.
- دخول بالدعوة فقط: دوران، المشرف والقارئ. وتدير اللوحة المستخدمين والصحف ومفتاح الذكاء الاصطناعي والنسخ الاحتياطية.
بالأرقام
- حد أقصى للذاكرة قدره 8 GB لخدمة التضمين، مع إعادة تشغيل يومية. وقبل وضع هذا الحد كانت قد تضخمت إلى نحو 15 GB وعطّلت الطابور لمدة أسبوع.
- نسخ احتياطي ليلي في الساعة 03:30: تفريغ مضغوط لقاعدة البيانات مع الاحتفاظ بآخر 14 نسخة، إضافة إلى نسخة متزايدة مطابقة لملفات PDF.
- استعادة تلقائية للمهام العالقة: أي مهمة تظل قيد التشغيل أكثر من 20 دقيقة تعود إلى الطابور، بحد أقصى 6 محاولات.
التقنيات المستخدمة
Python 3.11 وFastAPI لتطبيق الويب. وPostgreSQL 16 مع pgvector وunaccent وpg_trgm للبيانات والبحث النصي والمتجهات. وPyMuPDF وTesseract للنص وOCR. وsentence-transformers مع نموذج multilingual-e5-base للتضمينات، ويعمل كخدمة محلية منفصلة. وAnthropic API للمساعد. ويعمل كل شيء كخدمات systemd خلف وكيل عكسي Apache.
لماذا بهذه الطريقة
أبقيت طابور المهام داخل PostgreSQL بدلًا من إضافة Redis. تحجز عمليات المعالجة المهام باستخدام FOR UPDATE SKIP LOCKED، فتعمل عدة عمليات بالتوازي دون أن تعالج العدد نفسه مرتين أبدًا. كما أن الخادم يستضيف مواقع أخرى، لذا كان الاستغناء عن خدمة إضافية تحتاج إلى تشغيل وتأمين مكسبًا حقيقيًا.
لمن يصلح أرشيف الصحف الرقمي
يصلح هذا النوع من الأرشيف للصحف ودور النشر التي تريد إتاحة أعدادها القديمة لفريق التحرير، وللمكتبات والجمعيات والمؤسسات التي تحتفظ بمجموعات من الصحف والمجلات، وللباحثين الذين يعملون على مصادر صحفية كثيرة. الفكرة واحدة في كل الحالات: تتحول الملفات المتفرقة إلى مكان واحد يمكن البحث فيه بسرعة، بالكلمة أو بالمعنى، مع الحفاظ على خصوصية المجموعة وعدم فتحها إلا لمن تدعوهم.


