Logo

المدوّنات اللغوية العربية: مورد أساسي لمعالجة اللغة العربية الطبيعية

10 دقائق قراءة
شرائح الدرس
1 / 13

المدونات اللغوية العربية: مورد أساسي لمعالجة اللغة العربية

فهم المدونات اللغوية، والتجزئة اللفظية (Tokenization)، والتقطيع، وإزالة كلمات التوقف في النصوص العربية

📌 المدوّنات اللغوية العربية: مورد أساسي لمعالجة اللغة العربية الطبيعية 🌍📖

🔹 ما هي المدوّنة اللغوية العربية (Corpus)؟

المدوّنة اللغوية العربية (بصيغة الجمع: Corpora) هي مجموعة ضخمة من النصوص العربية تُستخدم في تدريب نماذج معالجة اللغة الطبيعية (NLP) وتقييم أدائها. تساعد هذه المدوّنات في مهام مثل التقطيع (Tokenization)، ووسم أقسام الكلام (Part-of-Speech Tagging)، والتعرّف على الكيانات المسمّاة (Named Entity Recognition)، وتحليل المشاعر، والترجمة الآلية.


🔹 أنواع المدوّنات اللغوية العربية (للاطّلاع فقط) 🏛️

تتفاوت المدوّنات اللغوية العربية بحسب مجالها والغرض منها وبنيتها. وفيما يلي بعض أنواعها الشائعة:

1️⃣ المدوّنات العربية العامة

📌 تُستخدم في مهام NLP العامة كالتقطيع، والتحليل النحوي، وبناء تضمينات الكلمات (Word Embeddings).

  • 📖 Arabic Gigaword ← مجموعة واسعة النطاق من المقالات الإخبارية العربية.
  • 🌎 Arabic Web Corpus ← نصوص عربية مُجمَّعة (Crawled) من مواقع إنترنت متنوعة.
  • 📜 Tashkeela Corpus ← يركّز على التشكيل العربي (Tashkeel) لأغراض التشكيل الآلي.

2️⃣ مدوّنات الكلام والمحادثات العربية 🗣️

📌 تُستخدم في التعرّف على الكلام (Speech Recognition)، وتدريب روبوتات الدردشة، وأنظمة الحوار.

  • 🎤 MGB-2 (Multi-Genre Broadcast Corpus) ← نصوص مُفرَّغة من بث تلفزيوني.
  • ☎️ CALLHOME Arabic Corpus ← مكالمات هاتفية مسجَّلة ومُفرَّغة نصيًا.
  • 🗣️ ArzEn ← مدوّنة ثنائية اللغة (عربية مصرية - إنجليزية) لمعالجة الكلام.

3️⃣ مدوّنات المشاعر والآراء العربية 😊😡

📌 تُستخدم في تحليل المشاعر (Sentiment Analysis) واستخراج الآراء.

  • 📊 ASTD (Arabic Sentiment Twitter Dataset) ← تغريدات موسومة بتصنيفات المشاعر.
  • 📝 LABR (Large-Scale Arabic Book Reviews Corpus) ← لتحليل المشاعر في مراجعات الكتب.
  • 💬 OCA (Opinion Corpus for Arabic) ← مجموعة بيانات لمراجعات الأفلام من حيث المشاعر.

4️⃣ مدوّنات النصوص القرآنية والدينية 📜

📌 تُستخدم في التحليل اللغوي والترجمة وأدوات البحث الخاصة بالنصوص الدينية.

  • 📖 Quranic Arabic Corpus ← مدوّنة موسومة (Annotated) للقرآن الكريم.
  • 📚 Al-Hadith Corpus ← مجموعة من نصوص الأحاديث لأغراض بحوث NLP.

5️⃣ المدوّنات العربية التاريخية والأدبية 🏺

📌 تُستخدم في بحوث العربية الفصحى التراثية ومعالجة النصوص التاريخية.

  • 📜 Al-Khalil Corpus ← مجموعة من النصوص العربية الكلاسيكية.
  • 📚 The Doha Historical Dictionary of Arabic ← يرصد تطوّر اللغة العربية عبر التاريخ.

✨ مهام تطبيع النصوص (Text Normalization) 📖

