طريقة عمل تضمين للغة العربية Word-Embedding (الجزء الثاني)

Arabic Word-Embedding Word2Vec

367

بمناسبة اليوم العالمي للغة العربية 18 ديسمبر من كل عام نقدم هذا الجزء الثاني من سلسلة طريقة عمل تضمين للغة العربية Word-Embedding

في هذا الجزء سوف نستعرض سويا كيف يمكن تطبيق المعادلات الرياضية على اللغة العربية, وسوف نستعرض أيضاً كيف يمكن تمييز الكلمة اللتي لا تمت بصلة لمجموعة من الكلمات, وكيف يمكن مشاهدة الكلمات المشابهة لكلمة معينة على الرسم البياني.

لمتابعة الجزء الأول لمن فاته الأمر هذا هو الرابط:-

طريقة عمل تضمين للغة العربية Word-Embedding (الجزء الأول)

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

هذا الفيديو عبارة عن محاكاة  للـ Bonus App والذي قام بتصمميه المبرمج العالمي Radim Řehůřek لعمل Word2Vec باللغة الانجليزية.

للمزيد من المعلومات يمكنكم مشاهدة هذا الرابط والذي يشرح بشكل مبسط مكتبة Gensim الشهيرة وكيف يمكن استعمالها لكي نحصل على Word-Embedding

https://rare-technologies.com/word2vec-tutorial/

وعشان الناس اللي تحب تجرب الكلام دا كله بشكل جاهز, اللينك دا عليه السورس كود:-

https://github.com/rozester/Arabic-Word-Embeddings-Word2vec

طيب بسم الله نبدأ الشرح 💪💪💪

أول معادلة رياضية هنبدأ بيها وهي رجل + ملك – امرأة = ملكة

طيب هنتكلم شوية عن التفسير الرياضي لها عشان يكون الكلام مفهوم للطلبة الجدد.

المفروض إن كلمة رجل عبارة عن Vector رياضي طوله 300 ودا مثال لشكله [1.0 2.9 0.9 -38 …]

المقصود إنه عبارة عن أرقام عشرية موجبة أو سالبة, طيب إزاي حصلنا على هذه الأرقام ؟

للتذكير: قمنا باستعمال Word2Vec Algorithm عشان نحول الكلمات العربية إلى هذه الأرقام بناء على الكلمات المجاورة في الجملة.

إحنا في المعادلة السابقة بنقوم بجمع أول كلمتين وهما رجل + ملك ونطرحها من كلمة امرأة, هيطلع لنا Vector جديد لانج

طيب عايزين نعرف أكتر Vector في قاموسنا يشبه هذا المتجه الجديد ؟

همممم 🤔🤔🤔

أولا لازم تحسب الأمر دا لجميع الكلمات اللي عندك في القاموس ماعدا الثلاث كلمات اللي في المعادلة السابقة رجل, ملك, امرأة

طيب نحسبها إزاي يا ناصح ؟ 😤😤😤

واحد هيقولك إحنا نحسب الفرق بين كل قيمة من قيم المتجه الجديد الـ 300 والفرق بين القيمة المناظرة لها في كل متجهات القاموس وبعد كدا نجمعها ونربعها, اللي هي طريقة Mean Square Error الشهيرة

هنقوله فكرة حلوة بس مش صح 👻👻👻

الفكرة اللي هنستعملها اسمها Cosine Similarity

ودي صورة توضح إزاي هنعملها

Image result for Cosine Similarity

فسر الماء بعد الجهد بالماء 😭😢😭😢

طبعا هنحتاج نشرح يعني التشابه بين متجهين رياضيين.

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

الفكرة دي هي اللي تم الاستقرار عليها وأثبتت نجاح كبير في الواقع العملي عن فكرة Mean Square Error

طيب يبقى هنطبق المعادلة اللطيفة 😂🤣😁 اللي في الرسمة الأولى وهي مفهومة لكل من درس Vector Calculus

البسط هو Dot Product بين المتجهين, أما المقام فهو حاصل ضرب Unit Vector لكلاهما

مرة أخرى هنطبق المعادلة دي لكل الكلمات ما عدا الثلاث كلمات اللي في معادلتنا مع المتجه الجديد اللي خرج من المعادلة

