معالجة اللغة العربية Arabic Natural Language Processing – تصنيف الكلام Text Classification (الجزء الثالث)

271

تصنيف الكلام

سنتحدث اليوم عن وسائل تصنيف الكلام text classification التي تمكننا من بناء أنظمة NLP عالية الكفاءة بـاستخدام models بسيطة للغاية. سنرى كيف نتمكن من الحصول على نتائج مذهلة مع مجهود يسير جدا.

المنظور التحليلي للـ NLP

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

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

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

تصنيف الكلام لاستخراج المقصد

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

النظافة والطاقم متعاون، رقي في التعامل مع الناس

يتحدث التقييم السابق عن النظافة والمعاملة ولا يذكر الفندق صراحة ولا أنه “جيد” ولكن نحن نعرف أن هذا يعد تقييما جيدا للفندق.

كيف يمكننا برمجة الكمبيوتر لاستخراج هذه المعلومة عن “جودة” الفندق من الكلام، رغم أن “الجودة” لم تذكر صراحة؟ بدلا من النظر للمشكلة أنها مشكلة تحليل وفهم لغوي معقد، نبسط المشكلة إلى مشكلة تصنيف. حينها يمكننا استخدام طرق الـ machine learning لحل المشكلة.

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

نحتاج لكثير من الداتا لتعليم نظم الـ machine learning، سنستخدم داتا تقييم فنادق ويكون التقييم من 1 إلى 5، ونتعامل معها أنها مشكلة تصنيف أن كل رقم منفصل بدلا من regression لأنه يبسط المشكلة.

رغم بساطة هذا الـ model إلا أنه يمكننا من الكثير من التطبيقات مثل تحليل الوسائط الاجتماعية ومتابعة الأحداث والمنتجات الجديدة. لتطبيق هذا مثلا نجمع بعض التغريدات عن موضوع محدد ونقوم بإعطائها تقييم ثم نستخدم الـ model كمنتج لمتابعة هذا الموضوع الذي اخترناه.

لماذا يعمل model بهذه البساطة؟

قد يبدو الأمر ضربا من السحر أن نستغني عن التحليل اللغوي المعقد ونستبدله بـ model احصائي بسيط لغوية لا ينظر إلا لأنماط الكلمات، فأنى يغني هذا عن ذاك؟

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

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

قوة الـ machine learning تكمن في الأنماط الإحصائية statistical patterns بين الكلمات والتقييمات المختلفة. مثلا نرى في الكلام اعتماد على الرموز التعبيرية emojis التي ترتبط بشدة مع التعبير عن المزاج أو العواطف. فإذا وجدنا مثلا _ على الأرجح متعلق بتقييم منخفض ويعبر عن الاعتراض. وهنا قوة الـ machine learning أنه ينظر إلى هذه الكلمات والرموز وأنماط تكرارها مع التقييمات المختلفة ليتعلم أي الكلام يشير لأي تقييم، دون فهم حقيقي للكلام!

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

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

ما هي تطبيقات نظم تصنيف الكلام؟

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

من أشهر تطبيقات هي تصنيف البريد الالكتروني وهو يستخدم لتصنيف البريد المؤذي spam.

ومثل تصنيف الـ spam هناك تطبيق أوسع وهو التعرف على أي كلام مؤذي أو بذيء.

ويمكننا أيضاً تصنيف رسائل الدعم الفني لإرسالها للقسم المناسب لتوفير الدعم بصورة أكثر كفاءة.

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

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

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

بناء نظام تصنيف الكلام بمكتبة fastText

يمكن اتباع هذه التعليمات لتنزيل مكتبة fastText

https://fasttext.cc/docs/en/support.html

ولتشغيلها على Windows يمكن استخدام هذه النسخة

https://github.com/xiamx/fastText/releases

الخطوة الأولى: تحميل الداتا تقييم الفنادق

سنستخدم داتا تقييم فنادق من النجار تتكون من حوالي 500 ألف تقييم من موقع booking.com ويكون التقييم من 1 إلى 5

https://github.com/elnagara/HARD-Arabic-Dataset

تحتوي الداتا على معلومات إضافية لكن سنكتفي بالنص review و التقييم rating

الخطوة الثانية: تجهيز ومعالجة أولية

تحتاج مكتبة fastText أن يكون الملف المدخل به الصنف مسبوق بكلمة __label__ ثم النص الكتابي، مثال