تطبيع النصوص خطوة معالجة مسبقة (Preprocessing) أساسية في NLP، وتشمل:

  • 🔹 التقطيع (Tokenization): تقسيم النص إلى كلمات أو وحدات فرعية.
  • 🔹 التجزئة (Segmentation): تقسيم النص إلى وحدات ذات معنى كالجُمَل أو العبارات.
  • 🔹 الاشتقاق (Stemming): اختزال الكلمات إلى جذرها بحذف الزوائد.
  • 🔹 التحليل الصرفي (Lemmatization): تحويل الكلمات إلى صورتها القاموسية الأساسية.

🔹 نص عربي

إن التاريخ العسكري سوف يتوقف طويلاً أمام عملية يوم ٦ أكتوبر ١٩٧٣، ولست أتجاوز إذا قلت أن التاريخ العسكري سوف يتوقف طويلاً بالفحص والدرس أمام عملية يوم ٦ أكتوبر سنة ٧٣، حين تمكنت القوات المسلحة المصرية من اقتحام مانع قناة السويس الصعب واجتياز خط بارليف المنيع وإقامة رؤوس جسور لها بعد أن أفقدت العدو توازنه في 6 ساعات، لقد كانت المخاطرة كبيرة والتضحيات عظيمة لمعركة ٦ أكتوبر خلال الساعات الست الأولى من حربنا كانت هائلة فقد العدو توازنه إلى هذه اللحظة.

Q1: التقطيع باستخدام ثلاث طرق

التقطيع (Tokenization) هو عملية تفكيك عبارة أو جملة أو فقرة أو مستند كامل إلى وحدات أصغر تُسمّى رموزًا (Tokens). يمكن أن تكون هذه الرموز كلمات كاملة، أو كلمات فرعية، أو علامات ترقيم.

في هذه المهمة، سنطبّق ثلاث طرق تقطيع مختلفة:

  1. طريقتان تقليديتان بلغة Python
  2. طريقة واحدة تعتمد على مكتبة NLP
text = ' إن التاريخ العسكري سوف يتوقف طويلاً أمام عملية يوم ٦ أكتوبر ١٩٧٣, ولست اتجاوز اذا قلت أن التاريخ العسكري سوف يتوقف طويلاً بالفحص والدرس أمام عملية يوم ٦ أكتوبر سنة ٧٣, حين تمكنت القوات المسلحة المصرية من إقتحام مانع قناة السويس الصعب واجتياز خط بارليف المنيع وإقامة رؤس جسور لها بعد أن أفقدت العدو توازنه فى 6 ساعات, لقد كانت المخاطرة كبيرة والتضحيات عظيمة لمعركة ٦ أكتوبر خلال الساعات الست الأولي من حربنا كانت هائلة فقد العدو توازنه إلي هذه اللحظة'
# Preprocessing
import re
pre_processed = re.sub(r'[^\w\s]', '', text) # Keep only whitespaces & words
pre_processed
' إن التاريخ العسكري سوف يتوقف طويلا أمام عملية يوم ٦ أكتوبر ١٩٧٣ ولست اتجاوز اذا قلت أن التاريخ العسكري سوف يتوقف طويلا بالفحص والدرس أمام عملية يوم ٦ أكتوبر سنة ٧٣ حين تمكنت القوات المسلحة المصرية من إقتحام مانع قناة السويس الصعب واجتياز خط بارليف المنيع وإقامة رؤس جسور لها بعد أن أفقدت العدو توازنه فى 6 ساعات لقد كانت المخاطرة كبيرة والتضحيات عظيمة لمعركة ٦ أكتوبر خلال الساعات الست الأولي من حربنا كانت هائلة فقد العدو توازنه إلي هذه اللحظة'

🔸 طرق التقطيع

1️⃣ دالة split() المدمجة في Python (تقطيع أساسي يعتمد على الفراغات) 2️⃣ التعبيرات النمطية (re.findall(PATTERN, TEXT), re.split()) 3️⃣ مكتبة NLP (nltk.word_tokenize للإنجليزية، وFarasa للعربية) (تقطيع مراعٍ للسياق وخاص باللغة)

1️⃣ استخدام دالة split() في Python (الطريقة التقليدية)

