Detect Quranic verses and verse fragments in Arabic text (QDetect rewrite)
Project description
quran-detector
مكتبة لاكتشاف آيات القرآن الكريم ومقاطع الآيات داخل النصوص العربية (تغريدات، مقالات، كتب) اعتمادًا على خوارزمية مبنية على الورقة البحثية التالية:
“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
Legacy implementation repo: https://github.com/SElBeltagy/Quran_Detector
هذا المشروع هو إعادة كتابة حديثة للمشروع القديم Quran_Detector مع واجهة Python واضحة، وأداة سطر أوامر (CLI)، وملفات بيانات مرفقة (نص القرآن وقوائم الكلمات)، واختبارات انحدار (golden files) لضمان ثبات السلوك.
التثبيت
باستخدام uv (موصى به)
داخل مشروعك:
uv add quran-detector
للتطوير (يضيف ruff و mypy و pre-commit):
uv add --dev "quran-detector[dev]"
باستخدام pip
python -m pip install quran-detector
إضافات التطوير:
python -m pip install "quran-detector[dev]"
تهيئة المستودع محليًا (هذا المستودع)
هذا المستودع يحتوي على uv.lock لذلك يمكنك تشغيل:
uv sync --extra dev
إذا كنت تستخدم Mise:
mise exec python@3.12 -- uv sync --extra dev
بداية سريعة
واجهة Python
from quran_detector import Settings, detect, annotate
text = "وَاصْبِرْ وَمَا صَبْرُكَ إِلَّا بِاللَّهِ"
records = detect(text, settings=Settings())
annotated = annotate(text, settings=Settings())
أداة سطر الأوامر (CLI)
اكتشاف (خرج 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
الواجهة العامة (Public API)
الواجهة العامة مقصودة لتكون صغيرة وبسيطة:
quran_detector.detect(text: str, settings: Settings = Settings()) -> list[dict]quran_detector.annotate(text: str, settings: Settings = Settings()) -> strquran_detector.Settings(كائن إعدادات)
داخليًا، يتم إنشاء كائن Engine وحيد (singleton) عند أول استدعاء بشكل كسول، ويعتمد على موارد القرآن المرفقة داخل الحزمة.
صيغة الخرج
الدالة detect() تُرجع list[dict] قابلة للتحويل إلى JSON، حيث يحتوي كل سجل على:
surah_name: اسم السورة (نص عربي)aya_startوaya_end: نطاق الآية (شاملًا)verses: قائمة بمقاطع/نصوص التطابق (بعد التطبيع)errors: قائمة قوائم تشرح التصحيحات لكل مقطعstart_in_textوend_in_text: فهارس كلمات بالنسبة لـtext.split()بعد تجهيز الرموز داخليًا
ملاحظات:
- الفهارس هي مواقع كلمات وليست إزاحات حروف.
- إذا كان التطابق يغطي أكثر من آية متتالية فستجد
aya_end > aya_startوversesتحتوي أكثر من مقطع.
الإعدادات (Settings)
كائن Settings يتحكم في سلوك المطابقة:
find_errors: bool = True
تفعيل تصحيح أخطاء الإملاء (مسافة Levenshtein تساوي 1 بين كلمة الإدخال وأحد أبناء العقدة في الـ trie).find_missing: bool = True
تفعيل اكتشاف الكلمات الناقصة عبر السماح بـ “تخطّي” كلمة داخل مسار الـ trie (مكلف حسابيًا؛ انظر الورقة).allowed_error_pct: float = 0.25
أقصى نسبة للأخطاء المسموحة مقارنة بطول التطابق (عدد الكلمات). السجلات التي تتجاوز هذا الحد يتم استبعادها.min_match: int = 3
الحد الأدنى لعدد الكلمات لتكوين مقطع صالح (الافتراضي في الورقة هو 3).delimiters: str = GLOBAL_DELIMITERS
تعبير Regex لفصل/إزالة علامات الترقيم من الكلمات قبل المطابقة.
خيارات CLI تُطابق هذه الحقول 1:1:
quran-detector detect --stdin --no-find-errors --no-find-missing --allowed-error-pct 0.5 --min-match 5
كيف يعمل الوسم (Annotation)
الدالة annotate() تُرجع نصًا يتم فيه استبدال المقاطع المطابقة بالنص الأصلي للقرآن (كما هو مخزّن في الموارد المرفقة)
مع إضافة وسم مرجعي:
"<quran text>"(سورة:آية[-آية])
ملاحظة حول الالتباس: بعض المقاطع الشائعة جدًا قد تتطابق مع أكثر من موضع/آية. الخوارزمية القديمة (وبالتالي هذه الإعادة) قد تُنتج أكثر من نتيجة صحيحة في حالات معيّنة. لذلك اختبارات golden الخاصة بالوسم تتحقق من الحالات غير الملتبسة (unambiguous) فقط.
لمحة عن الخوارزمية (QDetect)
على مستوى عالٍ، هذه طريقة مطابقة أنماط متعددة مستوحاة من Aho–Corasick، لكنها في الورقة مُنفّذة عبر “linked hash tables”، وفي هذا المشروع تُنفّذ ببنية trie مخصصة لاكتشاف مقاطع الآيات بكفاءة.
- التطبيع (Normalization)
- تطبيع بعض أشكال الحروف العربية (مثل: أشكال الألف →
ا، وة→ه، وى/ی→ي). - إزالة التشكيل/الضبط من نصوص القرآن والمدخل لأغراض المطابقة.
- تطبيع بعض أشكال الحروف العربية (مثل: أشكال الألف →
- فهرسة القرآن
- بناء بنية trie (“linked hash tables” في الورقة) على جميع سوابق/لواحق مقاطع الآيات (بحد أدنى 3 كلمات).
- تتبع حالات terminal و abs-terminal لدعم “أطول تطابق” (longest match).
- المسح (Scanning)
- مسح النص كلمة بكلمة ومحاولة تمديد التطابق قدر الإمكان.
- اختياريًا:
- تصحيح خطأ إملائي بحرف واحد.
- اكتشاف كلمة مفقودة.
- الترشيح (Filtering)
- تطبيق حد أدنى للطول، واستبعاد بعض العبارات/الآيات القصيرة الشائعة، وتطبيق حد نسبة الأخطاء
allowed_error_pct. - تطبيق معيار نسبة كلمات الوقف للمقاطع القصيرة (سلوك الورقة/الإرث).
- تطبيق حد أدنى للطول، واستبعاد بعض العبارات/الآيات القصيرة الشائعة، وتطبيق حد نسبة الأخطاء
للتفاصيل النظرية والخوارزمية، راجع الورقة البحثية من خلال الرابط في الأعلى.
البيانات / الموارد
الحزمة ترفق الموارد المطلوبة داخل src/quran_detector/data/:
quran-simple.txt(نص القرآن)quran-index.xml(بيانات السور)non-terminals.txt(قائمة كلمات الوقف / non-terminals)
يتم تحميل الموارد عبر importlib.resources بحيث تعمل في حزم wheels وعمليات التثبيت المضغوطة.
التطوير
Pre-commit
هذا المستودع يستخدم:
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 دقيقة لكل مجموعة على جهاز محمول.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file quran_detector-0.0.1.tar.gz.
File metadata
- Download URL: quran_detector-0.0.1.tar.gz
- Upload date:
- Size: 304.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f722af08cf974dec17c0bb9bf2ff9b6a54d026ca4893c8914229523b5a1f8dde
|
|
| MD5 |
2a893f32cf9e5201d724c7dfeff20176
|
|
| BLAKE2b-256 |
8e9bb4efdc6af51323f11851477ee1811cc9f4d2cfdc0c8fd0a8dd515c64202b
|
Provenance
The following attestation bundles were made for quran_detector-0.0.1.tar.gz:
Publisher:
release.yml on ieasybooks/quran-detector
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
quran_detector-0.0.1.tar.gz -
Subject digest:
f722af08cf974dec17c0bb9bf2ff9b6a54d026ca4893c8914229523b5a1f8dde - Sigstore transparency entry: 777304713
- Sigstore integration time:
-
Permalink:
ieasybooks/quran-detector@cb7291db44a044a7ee74449a49238d20c5b60cb3 -
Branch / Tag:
refs/tags/0.0.1 - Owner: https://github.com/ieasybooks
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@cb7291db44a044a7ee74449a49238d20c5b60cb3 -
Trigger Event:
release
-
Statement type:
File details
Details for the file quran_detector-0.0.1-py3-none-any.whl.
File metadata
- Download URL: quran_detector-0.0.1-py3-none-any.whl
- Upload date:
- Size: 314.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1bb0423a4eda22a89db0835aecdea10fc6556bc9e1257b71727b005661d9a001
|
|
| MD5 |
75143d756609a1b034ad30894b732b70
|
|
| BLAKE2b-256 |
9dfc30e3d5208c642fd1d11fb826faf2334c9e6ab319482ed0e12c721e22313a
|
Provenance
The following attestation bundles were made for quran_detector-0.0.1-py3-none-any.whl:
Publisher:
release.yml on ieasybooks/quran-detector
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
quran_detector-0.0.1-py3-none-any.whl -
Subject digest:
1bb0423a4eda22a89db0835aecdea10fc6556bc9e1257b71727b005661d9a001 - Sigstore transparency entry: 777304739
- Sigstore integration time:
-
Permalink:
ieasybooks/quran-detector@cb7291db44a044a7ee74449a49238d20c5b60cb3 -
Branch / Tag:
refs/tags/0.0.1 - Owner: https://github.com/ieasybooks
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@cb7291db44a044a7ee74449a49238d20c5b60cb3 -
Trigger Event:
release
-
Statement type: