العربية في الاسترجاع
درس 7 من 10
7العربية في الاسترجاع
الصورة الكبيرة«إجازة» و«اجازه» و«الإجَازَة» نفس الكلمة للقارئ، وثلاث كلمات مختلفة للحاسوب. المستخدمون يكتبون بلا همزات ولا تشكيل، والمستندات الرسمية بهما. تطبيع النص العربي قبل الفهرسة وقبل البحث هو أرخص تحسين في نظام RAG عربي، وأكثر ما يُنسى.
ماذا تشاهد في الرسم: فوق: كل شكل يراه الحاسوب كلمة مختلفة. تحت: نفس الدالة تحذف التشكيل والتطويل وتوحّد الهمزات والتاء المربوطة والألف المقصورة، فتلتقي الأشكال. هذه الدالة نفسها يجب أن تمرّ عليها المستندات والأسئلة معًا.
خارطة هذا الجزء
المفاهيم بالترتيب، اضغط أيًّا منها للقفز إليه:
طريقان إلى نفس الفكرة
الكلمة العربية الواحدة تُكتب بطرق كثيرة: «إسلام» و«اسلام»، و«مدرسة» و«مدرسه»، مع تشكيل أو بدونه، وبأرقام ١٢٣ أو 123. الحاسوب يراها كلمات مختلفة تمامًا. لو لم توحّدها قبل البحث، يفشل البحث في إيجاد ما هو أمامه.
التطبيع يزيل التشكيل والتطويل، ويوحّد أشكال الألف أ إ آ إلى ا، والتاء المربوطة والألف المقصورة، ويحوّل الأرقام الهندية. يُطبَّق بالطريقة نفسها على المستندات والأسئلة معًا، ويُكمَّل باستخراج الجذر أو تقطيع مناسب للعربية.
قبل أن تبدأ
⚗️البحث الهجين
تعرف أن BM25 يقارن الكلمات حرفًا بحرف، فأي اختلاف في الكتابة يُضيّع التطابق.
🧹مشروع: بيانات عربية وسخة
نظّفت نصًّا عربيًّا من قبل، وتعرف التعابير النمطية مع re.sub.
الفكرة الجوهرية
«إجازة» و«اجازه» كلمة واحدة للقارئ وكلمتان للحاسوب. تبني في هذا الدرس دالة تطبيع، ثم ترى أثرها على البحث، ثم توحّد الأرقام والأشكال المركّبة، ثم تعرف أين تتوقّف.
1دالة التطبيع
التطبيع يحوّل الأشكال المختلفة لنفس الكلمة إلى شكل واحد قبل المقارنة. انظر إلى الرسم: خمس قواعد تمرّ عليها كل كلمة بالترتيب.
import re
DIACRITICS = re.compile(r"[ً-ْٰ]") # fatha, damma, kasra, tanween, shadda, sukun, dagger alef
TATWEEL = "ـ"
def normalize(text):
text = DIACRITICS.sub("", text)
text = text.replace(TATWEEL, "")
text = re.sub("[إأآٱ]", "ا", text)
text = text.replace("ى", "ي")
text = text.replace("ة", "ه")
return text
for word in ["الإجَازَةُ", "إجازة", "اجازه", "مُســـتشفى", "مستشفي", "أحمد", "احمد"]:
print(f"{word:12} -> {normalize(word)}")
حذف التشكيل والتطويل، وتوحيد أشكال الألف المهموزة إلى «ا»، والألف المقصورة إلى «ي»، والتاء المربوطة إلى «ه». النتيجة أن كل الأشكال السبعة صارت ثلاث كلمات فقط. لاحظ أن هذا يحدث في نسخة البحث فقط، ويبقى النص الأصلي كما هو للعرض والاستشهاد.
توحيد الهمزات يخسر تمييزًا نادرًا بين كلمات قليلة، ويكسب تطابق أغلب ما يكتبه الناس.
2الأثر على البحث
الناس يكتبون بلا همزات ولا تشكيل، والمستندات الرسمية تكتب بهما. انظر إلى الرسم: خمسة أسئلة كما يكتبها الناس، قبل التطبيع وبعده.
import re
docs = ["تُقدَّم طلبات الإجازة قبل أسبوعين.",
"يحق للموظف إجازة مرضية بتقرير طبي.",
"تصرف بدلات السفر خلال عشرة أيام.",
"الأسئلة الشائعة عن المستشفى المتعاقد معه."]
queries = ["اجازه", "الاجازة", "اسبوعين", "مستشفي", "تقدم"]
def normalize(t):
t = re.sub(r"[ً-ْٰـ]", "", t)
t = re.sub("[إأآٱ]", "ا", t)
return t.replace("ى", "ي").replace("ة", "ه")
def found(query, docs, norm):
f = normalize if norm else (lambda s: s)
return [i for i, d in enumerate(docs) if f(query) in f(d)]
for q in queries:
print(f"{q:10} raw: {found(q, docs, False)!s:8} normalised: {found(q, docs, True)}")
بلا تطبيع، خمسة أسئلة مكتوبة كما يكتب الناس فعلًا لم تجد شيئًا. بعد التطبيع وجدت كلها مستنداتها. هذا بحث نصّي بسيط، لكن الأثر نفسه يحدث في BM25 وفي أي فهرس كلمات، ويقلّ في نماذج التضمين لكنه لا يختفي.
3الأرقام والأشكال المركّبة
الأرقام العربية الهندية (١٢٣) والفارسية (۱۲۳) واللاتينية (123) شيء واحد للقارئ. إن لم توحّدها، لن يجد «طلب 1043» مستندًا فيه «طلب ١٠٤٣».
نصوص من ملفات PDF قديمة تحمل أحيانًا «لا» كحرف واحد مركّب لا حرفين، فلا تجدها أي مقارنة.
import unicodedata
DIGITS = str.maketrans("٠١٢٣٤٥٦٧٨٩۰۱۲۳۴۵۶۷۸۹", "01234567890123456789")
for text in ["الطلب رقم ١٠٤٣", "الطلب رقم 1043", "الطلب رقم ۱۰۴۳"]:
print(f"{text:18} -> {text.translate(DIGITS)}")
lam_alef = "ﻻ" # the ligature form of lam-alef, from old PDFs
print("ligature:", lam_alef, "length", len(lam_alef),
"-> NFKC:", unicodedata.normalize("NFKC", lam_alef), "length", len(unicodedata.normalize("NFKC", lam_alef)))
str.translate يوحّد الأرقام بجدول واحد. وNFKC من مكتبة unicodedata يفكّك الأشكال المركّبة إلى حروفها الأصلية: حرف واحد طوله 1 صار «لا» بطول 2. شغّل NFKC على كل نص مستخرج من PDF قبل أي تطبيع آخر.
4أين تتوقّف
للتطبيع ثمن صغير: في حالات نادرة تصير كلمتان مختلفتا المعنى كلمة واحدة. لذلك لا تتجاوز القواعد الخمس بلا قياس.
وتجنّب التجذيع العنيف الذي يردّ الكلمة إلى جذرها. انظر إلى الرسم: ثلاث كلمات من جذر واحد بثلاثة معانٍ.
كيف يعمل، خطوة بخطوة: كيف تطبّع نصًّا عربيًّا قبل البحث
تشغّل NFKC على النص المستخرج من PDF لتفكيك الأشكال المركّبة مثل «ﻻ» إلى حروفها.
تحذف التشكيل والتطويل، وتوحّد الأرقام العربية الهندية والفارسية إلى اللاتينية بجدول واحد.
توحّد أ وإ وآ وٱ إلى ا، وى إلى ي، وة إلى ه.
تخزّن النسخة المطبّعة للبحث بجانب الأصلية للعرض، وتمرّر السؤال على الدالة نفسها.
مثال محلول
التطبيع دالة واحدة تطبّقها على المستندات عند الفهرسة وعلى السؤال عند البحث، بنفس القواعد. ابدأ بالقواعد الخمس الأشيع.
جرّب بلا كود
خرافة مقابل حقيقة
| الخرافة | الحقيقة |
|---|---|
| نماذج التضمين متعدّدة اللغات لا تحتاج تطبيعًا. | أثره أصغر معها لكنه موجود: التشكيل والأرقام المختلفة تغيّر التقطيع فيتغيّر المتّجه، وBM25 في البحث الهجين يحتاجه بالتأكيد. |
| رد الكلمة إلى جذرها يحسّن البحث العربي. | «كتاب» و«مكتب» و«كاتب» جذرها واحد ومعانيها مختلفة، فيسحب سؤال عن المكتب مستندات عن الكتب. |
| يمكن تطبيع النص الأصلي وتخزينه هكذا. | المستخدم يجب أن يرى «الإجازة» كما كُتبت في الاستشهاد. خزّن نسختين: الأصلية للعرض والمطبّعة للبحث. |
جرّب بنفسك
المستخدم كتب «اسعار التذاكر» والمستند فيه «أسعار التذاكر». لماذا لم يجده BM25؟
BM25 يقارن الكلمات حرفًا حرفًا. توحيد أ إلى ا في الجهتين يجعلهما كلمة واحدة.
لماذا تتجنّب الاشتقاق الجذري العنيف في البحث العربي؟
«كتاب» و«مكتب» و«كاتب» من «ك ت ب». سؤال عن المكتب سيجلب مستندات عن الكتب. التطبيع الخفيف يكسب أغلب الفائدة دون هذا الضرر.
بطاقات مراجعة سريعة
تحقق من فهمك
هل تحتاج تطبيعًا إن كنت تستخدم نموذج تضمين متعدّد اللغات فقط؟
غالبًا نعم، وإن كان أثره أصغر. نماذج التضمين تتعامل مع بعض الاختلافات، لكن التشكيل والأرقام المختلفة تغيّر التقطيع إلى رموز، فيتغيّر المتّجه. والأهم أن البحث الهجين يحتاج BM25، وBM25 بلا تطبيع يفشل كما رأيت. قِس على أسئلتك «السيّئة الكتابة» وقرّر.
مستخدم كتب «طلب ١٠٤٣» والمستند فيه «طلب 1043». ما القاعدة التي تحلّ ذلك؟
توحيد الأرقام بـstr.translate وجدول يحوّل الأرقام العربية الهندية والفارسية إلى اللاتينية، على المستند والسؤال معًا.
مصادر هذا الدرس
مرتّبة بالنوع. ابدأ بالتوثيق الرسمي إذا تبي المرجع الدقيق، وبالمقال أو الفيديو إذا تبي الشرح أولًا.
توثيق رسمي1
خلّصت الدرس؟
سجّل الدخول ليُحفظ تقدّمك.