تمرين برمجي في معالجة النصوص وتفسير النماذج - كتاب الذكاء الإصطناعي - الصف 12 - الفصل 1 - المملكة العربية السعودية

الكتاب: كتاب الذكاء الإصطناعي - الصف 12 - الفصل 1 | المادة: الذكاء الإصطناعي | المرحلة: الصف 12 | الفصل الدراسي: 1

الدولة: المملكة العربية السعودية | المنهج: المنهج السعودي - وزارة التعليم

الدرس: تمارين تطبيقية على TF-IDF وLIME

📚 معلومات الصفحة

الكتاب: كتاب الذكاء الإصطناعي - الصف 12 - الفصل 1 | المادة: الذكاء الإصطناعي | المرحلة: الصف 12 | الفصل الدراسي: 1

الدولة: المملكة العربية السعودية | المنهج: المنهج السعودي - وزارة التعليم

نوع المحتوى: تمارين وأسئلة

مستوى الصعوبة: متوسط

📝 ملخص الصفحة

هذه الصفحة تحتوي على تمرينين برمجيين متتاليين في مجال معالجة اللغات الطبيعية والتعلم الآلي. التمرين الأول يطلب من المستخدم إكمال مقطع برمجي لتنفيذ خط أنابيب تنبؤ باستخدام خوارزمية TF-IDF لتمثيل النصوص كمتجهات، ثم تدريب نموذج تصنيف Naive Bayes متعدد الحدود (MultinomialNB) على البيانات الممثلة. يتضمن ذلك استيراد المكتبات المناسبة من scikit-learn، وضبط معلمات المتجه، وتدريب النموذج، ودمج المتجه والنموذج في خط أنابيب واحد باستخدام make_pipeline.

التمرين الثاني يبني على التمرين الأول، حيث يطلب من المستخدم إكمال مقطع برمجي لبناء مفسّر نصوص باستخدام أداة LIME (Local Interpretable Model-agnostic Explanations) لتفسير تنبؤات النموذج. يتضمن ذلك استيراد LimeTextExplainer، وإنشاء مفسّر محلي، وتطبيقه على مثال نصي لتحديد الكلمات الأكثر تأثيرًا في التنبؤ، مع طباعة النتائج. هذا التمرين يركز على تفسيرية النماذج وشفافيتها في سياق تصنيف النصوص.

الصفحة موجهة لطلاب أو ممارسين في مجال التعلم الآلي ومعالجة النصوص، وتتطلب معرفة مسبقة بمفاهيم مثل TF-IDF، Naive Bayes، وخطوط الأنابيب في scikit-learn، بالإضافة إلى أساسيات تفسير النماذج باستخدام أدوات مثل LIME. التمارين عملية وتطبيقية، مما يساعد على تعزيز الفهم من خلال الترميز الفعلي.

📋 المحتوى المنظم

📖 محتوى تعليمي مفصّل

4

نوع: QUESTION

لديك X_train_text وهي عبارة عن مصفوفة numpy تتضمن مستندًا واحدًا في كل صف. لديك كذلك مصفوفة ثانية Y_train تتضمن قيم المستندات في X_train_text. أكمل المقطع البرمجي التالي بحيث يمكن استخدام تكرار المصطلح - تكرار المستند العكسي (TF-IDF) لتمثيل البيانات بالمتجهات، وتدريب نموذج تصنيف MultinomialNB على الإصدار الممثل بالمتجهات، ثم تجميع أداة التمثيل بالمتجهات ونموذج التصنيف في خط أنابيب تنبؤ واحد: from __________.naive_bayes import MultinomialNB from sklearn.pipeline import make_pipeline from sklearn.feature_extraction.text import _________ vectorizer = _________ (min_df=10) vectorizer.fit(_________) # fits the vectorizer on the training data X_train = vectorizer._________ (X_train_text) # uses the fitted vectorizer to vectorize the data model_MNB = MultinomialNB() # a Naive Bayes Classifier model_MNB.fit(X_train, _________) # fits the classifier on the vectorized training data prediction_pipeline = make_pipeline(_________, _________)

5

نوع: QUESTION