المفروض لو الدنيا ماشية صح و Dataset بتاعتك مظبوطة يطلع أقرب متجه هو كلمة “ملكة”

وكذلك الأمر بالنسبة للمعادلة دي مصر + القاهرة – السعودية = الرياض

هتجرب في الموضوع دا كتير وهتقابلك كذا مشكلة لازم تحلها, فيه Meme بيوضح الفكرة دي بشكل كوميدي

أول مشكلة هي مشكلة اللواحق القبلية والبعدية في الكلمات العربية زي:-

بمصر, فصر, كالسعودية, خليجنا, أهلنا, محبتكم, فإخلاصها …

الكلمات دي هتسبب لك إزعاج شديد وإنت بتجرب في بعض المعادلات

مثلا لو جربت الدرس السابق وحاولت تكتب معادلة زي كدا

مصر + القاهرة – الأردن = بالأردن

العاصمة “عمان” ربما تكون هو المتجه المتشابه الثاني أو الثالث أو الرابع في قاموس الكلمات

المشكلة الثانية هي مشكلة المذكر والمؤنث في اللغة العربية

لما هتكتب معادلات زي دي

قائم + قائمة – كاتب = لقائمة

برضه نفس المشكلة اللي فاتت كلمة “كاتبة” غالباً هي المتجه المتشابه الثاني أو الثالث ولكنها ليست الأولى بالطبع

طيب حلها إيه ؟ 🤔🤔🤔

قبل ما نتكلم في الحل, أحب أوضح إن دي مشكلة وعيب حقيقي في Word2Vec حتى بالنسبة للغة الانجليزية

جرب كدا على Bonus App اللي على موقع Radim Řehůřek اللي كتبته فوق, جرب كدا معادلات زي اللي تحت دي.

يعني معادلة على هذا النمط Man + Actor – Woman = Actress غالبا بتطلع نتايج مش مظبوطة في كثير من الأحيان

جرب كدا pure + purification – purge = purgation هتلاقي النتائج مش مظبوطة أوي

طيب مبدأيا هو حلها المباشر إنك تكبر Dataset والكلام دا جربوه فعلا في اللغة الانجليزية وأخونا رديم ريهورك استخدم واحدة فيها 100 billion words في Bonus App من على Google News

معني ذلك لو حاولنا نجربها على اللغة العربية يبقى إحنا داخلين في ثقب أسود 😯😦😧😮😲

طيب والحل الآخر ؟ 🤫🤫🤫

إنك تعمل Stemming أو Lemmatization للكلمات اللي هتخرج من المعادلة لحد لما تلاقي كلمة مجردة,

بس برضه ستظل مشكلة قائمة, لكن لا تحاول إنك تقضي عليها وإلا ربما تقع في مشكلة أخرى ألا وهي Overfitting 😈👿👹👺

مشكلة زي دي مش خطيرة أوي لأننا لما بنحب نستعمل Word-Embedding بنستعمله في ChatBot أو Document Summarization أو Topic Modeling أو Sentiment Analysis

من الآخر Word-Embedding ليس هو الغاية ولكنه وسيلة لشئ آخر مهم, لذلك سوف نغض الطرف مؤقتاً عن هذه المشكلة إلى أجل مسمى.

طيب نرجع للمعادلة الرئيسية بتاعتنا وخلينا نشوف إزاي هنطلع الإجابة منها, طبعا هي مكتبة Gensim وفرت لك شغل كتير ووقت كتير, بمجرد كتابة هذا السطر سيقوم تلقائيا بحساب Cosine Similarity وإعادة النتيجة النهائية لعرضها على المستخدم.

answer = model.wv.most_similar(
        positive=[woman, king],
        negative=[man],
        topn=5)

طيب إزاي نستعرض Vectors دي في رسم بياني ؟

سؤال وجيه فعلا !!!! مطلوب مننا 300 محور عشان نشوفها وهذا أمر خارج قدراتنا كبشر 😬😬😬😬😬

طيب هنعمل إيه يا بطل ؟ هنعمل Dimensionality Reduction عشان نخليها في محورين فقط X + Y

عندنا طريقتين لعمل الحكاية دي والفرق بينهم مش كبير t-SNE أو PCA

