بسم الله، والصلاة والسلام على رسول الله.
اللهم نسألك العفو والعافية في الدنيا والآخرة.
المقدمة
قبل حوالي عام، منَّ الله عليّ بفرصة التطوع كمطور لمشروع “رصائف”.
ما هو مشروع رصائف؟
رصائف الصحاح لتراجم الفصحاح هو منصة تعرض الكلمات في سياقها مع ما يعادلها باللغة الإنجليزية. يتميز هذا المشروع الرائع بانتقائه للكتب البليغة لمؤلفين كلاسيكيين. أطلقه المترجم السعودي أحمد الغامدي، مؤلف كتاب الأرنجية، بالتعاون مع متطوعين مخلصين - نسأل الله أن يتقبل جهودهم. يمكنك مشاهدة هذا الفيديو لمعرفة المزيد عن المبادرة.
التحديات
استدامة جهود المتطوعين
ضمان استمرار المتطوعين في تنسيق الكتب باستخدام برنامج وورد.
عرض نتائج البحث في سياقها
القدرة على إظهار نتائج البحث ضمن سياقها، مع النص المكافئ باللغة الأخرى.
ميزة بحث شاملة وسريعة
توفير خاصية البحث الفوري التي تشمل جميع الكتب، على غرار المكتبة الشاملة.
تحميل الكتب بسهولة
تمكين رفع كتاب منسق بالكامل في خطوة واحدة، بدلاً من رفعه فقرة بفقرة كما كان في السابق.
خيارات بحث مخصصة
إمكانية تخصيص البحث حسب:
الكتاب
التصنيف
المؤلف
اللغة
التنقل بين النتائج المتتالية
السماح للمستخدمين بالتنقل بين النتائج السابقة والتالية داخل نفس الكتاب.
تحليل بيانات البحث
تتبع الكلمات التي بحث عنها الزوار، وعدد مرات البحث عنها، وما إذا كانت موجودة في الكتب أم لا.
الأدوات المستخدمة
Pandoc
لتحويل ملفات وورد إلى تنسيق HTML.
Jupyter Notebook
لمعالجة ملفات HTML، وتنقية النصوص باستخدام مكتبة Pandas، ثم تحويل المخرجات إلى JSON-ND لاستخدامها في Elasticsearch.
Elasticsearch
لتوفير إمكانيات البحث النصي المتقدم.
# تحديد مسار الملفpath =rf'organized/books/{book}/{file_no}.html'# تحليل ملف HTML باستخدام BeautifulSoupwithopen(path, 'r', encoding='utf-8') as file:
soup = BeautifulSoup(file, 'html.parser')
# استخراج رؤوس الجداولtry:
table = soup.find("table")
header = [th.get_text(strip=True) for th in table.find("tr").find_all("th")]
exceptAttributeError:
raiseValueError("لم يتم العثور على الجدول أو العناوين في ملف HTML.")
# استخراج بيانات الصفوفdata = []
for row in table.find_all("tr")[1:]: # تخطي صف العناوين row_data = [td.get_text(strip=True) for td in row.find_all("td")]
data.append(row_data)
# تحويل البيانات إلى DataFrame في PandasdataFrame = pd.DataFrame(data=data, columns=header)