أكمل المقطع البرمجي التالي بحيث يمكنه بناء مفسّر نصوص النموذج المحايد المحلي القابل للتفسير والشرح (LIME) لخط أنابيب التنبؤ الذي قمت ببنائه في التمرين السابق، واستخدم المفسّر لتفسير التنبؤ على مثال لنص آخر. from _________ import LimeTextExplainer text_example="I really enjoyed this movie, the actors were excellent" class_names=['neg','pos'] # creates a local explainer for explaining individual predictions explainer = _________ (class_names=class_names) # explains the prediction for this example exp = explainer._________ (text_example.lower(),prediction_pipeline._________, _________=10) # focuses the explainer on the 10 most influential features print(exp._________) # prints the words with the highest influence on the prediction

نوع: METADATA

وزارة التعليم 153 Ministry of Education 2025 - 1447

📄 النص الكامل للصفحة

--- SECTION: 4 --- لديك X_train_text وهي عبارة عن مصفوفة numpy تتضمن مستندًا واحدًا في كل صف. لديك كذلك مصفوفة ثانية Y_train تتضمن قيم المستندات في X_train_text. أكمل المقطع البرمجي التالي بحيث يمكن استخدام تكرار المصطلح - تكرار المستند العكسي (TF-IDF) لتمثيل البيانات بالمتجهات، وتدريب نموذج تصنيف MultinomialNB على الإصدار الممثل بالمتجهات، ثم تجميع أداة التمثيل بالمتجهات ونموذج التصنيف في خط أنابيب تنبؤ واحد: from __________.naive_bayes import MultinomialNB from sklearn.pipeline import make_pipeline from sklearn.feature_extraction.text import _________ vectorizer = _________ (min_df=10) vectorizer.fit(_________) # fits the vectorizer on the training data X_train = vectorizer._________ (X_train_text) # uses the fitted vectorizer to vectorize the data model_MNB = MultinomialNB() # a Naive Bayes Classifier model_MNB.fit(X_train, _________) # fits the classifier on the vectorized training data prediction_pipeline = make_pipeline(_________, _________)--- SECTION: 5 --- أكمل المقطع البرمجي التالي بحيث يمكنه بناء مفسّر نصوص النموذج المحايد المحلي القابل للتفسير والشرح (LIME) لخط أنابيب التنبؤ الذي قمت ببنائه في التمرين السابق، واستخدم المفسّر لتفسير التنبؤ على مثال لنص آخر. from _________ import LimeTextExplainer text_example="I really enjoyed this movie, the actors were excellent" class_names=['neg','pos'] # creates a local explainer for explaining individual predictions explainer = _________ (class_names=class_names) # explains the prediction for this example exp = explainer._________ (text_example.lower(),prediction_pipeline._________, _________=10) # focuses the explainer on the 10 most influential features print(exp._________) # prints the words with the highest influence on the prediction2025 - 1447

✅ حلول أسئلة الكتاب الرسمية

عدد الأسئلة: 2

سؤال 4: لديك X_train_text وهي عبارة عن مصفوفة numpy تتضمن مستندًا واحدًا في كل صف. لديك كذلك مصفوفة ثانية Y_train تتضمن قيم المستندات في X_train_text. أكمل المقطع البرمجي التالي بحيث يمكن استخدام تكرار المصطلح - تكرار المستند العكسي (TF-IDF) لتمثيل البيانات بالمتجهات، وتدريب نموذج تصنيف MultinomialNB على الإصدار الممثل بالمتجهات، ثم تجميع أداة التمثيل بالمتجهات ونموذج التصنيف في خط أنابيب تنبؤ واحد: from __________.naive_bayes import MultinomialNB from sklearn.pipeline import make_pipeline from sklearn.feature_extraction.text import _________ vectorizer = _________ (min_df=10) vectorizer.fit(_________) # fits the vectorizer on the training data X_train = vectorizer._________ (X_train_text) # uses the fitted vectorizer to vectorize the data model_MNB = MultinomialNB() # a Naive Bayes Classifier model_MNB.fit(X_train, _________) # fits the classifier on the vectorized training data prediction_pipeline = make_pipeline(_________, _________)

الإجابة: (1) 4: sklearn (2) 4: TfidfVectorizer (3) 4: TfidfVectorizer (4) 4: X_train_text (5) 4: transform (6) 4: Y_train (7) 4: vectorizer (8) 4: model_MNB