__label__5 فندق جيد جداً

ثم نحتاج بعض المعالجة لقصل علامات الترقيم وتوحيد الهمزات والهاء والتاء المربوطة، وذلك هو الـ normalization الذي ذكرناه في المقال السابق

هذا الكود يقوم بهذه المهمة

import pandas as pd
import re
def clean(s):
    s = re.sub(r"([.!?,'/()])", r" \1 ", s)
    s = re.sub(r"[اأإآءئ]", "ا", s)
    s = re.sub(r"[هة]", "ه", s)
    return s
df = pd.read_csv('unbalanced-reviews.txt', sep='\t', encoding='utf-16')
df.review = df.review.apply(clean)
df['label'] = '__label__' + df.rating.astype(str)

الخطوة الثالثة: تقسيم الداتا إلى قسم للتعليم وقسم للاختبار

نحتاج إلى هذا التقسيم لنقيم نظامنا الـ machine learning، إذا استخدمنا الداتا كما هي فكأننا نعطيه الإجابة النموذجية وكل المطلوب هي الحفظ.

from sklearn.model_selection import StratifiedShuffleSplit
spl = StratifiedShuffleSplit(n_splits=1, test_size=0.3, random_state=123)
for tr_ix, te_ix in spl.split(df.review, df.label):
    break
with open('hotel.train', 'w', encoding='utf-8') as f:
    for lbl, txt in df[['label', 'review']].iloc[tr_ix].values:
        print(lbl, txt, file=f)
with open('hotel.test', 'w', encoding='utf-8') as f:
    for lbl, txt in df[['label', 'review']].iloc[te_ix].values:
        print(lbl, txt, file=f)

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

الخطوة الرابعة: التعليم

نستخدم مكتبة fastText كأداة منفصلة من الـ command line كالأتي

fasttext supervised -input hotel.train -output hotel_model

Read 7M words
Number of words: 266624
Number of labels: 5
Progress: 100.0% words/sec/thread: 685967 lr: 0.000000 loss: 0.669792 ETA: 0h 0m

نلاحظ أن التعليم لا يأخذ وقت كثير رغم حجم الداتا

الخطوة الخمسة: الاختبار

نقوم بالاختبار أيضاً من الـ command line كالآتي:

fasttext test hotel_model.bin hotel.test

N 122869
P@1 0.738
R@1 0.738
Number of examples: 122869

وهذا سيعطينا تقييم للـ Precision والـ Recall

يمكن أيضا تقييم صحة الـ model في إجابتين بدل من واحدة، وهو مفيد لتقييم أوسع لنسبة الخطأ. فإذا كانت نسبة الخطأ لإجابة واحدة مثلا 50% ونسبة الخطأ لإجابتين 25% فهذا يعني أنه يحتاج لقليل من التحسين حتى نرفع احتمالية الإجابة الصحيحة، لكن إذا ظلت النسبة 50% مع إجابتين فهذا model أسوأ يحتاج إلى تحسين أكثر.

الخطوة السادسة: تحسين الـ model

هناك العديد من الإعدادات لضبط الـ model يمكن التعرف عليها هنا

https://fasttext.cc/docs/en/options.html

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

 

fasttext supervised -input hotel.train -output hotel_model -wordNgrams 2
Read 7M words
Number of words: 266624
Number of labels: 5
Progress: 100.0% words/sec/thread: 427187 lr: 0.000000 loss: 0.514206 ETA: 0h 0m

fasttext test hotel_model.bin hotel.test
N 122869
P@1 0.756
R@1 0.756
Number of examples: 122869

نرى أن استخدام الـ wordNgram بـ 2 قام بتحسين حوالي 1.8% وهو تحسين لا بأس به.

يمكننا الاستفادة من الـ text classification في عديد من التطبيقات، وتساعدنا مكتبات مثل fastText في بناء هذه التطبيقات بصورة أسهل وأكثر تنظيماً.

ملف الكود كاملاً

المصادر:

https://medium.com/@ageitgey/text-classification-is-your-new-secret-weapon-7ca4fad15788

https://fasttext.cc/docs/en/supervised-models.html

https://github.com/mohamedadaly/LABR

https://github.com/elnagara/HARD-Arabic-Dataset

https://www.cs.mcgill.ca/~mxia3/FastText-for-Windows

تعليقات