بانداس: التحقق مما إذا كانت السلسلة النصية تحتوي على سلاسل فرعية متعددة
تتبوأ مكتبة Pandas مكانة الصدارة في المنظومة البرمجية للغة بايثون المخصصة لعلوم البيانات وهندستها، نظراً لما توفره من هياكل بيانات مرنة وأدوات متطورة لتحليل وتنقية الجداول الضخمة. غير أن التعامل مع البيانات غير المهيكلة، وتحديداً النصوص والسلاسل المحرفية (String Data)، يفرض تحديات حوسبية ومنطقية تتجاوز مجرد المعالجات العددية التقليدية. تُعد مسألة التحقق من احتواء السلسلة النصية على سلاسل فرعية متعددة (Checking if a string contains multiple substrings) إحدى المعضلات المركزية في عمليات تنقيب النصوص، واستخلاص الميزات في نماذج التعلم الآلي، وتصفية السجلات المعقدة، والتحقق من جودة البيانات الواردة من مصادر غير متجانسة.
تتطلب معالجة النصوص على مستوى الأعمدة في أطر البيانات (DataFrames) فهماً عميقاً للطبقات التحتية التي تربط بين بايثون ومكتبات NumPy ومحركات التعبيرات النمطية (Regular Expressions – Regex). فعند الرغبة في البحث عن عدة كلمات مفتاحية في آن واحد، تتشعب الخيارات الهندسية بين استخدام المنطق التناوبي (OR Logic) والمنطق التزامني (AND Logic)، وتتفاوت الطرق المتبعة من حيث الكفاءة الزمنية واستهلاك الذاكرة وقابلية التوسع البرمجي. لا يقتصر الأمر على مجرد استدعاء دالة جاهزة، بل يمتد إلى دراسة معمقة لكيفية تفسير الأنماط الرمزية، والتعامل مع حساسيات الأحرف، وإدارة القيم المفقودة، وتجنب الاختناقات الأدائية عند معالجة ملايين السجلات النصية.
يقدم هذا المقال دليلاً مرجعياً وأكاديمياً شاملاً لتشريح آليات البحث عن السلاسل الفرعية المتعددة داخل أطر بيانات بانداس. سنستعرض فيه الأسس النظرية للمتجهات النصية، والتشريح البارامتري للدوال المتخصصة، والحلول الرياضية والمنطقية المتقدمة لمطابقة النصوص المتعددة، مع مقارنات معيارية دقيقة تقيس الأداء الحسابي والتعقيد الخوارزمي لمختلف الاستراتيجيات، مما يُمكّن مهندسي البيانات وعلماء الذكاء الاصطناعي من بناء أنابيب معالجة نصية فائقة السرعة وعالية الموثوقية.
- 1. الأسس النظرية لمعالجة السلاسل النصية في أطر بيانات بانداس (Pandas)
- 2. التشريح الدقيق والتحليل المعلمي للدالة Series.str.contains
- 3. منطق المطابقة التناوبية (OR Logic): التحقق من وجود سلسلة فرعية واحدة على الأقل
- 4. منطق المطابقة المتزامنة (AND Logic): التحقق من وجود جميع السلاسل الفرعية معاً
- 5. استراتيجيات مطابقة النصوص مع مراعاة حساسية حالة الأحرف وتوحيد البيانات
- 6. الإدارة الأكاديمية للقيم المفقودة والبيانات غير المكتملة (Missing Values)
- 7. البدائل المنهجية لتنفيذ المطابقة المتعددة دون التعبيرات النمطية المركبة
- 8. معالجة الحالات الخاصة والرموز المحجوزة وحدود الكلمات (Advanced Regex Edge Cases)
- 9. التقييم المعياري للأداء والكفاءة الحسابية (Benchmarking & Performance Profiling)
- 10. تكامل التحقق النصي في مسارات هندسة البيانات وتعلم الآلة
- 11. الأخطاء المنطقية والبرمجية الشائعة وطرق تشخيصها ومعالجتها
- 12. الدليل الإرشادي والتطبيقي الشامل لاختيار المنهجية المثلى
- Conclusion
- References
1. الأسس النظرية لمعالجة السلاسل النصية في أطر بيانات بانداس (Pandas)
1.1 بنية معالجة النصوص عبر المتجه النصي المتخصص str
ترتكز كفاءة مكتبة بانداس في إدارة البيانات المجدولة على مبدأ التوجيه (Vectorization)، وهو النمط الحسابي الذي ينقل تنفيذ العمليات التكرارية من حلقات بايثون التفسيرية البطيئة إلى مسارات منخفضة المستوى مكتوبة بلغة C ومحسنة معمارياً. وفي سياق البيانات النصية، تجسد هذه الفلسفة من خلال الموجه النصي المتخصص المعروف بـ .str accessor. يتيح هذا الموجه لكائنات السلاسل (Series) والأعمدة النصية تطبيق الدوال الحرفية والتعبيرية على كل عنصر من عناصر العمود دفعة واحدة وبصيغة تركيبية متسقة، متفادياً بذلك العبء التشغيلي الحاصل عند كتابة دوال تكرار صريحة مثل for loops داخل بيئة بايثون الافتراضية.
من الناحية المعمارية، تختلف معالجة النصوص في بانداس جذرياً عن معالجة المتجهات العددية النقية. فالأعداد تُخزن في كتل ذاكرية متجاورة تديرها مكتبة NumPy مباشرة، بينما كانت السلاسل النصية تُخزن تاريخياً ككائنات بايثون عامة (Python Objects)، مما يعني أن كل مدخل في السلسلة هو مؤشر (Pointer) يشير إلى كائن نصي معزول في الذاكرة العشوائية. هذا النمط القديم كان يحد من الاستفادة الكاملة من خطوط أنابيب المعالجة المتوازية (SIMD). ولمعالجة هذا القصور، قدمت بانداس في إصداراتها الحديثة نوع البيانات المخصص StringDtype، والذي يمكن أن يستند إلى محرك Apache Arrow، موفراً تمثيلاً ذاكرياً متجاوراً ومضغوطاً يتيح عمليات مسح وفهرسة وبحث فائقة السرعة تتفوق بمراحل على مؤشرات كائنات بايثون التقليدية.
يتكامل الموجه النصي .str مع محرك التحليل اللغوي في بانداس ليوفر طبقة تجريدية موحدة تتعامل مع النصوص بغض النظر عن تعقيد بنيتها الداخلية. وعند تفعيل هذا الموجه لتنفيذ عمليات البحث أو التحقق، فإنه يقوم داخلياً باستدعاء دوال محسنة بلغة C تقوم بالمرور على مصفوفة البيانات وتطبيق الخوارزميات النصية المحددة، مع توفير دعم تلقائي لمعالجة القيم المفقودة وإرجاع مصفوفات بوليانية متوافقة تماماً مع آليات الفهرسة المتقدمة، مما يجعله العمود الفقري لأي عملية معالجة مسبقة للنصوص في بايثون.
1.2 مفهوم البحث عن السلاسل الفرعية المتعددة وأهميته في هندسة الميزات
يُعرف البحث عن السلاسل الفرعية المتعددة رياضياً بأنه عملية إسقاط منطقي تطبق على متتالية من الرموز (String of characters) للتحقق من انتمائها إلى لغة صورية محددة تعرفها مجموعة فرعية من السلاسل المستهدفة. في فضاء علوم البيانات، لا يقتصر هذا المفهوم على الاسترجاع البسيط للمعلومات، بل يمثل حجر الزاوية في عمليات هندسة الميزات (Feature Engineering) للبيانات غير المهيكلة وشبه المهيكلة، مثل سجلات الخوادم، والمستندات الطبية، والتغذيات الإخبارية، وتغريدات منصات التواصل الاجتماعي.
تتجلى الأهمية التطبيقية لمطابقة النصوص المتعددة في تحويل النصوص الخام إلى مؤشرات بوليانية (Boolean Flags) أو مصفوفات ثنائية تصف وجود سمات معينة بدقة متناهية. فعلى سبيل المثال، في تطبيقات الكشف عن الاحتيال المالي، يحتاج النظام إلى فحص حقل الوصف للتحقق مما إذا كانت المعاملة تتضمن كلمات دلالية مشبوهة متعددة مجتمعة أو متفرقة. وبالمثل، في مهام المعالجة الطبيعية للغة (NLP)، تسهم هذه العملية في استخراج الكيانات المسماة (Named Entities)، وبناء قواميس المصطلحات، وتوليد ميزات التفاعل النصي التي تغذي خوارزميات التعلم الآلي مثل Scikit-Learn و XGBoost.
تتطلب الدقة المنطقية في هندسة الميزات تمييزاً قاطعاً بين نوعين من المطابقة: المطابقة الشاملة المتزامنة (Conjunctive Matching)، والتي تقتضي وجود جميع السلاسل الفرعية المستهدفة داخل السجل النصي الواحد لإثبات الحالة، والمطابقة الجزئية أو التناوبية (Disjunctive Matching)، التي تكتفي بتحقق وجود سلسلة فرعية واحدة على الأقل. يؤدي الخلط بين هذين المفهومين المنطقيين إلى تشويه دقة المتغيرات التنبؤية وإدخال ضوضاء إحصائية تؤثر سلباً على تعميم النماذج الرياضية في بيئات الإنتاج الفعلية.
1.3 التفاعل بين بايثون ومحرك التعبيرات النمطية (Regex Engine)
تعتمد مكتبة بانداس في تنفيذ العمليات النصية المعقدة على استدعاء محرك التعبيرات النمطية المدمج في بايثون عبر وحدة re القياسية، أو عبر محركات متخصصة عند استخدام واجهات الأداء العالي. يعتمد محرك التعبيرات النمطية القياسي في بايثون على بنية الأوتوماتون غير الحتمي ذي الرجوع الخلفي (Non-deterministic Finite Automaton – NFA)، وهو نموذج حوسبي مرن للغاية يتيح ميزات متقدمة مثل التطلعات المسبقة (Lookaheads) والإشارات المرجعية الخلفية (Backreferences)، لكنه يتطلب إدارة واعية لتجنب الانزلاق في التعقيد الأسي عند معالجة الأنماط الرديئة.
عند تمرير نمط نصي مركب إلى دوال الموجه .str في بانداس، يمر النمط بمرحلة تحليل وتجميع (Compilation) يتم خلالها تحويل النص المصدري للتعبير النمطي إلى كود ثنائي داخلي (Bytecode) يفهمه محرك التعبيرات. يؤثر تكرار ترجمة الأنماط داخل الحلقات التكرارية تأثيراً سلبياً على زمن المعالجة؛ ولذلك تقوم بانداس داخلياً بتخزين مؤقت (Caching) للأنماط المترجمة لتسريع عمليات المطابقة المتتابعة عبر مئات الآلاف من الصفوف. كما يحدد نوع المحرك المستخدم طبيعة استهلاك الموارد؛ إذ تستهلك محركات NFA ذاكرة متغيرة وتعتمد على عمق شجرة البحث والرجوع الخلفي، مقارنة بمحركات الأوتوماتون الحتمي (DFA) التي تضمن زمناً خطياً لكنها تفتقر لبعض ميزات التأكيد المكاني المتقدمة.
بالإضافة إلى ذلك، يلعب التوافق الترميزي دوراً حاسماً في استقرار عمليات التعبير النمطي، وتحديداً عند التعامل مع النصوص المشفرة بترميز UTF-8 والنصوص متعددة اللغات كالعربية والإنجليزية المدمجة. يجب على محرك المطابقة إدارة حدود الرموز والمحارف متعددة البايتات بدقة متناهية لضمان عدم حدوث انقطاع في تسلسل المحارف أو تفسير خاطئ للرموز الميتامية (Metacharacters)، مما يضمن تكاملاً متيناً بين هياكل بيانات بانداس ومحركات الفحص النمطي الصورية.
2. التشريح الدقيق والتحليل المعلمي للدالة Series.str.contains
2.1 البنية التركيبية والتوقيع البرمجي للدالة
تمثل الدالة Series.str.contains الأداة القياسية والأكثر شيوعاً للتحقق من وجود الأنماط النصية داخل كائنات السلاسل في بانداس. يأتي التوقيع البرمجي للدالة محملاً بمجموعة من المعاملات المصممة لضبط سلوك البحث بدقة متناهية: Series.str.contains(pat, case=True, flags=0, na=None, regex=True). يتطلب المعامل الأول pat تمرير النمط المراد البحث عنه، والذي يمكن أن يكون سلسلة نصية بسيطة تمثل كلمة مفردة، أو تعبيراً نمطياً معقداً يدمج قواعد منطقية متعددة لاكتشاف هياكل لغوية مركبة.
يتحكم المعامل case في حساسية عملية المطابقة لحالة الأحرف اللاتينية، حيث يؤدي ضبطه على القيمة الافتراضية True إلى التمييز الصارم بين الحروف الكبيرة والصغيرة (Case-sensitive)، بينما يؤدي ضبطه على False إلى تجاهل هذا الفارق عبر مواءمة النمط آلياً مع النصوص المفحوصة. أما المعامل flags، فيتيح للمطور تمرير مؤشرات التحكم الرسمية الخاصة بمكتبة re في بايثون، مثل re.IGNORECASE أو re.DOTALL أو re.MULTILINE، مما يمنح مرونة برمجية فائقة لتعديل سلوك المحرك النمطي على مستوى البايتات الداخلية للعملية.
يكتسب المعامل na أهمية استثنائية في إدارة جودة البيانات، إذ يحدد القيمة المنطقية التي يجب إسنادها للحقول التي تحتوي على قيم مفقودة (مثل NaN أو None). ففي حين أن السلوك الافتراضي يترك هذه القيم كقيم مفقودة، فإن تعيين na=False يضمن تحويل كافة النتائج غير المعرفة إلى قيم منطقية سالبة صريحة، وهو ما يحمي خوارزميات التصفية والفهرسة اللاحقة من الانهيار أو السلوك غير المتوقع، كما سنفصل لاحقاً.
2.2 المعامل regex والتحكم في نمط التفسير الداخلي
يعد المعامل regex أحد أهم محددات الأداء والسلامة المنطقية في الدالة Series.str.contains. عند ضبط هذا المعامل على قيمته الافتراضية regex=True، توجه بانداس مدخل المعامل pat مباشرة إلى محرك التعبيرات النمطية ليتم تفسيره كقاعدة نمطية صورية. يتيح ذلك الاستفادة الكاملة من القوة التعبيرية للرموز الخاصة مثل نقاط البداية والنهاية، ومجموعات التناوب، والتطلعات المسبقة، مما يجعله الخيار الحتمي عند فحص سلاسل فرعية متعددة ذات علاقات منطقية معقدة.
على النقيض من ذلك، عند تعيين regex=False، تقوم الدالة بتعطيل محرك التعبيرات النمطية بالكامل والاعتماد على خوارزميات المطابقة النصية الحرفية المباشرة (Literal String Matching)، مثل خوارزمية بايثون الداخلية للبحث النصي المستندة إلى خوارزميات Boyer-Moore-Horspool المعدلة. يوفر هذا التعطيل تحسيناً حسابياً ملحوظاً في زمن التنفيذ، ويقلل من استهلاك الذاكرة، لأنه يلغي مرحلة تجميع النمط وتتبعه عبر الأوتوماتون. بالإضافة إلى ذلك، يمنع هذا الوضع الأخطاء البرمجية الناتجة عن احتواء النصوص المستهدفة على رموز نمطية محجوزة مثل الأقواس، أو علامات الاستفهام، أو النقاط، والتي قد تفسر خطأ كأوامر نمطية تؤدي إلى توقف الأنبوب البرمجي.
ومع ذلك، تبرز محدودية المعامل regex=False عند الحاجة للبحث عن سلاسل فرعية متعددة، حيث يصبح من المستحيل استخدام رموز التناوب المنطقي مثل شريط الفصل العمودي |، مما يفرض على المطور إما العودة لتفعيل regex=True مع تعقيم المدخلات، أو اللجوء إلى تقنيات الربط المنطقي الخارجي التي سنتناولها في الأقسام اللاحقة.
2.3 المخرجات المتجهية والخصائص البوليانية الناتجة
تنتج الدالة Series.str.contains كائناً متجهياً من نوع Series يحمل نوع البيانات المنطقي bool (أو كائناً يحتوي على قيم منطقية ممزوجة بقيم مفقودة إذا لم يتم ضبط المعامل na). يمثل هذا المخرج ما يعرف في معالجة البيانات بالقناع البولياني (Boolean Mask)، وهو مصفوفة أحادية البعد تتطابق أبعادها وفهارسها تماماً مع أبعاد وفهارس العمود الأصلي الخاضع للفحص، حيث يحمل كل عنصر القيمة True إذا تحقق شرط المطابقة النصية، أو False إذا تخلف الشرط.
يتميز هذا القناع البولياني بتوافقه التام مع آليات الوصول والفهرسة المتقدمة في بانداس، مثل الموجهات .loc[] و .iloc[]. يتيح ذلك لمهندسي البيانات إجراء عمليات التصفية الشرطية المباشرة، واستخلاص الشرائح الموجهة من البيانات بسرعة فائقة عبر تمرير القناع مباشرة داخل الأقواس المعقوفة لإطار البيانات: df[df['column'].str.contains(...)]. تضمن الطبيعة المتجهية لهذا القناع تنفيذ عمليات التصفية على مستوى الذاكرة المنخفضة دون الحاجة لنسخ غير ضروري للبيانات غير المطابقة.
علاوة على ذلك، تتمتع المخرجات البوليانية بخصائص رياضية تتيح دمجها المباشر في العمليات الإحصائية والتجميعية. فعلى سبيل المثال، يمكن استخدام التابع .sum() لحساب التكرار المطلق للسجلات المطابقة للشرط النصي، أو التابع .mean() لحساب النسبة المئوية للسجلات التي حققت النمط بالنسبة للحجم الكلي للبيانات. يوضح الجدول التالي البنية العامة لمدخلات ومخرجات دالة الفحص النصي في بانداس:
| المعامل / الخاصية | النوع البرمجي المقبول | القيمة الافتراضية | الوصف الوظيفي والتأثير الحسابي |
|---|---|---|---|
| pat | str |
إلزامي | النمط النصي أو التعبير النمطي المراد البحث عنه عبر السلسلة. |
| case | bool |
True |
تحديد حساسية الفحص لحالة الأحرف الكبيرة والصغيرة. |
| flags | int |
0 |
مؤشرات تمرر لمحرك re للتحكم في قواعد المطابقة الداخلية. |
| na | Scalar (bool/None) |
None |
القيمة البديلة المسندة للمدخلات المفقودة لتجنب انتشار NaN. |
| regex | bool |
True |
تحديد ما إذا كان النمط سيفسر كتعبير نمطي أو كنص حرفي جامد. |
| المخرج (Output) | Series (boolean) |
– | قناع بولياني متطابق الفهرسة يمثل نتائج التحقق لكل صف. |
3. منطق المطابقة التناوبية (OR Logic): التحقق من وجود سلسلة فرعية واحدة على الأقل
3.1 الأسس الرياضية للتناوب المنطقي في التعبيرات النمطية
يستند التناوب المنطقي (Logical Disjunction) في نظرية اللغات الصورية إلى مشغل الاتحاد الرياضي، حيث تعتبر السلسلة النصية مقبولة إذا انتمت إلى الفضاء اللغوي لأي من الأنماط الفرعية المحددة. وفي التعبيرات النمطية، يُرمز لهذا المشغل برمز الخط العمودي |. عند بناء تعبير نمطي بالصيغة pattern1|pattern2، يقوم محرك المطابقة بفحص النص بحثاً عن تحقق أي من الطرفين، معتمداً استراتيجية التقييم الكسول من اليسار إلى اليمين (Short-circuit Evaluation)؛ أي أنه بمجرد العثور على مطابقة للطرف الأول، تتوقف عملية المسح لذلك المقطع ويُعتبر الشرط محققاً دون إهدار موارد المعالجة في فحص بقية الأطراف.
تفرض الطبيعة التقييمية للتناوب النمطي مراعاة دقيقة لأسبقية المعاملات وترتيب السلاسل داخل النمط، لا سيما عند وجود تداخل جزئي بين الكلمات المستهدفة. فإذا كانت إحدى السلاسل الفرعية تمثل بادئة لسلسلة أخرى أطول (مثل ‘Data’ و ‘Database’)، فإن وضع السلسلة الأقصر أولاً قد يؤدي إلى مطابقتها مبكراً وإغفال السياق الأوسع للسلسلة الأطول في بعض المحركات غير التراجعية. ومع ذلك، في سياق الدالة str.contains، وبما أن الهدف الأساسي هو إرجاع قيمة بوليانية تثبت الوجود، فإن هذا التقديم لا يفسد صحة النتيجة الإجمالية، لكنه يؤثر على زمن الاستجابة وفقاً لتوزيع تكرار الكلمات في البيانات الفعلية.
توضح جداول الصواب المنطقي أن النتيجة الإجمالية للمطابقة التناوبية تكون سالبة (False) في حالة واحدة فقط: عندما تفشل كافة السلاسل الفرعية المكونة للتعبير في التواجد داخل النص المفحوص. هذا السلوك يجعل التناوب المنطقي الأداة المثلى لبناء مرشحات الكلمات المفتاحية العريضة وتصنيف الموضوعات العامة التي تكتفي بوجود مؤشر دلالي واحد من قائمة موسعة من المرادفات.
3.2 البناء الديناميكي للأنماط النصية باستخدام التابع str.join
في التطبيقات الواقعية، نادراً ما يتم كتابة الأنماط التناوبية يدوياً وبشكل جامد داخل الكود المصدري، نظراً لأن قوائم الكلمات المفتاحية غالباً ما تكون ديناميكية، وتُستمد من قواعد بيانات خارجية، أو ملفات تهيئة، أو مدخلات تفاعلية للمستخدمين. لذلك، يُعد استخدام التابع القياسي str.join في بايثون المنهجية الهندسية القياسية لتحويل قوائم السلاسل النصية إلى تعبيرات نمطية تناوبية صالحة للحقن المباشر في دالة بانداس.
تتمثل هذه الصياغة في دمج عناصر القائمة باستخدام الفاصل العمودي كمعامل ربط: '|'.join(keywords_list). فعلى سبيل المثال، إذا كانت لدينا قائمة تحتوي على المصطلحات ['python', 'sql', 'r']، فإن تطبيق عملية الربط ينتج التعبير النمطي 'python|sql|r'. تتميز هذه الطريقة بمرونتها الفائقة وقابليتها للتوسع، حيث يمكنها استيعاب مئات أو آلاف المصطلحات دون الحاجة لتعديل الهيكل البرمجي للدالة المستدعية، مما يضمن توافق الكود مع مبادئ التصميم البرمجي النظيف وتفادي التكرار (DRY Principle).
لضمان أعلى درجات الكفاءة عند بناء الأنماط ديناميكياً، يُنصح برمجياً بترتيب قائمة الكلمات مسبقاً وفقاً لتكرارها المتوقع في مجموعة البيانات المستهدفة تنازلياً، أو وفقاً لطول النصوص إذا كانت هناك متطلبات استخلاص دقيقة. يقلل الترتيب التنازلي للتكرار من عدد المقارنات الحسابية التي يجريها محرك التعبيرات النمطية لكل صف، مما ينعكس إيجابياً على سرعة معالجة الأطر البيانية المليونية.
3.3 تطبيقات عملية ونماذج برمجية لتحليل بيانات الفرق الرياضية
لتجسيد المنطق التناوبي في بيئة تطبيقية، نفترض وجود إطار بيانات تجريبي يوثق إحصائيات الأندية الرياضية في دوري تنافسي، حيث يتضمن عموداً نصياً يصف أسماء الفرق ومناطقها الجغرافية مثل: "Boston Celtics East"، و "Golden State West"، و "East Chicago Good"، و "Miami Heat South". يتمثل المطلب التحليلي في استخراج وتحديد كافة الفرق التي تنتمي إما إلى المنطقة الشرقية (East) أو التي تحمل وصف التميز (Good).
يتم تنفيذ هذا الاستعلام عبر بناء النمط التناوبي "East|Good" وتمريره للدالة df['Team_Info'].str.contains("East|Good"). تقوم بانداس بمسح كل سجل على حدة؛ فعند معالجة السجل "Boston Celtics East"، يلتقط المحرك المصطلح East ويُرجع True على الفور. وعند معالجة "East Chicago Good"، يُرجع True أيضاً لتحقق كلا الشرطين، بينما يُسند القيمة False للسجل "Miami Heat South" لغياب كلا المصطلحين المستهدفين.
تتيح إضافة هذا القناع المنطقي كعمود جديد داخل إطار البيانات—بصيغة مثل df['Is_Target_Group'] = df['Team_Info'].str.contains("East|Good")—إجراء تقييمات إحصائية سريعة، ومقارنة معدلات الفوز والإنفاق المالي بين المجموعات المصنفة دون الحاجة لإجراء عمليات فرز يدوي معقدة أو استخدام استعلامات SQL متداخلة، مما يبرهن على الفاعلية العالية للمنطق التناوبي في تسريع الاستكشاف الأولي للبيانات.
4. منطق المطابقة المتزامنة (AND Logic): التحقق من وجود جميع السلاسل الفرعية معاً
4.1 مفهوم التطلع الإيجابي للأمام (Positive Lookahead Assertions)
يمثل التحقق من وجود سلاسل فرعية متعددة في آن واحد داخل النص (AND Logic) تحدياً تركيبياً فريداً في التعبيرات النمطية؛ فالنمط النمطي بطبيعته الخطية يستهلك المحارف أثناء تقدمه في مسح النص، مما يجعل التحقق من وجود كلمتين دون الاكتراث بترتيب ورودهما أمراً مستحيلاً باستخدام التراكيب التسلسلية البسيطة. لحل هذه المعضلة الحوسبية، توفر محركات التعبيرات النمطية آلية رياضية متقدمة تُعرف بالتأكيدات الصفرية العرض (Zero-width Assertions)، وتحديداً التطلع الإيجابي للأمام (Positive Lookahead).
يُصاغ التطلع الإيجابي للأمام بالرمز (?=...). تكمن الخاصية الجوهرية لهذا التركيب في أنه يقوم بمسح السلسلة النصية للأمام انطلاقاً من الموضع الحالي لمؤشر القراءة للتحقق من تطابق النمط الداخلي، دون أن يستهلك أي محارف أو يقدم المؤشر الفعلي للأمام بعد انتهاء الفحص. هذا يعني أنه بمجرد نجاح التحقق من الشرط الموجود داخل التطلع، يعود مؤشر القراءة فوراً إلى نفس نقطة البداية التي انطلق منها، مما يتيح تطبيق فحص تطلعي آخر مستقل تماماً على نفس النص ومن نفس الموقع الأصلي.
تعتبر التأكيدات الصفرية العرض الحل الهندسي الأمثل لتحقيق مشغل العطف المنطقي (Logical Conjunction) داخل تعبير نمطي موحد. فهي تتيح التحقق المتزامن من قائمة طويلة من الشروط النصية المستقلة، دون الحاجة لبناء تباديل وتوافيق يدوية لترتيب الكلمات، مما يوفر صياغة برمجية مضغوطة وأنيقة تحقق أعلى درجات الدقة المنطقية في مطابقة النصوص.
4.2 التشريح التفصيلي للنمط النمطي r’^(?=.*str1)(?=.*str2)’
يعد النمط النمطي r'^(?=.*str1)(?=.*str2)' التركيب المعياري العالمي لتنفيذ المنطق التزامني (AND Logic) في فحص السلاسل النصية عبر مختلف لغات البرمجة ومكتبات المعالجة. لفهم الآلية الحسابية لهذا النمط، يجب تشريح مكوناته الرمزية على النحو التالي:
- رمز التثبيت المبدئي (
^): يثبت مؤشر المطابقة عند نقطة بداية السلسلة النصية بالضبط. هذا التثبيت إلزامي وحاسم لمنع محرك التعبيرات النمطية من إعادة محاولة التطلع للأمام من كل موضع محرفي داخل النص عند فشل المطابقة الأولى، مما يحمي الأداء الحسابي من التدهور الأسي. - المجموعة التطلعية الأولى (
(?=.*str1)): ينطلق المحرك من بداية السلسلة، ويستخدم التركيب العام.*لتخطي أي عدد عشوائي من المحارف حتى يجد السلسلة الفرعيةstr1. إذا وجدها، يُعتبر هذا التأكيد ناجحاً، ويعود المؤشر فوراً ودون استهلاك للرموز إلى بداية السلسلة (موضع^). - المجموعة التطلعية الثانية (
(?=.*str2)): ينطلق المحرك مجدداً من نفس نقطة البداية (الموضع^)، ويبحث عبر.*عن السلسلة الفرعيةstr2في أي موضع داخل النص. إذا وجدها، ينجح التأكيد الثاني. - النتيجة النهائية: إذا نجحت كافة مجموعات التطلع للأمام المتتالية، يُرجع المحرك نجاح المطابقة الكلية (True). وإذا فشل أي تأكيد منها، تتوقف العملية ويُرجع الفشل (False).
تتميز هذه البنية بعدم حساسيتها للترتيب المكاني؛ فسواء وردت str1 قبل str2 أو العكس، وسواء كانت هناك كلمات فاصلة بينهما أو كانتا متجاورتين تماماً، فإن النمط يضمن تقييماً منطقياً سليماً وغير متحيز، مما يجعله المعيار الذهبي لمطابقة الكلمات المتزامنة في بانداس.
4.3 تنفيذ الفحص المتزامن على أطر البيانات وحالات عدم الترتيب
لتوضيح قوة هذا النمط عملياً، نعود إلى سيناريو تحليل بيانات الفرق الرياضية، بافتراض أننا نبحث عن السجلات التي تحتوي حصراً على الكلمتين "Good" و "West" معاً في نفس الوصف النصي، بغض النظر عن ترتيبهما في الجملة. تتضمن بيانات الاختبار لدينا حالات متبادلة مثل: "Good West Team" و "West Region is Good" و "Good East Team" و "West Team Only".
عند صياغة الاستعلام في بانداس باستخدام التعبير النمطي المتزامن: df['Team_Info'].str.contains(r'^(?=.*Good)(?=.*West)')، تجري المعالجة بدقة متناهية. يتم تقييم السجل الأول "Good West Team" بإرجاع True لتحقق كلا الكلمتين. ويتم تقييم السجل الثاني "West Region is Good" بإرجاع True أيضاً، على الرغم من أن كلمة West سبقت كلمة Good في الترتيب، وهو ما يبرهن على مرونة التطلع الإيجابي للأمام في تجاوز قيود الترتيب الحرفي.
في المقابل، يُسند المحرك القيمة False للسجل الثالث "Good East Team" لاختفاء كلمة West، وللسجل الرابع "West Team Only" لاختفاء كلمة Good. يضمن هذا التدقيق الصارم عزل الشريحة المستهدفة بدقة تامة تتوافق مع المتطلبات المعيارية لأنظمة الاسترجاع الدقيق، حيث يُستبعد أي سجل يفقد عنصراً واحداً من عناصر مصفوفة البحث الإلزامية.
5. استراتيجيات مطابقة النصوص مع مراعاة حساسية حالة الأحرف وتوحيد البيانات
5.1 الضبط الدقيق لمعامل حساسية حالة الأحرف case في النمط التناوبي والمتزامن
تتطلب التطبيقات الواقعية مرونة في التعامل مع التباينات الطباعية الناتجة عن اختلاف حالة الأحرف اللاتينية (مثل GOOD و good و Good). توفر بانداس التحكم في هذه الحساسية من خلال المعامل case=False داخل الدالة str.contains. يؤدي هذا الضبط إلى توجيه محرك التعبيرات النمطية لتجاهل الفروق بين الأحرف الكبيرة والصغيرة أثناء عملية الفحص، مما يوسع نطاق المطابقة دون الحاجة لتكرار الكلمات بجميع صيغها المحتملة داخل النمط.
بالإضافة إلى المعامل الخارجي، يمكن للمطورين فرض عدم الحساسية للأحرف موضعياً أو كلياً عبر تضمين المؤشر النمطي (?i) في صلب التعبير النمطي نفسه، مثل r'(?i)^(?=.*good)(?=.*west)'. يُلغي هذا التضمين الداخلي الحاجة لضبط المعامل case صراحة في كود بايثون، ويوفر تحكماً دقيقاً في حال الرغبة بجعل بعض أجزاء النمط حساسة للأحرف وأجزاء أخرى غير حساسة داخل نفس الاستعلام المركب.
ومع ذلك، تجدر الإشارة إلى أن تعطيل حساسية الأحرف يفرض حملاً حسابياً إضافياً على محرك التعبيرات النمطية، حيث يضطر المحرك إلى تحويل كل بايت أو محرف ومقارنته بنطاقات متعددة في جدول الحروف (Unicode Case Folding). في مجموعات البيانات الضخمة، قد يؤدي ذلك إلى تباطؤ طفيف في زمن التنفيذ مقارنة بالفحص الحساس، وهو ما يستوجب دراسة المفاضلة بين المرونة التعبيرية والسرعة الحسابية.
5.2 المعالجة المسبقة والتطبيع النصي (Data Normalization)
تمثل المعالجة المسبقة والتطبيع النصي (Data Normalization) الاستراتيجية البديلة والأكثر كفاءة للتعامل مع عدم انتظام النصوص في خطوط معالجة البيانات الإنتاجية. بدلاً من الاعتماد على المعامل case=False أثناء كل استعلام، يتم إجراء خطوة تنظيف استباقية توحد النصوص عبر العمود بالكامل باستخدام التوابع المتجهية المدمجة في بانداس مثل .str.lower() أو .str.upper().
يمتد التطبيع النصي ليشمل معالجة الفراغات غير المنضبطة والمسافات البينية المزدوجة وفواصل الأسطر باستخدام التابع .str.strip() والتابع .str.replace(r's+', ' ', regex=True). كما يتضمن تطبيع النصوص إزالة التشكيل وعلامات الترقيم وتوحيد كتابة بعض المحارف المعقدة، مما ينشئ طبقة بيانات نقية ومتجانسة تقلل من احتمالات الفشل المنطقي أثناء البحث.
يبرز التحليل المعماري وجود مفاضلة واضحة في استهلاك الموارد: تتطلب خطوة التطبيع المسبق استهلاك ذاكرة إضافية لإنشاء نسخة مطبعة من العمود النصي، لكنها تحقق وفراً هائلاً في زمن المعالجة اللاحق، حيث تتيح تنفيذ كافة الاستعلامات المستقبلية باستخدام نصوص صغيرة موحدة وحساسة للأحرف (Case-sensitive)، وهو ما يرفع من سرعة المعالجة بمعدلات تصل إلى أضعاف السرعة الأصلية في العمليات المتكررة.
5.3 التعامل مع النصوص متعددة اللغات وتحديات اليونيكود (Unicode)
تفرض البيانات متعددة اللغات، ولا سيما النصوص العربية، تحديات فريدة تتجاوز مجرد مطابقة الحروف اللاتينية. يعتمد نظام اليونيكود على مستويات مختلفة من التطبيع الشكلي، مثل الصيغ المعيارية NFC و NFD و NFKC و NFKD. فعلى سبيل المثال، يمكن تمثيل حرف الألف المهموز "أ" في الذاكرة إما كمحرف مدمج واحد (NFC) أو كمحرفين منفصلين: حرف الألف متبوعاً بمحرف الهمزة المنفصل (NFD). إذا اختلف المستوى الترميزي بين النمط المفحوص والنص المخزن، ستفشل الدالة str.contains في العثور على المطابقة على الرغم من التطابق البصري التام.
لضمان استقرار البحث النصي في النصوص العربية والمشتركة، يتعين تطبيق تطبيع يونيكود مسبق باستخدام وحدة unicodedata القياسية في بايثون عبر توجيهها على العمود النصي، بالإضافة إلى توحيد الياءات والألفات (مثل تحويل "ى" إلى "ي"، و "إ/أ/آ" إلى "ا") عبر تعبيرات نمطية مخصصة قبل الشروع في فحص السلاسل الفرعية المتعددة.
كذلك يجب الانتباه إلى النصوص ثنائية الاتجاه (Bidirectional Texts) التي تجمع بين مصطلحات عربية وأخرى إنجليزية أو أرقام داخل نفس السجل. يجب التأكد من أن محرك التعبيرات النمطية يعمل بوضع اليونيكود الافتراضي في بايثون 3، وتجنب استخدام محددات الحدود اللاتينية البحتة التي قد تعامل الحروف العربية كفواصل رمزية، مما يضمن دقة الفحص المنطقي واستقراره عبر مختلف بيئات التشغيل وأنظمة التخزين.
6. الإدارة الأكاديمية للقيم المفقودة والبيانات غير المكتملة (Missing Values)
6.1 السلوك الافتراضي للدالة عند مصادفة قيم NaN و None
تعتبر إدارة القيم المفقودة (Missing Data) إحدى الركائز الأساسية التي تميز مكتبة بانداس عن أدوات المعالجة النصية البسيطة. في بيئات البيانات الواقعية، تحتوي الأعمدة النصية بشكل متكرر على قيم غير معرفة يتم تمثيلها كـ np.nan في المصفوفات العددية وكائنات None في السلاسل الكائنية. يحدد السلوك الرياضي الافتراضي للدالة Series.str.contains إعادة إسناد القيمة المفقودة NaN في مصفوفة المخرجات عند مصادفة أي مدخل غير معرف في السلسلة الأصلية، بدلاً من إرجاع قيمة بوليانية قطعية (True أو False).
ينطوي هذا السلوك الافتراضي على مخاطر برمجية ومنطقية جسيمة إذا لم يتم استيعابه بدقة. فالقناع الناتج لا يصبح قناعاً بوليانياً نقياً، بل قناعاً ثلاثي الحالات المنطقية (Three-valued Logic: True, False, NaN). وعند استخدام هذا القناع مباشرة لتصفية إطار البيانات بصيغة df[mask]، تقوم بانداس افتراضياً باستبعاد الصفوف المقابلة لـ NaN واعتبارها سالبة، ولكن الكارثة المنطقية تقع عند محاولة تطبيق عملية النفي المنطقي باستخدام المشغل ~mask.
وفقاً لقواعد الجبر البولياني في مكتبة NumPy وبانداس، فإن نفي القيمة المفقودة ~NaN لا ينتج عنه True، بل يظل NaN، مما يؤدي إلى استبعاد السجلات المفقودة من كلا الاستعلامين المتناقضين (المطابق وغير المطابق)، وهو ما يسبب تآكلاً صامتاً في البيانات وتشويهاً إحصائياً للعينات المدروسة.
6.2 التحكم في المخرجات المنطقية عبر المعامل na
لتجنب المخاطر المنطقية الناتجة عن انتشار القيم المفقودة، توفر الدالة Series.str.contains المعامل الحاسم na، والذي يتيح للمطورين فرض قيمة منطقية صريحة لتحل محل أي قيمة غير معرفة داخل العمود النصي أثناء الفحص. من أكثر الممارسات الموصى بها أكاديمياً وبرمجياً هو التحديد الصريح للمعامل na=False في معظم سيناريوهات التصفية واستخلاص الميزات.
عند ضبط na=False، تتحول كافة المدخلات المفقودة قسرياً إلى القيمة المنطقية False داخل السلسلة الناتجة. يضمن هذا الإجراء تحويل مصفوفة المخرجات إلى نوع البيانات البولياني الصرف bool dtype، مما يجعلها متوافقة تماماً مع كافة العمليات الثنائية ومشغلات النفي المنطقي (~) دون التسبب في أي تشويه منطقي. وفي المقابل، يمكن استخدام na=True في سيناريوهات خاصة تقتضي اعتبار البيانات غير المكتملة مطابقة للشرط افتراضياً لضمان عدم إغفال أي سجلات مشبوهة في مهام المراقبة والتدقيق الأمني.
يسهم التحديد الصارم للمعامل na في تعزيز مناعة خطوط الأنابيب البرمجية (Defensive Data Pipelines)، حيث يمنع التوقف المفاجئ للعمليات الحسابية اللاحقة التي تشترط مصفوفات منطقية ثنائية خالصة، مثل دوال التجميع ومحولات التعلم الآلي.
6.3 استراتيجيات التنقية والعزل للبيانات المفقودة قبل الفحص
على الرغم من فاعلية المعامل na، إلا أن التصميم الهندسي الرصين لمنظومات البيانات يفرض عزل معالجة البيانات المفقودة كخطوة تنقية مستقلة تسبق عمليات الفحص النمطي. تتضمن هذه الاستراتيجية توثيق نسبة الفقد في كل عمود نصي، واتخاذ قرارات واعية بشأن كيفية التعامل معها لضمان تمثيلية العينة الخاضعة للتحليل.
يمكن استخدام التابع .fillna() لاستبدال القيم المفقودة بسلاسل نصية دلالية فارغة "" أو بمصطلحات تمثيلية واضحة مثل "UNKNOWN" أو "N/A"، مما يضمن بقاء العمود نصياً بالكامل ويسمح بإجراء الفحص بأمان دون الاعتماد على آليات الاستبدال التلقائية للدوال. وفي السيناريوهات التي تمثل فيها السجلات المفقودة بيانات تالفة لا يمكن استعادتها، يُفضل استخدام التابع .dropna(subset=['text_column']) لإسقاط هذه الصفوف مبكراً من إطار البيانات وتخفيف العبء الحسابي على محرك التعبيرات النمطية.
علاوة على ذلك، يُنصح ببناء تقارير جودة البيانات (Data Quality Audits) التي تقيس بشكل مستمر حجم البيانات غير النصية أو المفقودة المتدفقة عبر النظام، مما يساعد المهندسين على اكتشاف انحراف البيانات (Data Drift) ومشاكل التكامل البرمجي في واجهات الإدخال قبل وصولها إلى مراحل المعالجة المتقدمة.
7. البدائل المنهجية لتنفيذ المطابقة المتعددة دون التعبيرات النمطية المركبة
7.1 التسلسل البولياني للعمليات المنفردة عبر المعاملات & و |
على الرغم من القوة الفائقة للتعبيرات النمطية المركبة، إلا أن هناك منهجية بديلة واسعة الانتشار تعتمد على تجزئة الفحص المتعدد إلى استدعاءات منفردة وبسيطة للدالة str.contains، ثم الربط بين المصفوفات البوليانية الناتجة باستخدام معاملات البت المنطقية في بايثون (Bitwise Logical Operators) مثل & (للمنطق AND) و | (للمنطق OR).
تتجسد هذه المنهجية في كتابة استعلامات صريحة ومقروءة للغاية، مثل: mask = (df['text'].str.contains('str1', na=False)) & (df['text'].str.contains('str2', na=False)). تتميز هذه الطريقة بمقروئيتها العالية وسهولة صيانتها من قبل المطورين المبتدئين الذين قد لا يمتلكون خبرة عميقة في صياغة التأكيدات الصفرية العرض (Lookaheads) في Regex. كما أنها تلغي تماماً مخاطر الأخطاء الناتجة عن تعقيد محرك الأنماط وتتيح ضبط معاملات متباينة (مثل حساسية الأحرف) لكل كلمة مفتاحية على حدة.
ومع ذلك، يفرض التسلسل البولياني ثمناً حوسبياً يجب أخذه في الاعتبار: تتطلب هذه الطريقة مسح العمود النصي بالكامل عدة مرات بعدد الكلمات المفتاحية المستهدفة، بالإضافة إلى تخصيص مساحات ذاكرية وسيطة لتخزين المصفوفات البوليانية الناتجة عن كل استدعاء قبل دمجها النهائي، مما يجعلها أقل كفاءة في استهلاك الذاكرة وسرعة المعالجة عند التعامل مع قوائم طويلة من الكلمات في مجموعات البيانات الضخمة مقارنة بالتعبير النمطي الموحد.
7.2 استخدام الدوال المجهولة والتكرار الموجه عبر apply و List Comprehensions
تتمثل الاستراتيجية البديلة الثانية في استغلال الدوال القياسية في بايثون مثل all() و any() مدمجة داخل بنية التابع .apply() أو داخل تعبيرات استيعاب القوائم (List Comprehensions). تتيح هذه المنهجية مرونة برمجية مطلقة لتنفيذ قواعد منطقية شرطية مخصصة تتجاوز إمكانيات محركات التعبيرات النمطية القياسية.
يتم تنفيذ الفحص التزامني عبر apply بصيغة دالة مجهولة: df['text'].apply(lambda x: all(k in str(x) for k in keywords))، بينما يُنفذ الفحص التناوبي باستبدال all بالدالة any. على الرغم من أن هذه الطريقة تمنح المطور حرية كاملة في إضافة استثناءات وشروط معقدة أثناء التحقق، إلا أنها تُعد المنهجية الأبطأ حوسبياً على الإطلاق بين كافة الحلول المتاحة في بانداس، لأنها تعطل التوجيه البرمجي بالكامل وتجبر المترجم على تشغيل حلقة تكرار داخلية بطيئة على مستوى بايثون لكل صف في إطار البيانات.
من الناحية العملية، يمكن تحسين أداء هذا النمط بنسبة ملحوظة عبر استخدام استيعاب القوائم المباشر على مصفوفة القيم: [all(k in str(val) for k in keywords) for val in df['text'].values]، متفادياً العبء التشغيلي الإضافي للتابع .apply()، ومع ذلك تظل هذه الحلول غير مفضلة في بيئات الإنتاج عالية الأداء ما لم تكن هناك متطلبات منطقية يتعذر حلها بالمتجهات النصية.
7.3 استخدام مصفوفات البت والعمليات المتجهية المنطقية في NumPy
لتحقيق أعلى درجات الأداء عند اتباع منهجية الفحص المنفصل، يمكن اللجوء إلى العمليات المتجهية المنخفضة المستوى التي توفرها مكتبة NumPy Logic Functions، وتحديداً الدوال التراكمية مثل np.logical_and.reduce و np.logical_or.reduce.
في هذه المنهجية، يتم توليد مصفوفات بوليانية لكل كلمة مفتاحية عبر استدعاءات str.contains(..., regex=False) للاستفادة من أقصى سرعة للمطابقة الحرفية الخالية من عبء محرك Regex، ثم يتم تجميع هذه المصفوفات في مصفوفة ثنائية الأبعاد وتمريرها للدالة التراكمية في NumPy: combined_mask = np.logical_and.reduce([df['text'].str.contains(k, regex=False, na=False) for k in keywords]).
تتميز هذه الطريقة بكفاءة ذاكرية واستقرار حسابي استثنائي، حيث تقوم دوال NumPy بتنفيذ عمليات الدمج المنطقي على مستوى مسجلات المعالج وبلغة C المحسنة، مع الاستفادة القصوى من الذاكرة المؤقتة (CPU Cache). يُعد هذا الأسلوب الخيار الهندسي الأمثل عندما تكون قائمة الكلمات المفتاحية مكونة من نصوص ثابتة وبسيطة ويراد تجنب التعقيد البنائي للتعبيرات النمطية مع الحفاظ على زمن استجابة منافس للغاية.
8. معالجة الحالات الخاصة والرموز المحجوزة وحدود الكلمات (Advanced Regex Edge Cases)
8.1 الهروب الصارم من الرموز الخاصة باستخدام re.escape
من أكثر الأخطاء الشائعة والخطيرة في تطوير أنابيب معالجة البيانات النصية هو افتراض أن مدخلات البحث ستقتصر دائماً على أحرف وأرقام عادية. في الواقع، تحتوي الكلمات المفتاحية في العديد من المجالات (مثل التمويل، والبرمجة، والشبكات) على رموز ميتامية محجوزة في لغة التعبيرات النمطية، مثل النقاط (.)، وعلامات الجمع والضرب (+, *)، وعلامات الاستفهام (?)، والأقواس ((), [], {})، والرموز الخاصة مثل ($, ^).
إذا تم دمج كلمة مثل "C++" أو "data.frame" مباشرة في تعبير نمطي، سيقوم المحرك بتفسير علامات الجمع كنقاط تكرار، والنقطة كرمز يطابق أي محرف عشوائي، مما يؤدي إلى تشويه نتائج المطابقة أو انهيار البرنامج بالكامل نتيجة خطأ تركيبي (Regex Syntax Error). للتعامل الأكاديمي الصارم مع هذه المعضلة، يجب تطبيق دالة الهروب الصارم re.escape على كافة الكلمات المفتاحية قبل حقنها في التعبير النمطي: escaped_keywords = [re.escape(k) for k in keywords].
تقوم الدالة re.escape بوضع شرطة مائلة عكسية (Backslash) تلقائياً أمام أي رمز خاص داخل السلسلة، مما يجبر المحرك على معاملته كمحرف نصي حرفي ومجرد. يضمن هذا التعقيم المسبق استقرار وحصانة أنابيب البيانات ضد الأخطاء غير المتوقعة وهجمات حقن الأنماط الخبيثة، لا سيما عندما تكون المدخلات مستمدة من واجهات مستخدمين غير موثوقة.
8.2 تحديد حدود الكلمات الكاملة باستخدام محددات الحدود b
تعتبر مشكلة المطابقة الجزئية غير المقصودة (False Substring Matching) من العيوب المنطقية الجسيمة في تصنيف النصوص. فعند البحث عن كلمة قصيرة مثل "East"، فإن الفحص البسيط سيطابق أيضاً كلمات مثل "Eastern" و "Northeast" و "Breast"، وهو ما قد يتعارض تماماً مع المتطلبات الدقيقة للتحليل التي تستهدف الكلمة المستقلة بذاتها ككيان لغوي منفصل.
لحل هذه المشكلة، توفر التعبيرات النمطية محدد حدود الكلمات b (Word Boundary Assertion). يمثل هذا المحدد تأكيداً صفري العرض يطابق الفاصل الانتقالي بين محرف يعتبر جزءاً من كلمة (Word Character: أحرف وأرقام وشرطة سفلية) ومحرف لا يعتبر جزءاً منها (مثل المسافات وعلامات الترقيم وبدايات ونهايات الأسطر). يتم بناء النمط التناوبي المحمي بالحدود على النحو التالي: r'b(?:' + '|'.join(escaped_keywords) + r')b'.
يضمن استخدام المجموعة غير الملتقطة (?:...) مع محددات الحدود b في الطرفين قصر المطابقة على الكلمات الكاملة المستقلة فقط، ومنع تسرب المطابقات الجزئية المشوهة. ومع ذلك، يجب توخي الحذر عند تطبيق b على اللغات التي تستخدم محارف خارج النطاق اللاتيني الأساسي كاللغة العربية في بعض بيئات المحركات القديمة، حيث يتطلب الأمر التأكد من تفعيل وضع دعم اليونيكود لضمان تفسير الحروف العربية كأجزاء من الكلمات بصورة سليمة.
8.3 التعامل مع المسافات البيضاء والرموز غير المرئية وتكرار الرموز
تتميز البيانات النصية المستخلصة من صفحات الويب ومستندات PDF بوجود تباينات تنسيقية غير مرئية للمستخدم، مثل المسافات غير المنكسرة (Non-breaking Spaces: u00A0)، وفواصل الأسطر المتعددة، والمسافات الجدولية (Tabs)، وتفاوت أطوال الفراغات بين الكلمات. يؤدي البحث عن سلسلة فرعية مثل "Machine Learning" إلى الفشل إذا كانت السلسلة في النص الأصلي مكتوبة بفاصل مسافتين أو سطر جديد.
تتمثل المعالجة المتقدمة لهذه الحالات في استبدال المسافات الثابتة داخل الأنماط النمطية بتعبيرات مطابقة الفراغات المرنة s+. يتيح هذا الرمز مطابقة أي نوع من المسافات البيضاء والرموز غير المرئية وبأي تكرار كان، مما يمنح عملية البحث حصانة ضد الاختلافات التنسيقية للوثائق.
بالإضافة إلى ذلك، يجب تصميم التعبيرات النمطية لتكون قادرة على تجاوز تكرار الرموز الناتجة عن أخطاء الإدخال اليدوي، مما يضمن أن تكون أدوات الفحص قادرة على استيعاب تباين العالم الحقيقي للبيانات النصية دون التفريط في دقة وصحة النتائج المنطقية.
9. التقييم المعياري للأداء والكفاءة الحسابية (Benchmarking & Performance Profiling)
9.1 التعقيد الزمني والمكاني لمختلف استراتيجيات البحث المتعدد
يستند التقييم الأكاديمي لاستراتيجيات البحث النصي في بانداس إلى تحليل التعقيد الخوارزمي الزمني والمكاني باستخدام نظرية Big-O Notation. يعتمد التعقيد الزمني لمحرك التعبيرات النمطية NFA عند فحص سلسلة نصية طولها $N$ بنمط تطلعي يحتوي على $K$ كلمة مفتاحية على الصيغة $O(K \times N)$ في الحالات المتوسطة، ولكنه قد يرتفع إلى مستويات أسوأ عند وجود أنماط متداخلة معقدة تسبب رجوعاً خلفياً مكثفاً (Backtracking).
في المقابل، فإن استراتيجية التسلسل البولياني الحرفي regex=False تتمتع بتعقيد زمني حتمي قدره $O(K \times N)$، مستفيدة من خوارزميات البحث السريع التي تعمل بالقرب من الزمن الخطي $O(N)$، متفادية أي ارتداد خلفي. من ناحية التعقيد المكاني، يتطلب التعبير النمطي الموحد $O(1)$ من الذاكرة الإضافية لأنه ينشئ مصفوفة بوليانية واحدة فقط كناتج مباشر، بينما يفرض التسلسل البولياني تعقيداً مكانياً وسيطاً قدره $O(K \times M)$ حيث $M$ هو عدد الصفوف في إطار البيانات، نظراً لتوليد $K$ مصفوفة وسيطة في الذاكرة.
توضح أدوات القياس الدقيق مثل timeit و cProfile أن كفاءة الأنماط التطلعية (?=...) تتأثر بشدة بطول النصوص وموضع الكلمات المستهدفة؛ إذ يؤدي وجود الكلمات المستهدفة بالقرب من بداية النص إلى إنهاء التطلع مبكراً وتحقيق سرعات فائقة، بينما يؤدي غياب الكلمات إلى مسح النص بالكامل حتى نهايته لكل مجموعة تطلعية، وهو ما يحدد منحنى الأداء الكلي للنظام.
9.2 اختبارات القياس على مجموعات بيانات ضخمة (Scale-up Testing)
لتقييم الاستجابة الحسابية عملياً، تم تصميم اختبار معياري صارم على إطار بيانات اصطناعي يحتوي على مليون صف (1,000,000 سجل نصي)، بمتوسط طول 150 محرفاً لكل سجل، لفحص وجود 5 كلمات مفتاحية في حالتي التناوب (OR) والتزامن (AND). تم قياس زمن التنفيذ الإجمالي ومعدل استهلاك الذروة للذاكرة العشوائية (RAM) عبر بيئة حوسبية قياسية تعتمد على معالج متعدد النوى.
| الاستراتيجية المتبعة | النمط المنطقي | زمن التنفيذ (ثانية) | استهلاك الذاكرة (MB) | ملاحظات الكفاءة والاستقرار |
|---|---|---|---|---|
Regex Lookahead (?=...) |
AND Logic | 1.82 | ~8.2 | الأعلى كفاءة ذاكرية، وأداء استثنائي وسريع بفضل القناع الفردي الموحد. |
Chained Pandas & (regex=True) |
AND Logic | 3.45 | ~38.5 | تكرار استدعاء محرك الأنماط يضاعف زمن المعالجة واستهلاك الذاكرة الوسيطة. |
| NumPy Logical Reduce (regex=False) | AND Logic | 1.21 | ~32.0 | الأسرع زمنياً على الإطلاق لمطابقة النصوص الحرفية، مع استهلاك ذاكرة متوسط. |
Apply + Python all() |
AND Logic | 14.80 | ~120.0 | بطء حاد ناتج عن الحلقة التكرارية وتجاوز التوجيه المتجهي، غير صالح للإنتاج. |
Regex OR '|'.join() |
OR Logic | 0.95 | ~8.2 | سرعة فائقة واستفادة ممتازة من التقييم الكسول لمحرك التعبيرات النمطية. |
Chained Pandas | (regex=False) |
OR Logic | 1.18 | ~32.0 | سريع جداً ومستقر، لكنه يتأخر قليلاً عن Regex الموحد في المنطق التناوبي. |
تثبت نتائج الاختبارات المعيارية أن التعبير النمطي الموحد يمثل الخيار المتوازن والأمثل في المنطقين التناوبي والتزامني، في حين يتفوق حل NumPy المتجهي المعتمد على الفحص الحرفي الصرف في السرعة الزمنية المطلقة عند غياب الحاجة لميزات التعبير النمطي المتقدمة.
9.3 تحسين الأداء باستخدام التجميع المسبق للأنماط والحلول المسرعة
يمكن لمهندسي النظم تحقيق مستويات أداء أعلى عبر تطبيق استراتيجيات تسريع متقدمة عند معالجة عشرات الملايين من السجلات. أولى هذه الاستراتيجيات هي التجميع المسبق للأنماط المعقدة باستخدام re.compile مع المؤشرات المناسبة وتمرير الكائن المترجم مباشرة للدالة str.contains، مما يلغي تماماً عبء التحقق والترجمة التكرارية للأنماط.
علاوة على ذلك، يمثل الانتقال إلى محرك PyArrow المدعوم في بانداس الحديثة نقلة نوعية في كفاءة المعالجة؛ حيث تتيح هياكل البيانات السهمية (Arrow String Arrays) تنفيذ عمليات الفحص النصي على بيانات مضغوطة ومنظمة في كتل ذاكرية متجاورة تدعم التعليمات البرمجية المتوازية (SIMD) بشكل مباشر على عتاد المعالجة.
وفي الأنظمة الحسابية الضخمة التي تتجاوز سعة الذاكرة العشوائية للجهاز الواحد، يمكن تكييف نفس المنطق والأنماط التعبيرية المستعرضة في هذا المقال لتعمل بسلاسة على محركات الحوسبة المتوازية والموزعة مثل Polars و Dask و PySpark، مما يضمن قابلية التوسع الأفقي لخطوط المعالجة النصية دون الحاجة لإعادة كتابة القواعد المنطقية للبحث.
10. تكامل التحقق النصي في مسارات هندسة البيانات وتعلم الآلة
10.1 توليد المتغيرات المؤشرية والتصنيفات المشفرة (One-Hot & Indicator Features)
يمثل استخراج المتغيرات البوليانية والمؤشرات الرقمية من النصوص خطوة تحويلية محورية في تجهيز البيانات لنماذج التعلم الآلي الخاضعة للإشراف (Supervised Learning). لا تستطيع معظم الخوارزميات الرياضية مثل الانحدار الخطي واللوجستي والشبكات العصبية معالجة النصوص الخام بشكل مباشر، مما يفرض تحويل نتائج الفحص النصي إلى مصفوفات ثنائية مكونة من القيمتين 0 و 1.
يتم هذا التحويل بسهولة في بانداس عبر تطبيق التابع .astype(int) على القناع البولياني الناتج من str.contains. يمكن توسيع هذه المنهجية لبناء مصنفات فئوية مركبة باستخدام الدوال الشرطية المتجهية في مكتبة NumPy مثل np.where للشروط الثنائية، أو np.select لإنشاء تصنيفات متعددة المستويات بناءً على قائمة من الأقنعة النصية المتزامنة والتناوبية المعقدة.
تسهم هذه الميزات المشتقة في التقاط تفاعلات نصية حرجة تزيد من القدرة التنبؤية للنماذج؛ فعلى سبيل المثال، توليد ميزة ثنائية تؤكد تواجد مصطلحي "High" و "Risk" معاً في تقارير الصيانة يمنح خوارزمية التنبؤ بالأعطال مؤشراً قوياً وفورياً يفوق في دلالته الإحصائية مجرد معالجة الكلمات المنفردة عبر تقنيات حقيبة الكلمات التقليدية (Bag-of-Words).
10.2 التصفية الشرطية المتقدمة واستخلاص العينات البحثية
تعتبر التصفية الشرطية المتقدمة المعتمدة على استعلامات النصوص المتعددة أداة حيوية في أيدي محللي البيانات لاستخلاص العينات البحثية الموجهة من بحيرات البيانات (Data Lakes). يتيح دمج الأقنعة النصية المركبة مع الشروط العددية والزمنية تشريح البيانات واستكشاف الأنماط بدقة بالغة.
تتم هذه العملية عبر دمج الأقنعة داخل بنية الفهرسة .loc[]: subset_df = df.loc[(df['description'].str.contains(r'^(?=.*critical)(?=.*server)', na=False)) & (df['response_time'] > 500)]. تضمن هذه الصياغة عزل الحالات الحرجة فقط التي تجمع بين الوصف النصي المحدد والمؤشر العددي المرتفع، مما يقلص حجم البيانات المعالجة في المراحل اللاحقة ويوفر استهلاك موارد التحليل السحابي.
كما يضمن استخدام الأقنعة البوليانية المتجهية استمرارية واتساق فهارس البيانات الأصلية (Index Integrity)، مما يسمح بإعادة دمج النتائج المستخلصة أو تحديث السجلات المحددة في الجدول الرئيسي دون حدوث أخطاء محاذاة أو فقدان في البيانات المرجعية.
10.3 بناء محولات مخصصة داخل خطوط أنابيب Scikit-Learn
لضمان الاحترافية الهندسية ومنع ظاهرة تسرب البيانات (Data Leakage) في مشاريع التعلم الآلي، يجب تضمين منطق الفحص النصي داخل محولات مخصصة (Custom Transformers) تتكامل عضوياً مع خطوط أنابيب مكتبة Scikit-Learn Pipelines. يتم تحقيق ذلك من خلال بناء فئة برمجية ترث من الفئتين الأساسيتين BaseEstimator و TransformerMixin.
تتضمن هذه الفئة المخصصة تعريف قواعد البحث النصي ومعايير المطابقة في دالة التهيئة __init__، وتطبيق منطق التحقق في التابع transform باستخدام التعبيرات النمطية المحسنة مع ضمان ضبط na=False. يضمن هذا التغليف البرمجي عزل مرحلة استخراج الميزات وتطبيقها بتطابق تام ومستقل على كل من مجموعة بيانات التدريب (Training Set) ومجموعة بيانات الاختبار (Test Set) والبيانات المستقبلية في بيئة الإنتاج.
يوفر دمج المنطق النصي في خطوط الأنابيب قابلية إعادة استخدام الكود عبر مشاريع متعددة، ويسهل عمليات التحقق المتقاطع (Cross-Validation) والبحث عن أفضل المعلمات الفائقة (Hyperparameter Tuning)، مما يرتقي بالحلول البرمجية من مجرد نصوص تفاعلية معزولة إلى نظم برمجية مؤسسية متكاملة.
11. الأخطاء المنطقية والبرمجية الشائعة وطرق تشخيصها ومعالجتها
11.1 مزالق الأسبقية المنطقية وسوء استخدام التعبيرات النمطية
تقود الأخطاء التركيبية في صياغة التعبيرات النمطية إلى عواقب منطقية غير مقصودة قد تمر دون أن تثير أي استثناءات برمجية واضحة، مما يجعلها من أخطر أنواع العيوب البرمجية (Silent Logical Bugs). من أشهر هذه المزالق هو الخلط بين مجموعات الالتقاط (Capturing Groups) والمجموعات غير الملتقطة عند استخدام رمز التناوب |.
فعلى سبيل المثال، كتابة النمط r'^North|South' دون استخدام أقواس التجميع سيؤدي إلى تفسيره رياضياً كـ: “إما سلسلة تبدأ بـ North، أو أي سلسلة تحتوي على South في أي موضع”، بدلاً من القصد الفعلي وهو “سلسلة تبدأ بإما North أو South“. لحل هذا الالتباس، يجب استخدام الأقواس التجميعية غير الملتقطة: r'^(?:North|South)' لحصر نطاق الأسبقية المنطقية بدقة.
من الأخطاء الكارثية الأخرى في المنطق التزامني هو نسيان تثبيت البداية ^ قبل التطلعات الإيجابية (?=.*str1)(?=.*str2). يؤدي هذا الإغفال إلى قيام المحرك بإعادة تقييم التطلع من كل محرف داخل النص في حال الفشل المبدئي، مما يؤدي إلى تدهور حاد في زمن التنفيذ يصل إلى التجمد الكامل للبرنامج عند معالجة نصوص طويلة، وهو ما يبرز أهمية الفهم المعماري الدقيق لتشغيل الأنماط.
11.2 مشكلات التوافقية والأنواع البرمجية غير المتجانسة
تفترض دوال الموجه النصي .str أن كافة العناصر الموجودة داخل العمود هي سلاسل نصية نقية (Strings). ومع ذلك، تتضمن مجموعات البيانات الحقيقية أعمدة ملوثة بأنواع غير متجانسة كالأعداد الصحيحة، والعوامات العشرية، والقواميس، أو الكائنات المخصصة الممزوجة داخل عمود واحد من نوع object.
عند مصادفة قيم غير نصية، قد تفشل عمليات الفحص النصي أو تصدر تحذيرات برمجية غير مرغوبة. يلجأ بعض المطورين كحل سريع إلى التحويل الإجباري للعمود بالكامل عبر df['col'].astype(str). ينطوي هذا الحل على منزلق خطير: حيث يتم تحويل القيم المفقودة np.nan إلى السلسلة النصية الصريحة "nan"، والقيمة None إلى "None". وإذا تزامنت إحدى الكلمات المفتاحية للبحث مع هذه النصوص (مثل البحث عن بادئة ‘nano’ أو مصطلح ‘none’)، فستسجل هذه السلاسل كمطابقات موجبة خاطئة (False Positives).
تتمثل المعالجة الاحترافية في التحقق الصارم من بنية العمود وتطبيق الفلترة المسبقة، أو تحويل السلسلة إلى نوع StringDtype الرسمي في بانداس، والذي يدير القيم النصية المفقودة بأمان تام ومستقل عن التمثيل المحرفي، مما يحمي المنظومة من التلوث التوافقي.
11.3 الاختبارات الأحادية (Unit Testing) لضمان جودة الأكواد النصية
تتطلب أنابيب معالجة البيانات النصية في المشاريع الصناعية ضماناً صارماً لجودة واستقرار الأكواد عبر بناء اختبارات أحادية شاملة باستخدام أطر الاختبار القياسية مثل pytest أو unittest. يجب أن تغطي هذه الاختبارات كافة الحالات الحدية (Edge Cases) التي قد تواجهها النظم في بيئات الإنتاج الفعلية.
يتضمن تصميم حالات الاختبار فحص سلوك النمط مع:
السلاسل الفارغة ("")،
والأعمدة المكونة بالكامل من قيم مفقودة (NaN)،
والنصوص شديدة الطول،
والنصوص التي تحتوي على رموز ميتامية خاصة (مثل "$100" أو "C++")،
والسلاسل التي تتكرر فيها الكلمات المستهدفة،
والنصوص ذات الحالات المتبادلة للأحرف والمسافات المشوهة.
يساعد بناء مجموعة اختبارات مؤتمتة ومدمجة في خطوط التكامل المستمر (CI/CD Pipelines) على التيقن من أن أي تعديل مستقبلي في قواعد التعبيرات النمطية أو ترقية لإصدارات مكتبة بانداس لن يؤدي إلى كسر الوظائف المنطقية القائمة أو انحراف نتائج التصفية، مما يوفر موثوقية تشغيلية عالية للمؤسسات المعتمدة على البيانات.
12. الدليل الإرشادي والتطبيقي الشامل لاختيار المنهجية المثلى
12.1 مصفوفة المفاضلة الشاملة بين المنهجيات المختلفة
لمساعدة مهندسي وعلماء البيانات على اتخاذ القرار التقني الأكثر ملاءمة لطبيعة بياناتهم وبنيتهم التحتية، تلخص مصفوفة المفاضلة الشاملة التالية مقارنة متكاملة بين مختلف الاستراتيجيات المنهجية المتاحة للتحقق من السلاسل الفرعية المتعددة في بانداس وفقاً لأربعة معايير حاسمة:
| المنهجية البرمجية | السرعة الحسابية | الكفاءة الذاكرية | المقروئية والصيانة | أفضل سيناريو للاستخدام |
|---|---|---|---|---|
| Regex Lookaheads (AND) | ممتازة (مرتفعة) | مثالية (قناع مفرد) | متوسطة (تتطلب فهم Regex) | البحث المتزامن غير المرتب عن مصطلحات متعددة في البيانات الكبيرة. |
Regex Join | (OR) |
استثنائية (الأسرع) | مثالية (قناع مفرد) | عالية جداً (نمط قياسي) | البحث التناوبي عن قائمة موسعة من الكلمات المفتاحية والمرادفات. |
Chained Pandas (& / |) |
متوسطة | منخفضة (مصفوفات وسيطة) | ممتازة (واضحة وبسيطة) | مجموعات البيانات الصغيرة إلى المتوسطة وعند الحاجة لشروط منفصلة لكل كلمة. |
| NumPy Logical Reduce | استثنائية (الأسرع حرفياً) | متوسطة | جيدة (هندسية متقدمة) | البحث المتزامن عن نصوص حرفية ثابتة عبر ملايين السجلات لتفادي Regex. |
| Apply + Python Functions | رديئة جداً (الأبطأ) | سيئة | عالية | النماذج الأولية السريعة والتحققات التي تتطلب دوالاً منطقية مخصصة ومعقدة. |
12.2 أنماط التصميم البرمجي النظيف للتعامل مع البيانات النصية في Pandas
يتطلب الالتزام بمبادئ هندسة البرمجيات النظيفة (Clean Code) عزل منطق بناء التعبيرات النمطية والتحقق النصي في دوال مساعدة مستقلة وقابلة لإعادة الاستخدام والاختبار (Modular Helper Functions)، بدلاً من كتابة تراكيب معقدة ومتناثرة داخل السكربتات الرئيسية للمشروع.
يُنصح ببناء دوال مصنع مخصصة (Pattern Factory Functions) تتولى استقبال قوائم الكلمات الخام، وتطبيق الهروب الصارم re.escape عليها، وتغليفها بمحددات الحدود b إذا لزم الأمر، ثم دمجها بالصيغة التناوبية أو التزامنية المطلوبة. كما يجب إرفاق هذه الدوال بتوثيق برمجي شامل (Docstrings) يوضح القواعد الرياضية المتبعة ويوضح حالات التعامل مع القيم المفقودة وحساسية الأحرف.
كذلك يجب اعتماد تسميات دلالية صريحة للأعمدة الناتجة عن عمليات الفحص داخل إطار البيانات (مثل has_all_required_tags أو is_eligible_candidate) وتجنب التسميات المبهمة، مع الحرص التام على عدم تكرار الأنماط النصية الثابتة (Hardcoded Strings) داخل الأكواد، مما يضمن سهولة قراءة الكود وصيانته وتطويره عبر فرق العمل المشتركة.
12.3 خلاصة التوصيات التطبيقية والآفاق المستقبلية لمعالجة النصوص
خلاصة القول، يمثل التحقق من احتواء السلسلة النصية على سلاسل فرعية متعددة في بانداس عملية تجمع بين الدقة المنطقية والكفاءة المعمارية. لضمان أفضل الممارسات في مشاريعك البرمجية، نوصي باتباع القواعد الذهبية التالية:
استخدم دائماً التعبيرات النمطية الموحدة المدعومة بـ (?=...) للبحث المتزامن و | للبحث التناوبي لتحقيق أعلى كفاءة ذاكرية،
احرص دائماً على التحديد الصريح للمعامل na=False لحماية أقنعتك البوليانية من التآكل الصامت،
وقم بتعقيم المدخلات باستخدام re.escape لحصانة كودك ضد الانهيارات غير المتوقعة.
بالنظر إلى المستقبل، يتسارع تطور منظومة بايثون لمعالجة البيانات نحو تبني محركات ذاكرية موحدة مثل Apache Arrow وتكاملات الذكاء الاصطناعي على مستوى النواة. تتيح هذه التطورات المستمرة تسريع معالجة النصوص عبر الحوسبة الموزعة واستخدام كروت الشاشة (GPUs) عبر مكتبات متقدمة مثل RAPIDS cuDF، مما يفتح آفاقاً لا محدودة لتحليل واستخلاص المعرفة من مجموعات البيانات النصية المليارية في أجزاء من الثانية.
Conclusion
استعرضنا في هذا الدليل الأكاديمي الشامل التشريح الهندسي والمنطقي للتحقق من احتواء السلاسل النصية على سلاسل فرعية متعددة داخل أطر بيانات بانداس (Pandas). انطلاقاً من الأسس النظرية للموجهات النصية المتجهة .str والتكامل المعماري مع محركات التعبيرات النمطية، وصولاً إلى الفروق الدقيقة بين المنطق التناوبي (OR) والمنطق التزامني (AND) القائم على التأكيدات التطلعية الإيجابية الصفرية العرض (?=...).
كما تم تسليط الضوء على الإدارة الصارمة للقيم المفقودة وتأثير المعامل na، واستعراض البدائل الهندسية المتجهة في NumPy، ومناقشة الحالات الحدية كحدود الكلمات والرموز المحجوزة، وتدعيم ذلك باختبارات أداء معيارية على ملايين السجلات، ومحولات متكاملة مع Scikit-Learn. إن تبني هذه المنهجيات الرصينة يضمن لمهندسي وعلماء البيانات بناء أنابيب معالجة نصية تتسم بأعلى معايير السرعة، والدقة، والموثوقية التشغيلية في بيئات الإنتاج الفعلية.
References
- Apache Arrow Project. (2024). Apache Arrow: A cross-language development platform for in-memory analytics. Apache Software Foundation. https://arrow.apache.org/
- Friedl, J. E. (2006). Mastering Regular Expressions (3rd ed.). O’Reilly Media.
- Harris, C. R., Millman, K. J., van der Walt, S. J., Gommers, R., Virtanen, P., Cournapeau, D., … & Oliphant, T. E. (2020). Array programming with NumPy. Nature, 585(7825), 357–362. https://doi.org/10.1038/s41586-020-2649-2
- McKinney, W. (2010). Data structures for statistical computing in Python. In Proceedings of the 9th Python in Science Conference (Vol. 445, pp. 51–56). https://doi.org/10.25080/Majora-92bf1921-00a
- McKinney, W. (2022). Python for Data Analysis: Data Wrangling with pandas, NumPy, and Jupyter (3rd ed.). O’Reilly Media.
- Pandas Development Team. (2024). pandas.Series.str.contains — pandas documentation. PyData. https://pandas.pydata.org/docs/reference/api/pandas.Series.str.contains.html
- Pedregosa, F., Varoquaux, G., Gramfort, A., Michel, V., Thirion, B., Grisel, O., … & Duchesnay, É. (2011). Scikit-learn: Machine learning in Python. Journal of Machine Learning Research, 12, 2825–2830. https://scikit-learn.org/
- Python Software Foundation. (2024). re — Regular expression operations. Python Standard Library. https://docs.python.org/3/library/re.html
- Unicode Consortium. (2024). The Unicode Standard, Version 15.0. Unicode Consortium. https://unicode.org/reports/tr15/
- van der Walt, S., Colbert, S. C., & Varoquaux, G. (2011). The NumPy array: a structure for efficient numerical computation. Computing in Science & Engineering, 13(2), 22–30. https://doi.org/10.1109/MCSE.2011.37