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

تحدثنا في المقالة السابقة عن الخطوتين الأولتين في خط إنتاج أنظمة معالجة اللغة الطبيعية و هما  الحصول على البيانات ، و تنظيف و إستخراج النص . نتعرف الأن على الخطوة الثالثة و هي المعالجة المسبقة (Pre-Processing)

المعالجة المسبقة (Pre-Processing)

لنبدأ بسؤال بسيط: لقد قمنا بالفعل ببعض التنظيف في الخطوة السابقة ؛ لماذا لا يزال يتعين علينا معالجة النص مسبقًا؟ ضع في اعتبارك سيناريو نعالج فيه نصًا من صفحات ويكيبيديا حول الأفراد لاستخراج معلومات عن سيرتهم الذاتية.

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

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

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

مقدمات (Preliminaries)

تجزئة الجملة وترميز الكلمة.

مقدار الخطوات (Frequent steps)

إزالة كلمات التوقف ، و التشذيب  (stemming) ، واللممات (lemmatization) ، وإزالة الأرقام / علامات الترقيم ، والحروف الصغيرة ، إلخ.

خطوات أخرى

التسوية، والكشف عن اللغة ، وخلط الكود ، والترجمة الصوتية ، إلخ.

المعالجة المتقدمة

علامات POS ، التحليل ، دقة المرجع ، إلخ.

في حين أنه لن يتم اتباع جميع الخطوات في جميع خطوط إنتاج معالجة اللغات الطبيعية التي نواجهها ، إلا أن الخطوتين الأوليين يمكن رؤيتهما في كل مكان. دعونا نلقي نظرة على ما تعنيه كل خطوة من هذه الخطوات.

مقدمات

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

تجزئة الجملة (Sentence segmentation)

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

لحسن الحظ ، لا داعي للقلق بشأن كيفية حل هذه المشكلات ، حيث تأتي معظم مكتبات معالجة اللغة الطبيعية  مع تطبيق شكل من أشكال تقسيم الجمل والكلمات. مكتبة شائعة الاستخدام هي مجموعة أدوات اللغة الطبيعية (Natural Language Tool Kit) أو بإختصار  (NLTK) .

 يوضح مثال الكود أدناه كيفية استخدام جملة وكلمة مقسم من NLTK ويستخدم الفقرة الأولى من هذا المقال كمدخل:

mytext = "In the previous Article, we saw examples of some common NLP 
applications that we might encounter in everyday life.."

my_sentences = sent_tokenize(mytext)