خطوات الحل:

  1. **الخطوة 1 (فهم المهمة):** لنفهم هذا السؤال: لدينا بيانات نصية في مصفوفة X_train_text، وقيم تصنيفها في Y_train. نريد بناء خط أنابيب يتكون من مرحلتين: 1. تحويل النصوص إلى متجهات باستخدام TF-IDF 2. تدريب نموذج تصنيف Naive Bayes متعدد الحدود (MultinomialNB) نحتاج لاستيراد الأدوات المناسبة من مكتبة scikit-learn.
  2. **الخطوة 2 (استيراد المكتبات):** نبدأ باستيراد MultinomialNB من sklearn.naive_bayes: python from sklearn.naive_bayes import MultinomialNB ثم نستورد TfidfVectorizer من sklearn.feature_extraction.text لتحويل النصوص إلى متجهات TF-IDF: python from sklearn.feature_extraction.text import TfidfVectorizer
  3. **الخطوة 3 (تهيئة وتحويل البيانات):** ننشئ كائن TfidfVectorizer مع معلمة min_df=10 (تجاهل الكلمات التي تظهر أقل من 10 مرات): python vectorizer = TfidfVectorizer(min_df=10) نستخدم fit() لتعليم الـ vectorizer على بيانات التدريب: python vectorizer.fit(X_train_text) ثم نحول النصوص إلى متجهات باستخدام transform(): python X_train = vectorizer.transform(X_train_text)
  4. **الخطوة 4 (تدريب النموذج):** ننشئ نموذج MultinomialNB: python model_MNB = MultinomialNB() ندرب النموذج على البيانات المحولة (X_train) مع قيم التصنيف (Y_train): python model_MNB.fit(X_train, Y_train)
  5. **الخطوة 5 (بناء خط الأنابيب):** نستخدم make_pipeline لربط مرحلتي التحويل والتصنيف معاً: python prediction_pipeline = make_pipeline(vectorizer, model_MNB) إذن الإجابات المطلوبة هي: 1. sklearn 2. TfidfVectorizer 3. TfidfVectorizer 4. X_train_text 5. transform 6. Y_train 7. vectorizer 8. model_MNB

سؤال 5: أكمل المقطع البرمجي التالي بحيث يمكنه بناء مفسّر نصوص النموذج المحايد المحلي القابل للتفسير والشرح (LIME) لخط أنابيب التنبؤ الذي قمت ببنائه في التمرين السابق، واستخدم المفسّر لتفسير التنبؤ على مثال لنص آخر. from _________ import LimeTextExplainer text_example="I really enjoyed this movie, the actors were excellent" class_names=['neg','pos'] # creates a local explainer for explaining individual predictions explainer = _________ (class_names=class_names) # explains the prediction for this example exp = explainer._________ (text_example.lower(),prediction_pipeline._________, _________=10) # focuses the explainer on the 10 most influential features print(exp._________) # prints the words with the highest influence on the prediction

الإجابة: (1) 5: lime.lime_text (2) 5: LimeTextExplainer (3) 5: explain_instance (4) 5: predict_proba (5) 5: num_features (6) 5: as_list()

خطوات الحل:

  1. **الخطوة 1 (فهم المهمة):** لنفهم هذا السؤال: نريد استخدام أداة LIME لتفسير تنبؤات النموذج الذي بنيناه في السؤال السابق. LIME تساعدنا في فهم أي الكلمات كانت الأكثر تأثيراً في قرار التصنيف.
  2. **الخطوة 2 (استيراد المكتبة):** نحتاج لاستيراد LimeTextExplainer من مكتبة lime.lime_text: python from lime.lime_text import LimeTextExplainer
  3. **الخطوة 3 (تهيئة المفسّر):** ننشئ كائن LimeTextExplainer مع تحديد أسماء الفئات (سلبية/إيجابية): python explainer = LimeTextExplainer(class_names=class_names)
  4. **الخطوة 4 (تفسير النص):** نستخدم explain_instance() لتفسير تنبؤ النموذج على نص معين: python exp = explainer.explain_instance(text_example.lower(), prediction_pipeline.predict_proba, num_features=10) حيث: - text_example.lower(): النص الذي نريد تفسيره (بالحروف الصغيرة) - prediction_pipeline.predict_proba: دالة التنبؤ بالنموذج - num_features=10: عدد الميزات (الكلمات) الأكثر تأثيراً التي نريد عرضها
  5. **الخطوة 5 (عرض النتائج):** نستخدم as_list() للحصول على قائمة بالكلمات الأكثر تأثيراً وتأثيرها: python print(exp.as_list()) إذن الإجابات المطلوبة هي: 1. lime.lime_text 2. LimeTextExplainer 3. explain_instance 4. predict_proba 5. num_features 6. as_list()