مكتبة Scikit-Learn بتقدم لنا هذه Algorithms بشكل جاهز

    words.append(man, king, woman, queen)

    X1 = {}
    for x in words:
        X1[x] = model.wv.vocab[x]
    X = array([model[x] for x in model.wv.vocab if x in words])

    pca = PCA(n_components=2)
    result = pca.fit_transform(X)
    # create a scatter plot of the projection
    plt.figure()
    plt.scatter(result[:, 0], result[:, 1])
    newwords = list(X1)
    for i, word in enumerate(newwords):
        word = arabic_reshaper.reshape(word)
        word = get_display(word)
        plt.annotate(word, xy=(result[i, 0], result[i, 1]))
        plt.savefig('AraVecDemo/static/' + str(randName) + '.png')
        image_url = str(randName) + '.png'

طبعا عشان إحنا مستخدمين Python Flask وهو Framework عشان Web Application فلذلك بنضطر نحفظ الصورة في ملف خارجي ويتم استدعاؤها في HTML أما لو عايز تشوفها على Jupyter Notebook أو Spyder يبقى هتضيف سطر

plt.show()

رائع جدا لحد دلوقتي, خلينا نشوف الفقرة التالية 🥳🥳🥳🥳🥳

الفقرة دي عبارة عن معادلة أعقد من السابق ولكن لا تقلق مكتبة Gensim هتقدم لك الحل السحري السريع 😎😎😎😎

المفروض إنك هتختار 4 كلمات مثلاً عبارة عن فواكه وكلمة خامسة لا تمت لهم بأي صلة مثل “كرة” أو “الكرم” أو “يذهب”

المفروض إن البرنامج يستطيع تمييز الكلمة الخامسة والتي لا تمت لهم بصلة بسهولة شديدة, طبعا برضه هي قائمة على فكرة Cosine Similarity وإنك هتجيب تباديل وتوافيق بين الكلمات دي وبعضها لحد لما نكتشف فين الكلمة البعيدة المعني عنهم, السطر التالي يقوم بهذا المهمة بكل سهولة

words = [apple, banana, peach, orange, football]
answer = model.doesnt_match(words)

برضه بعد لما نخلص المفروض نرسم الكلمات دي على الرسم البياني بنفس الطريقة السابقة عشان نشوفها ونحس بيها.

الفقرة الأخيرة معانا وهي أسهل فقرة في درسنا النهاردة 😃😃😃

هي فقرة إظهار الكلمات المتشابهة لكلمة معينة ورسمها على الرسم البياني, ولتكن كلمة مثل “مصر”

words = model.most_similar(Egypt, topn=20)

الخاتمة

في النهاية زي ما شفنا الأمر ليس بالصعوبة المتصورة كما يظن البعض عن تحويل النصوص العربية إلى Vectors مع وجود مكتبة Gensim الرائعة, لكن ننصح الشباب الجديد إنه يعرف إزاي Word-Embedding بيتم عمله من الصفر وهي مسألة معقدة وهي مهمة للمتخصصين في مجال NLP, أما اللي عايز يستخدم المكتبة مباشرة يقدر يجهز Dataset اللي يحبها سواء كانت من تويتر أو فيسبوك أو مواقع إخبارية وبعد كدا يقوم ببناء الموديل ببساطة.

طيب بعد لما حصلنا على الموديل إزاي نستغله عشان نفهم النصوص والجمل ؟

الموضوع دا كبير جدا وهنتكلم عنه في كذا سلسلة, أهم تطبيق بيستخدم Word-Embedding هو ChatBot عشان يقدر يفهم Intent الخاصة بالسؤال ومن ثم يقوم بالرد عليه, بشكل سريع جدا أبسط استعمال وتقدر تجربه حالاً جملة زي دي مثلا:-

أريد معرفة مصروف السيارة خلال الشهر الماضي ؟

قم بجمع هذه الـ Vectors مع بعضها البعض واقسم على عدد الكلمات في الجملة, هيطلع لك متجه جديد معبر إلى حد كبير جداً عن معني الجملة, هذا المتجه الجديد ممكن إنك تستعمل عليه Algorithms الخاصة بـ Machine Learning أو Deep Learning زي ما تحب.

لا تقلق في السلسلة القادمة هنتكلم عن ChatBot بشكل مبسط ومفهوم جدا ونحاول نبسط فكرة seq2seq للمستخدمين عشان يفهموها بالبلدي 😌😌😌😌

انتظرونا 😉

تعليقات