يمكن استخدام دالة split() المدمجة في Python لتقطيع النص اعتمادًا على الفراغات. غير أنها لا تتعامل مع علامات الترقيم أو الحالات الخاصة.

tokens_1 = pre_processed.split()
tokens_1
['إن',
 'التاريخ',
 'العسكري',
 'سوف',
 'يتوقف',
 'طويلا',
 'أمام',
 'عملية',
 'يوم',
 '٦',
 'أكتوبر',
 '١٩٧٣',
 'ولست',
 'اتجاوز',
 'اذا',
 'قلت',
 'أن',
 'التاريخ',
 'العسكري',
 'سوف',
 'يتوقف',
 'طويلا',
 'بالفحص',
 'والدرس',
 'أمام',
 'عملية',
 'يوم',
 '٦',
 'أكتوبر',
 'سنة',
 '٧٣',
 'حين',
 'تمكنت',
 'القوات',
 'المسلحة',
 'المصرية',
 'من',
 'إقتحام',
 'مانع',
 'قناة',
 'السويس',
 'الصعب',
 'واجتياز',
 'خط',
 'بارليف',
 'المنيع',
 'وإقامة',
 'رؤس',
 'جسور',
 'لها',
 'بعد',
 'أن',
 'أفقدت',
 'العدو',
 'توازنه',
 'فى',
 '6',
 'ساعات',
 'لقد',
 'كانت',
 'المخاطرة',
 'كبيرة',
 'والتضحيات',
 'عظيمة',
 'لمعركة',
 '٦',
 'أكتوبر',
 'خلال',
 'الساعات',
 'الست',
 'الأولي',
 'من',
 'حربنا',
 'كانت',
 'هائلة',
 'فقد',
 'العدو',
 'توازنه',
 'إلي',
 'هذه',
 'اللحظة']

2️⃣ استخدام التعبيرات النمطية (Regular Expressions)

يمكننا استخدام التعبيرات النمطية (re) لتقطيع النص.

PATTERN = r"\w+"
tokens_2 = re.findall(PATTERN, pre_processed)
tokens_2
['إن',
 'التاريخ',
 'العسكري',
 'سوف',
 'يتوقف',
 'طويلا',
 'أمام',
 'عملية',
 'يوم',
 '٦',
 'أكتوبر',
 '١٩٧٣',
 'ولست',
 'اتجاوز',
 'اذا',
 'قلت',
 'أن',
 'التاريخ',
 'العسكري',
 'سوف',
 'يتوقف',
 'طويلا',
 'بالفحص',
 'والدرس',
 'أمام',
 'عملية',
 'يوم',
 '٦',
 'أكتوبر',
 'سنة',
 '٧٣',
 'حين',
 'تمكنت',
 'القوات',
 'المسلحة',
 'المصرية',
 'من',
 'إقتحام',
 'مانع',
 'قناة',
 'السويس',
 'الصعب',
 'واجتياز',
 'خط',
 'بارليف',
 'المنيع',
 'وإقامة',
 'رؤس',
 'جسور',
 'لها',
 'بعد',
 'أن',
 'أفقدت',
 'العدو',
 'توازنه',
 'فى',
 '6',
 'ساعات',
 'لقد',
 'كانت',
 'المخاطرة',
 'كبيرة',
 'والتضحيات',
 'عظيمة',
 'لمعركة',
 '٦',
 'أكتوبر',
 'خلال',
 'الساعات',
 'الست',
 'الأولي',
 'من',
 'حربنا',
 'كانت',
 'هائلة',
 'فقد',
 'العدو',
 'توازنه',
 'إلي',
 'هذه',
 'اللحظة']

3️⃣ استخدام مكتبات NLP (nltk.word_tokenize)

يوفّر مُقطِّع NLTK طريقةً ذكية لتقطيع الكلمات مع التعامل الصحيح مع علامات الترقيم والاختصارات (Contractions).

import nltk
# Punkt is a pretrained model that helps in splitting text into sentences and words.
# It supports multiple languages, including English and Arabic.
# The "punkt" package consists in unsafe pickles, so it is deprecated and not used in NLTK 3.8.2. It is replaced by "punkt_tab".
 