📝 أسئلة اختبارية

عدد الأسئلة: 2

سؤال 4: لديك X_train_text وهي عبارة عن مصفوفة numpy تتضمن مستندًا واحدًا في كل صف. لديك كذلك مصفوفة ثانية Y_train تتضمن قيم المستندات في X_train_text. أكمل المقطع البرمجي التالي بحيث يمكن استخدام تكرار المصطلح - تكرار المستند العكسي (TF-IDF) لتمثيل البيانات بالمتجهات، وتدريب نموذج تصنيف MultinomialNB على الإصدار الممثل بالمتجهات، ثم تجميع أداة التمثيل بالمتجهات ونموذج التصنيف في خط أنابيب تنبؤ واحد: from __________.naive_bayes import MultinomialNB from sklearn.pipeline import make_pipeline from sklearn.feature_extraction.text import _________ vectorizer = _________ (min_df=10) vectorizer.fit(_________) # fits the vectorizer on the training data X_train = vectorizer._________ (X_train_text) # uses the fitted vectorizer to vectorize the data model_MNB = MultinomialNB() # a Naive Bayes Classifier model_MNB.fit(X_train, _________) # fits the classifier on the vectorized training data prediction_pipeline = make_pipeline(_________, _________)

  • أ) from sklearn.naive_bayes import MultinomialNB from sklearn.pipeline import make_pipeline from sklearn.feature_extraction.text import CountVectorizer vectorizer = CountVectorizer(min_df=10) vectorizer.fit(X_train_text) X_train = vectorizer.fit_transform(X_train_text) model_MNB = MultinomialNB() model_MNB.fit(X_train, Y_train) prediction_pipeline = make_pipeline(vectorizer, model_MNB)
  • ب) from sklearn.naive_bayes import MultinomialNB from sklearn.pipeline import make_pipeline from sklearn.feature_extraction.text import TfidfVectorizer vectorizer = TfidfVectorizer(min_df=10) vectorizer.fit(X_train_text) X_train = vectorizer.transform(X_train_text) model_MNB = MultinomialNB() model_MNB.fit(X_train, Y_train) prediction_pipeline = make_pipeline(vectorizer, model_MNB)
  • ج) from sklearn.naive_bayes import MultinomialNB from sklearn.pipeline import make_pipeline from sklearn.feature_extraction.text import TfidfVectorizer vectorizer = TfidfVectorizer(min_df=10) vectorizer.fit(Y_train) X_train = vectorizer.transform(X_train_text) model_MNB = MultinomialNB() model_MNB.fit(X_train, Y_train) prediction_pipeline = make_pipeline(model_MNB, vectorizer)
  • د) from sklearn.naive_bayes import MultinomialNB from sklearn.pipeline import make_pipeline from sklearn.feature_extraction.text import TfidfVectorizer vectorizer = TfidfVectorizer(min_df=10) vectorizer.fit(X_train_text) X_train = vectorizer.fit_transform(X_train_text) model_MNB = MultinomialNB() model_MNB.fit(X_train, Y_train) prediction_pipeline = make_pipeline(vectorizer, model_MNB)

الإجابة الصحيحة: from sklearn.naive_bayes import MultinomialNB from sklearn.pipeline import make_pipeline from sklearn.feature_extraction.text import TfidfVectorizer vectorizer = TfidfVectorizer(min_df=10) vectorizer.fit(X_train_text) X_train = vectorizer.transform(X_train_text) model_MNB = MultinomialNB() model_MNB.fit(X_train, Y_train) prediction_pipeline = make_pipeline(vectorizer, model_MNB)

الشرح: يجب استيراد MultinomialNB من sklearn.naive_bayes واستيراد TfidfVectorizer من sklearn.feature_extraction.text. يتم إنشاء vectorizer باستخدام TfidfVectorizer مع معلمة min_df=10، ثم يتم تدريبه على بيانات التدريب X_train_text باستخدام fit(). يتم تحويل البيانات باستخدام transform()، ثم يتم تدريب نموذج MultinomialNB على البيانات المحولة والتسميات Y_train باستخدام fit(). أخيرًا، يتم إنشاء خط أنابيب باستخدام make_pipeline يجمع بين vectorizer وmodel_MNB.