ترقيم الكلمات (Word tokenization

لترقيم الجملة إلى كلمات ، يمكننا البدء بقاعدة بسيطة لتقسيم النص إلى كلمات بناءً على وجود علامات الترقيم. تتيح لنا مكتبة NLTK القيام بذلك. إذا أخذنا المثال السابق:

for sentence in my_sentences:
   print(sentence)
   print(word_tokenize(sentence))

بالنسبة للجملة الأولى ، تتم طباعة الإخراج على النحو التالي:

In the previous Article, we saw a quick overview of what is NLP, what are some
of the common applications and challenges in NLP, and an introduction to 
different tasks in NLP.
['In', 'the', 'Article', 'chapter', ',', 'we', 'saw', 'a', 'quick', 
'overview', 'of', 'what', 'is', 'NLP', ',', 'what', 'are', 'some', 'of', 'the', 
'common', 'applications', 'and', 'challenges', 'in', 'NLP', ',', 'and', 'an', 
'introduction', 'to', 'different', 'tasks', 'in', 'NLP', '.']

بينما تعمل الحلول المتاحة بسهولة مع معظم احتياجاتنا وستحتوي معظم مكتبات معالجة اللغة الطبيعية  على مٌرقم (tokenizer)  ومقسم جمل ، من المهم أن تتذكر أنها بعيدة عن الكمال.

 على سبيل المثال ، انظر إلى هذه الجملة: “Mr. Jack O’Neil works at Melitas Marg, located at 245 Yonge Avenue, Austin, 70272. ” 

إذا قمنا بتمرير هذه الجملة بواسطة  مُرقم NLTK ، فسيتم تحديد “O” و” ‘ “و” Neil”  على أنها ثلاثة ترقيمات منفصلة.

 في مثل هذه الحالات ، قد نحتاج إلى استخدام مرقم (tokenizer)  مخصص مصمم لغرضنا. في مثالنا ، سنقوم بترميز الكلمات بعد أن نقوم بترميز الجملة.

نظرًا لأن الترقيم قد يختلف من مجال إلى آخر ، فإن الترقيم يعتمد أيضًا بشكل كبير على اللغة. يمكن أن يكون لكل لغة قواعد واستثناءات لغوية مختلفة.توضح الصورة أدناه مثالاً حيث “N.Y.!” لديها إجمالي ثلاث ترقيمات. ولكن في اللغة الإنجليزية ، يرمز N.Y. إلى New York ، ومن هنا جاءت كلمة N.Y. يجب التعامل معها على أنها كلمة واحدة.. يمكن تحديد هذه الاستثناءات الخاصة باللغة في االمرقم الذي يوفره spaCy. من الممكن أيضًا في spaCy تطوير قواعد مخصصة للتعامل مع مثل هذه الاستثناءات .

الإستثناءات الخاصة باللغة الإنجليزية أثناء التدريبية

مقدار الخطوات (Frequent Steps)

دعنا نلقي نظرة على بعض عمليات المعالجة المسبقة الأخرى التي يتم إجراؤها بشكل متكرر في خط إنتاج معالجة اللغات الطبيعية. لنفترض أننا نصمم برنامجًا يعرّف فئة المقالة الإخبارية كفئة سياسية ورياضية وتجارية وغير ذلك.

 افترض أن لدينا مجزئًا جيدًا للجمل , و مرقم للكلمة في مكانها. في هذه المرحلة ، يجب أن نبدأ في التفكير في نوع المعلومات المفيدة لتطوير أداة التصنيف.

 بعض الكلمات المستخدمة بشكل متكرر في اللغة الإنجليزية ، مثل (as a, an, the, of, in, etc.)  وما إلى ذلك ، ليست مفيدة بشكل خاص لهذه المهمة ، لأنها لا تحمل أي محتوى بمفردها للفصل بين الفئات الأربع. 

تسمى هذه الكلمات كلمات التوقف ويتم عادةً (وإن لم يكن دائمًا) إزالتها من التحليل الإضافي في سيناريوهات المشكلة هذه. 

ومع ذلك ، لا توجد قائمة قياسية لكلمات التوقف للغة الإنجليزية. هناك بعض القوائم الشائعة (على سبيل المثال لدى NLTK واحدة) ، على الرغم من أن كلمة التوقف يمكن أن تختلف اعتمادًا على ما نعمل عليه. على سبيل المثال ، ربما تكون كلمة “أخبار” هي كلمة توقف لسيناريو هذه المشكلة ، ولكنها قد لا تكون كلمة توقف لبيانات خطاب العرض في المثال المذكور في الخطوة السابقة.

يوضح مثال الكود أدناه كيفية إزالة كلمات التوقف والأرقام وعلامات الترقيم والأحرف الصغيرة لمجموعة معينة من النصوص:

from nltk.corpus import stopwords
From string import punctuation
def preprocess_corpus(texts):
    mystopwords = set(stopwords.words("english"))
    def remove_stops_digits(tokens):
       return [token.lower() for token in tokens if token not in mystopwords                         and
               not token.isdigit() and token not in punctuation]
    return [remove_stops_digits(word_tokenize(text)) for text in texts]

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

التشذيب و   اللملمات (STEMMING AND LEMMATIZATION) 

يشير التشذيب إلى عملية إزالة اللواحق واختزال كلمة ما إلى شكل أساسي ما بحيث يمكن تمثيل جميع المتغيرات المختلفة لهذه الكلمة بنفس الشكل (على سبيل المثال ، يتم اختزال كل من “car” و “cars” إلى “car”).

 يتم تحقيق ذلك من خلال تطبيق مجموعة ثابتة من القواعد (على سبيل المثال ، إذا كانت الكلمة تنتهي بـ “-es” ، فقم بإزالة “-es”). على الرغم من أن هذه القواعد قد لا تنتهي دائمًا في شكل أساسي صحيح لغويًا ، إلا أن التشذيب  يُستخدم بشكل شائع في محركات البحث لمطابقة استفسارات المستخدم مع المستندات ذات الصلة وفي تصنيف النص لتقليل مساحة السمة لتدريب نماذج التعلم الآلي.

يوضح مقتطف الكود التالي كيفية استخدام خوارزمية تشذيب  شائعة تسمى Porter Stemmer باستخدام NLTK:

from nltk.stem.porter import PorterStemmer
stemmer = PorterStemmer()
word1, word2 = “cars”, “revolution” 
print(stemmer.stem(word1), stemmer.stem(word2))

وهذا يعطي “car” على أنها النسخة المشذبة من “cars” ، ولكن “revolut” هي الشكل المشذبة من “revolution” ، على الرغم من أن الأخيرة ليست صحيحة لغويًا. في حين أن هذا قد لا يؤثر على أداء محرك البحث ، فإن اشتقاق الصيغة اللغوية الصحيحة يصبح مفيدًا في بعض السيناريوهات الأخرى. يتم تحقيق ذلك من خلال عملية أخرى ، أقرب إلى التشذيب ، تسمى اللملة ( lemmatization) .

اللملة هي عملية تعيين جميع الأشكال المختلفة للكلمة إلى الكلمة الأساسية ، . في حين أن هذا يبدو قريبًا من تعريف الاشتقاق ، إلا أنهما مختلفان في الواقع. على سبيل المثال ، صفة “better” ، عند التشذيب ، تظل كما هي. ومع ذلك ، عند اللملة ، ستصبح  “good” ، كما هو موضح في الصورة أدناه . تتطلب اللملة مزيدًا من المعرفة اللغوية ، ولا تزال النمذجة وتطوير اللملة  الفعالة مشكلة مفتوحة في أبحاث معالجة اللغة الطبيعية   حتى الآن.

الفرق بين اللملة و التشذيب

يوضح مقتطف الكود التالي استخدام اللملة  استنادًا إلى WordNet من NLTK:

from nltk.stem import WordNetLemmatizer
lemmatizer = WordnetLemmatizer()
print(lemmatizer.lemmatize("better", pos="a")) #a is for adjective

ويظهر مقتطف الشفرة هذا أداة اللملة باستخدام spaCy:

import spacy
sp = spacy.load('en_core_web_sm')
token = sp(u'better')
for word in token:
   print(word.text,  word.lemma_)

الصورة التالية توضح  خطوات المعالجة المسبقة المختلفة التي رأيناها حتى الأن

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

خطوات المعالجة المسبقة الشائعة للنص

خطوات المعالجة المسبقة الأخرى

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

تطبيع النص (Text normalization)

ضع في اعتبارك سيناريو نعمل فيه مع مجموعة من منشورات الشبكات الاجتماعية لاكتشاف الأحداث الإخبارية. يختلف نص وسائل التواصل الاجتماعي كثيرًا عن اللغة التي نراها في الصحف على سبيل المثال.

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

عندما نعمل على تطوير أدوات معالجة اللغات الطبيعية للعمل مع هذه البيانات ، من المفيد الوصول إلى تمثيل أساسي للنص يلتقط كل هذه الاختلافات في تمثيل واحد. يُعرف هذا بتطبيع النص.

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

إكتشاف اللغة (Language detection)

يوجد الكثير من محتوى على الإنترنت بلغات مختلفة. على سبيل المثال ، لنفترض أنه طُلب منا جمع كل التعليقات حول منتجنا على الويب. بينما نتصفح مواقع التجارة الإلكترونية المختلفة ونبدأ في الزحف إلى الصفحات المتعلقة بمنتجنا ، نلاحظ ظهور العديد من المراجعات بلغات مختلفة. 

نظرًا لأن غالبية خط الإنتاج مبني بأدوات خاصة بلغة معينة ، فماذا سيحدث لخط إنتاج معالجة اللغة الطبيعية   الخاص بنا ، والذي يتوقع كمثال  نصًا باللغة الإنجليزية؟ في مثل هذه الحالات ، يتم إجراء اكتشاف اللغة كخطوة أولى في مسار معالجة اللغات الطبيعية. يمكننا استخدام مكتبات مثل Polyglot لاكتشاف اللغة. بمجرد الانتهاء من هذه الخطوة ، يمكن أن تتبع الخطوات خط إنتاج الخاصة باللغة.

خلط الكود والترجمة (Code mixing and transliteration)

كانت المناقشة أعلاه حول سيناريو يكون المحتوى فيه بلغات غير الإنجليزية. ومع ذلك ، هناك سيناريو آخر حيث يوجد جزء واحد من المحتوى بأكثر من لغة. يتحدث الكثير من الناس في جميع أنحاء العالم أكثر من لغة واحدة في حياتهم اليومية. 

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

جمله عامية من السنغافورية إلى الإنجليزية

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

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

معالجة متقدمة

تخيل أنه طُلب منا تطوير نظام لتحديد أسماء الأشخاص والمؤسسات في مجموعة شركتنا المكونة من مليون مستند. قد لا تكون خطوات المعالجة المسبقة الشائعة التي ناقشناها سابقًا ذات صلة في هذا السياق. 

يتطلب تحديد الأسماء أن نكون قادرين على  إنشاء علامات POS ، لأن تحديد الأسماء المناسبة يمكن أن يكون مفيدًا في تحديد أسماء الأشخاص والمؤسسات.

 كيف يمكننا  إنشاء علامات POS  خلال مرحلة المعالجة المسبقة  للمشروع؟  يتم ت  إنشاء علامات POS المدربة مسبقًا والقابلة للاستخدام بسهولة في مكتبات معالجة اللغة الطبيعية   مثل NLTK و spaCy و Parsey McParseface Tagger ، ولا يتعين علينا عمومًا تطوير حلول خاصة بنا. يوضح مقتطف البرمجة التالي كيفية استخدام العديد من وظائف المعالجة المسبقة المبنية مسبقًا التي ناقشناها حتى الآن باستخدام مكتبة NLP و spaCy:

import spacy
nlp = spacy.load('en_core_web_sm')
doc = nlp(u'Charles Spencer Chaplin was born on 16 April 1889 toHannah Chaplin 
         (born Hannah Harriet
Pedlingham Hill) and Charles Chaplin Sr')

في هذا المقتطف البسيط ، يمكننا أن نرى الترميز ، و اللملة، وعلامات POS ، والعديد من الخطوات الأخرى في العمل!

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

ما رأيناه حتى الآن في هذا القسم هو بعض خطوات المعالجة المسبقة الأكثر شيوعًا في خط الإنتاج. كلهم متاحون كنماذج مدربة مسبقًا وقابلة للاستخدام في مكتبات معالجة اللغة الطبيعية   المختلفة.

مخرج مراحل مختلفة من خط إنتاج معالحة اللغة

أخيرًا ، يتعين علينا النظر في الإجراءات خطوة بخطوة للمعالجة المسبقة في كل حالة ، على النحو الملخص.

خطوات المغالجة المسبقة للنص

على سبيل المثال ، لا يمكن أن يسبق وضع علامات POS بإزالة كلمة الإيقاف .حيث تؤثر هذه المعالجة على إخراج علامات POS  عن طريق تغيير البنية النحوية للجملة.

إضافة تعليق