# nltk.download('punkt')
nltk.download('punkt_tab')
nltk.download('stopwords')
[nltk_data] Downloading package punkt_tab to
[nltk_data]     C:\Users\mmaba\AppData\Roaming\nltk_data...
[nltk_data]   Package punkt_tab is already up-to-date!
[nltk_data] Downloading package stopwords to
[nltk_data]     C:\Users\mmaba\AppData\Roaming\nltk_data...
[nltk_data]   Package stopwords is already up-to-date!
True
from nltk.tokenize import word_tokenize
tokens_3 = word_tokenize(pre_processed)
tokens_3
['إن',
 'التاريخ',
 'العسكري',
 'سوف',
 'يتوقف',
 'طويلا',
 'أمام',
 'عملية',
 'يوم',
 '٦',
 'أكتوبر',
 '١٩٧٣',
 'ولست',
 'اتجاوز',
 'اذا',
 'قلت',
 'أن',
 'التاريخ',
 'العسكري',
 'سوف',
 'يتوقف',
 'طويلا',
 'بالفحص',
 'والدرس',
 'أمام',
 'عملية',
 'يوم',
 '٦',
 'أكتوبر',
 'سنة',
 '٧٣',
 'حين',
 'تمكنت',
 'القوات',
 'المسلحة',
 'المصرية',
 'من',
 'إقتحام',
 'مانع',
 'قناة',
 'السويس',
 'الصعب',
 'واجتياز',
 'خط',
 'بارليف',
 'المنيع',
 'وإقامة',
 'رؤس',
 'جسور',
 'لها',
 'بعد',
 'أن',
 'أفقدت',
 'العدو',
 'توازنه',
 'فى',
 '6',
 'ساعات',
 'لقد',
 'كانت',
 'المخاطرة',
 'كبيرة',
 'والتضحيات',
 'عظيمة',
 'لمعركة',
 '٦',
 'أكتوبر',
 'خلال',
 'الساعات',
 'الست',
 'الأولي',
 'من',
 'حربنا',
 'كانت',
 'هائلة',
 'فقد',
 'العدو',
 'توازنه',
 'إلي',
 'هذه',
 'اللحظة']

📝 Q2: تنفيذ تجزئة الجمل باستخدام nltk ✂️📖

🔹 وصف المهمة

تجزئة الجمل (Sentence Segmentation) هي عملية تقسيم الفقرة إلى جمل مفردة. في هذه المهمة، ستستخدم مُجزِّئ الجمل Punkt الخاص بمكتبة NLTK لتقسيم النص إلى جمل.

par=" في نفس المساحة، لقد تم توليد هذا النص من مولد النص العربى، حيث يمكنك أن تولد مثل هذا النص أو العديد من النصوص الأخرى إضافة إلى زيادة عدد الحروف التى يولدها التطبيق. إذا كنت تحتاج إلى عدد أكبر من الفقرات يتيح لك مولد النص العربى زيادة عدد الفقرات كما تريد، النص لن يبدو مقسما ولا يحوي أخطاء لغوية، مولد النص العربى مفيد لمصممي المواقع على وجه الخصوص، حيث يحتاج العميل فى كثير من الأحيان أن يطلع على صورة حقيقية لتصميم الموقع.ومن هنا وجب على المصمم أن يضع نصوصا مؤقتة على التصميم ليظهر للعميل الشكل كاملاً،دور مولد النص العربى أن يوفر على المصمم عناء البحث عن نص بديل لا علاقة له بالموضوع "
#============= Segmentation ==========
def segment(text):
    segmenter = nltk.data.load("tokenizers/punkt/english.pickle")
    sents = segmenter.tokenize(text)
    for sent in sents:
        print(sent)
        print('-'*30)
 
    print(f"Number of sentences: {len(sents)}")
segment(par)
 في نفس المساحة، لقد تم توليد هذا النص من مولد النص العربى، حيث يمكنك أن تولد مثل هذا النص أو العديد من النصوص الأخرى إضافة إلى زيادة عدد الحروف التى يولدها التطبيق.