تلميح: تأكد من استخدام الدوال المناسبة لتحويل البيانات وتدريب النموذج، وتذكر أن خط الأنابيب يجب أن يتضمن كلاً من أداة التمثيل بالمتجهات ونموذج التصنيف.

سؤال 5: أكمل المقطع البرمجي التالي بحيث يمكنه بناء مفسّر نصوص النموذج المحايد المحلي القابل للتفسير والشرح (LIME) لخط أنابيب التنبؤ الذي قمت ببنائه في التمرين السابق، واستخدم المفسّر لتفسير التنبؤ على مثال لنص آخر. from _________ import LimeTextExplainer text_example="I really enjoyed this movie, the actors were excellent" class_names=['neg','pos'] # creates a local explainer for explaining individual predictions explainer = _________ (class_names=class_names) # explains the prediction for this example exp = explainer._________ (text_example.lower(),prediction_pipeline._________, _________=10) # focuses the explainer on the 10 most influential features print(exp._________) # prints the words with the highest influence on the prediction

  • أ) from lime import LimeTextExplainer text_example="I really enjoyed this movie, the actors were excellent" class_names=['neg','pos'] explainer = LimeTextExplainer(class_names=class_names) exp = explainer.explain(text_example.lower(), prediction_pipeline.predict, features=10) print(exp.show_in_notebook())
  • ب) from lime.lime_text import LimeTextExplainer text_example="I really enjoyed this movie, the actors were excellent" class_names=['neg','pos'] explainer = LimeTextExplainer(class_names=class_names) exp = explainer.explain_instance(text_example.lower(), prediction_pipeline.predict_proba, num_features=10) print(exp.as_list())
  • ج) from sklearn.explainers import LimeTextExplainer text_example="I really enjoyed this movie, the actors were excellent" class_names=['neg','pos'] explainer = LimeTextExplainer(class_names=class_names) exp = explainer.explain(text_example.lower(), prediction_pipeline.predict_proba, num_features=10) print(exp.words())
  • د) from lime.lime_text import LimeTextExplainer text_example="I really enjoyed this movie, the actors were excellent" class_names=['neg','pos'] explainer = LimeTextExplainer(class_names=class_names) exp = explainer.explain_instance(text_example.lower(), prediction_pipeline.predict, num_features=10) print(exp.as_list())

الإجابة الصحيحة: from lime.lime_text import LimeTextExplainer text_example="I really enjoyed this movie, the actors were excellent" class_names=['neg','pos'] explainer = LimeTextExplainer(class_names=class_names) exp = explainer.explain_instance(text_example.lower(), prediction_pipeline.predict_proba, num_features=10) print(exp.as_list())

الشرح: يجب استيراد LimeTextExplainer من lime.lime_text. يتم إنشاء explainer باستخدام LimeTextExplainer مع class_names. ثم يتم استخدام explain_instance() لشرح التنبؤ، حيث يتم تمرير النص المحول إلى أحرف صغيرة، ودالة predict_proba من خط الأنابيب، وnum_features=10 لتحديد عدد الميزات الأكثر تأثيرًا. أخيرًا، يتم طباعة النتائج باستخدام as_list() للحصول على قائمة الكلمات المؤثرة.

تلميح: تأكد من استخدام الدالة الصحيحة لشرح التنبؤ وطباعة النتائج، وتذكر أن num_features تحدد عدد الميزات الأكثر تأثيرًا.

🎴 بطاقات تعليمية للمراجعة

عدد البطاقات: 5 بطاقة لهذه الصفحة

في سياق معالجة اللغات الطبيعية، ما هو الهدف الرئيسي من استخدام تكرار المصطلح - تكرار المستند العكسي (TF-IDF)؟

الإجابة: الهدف الرئيسي هو تمثيل البيانات النصية (المستندات) كمتجهات عددية، مع إعطاء وزن أكبر للمصطلحات الهامة التي تظهر بشكل متكرر في مستند معين ولكن بشكل نادر في المستندات الأخرى، مما يساعد نماذج التعلم الآلي على فهم أهمية الكلمات في سياقها.

