مكتبة لاكتشاف آيات القرآن الكريم ومقاطع الآيات داخل النصوص العربية (تغريدات، مقالات، كتب) مع واجهة Python بسيطة وواجهة سطر أوامر (CLI).
تعتمد الخوارزمية على الورقة البحثية:
“QDetect: An Intelligent Tool for Detecting Quranic Verses in any Text”
Samhaa R. El-Beltagy and Ahmed Rafea, Procedia Computer Science 189 (2021) 374–381.
Paper link: https://www.sciencedirect.com/science/article/pii/S1877050921012321
وهذه الحزمة هي إعادة كتابة حديثة للمستودع القديم:
https://github.com/SElBeltagy/Quran_Detector
- اكتشاف الآيات والمقاطع داخل نص عربي طويل بكفاءة.
- دعم تصحيح أخطاء إملائية بسيطة (Levenshtein=1) واكتشاف كلمات ناقصة (اختياري).
- واجهة Python صغيرة:
detectوannotateوSettings. - CLI جاهز للاستخدام:
quran-detector. - موارد القرآن مرفقة داخل الحزمة وتُحمّل عبر
importlib.resources. - اختبارات انحدار تعتمد على ملفات golden لضمان ثبات السلوك.
- Python بإصدار 3.12 أو أحدث.
داخل مشروعك:
uv add quran-detectorإضافات التطوير (للمساهمين):
uv add --dev "quran-detector[dev]"python -m pip install quran-detectorإضافات التطوير:
python -m pip install "quran-detector[dev]"- قم بتنزيل المستودع:
git clone git@github.com:ieasybooks/quran-detector.git - توجّه إلى مجلد المشروع:
cd quran-detector - ثبّت الاعتماديات:
uv sync --extra dev
إذا كنت تستخدم Mise:
mise exec python@3.12 -- uv sync --extra dev- اكتشاف (JSON):
quran-detector detect --input input.txt > matches.json - وسم:
quran-detector annotate --input input.txt > annotated.txt - قراءة من stdin:
cat input.txt | quran-detector detect --stdin
مثال لتغيير الإعدادات:
quran-detector detect --stdin --no-find-errors --no-find-missing --allowed-error-pct 0.5 --min-match 5الواجهة العامة صغيرة ومقصودة:
quran_detector.detect(text: str, settings: Settings = Settings()) -> list[dict]quran_detector.annotate(text: str, settings: Settings = Settings()) -> strquran_detector.Settings
from quran_detector import Settings, annotate
text = "قال تعالى: وَاصْبِرْ وَمَا صَبْرُكَ إِلَّا بِاللَّهِ"
print(annotate(text, settings=Settings(find_missing=False)))
ملاحظة: خيار find_missing قد يكون عدوانيًا في بعض النصوص العامة (قد يضم كلمات قبل الآية ضمن التطابق). لواجهات المستخدم يُنصح غالبًا بإيقافه:
Settings(find_missing=False).
from quran_detector import Settings, detect
text = "وَاصْبِرْ وَمَا صَبْرُكَ إِلَّا بِاللَّهِ"
matches = detect(text, settings=Settings(find_missing=False))
print(matches)كائن Settings يتحكم في سلوك المطابقة (وخيارات CLI تُطابقه):
find_errors: تفعيل تصحيح أخطاء الإملاء (Levenshtein=1).find_missing: تفعيل اكتشاف الكلمات الناقصة (مكلف وقد يكون عدوانيًا).allowed_error_pct: أقصى نسبة أخطاء مسموحة مقارنة بطول التطابق.min_match: الحد الأدنى لعدد الكلمات في المقطع.delimiters: تعبير Regex للفصل/التنظيف قبل المطابقة.
الدالة detect() تُرجع list[dict] قابلة للتحويل إلى JSON، حيث يحتوي كل سجل على:
surah_name: اسم السورةaya_startوaya_end: رقم الآية أو نطاق الآياتverses: المقاطع المطابقة (بعد التطبيع)errors: تفاصيل التصحيحات (إن وجدت)start_in_textوend_in_text: فهارس كلمات بالنسبة لـtext.split()
ملاحظة: الفهارس هنا هي مواقع كلمات (وليست إزاحات حروف).
الدالة annotate() تُرجع النص بعد استبدال المقاطع المطابقة بالنص الأصلي للقرآن مع إضافة مرجع:
"<quran text>" (سورة:آية[-آية])ملاحظة حول الالتباس: بعض المقاطع الشائعة جدًا قد تتطابق مع أكثر من موضع/آية، وقد توجد أكثر من نتيجة صحيحة في حالات معيّنة. اختبارات golden الخاصة بالوسم تتحقق من الحالات غير الملتبسة (unambiguous) فقط.
على مستوى عالٍ، الخوارزمية تقوم بـ:
-
تطبيع النص
- تطبيع بعض أشكال الحروف العربية (مثل: أشكال الألف →
ا، وة→ه، وى/ی→ي). - إزالة التشكيل لأغراض المطابقة.
- تطبيع بعض أشكال الحروف العربية (مثل: أشكال الألف →
-
فهرسة القرآن
- بناء بنية trie (“linked hash tables” في الورقة) على جميع سوابق/لواحق مقاطع الآيات (بحد أدنى 3 كلمات).
- تتبع حالات terminal و abs-terminal لدعم “أطول تطابق”.
-
مسح النص
- مسح النص كلمة بكلمة ومحاولة تمديد التطابق قدر الإمكان.
- اختياريًا: تصحيح خطأ إملائي بحرف واحد + اكتشاف كلمة ناقصة.
-
ترشيح النتائج
- تطبيق حد أدنى للطول (
min_match) وحد نسبة الأخطاء (allowed_error_pct) وقواعد إضافية للمقاطع القصيرة.
- تطبيق حد أدنى للطول (
الحزمة ترفق الموارد المطلوبة داخل src/quran_detector/data/:
quran-simple.txt(نص القرآن)quran-index.xml(بيانات السور)non-terminals.txt(قائمة الكلمات/الوقف)
يتم تحميل الموارد عبر importlib.resources لتعمل داخل wheels وعمليات التثبيت المضغوطة.
ruff(lint + ترتيب الاستيرادات)ruff format(تنسيق)mypy(فحص الأنواع)
تثبيت hooks:
pre-commit installتشغيلها على كل الملفات:
pre-commit run --all-filesالاختبارات تستخدم fixtures مرفقة داخل tests/fixtures/ (بدون الاعتماد على مجلدات خارجية).
تشغيل الاختبارات كأوامر منفصلة:
pytest -q tests/test_tweets_eval.py
pytest -q tests/test_golden_outputs.py -k 'match_all_against_golden'
pytest -q tests/test_golden_outputs.py -k 'annotate_txt_against_golden'ملاحظة: مجموعات golden ثقيلة عمدًا وقد تأخذ حوالي 30–40 دقيقة لكل مجموعة على جهاز محمول.