------------------------------
إذا كنت تحتاج إلى عدد أكبر من الفقرات يتيح لك مولد النص العربى زيادة عدد الفقرات كما تريد، النص لن يبدو مقسما ولا يحوي أخطاء لغوية، مولد النص العربى مفيد لمصممي المواقع على وجه الخصوص، حيث يحتاج العميل فى كثير من الأحيان أن يطلع على صورة حقيقية لتصميم الموقع.ومن هنا وجب على المصمم أن يضع نصوصا مؤقتة على التصميم ليظهر للعميل الشكل كاملاً،دور مولد النص العربى أن يوفر على المصمم عناء البحث عن نص بديل لا علاقة له بالموضوع
------------------------------
Number of sentences: 2

📝 Q3: إزالة كلمات التوقف باستخدام nltk.corpus 🚀

🔹 وصف المهمة

كلمات التوقف (Stopwords) هي كلمات شائعة (مثل "the" و"and" و"is" في الإنجليزية) لا تضيف عادة معنى ذا دلالة في تحليل النصوص. باستخدام وحدة corpus في مكتبة NLTK، أزل كلمات التوقف من الجمل العربية التالية.


X = [
    "أحب المشي على الشاطئ",
    "أنا أحب الأفلام",
    "أحب الأفلام",
    "القط على القبعة",
]
Y = [
    "الشاطئ للبحر مثل السحابة للسماء",
    "أحب الأفلام",
    "انا احب الافلام",
    "القطة فوق القبعة",
]
# print stopwords
from nltk.corpus import stopwords
stopwords = stopwords.words('arabic')
print(f"Stop words length : {len(stopwords)}")
print(f"Example : {stopwords[0:10]}")
Stop words length : 754
Example : ['إذ', 'إذا', 'إذما', 'إذن', 'أف', 'أقل', 'أكثر', 'ألا', 'إلا', 'التي']
from nltk.tokenize import word_tokenize
def RemoveStopwords(X,Y):
    
    print("X:", X)
    print("Y:", Y)
    
    # tokenization
    X_list = word_tokenize(X)
    Y_list = word_tokenize(Y)
    
    # remove stop words from the string
    X_set = {w for w in X_list if not w in stopwords}
    Y_set = {w for w in Y_list if not w in stopwords}
 
    # X_set = {w for w in X_list if not w in stopwords}
    # Is the same as ---------------------------------------------------
    # for w in X_list:  # Loop through each word in X_list
    #     if w not in stopwords:  # If the word is NOT a stopword
    #         X_set.add(w)  # Add it to the set
    # ------------------------------------------------------------------
    print("X_set:", X_set)
    print("Y_set:", Y_set)
for item in zip(X,Y):
    print(item)
('أحب المشي على الشاطئ', 'الشاطئ للبحر مثل السحابة للسماء')
('أنا أحب الأفلام', 'أحب الأفلام')
('أحب الأفلام', 'انا احب الافلام')
('القط على القبعة', 'القطة فوق القبعة')
for x,y in zip(X, Y):
    RemoveStopwords(x, y)
    print('-'*30)
X: أحب المشي على الشاطئ
Y: الشاطئ للبحر مثل السحابة للسماء
X_set: {'المشي', 'الشاطئ', 'أحب'}
Y_set: {'للسماء', 'السحابة', 'الشاطئ', 'للبحر'}
------------------------------
X: أنا أحب الأفلام
Y: أحب الأفلام
X_set: {'أحب', 'الأفلام'}
Y_set: {'أحب', 'الأفلام'}
------------------------------
X: أحب الأفلام
Y: انا احب الافلام
X_set: {'أحب', 'الأفلام'}
Y_set: {'الافلام', 'انا', 'احب'}
------------------------------
X: القط على القبعة
Y: القطة فوق القبعة
X_set: {'القط', 'القبعة'}
Y_set: {'القطة', 'القبعة'}
------------------------------

🔹 ما هي المدوّنة اللغوية العربية (Corpus)؟

المدوّنة اللغوية العربية (بصيغة الجمع: Corpora) هي مجموعة ضخمة من النصوص العربية تُستخدم في تدريب نماذج معالجة اللغة الطبيعية (NLP) وتقييم أدائها. تساعد هذه المدوّنات في مهام مثل التقطيع، ووسم أقسام الكلام، والتعرّف على الكيانات المسمّاة، وتحليل المشاعر، والترجمة الآلية.


# Where to put your corpus ?  
# nltk.data.path
# Loading it
# nltk.data.load('PATH')