الشرح: TF-IDF يحسب قيمة لكل كلمة في مستند ما تعكس أهميتها. الجزء الأول (TF - Term Frequency) يقيس عدد مرات ظهور الكلمة في المستند، بينما الجزء الثاني (IDF - Inverse Document Frequency) يقيس مدى ندرة الكلمة عبر جميع المستندات. الكلمات التي تظهر كثيراً في مستند واحد وقليلاً في المستندات الأخرى تحصل على درجة TF-IDF أعلى، مما يشير إلى أنها أكثر تمييزاً لهذا المستند.

تلميح: فكر كيف يوازن TF-IDF بين مدى ظهور الكلمة في مستند واحد ومدى ظهورها في مجموعة المستندات بأكملها.

ما هو الغرض من تجميع مكونات التمثيل بالمتجهات (Vectorizer) ونموذج التصنيف (Model) في خط أنابيب (Pipeline)؟

الإجابة: الغرض هو تبسيط سير عمل التعلم الآلي. يضمن خط الأنابيب أن يتم تطبيق خطوات معالجة البيانات (مثل تحويل النص إلى متجهات باستخدام TF-IDF) تلقائيًا قبل تمريرها إلى نموذج التصنيف، مما يسهل عملية التدريب والتنبؤ ويقلل من احتمالية الأخطاء.

الشرح: خط الأنابيب (Pipeline) هو طريقة لتجميع خطوات متعددة من معالجة البيانات والنمذجة في كائن واحد. هذا يجعل الكود أكثر تنظيمًا وقابلية لإعادة الاستخدام، ويضمن تطبيق نفس التحويلات على بيانات التدريب وبيانات الاختبار أو التنبؤ.

تلميح: تخيل أن لديك عدة خطوات متتالية، كيف تجمعها لتصبح خطوة واحدة فعالة؟

في مكتبة LIME، ما هو الدور الأساسي لكائن `LimeTextExplainer`؟

الإجابة: يقوم `LimeTextExplainer` ببناء مفسر محلي قابل للتفسير يركز على شرح التنبؤات التي يقوم بها نموذج التعلم الآلي لنصوص فردية.

الشرح: `LimeTextExplainer` هو جزء من مكتبة LIME (Local Interpretable Model-agnostic Explanations) ويُستخدم لشرح كيف توصل النموذج إلى قرار معين بشأن قطعة نصية معينة. إنه يفعل ذلك عن طريق إنشاء نماذج محلية بسيطة حول نقطة البيانات المراد تفسيرها.

تلميح: اسم الكائن نفسه يحتوي على مفتاح لفهم وظيفته.

عند استخدام `explainer.explain_instance` في LIME، ما هي المعلمات التي يتم تمريرها لشرح تنبؤ على نص معين؟

الإجابة: يتم تمرير النص المراد تفسيره (في صيغة حروف صغيرة)، ودالة التنبؤ الخاصة بالنموذج (والتي تأخذ النص وتعيد احتمالات الفئات)، وعدد الميزات (الكلمات) المراد التركيز عليها في التفسير.

الشرح: الدالة `explain_instance` تأخذ النص الأصلي (عادةً محولاً إلى حروف صغيرة)، و `classifier_fn` (وهي في هذه الحالة `prediction_pipeline.predict_proba`) التي تقوم بعمل التنبؤات، و `num_features` التي تحدد عدد الكلمات الأكثر تأثيراً التي سيتم عرضها في التفسير.

تلميح: فكر في المعلومات الأساسية التي يحتاجها المفسر ليعمل: ما الذي تفسره؟ وكيف تفعل ذلك؟ وبأي تفصيل؟

ماذا يعرض `exp.as_list()` عند استخدامه مع كائن مفسر LIME تم إنشاؤه من نص؟

الإجابة: يعرض قائمة بالكلمات (الميزات) الأكثر تأثيراً في تنبؤ النموذج لهذا النص المحدد، مع توضيح اتجاه تأثير كل كلمة (إيجابي أو سلبي) وقيمتها العددية.

الشرح: `exp.as_list()` (أو `exp.as_html()` أو `exp.show_in_notebook()`) هي طرق لعرض نتائج تفسير LIME. `as_list()` تقدم المعلومات كقائمة بسيطة مما يسهل تحليلها برمجيًا أو قراءتها.

تلميح: اسم الدالة يوحي بأنها ستقدم تفصيلاً على شكل قائمة.