تضمين الكلمات وتحويل الكلمات إلى متجهات مع مثال
⚡ ملخص ذكي
تُحوّل تقنيتا تضمين الكلمات وWord2Vec النصوص إلى متجهات رقمية كثيفة، مما يُتيح لنماذج التعلّم الآلي التعرّف على الكلمات ذات المعاني المتشابهة. يشرح هذا المورد التقنية، وبنيتيها CBOW وSkip-Gram، ووظائف التنشيط، بالإضافة إلى تطبيق كامل باستخدام مكتبة Gensim للتطبيقات العملية.
ما هو تضمين الكلمات؟
كلمة التضمين Word2vec هو نوع من تمثيل الكلمات يسمح لخوارزميات التعلم الآلي بفهم الكلمات ذات المعاني المتشابهة. وهو أسلوب لنمذجة اللغة وتعلم الميزات لرسم الكلمات في متجهات من الأعداد الحقيقية باستخدام الشبكات العصبية أو النماذج الاحتمالية أو تقليل الأبعاد على مصفوفة التواجد المشترك للكلمات. من نماذج تضمين الكلمات Word2vec (Google) GloVe (ستانفورد) و fastText (فيسبوك).
يُطلق على تضمين الكلمات أيضًا اسم النموذج الدلالي الموزع، أو النموذج التمثيلي الموزع، أو فضاء المتجهات الدلالي، أو نموذج فضاء المتجهات. عند قراءة هذه الأسماء، ستصادف الكلمة دلالات الألفاظوهذا يعني تصنيف الكلمات المتشابهة معًا. على سبيل المثال، يجب وضع الفواكه مثل التفاح والمانجو والموز بالقرب من بعضها، بينما توضع الكتب بعيدًا عنها. وبمعنى أوسع، يُنشئ تضمين الكلمات متجهًا للفواكه موضوعًا بعيدًا عن تمثيل متجه الكتب.
أين يتم استخدام تضمين الكلمات؟
يُساعد تضمين الكلمات في توليد الميزات، وتجميع المستندات، وتصنيف النصوص، ومعالجة اللغة الطبيعية. دعونا نستعرض هذه التطبيقات ونناقش كلًا منها.
- حساب الكلمات المتشابهة: تُستخدم تقنية تضمين الكلمات لاقتراح كلمات مشابهة للكلمة التي تخضع لنموذج التنبؤ. بالإضافة إلى ذلك، تقترح هذه التقنية كلمات غير مشابهة، فضلاً عن الكلمات الأكثر شيوعاً.
- إنشاء مجموعة من الكلمات ذات الصلة: يُستخدم للمجموعات الدلاليةping، وهو ما يجمع الأشياء ذات الخصائص المتشابهة معًا ويدفع الأشياء غير المتشابهة بعيدًا.
- ميزة تصنيف النص: يُحوّل النص إلى مصفوفات من المتجهات تُغذّى بها النموذج للتدريب والتنبؤ. لا يمكن تدريب نماذج التصنيف النصية على السلاسل النصية، لذا يُحوّل هذا النموذج النص إلى صيغة قابلة للتدريب الآلي. كما تُسهم خصائص بناء الدلالات في تعزيز التصنيف النصي.
- تجميع المستندات: هذا تطبيق آخر يتم فيه استخدام تقنية تضمين الكلمات وتقنية Word2vec على نطاق واسع.
- معالجة اللغة الطبيعية: توجد العديد من التطبيقات التي يكون فيها تضمين الكلمات مفيدًا ويتفوق على ميزات أخرى.tracمراحل التحليل، مثل تحديد أجزاء الكلام، وتحليل المشاعر، والتحليل النحوي.
الآن وقد فهمت أين يتم تطبيق تضمين الكلمات، دعنا نلقي نظرة على النموذج الأكثر شيوعًا المستخدم لإنشاء هذه التضمينات.
ما هو Word2vec؟
Word2vec هي تقنية أو نموذج يُنتج تمثيلات للكلمات لتحسين تمثيلها. وهي طريقة لمعالجة اللغة الطبيعية تُجسّد عددًا كبيرًا من العلاقات النحوية والدلالية الدقيقة بين الكلمات. وهي عبارة عن شبكة عصبية ثنائية الطبقات بسيطة، قادرة على اكتشاف الكلمات المترادفة واقتراح كلمات إضافية للجمل غير المكتملة بعد تدريبها.
قبل المضي قدماً، يرجى الاطلاع على الفرق بين الشبكة العصبية السطحية والشبكة العصبية العميقة كما هو موضح في الرسم التخطيطي أدناه لمثال تضمين الكلمات:
تتكون الشبكة العصبية السطحية من طبقة مخفية واحدة فقط بين المدخلات والمخرجات، بينما تحتوي الشبكة العصبية العميقة على طبقات مخفية متعددة بين المدخلات والمخرجات. تُمرر المدخلات عبر العقد، بينما تحتوي الطبقة المخفية، وكذلك طبقة المخرجات، على الخلايا العصبية.

Word2vec عبارة عن شبكة ذات طبقتين حيث يوجد مدخل وطبقة مخفية واحدة ومخرج.
تم تطوير Word2vec بواسطة مجموعة من الباحثين بقيادة توماس ميكولوف في Google. يعتبر Word2vec أفضل وأكثر كفاءة من نموذج التحليل الدلالي الكامن.
لماذا Word2vec؟
تمثل تقنية Word2vec الكلمات في فضاء متجهي. تُعرض الكلمات على شكل متجهات، ويتم ترتيبها بحيث تظهر الكلمات المتشابهة في المعنى معًا، بينما تتباعد الكلمات المختلفة. يُعرف هذا أيضًا بالعلاقة الدلالية. لا تفهم الشبكات العصبية النصوص، بل تفهم الأرقام فقط. توفر تقنية Word Embedding طريقة لتحويل النص إلى متجه رقمي.
يُعيد Word2vec بناء السياق اللغوي للكلمات. قبل المضي قدمًا، دعونا نفهم ما هو السياق اللغوي. في الحالة العامة، عندما نتحدث أو نكتب للتواصل، يحاول الآخرون فهم مغزى الجملة. على سبيل المثال، "ما هي درجة حرارة الهند؟" هنا، السياق هو أن المستخدم يريد معرفة "درجة حرارة الهند". باختصار، الهدف الرئيسي من الجملة هو السياق. تساعد الكلمات أو الجمل المحيطة باللغة المنطوقة أو المكتوبة في تحديد معنى السياق. يتعلم Word2vec التمثيل المتجهي للكلمات من خلال هذه السياقات.
ما يفعله Word2vec؟
قبل تضمين الكلمات
من المهم معرفة الأسلوب المُستخدم قبل تقنية تضمين الكلمات، وما هي عيوبه، ثم سنرى كيف يتم التغلب على هذه العيوب باستخدام تقنية تضمين الكلمات عبر Word2vec. وأخيرًا، سنتناول آلية عمل Word2vec، لأن فهمها ضروري.
نهج للتحليل الدلالي الكامن
هذا هو الأسلوب المُستخدم قبل ظهور تمثيلات الكلمات. يعتمد على مفهوم "حقيبة الكلمات"، حيث تُمثَّل الكلمات على شكل متجهات مُشفَّرة. وهو تمثيل متجهي مُتفرق، حيث يساوي بُعده حجم المفردات. تُحتسب الكلمة إذا وردت في القاموس، وإلا فلا. لمزيد من المعلومات، يُرجى الاطلاع على البرنامج أدناه.
مثال Word2vec
from sklearn.feature_extraction.text import CountVectorizer vectorizer = CountVectorizer() data_corpus = ["guru99 is the best site for online tutorials. I love to visit guru99."] vocabulary = vectorizer.fit(data_corpus) X = vectorizer.transform(data_corpus) print(X.toarray()) print(vectorizer.get_feature_names_out())
الإخراج:
[[1 2 1 1 1 1 1 1 1 1]] [u'best', u'guru99', u'is', u'love', u'online', u'sitefor', u'the', u'to', u'tutorials', u'visit']
Code تفسير
- تُستخدم وحدة CountVectorizer لتخزين المفردات بناءً على ملاءمة الكلمات لها. يتم استيراد هذه الوحدة من مكتبة sklearn.
- اصنع الكائن باستخدام فئة CountVectorizer.
- اكتب البيانات في القائمة التي سيتم ملاءمتها في CountVectorizer.
- تم احتواء البيانات في الكائن الذي تم إنشاؤه من فئة CountVectorizer.
- استخدم أسلوب "حقيبة الكلمات" لحساب عدد الكلمات في البيانات باستخدام المفردات. إذا لم تكن الكلمة أو الرمز المميز موجودًا في المفردات، فسيتم تعيين موضع الفهرس الخاص به إلى الصفر.
- يتم تحويل المتغير x في السطر 5 إلى مصفوفة (وهي دالة متاحة لـ x). وهذا يوفر عدد مرات ظهور كل كلمة في الجملة أو القائمة المذكورة في السطر 3.
- يوضح هذا السمات التي تشكل جزءًا من المفردات عند تركيبها باستخدام البيانات الموجودة في السطر 4.
في منهج الدلالات الكامنة، يُمثل الصف الكلمات الفريدة، بينما يُمثل العمود عدد مرات ظهور تلك الكلمة في المستند. وهو تمثيل للكلمات على شكل مصفوفة مستند. يُستخدم مقياس تردد المصطلح - تردد المستند العكسي (TF-IDF) لحساب تردد الكلمات في المستند، وهو تردد المصطلح في المستند مقسومًا على تردد المصطلح في المجموعة النصية بأكملها.
قصور طريقة حقيبة الكلمات
- يتجاهل ترتيب الكلمة؛ على سبيل المثال، هذا سيء = هذا سيء للغاية.
- يتجاهل هذا الأسلوب سياق الكلمات. لنفترض أننا كتبنا الجملة التالية: "كان يحب الكتب. أفضل ما يُكتسب من التعليم هو الكتب". سينتج عن ذلك متجهان: أحدهما لعبارة "كان يحب الكتب" والآخر لعبارة "أفضل ما يُكتسب من التعليم هو الكتب". سيتعامل مع كليهما على أنهما متعامدان، مما يجعلهما مستقلين، لكنهما في الواقع مرتبطان ببعضهما.
للتغلب على هذه القيود، تم تطوير تقنية تضمين الكلمات، و Word2vec هي إحدى الطرق المستخدمة لتنفيذها.
كيف يعمل Word2vec؟
يتعلم Word2vec الكلمة من خلال التنبؤ بسياقها المحيط. على سبيل المثال، لنأخذ كلمة "هو". يحب كرة القدم."
نريد حساب Word2vec للكلمة: يحب.
افترض:
loves = Vin. P(Vout / Vin) is calculated where, Vin is the input word. P is the probability of likelihood. Vout is the output word.
الكلمة يحب يتنقل البرنامج بين كل كلمة في المدونة. ويتم ترميز العلاقات النحوية والدلالية بين الكلمات. وهذا يساعد في إيجاد الكلمات المتشابهة والمتماثلة.
جميع الميزات العشوائية للكلمة يحب يتم حسابها. يتم تغيير هذه الميزات أو تحديثها فيما يتعلق بالكلمات المجاورة أو كلمات السياق بمساعدة التكاثر الخلفي الأسلوب.
هناك طريقة أخرى للتعلم وهي أنه إذا كانت سياقات كلمتين متشابهة، أو إذا كانت لكلمتين سمات متشابهة، فإن هذه الكلمات تكون مرتبطة.
Word2vec Architecture
هناك نوعان من الهندسة المعمارية المستخدمة بواسطة Word2vec:
- حقيبة الكلمات المستمرة (CBOW)
- تخطي غرام
قبل المضي قدمًا، دعونا نناقش أهمية هذه البنى أو النماذج من منظور تمثيل الكلمات. يُعدّ تعلّم تمثيل الكلمات في جوهره عملية غير مُشرفة، ولكن هناك حاجة إلى بيانات مُستهدفة/تصنيفات لتدريب النموذج. يقوم كل من Skip-gram وCBOW بتحويل التمثيل غير المُشرف إلى شكل مُشرف لتدريب النموذج.
في CBOW، يتم التنبؤ بالكلمة الحالية باستخدام نافذة نوافذ السياق المحيطة. على سبيل المثال، إذا كانت الكلمة الحاليةI-1، ثI-2، ثأنا + 1، ثأنا + 2 يتم إعطاء الكلمات أو السياق، وهذا النموذج سوف يوفر ثi.
يؤدي نموذج Skip-Gram وظيفة معاكسة لنموذج CBOW، مما يعني أنه يتنبأ بالتسلسل أو السياق المُعطى من الكلمة. يمكنك عكس المثال لفهمه. إذا كان wi إذا تم تحديد السياق، فسوف يتنبأ هذا بالسياق، أو wI-1، ثI-2، ثأنا + 1، ثأنا + 2.
يُتيح Word2vec خيارًا للاختيار بين CBOW (حقيبة الكلمات المتصلة) و skip-gram. تُحدد هذه المعلمات أثناء تدريب النموذج. كما يُمكن استخدام أسلوب أخذ العينات السلبية أو طبقة softmax الهرمية.
حقيبة الكلمات المستمرة
دعونا نرسم مخططًا بسيطًا لمثال Word2vec لفهم بنية حقيبة الكلمات المستمرة.
دعونا نحسب المعادلات رياضيا. لنفترض أن V هو حجم المفردات وN هو حجم الطبقة المخفية. يتم تعريف الإدخال كـ {xI-1، XI-2، Xأنا + 1، Xأنا + 2 نحصل على مصفوفة الأوزان بضرب V * N. ونحصل على مصفوفة أخرى بضرب متجه الإدخال في مصفوفة الأوزان. ويمكن فهم ذلك أيضًا من خلال المعادلة التالية.
h = xitW
حيث الحادي عشرt و W هما متجه الإدخال ومصفوفة الأوزان على التوالي.
لحساب التطابق بين السياق والكلمة التالية، يرجى الرجوع إلى المعادلة أدناه.
u = التمثيل المتوقع * h
حيث يتم الحصول على التمثيل المتوقع من النموذج في المعادلة أعلاه.
نموذج تخطي جرام
تُستخدم طريقة Skip-Gram للتنبؤ بجملة بناءً على كلمة مُدخلة. لفهمها بشكل أفضل، دعونا نرسم المخطط الموضح في مثال Word2vec أدناه.
يمكن اعتبار هذا النموذج عكس نموذج "حقيبة الكلمات المتصلة"، حيث تكون الكلمة هي المدخل، بينما يوفر النموذج السياق أو التسلسل. نستنتج أيضًا أن الهدف يُغذى إلى المدخل، وتُكرر طبقة الإخراج عدة مرات لاستيعاب عدد كلمات السياق المُختار. يُجمع متجه الخطأ من جميع طبقات الإخراج لضبط الأوزان باستخدام طريقة الانتشار العكسي.
أي نموذج تختار؟
يُعدّ نموذج CBOW أسرع بعدة مرات من نموذج skip-gram، ويُوفّر ترددًا أفضل للكلمات الشائعة، بينما يحتاج نموذج skip-gram إلى كمية قليلة من بيانات التدريب، ويُمثّل حتى الكلمات أو العبارات النادرة. يُقارن الجدول أدناه بين النموذجين بإيجاز.
| البعد | CBOW | تخطي غرام |
|---|---|---|
| تنبؤ | يتنبأ بالكلمة المستهدفة من السياق | يتنبأ بالسياق من الكلمة المستهدفة |
| سرعة التدريب | أسرع | أبطأ |
| كثرة الكلمات | دقة أعلى | دقة أقل |
| كلمات نادرة | تمثيل أضعف | تمثيل أقوى |
| بيانات التدريب | يحتاج إلى مزيد من البيانات | يعمل ببيانات أقل |
العلاقة بين Word2vec وNLTK
نلتك هو الطبيعي Language Toolتُستخدم هذه الأداة لمعالجة النصوص مسبقًا، حيث تُمكّن المستخدم من إجراء عمليات متنوعة مثل تحديد أجزاء الكلام، والتحليل الصرفي، والتجذير، وإزالة الكلمات الشائعة، وحذف الكلمات النادرة أو الأقل استخدامًا. تُساعد هذه الأداة في تنظيف النص واستخلاص الميزات من الكلمات الفعّالة. من جهة أخرى، يُستخدم Word2vec للمطابقة الدلالية (ربط العناصر المترابطة) والنحوية (التسلسل). باستخدام Word2vec، يُمكن إيجاد الكلمات المتشابهة والمختلفة، وتقليل الأبعاد، وغيرها الكثير. ومن الميزات المهمة الأخرى لـ Word2vec تحويل التمثيل عالي الأبعاد للنص إلى متجهات منخفضة الأبعاد.
أين يمكن استخدام NLTK وWord2vec؟
إذا كان على المرء إنجاز بعض المهام العامة كما ذكر أعلاه، مثل تجزئة الكلمات، ووضع علامات أجزاء الكلام، والتحليل النحوي، فيجب عليه استخدام NLTK، بينما بالنسبة للتنبؤ بالكلمات وفقًا لسياق معين، أو نمذجة الموضوع، أو تشابه المستندات، فيجب عليه استخدام Word2vec.
العلاقة بين NLTK وWord2vec بمساعدة الكود
يمكن استخدام NLTK وWord2vec معًا لإيجاد تمثيلات متشابهة للكلمات أو مطابقة تركيبها النحوي. تتيح لك حزمة أدوات NLTK تحميل العديد من الحزم المرفقة مع NLTK، كما يمكنك إنشاء نموذج باستخدام Word2vec، ثم اختباره على كلمات حقيقية. لنستعرض الآن كيفية دمج هاتين الطريقتين في الكود التالي. قبل المتابعة، يُرجى الاطلاع على مجموعات النصوص التي توفرها NLTK. يمكنك تنزيلها باستخدام الأمر التالي:
nltk(nltk.download('all'))
يرجى الاطلاع على لقطة الشاشة للرمز.
import nltk import gensim from nltk.corpus import abc model = gensim.models.Word2Vec(abc.sents()) X = list(model.wv.vocab) data = model.most_similar('science') print(data)
الإخراج:
[('law', 0.9415997266769409), ('practice', 0.9276568293571472), ('discussion', 0.9259148836135864), ('agriculture', 0.9257254004478455), ('media', 0.9232194423675537), ('policy', 0.922248125076294), ('general', 0.9166069030761719), ('undertaking', 0.916458249092102), ('tight', 0.9129181504249573), ('board', 0.9107444286346436)]
شرح Code
- يتم استيراد مكتبة nltk، ومنها يمكنك تنزيل مجموعة abc التي سنستخدمها في الخطوة التالية.
- تم استيراد مكتبة Gensim. إذا لم تكن مكتبة Gensim Word2vec مثبتة، فيُرجى تثبيتها باستخدام الأمر "pip3 install gensim". انظر لقطة الشاشة أدناه.
- قم باستيراد مجموعة بيانات abc، والتي تم تنزيلها باستخدام nltk.download('abc').
- قم بتمرير الملفات إلى نموذج Word2vec، الذي يتم استيراده باستخدام Gensim، كجمل.
- يتم تخزين المفردات على شكل متغير.
- يتم اختبار النموذج على الكلمة النموذجية علم، لأن هذه الملفات مرتبطة بالعلوم.
- هنا، يتوقع النموذج وجود كلمة مشابهة هي "العلم".
المنشطات وWord2Vec
تُحدد دالة التنشيط للعصبون ناتج ذلك العصبون عند تلقيه مجموعة من المدخلات. وهي مستوحاة بيولوجيًا من نشاط الدماغ، حيث تُنشط عصبونات مختلفة باستخدام محفزات مختلفة. دعونا نفهم دالة التنشيط من خلال الرسم التوضيحي التالي.
هنا x1، x2، … x4 هي عقد الشبكة العصبية.
w1 و w2 و w3 هي أوزان العقد.
يعمل مجموع (Σ) جميع الأوزان وقيم العقد كدالة تنشيط.
لماذا وظيفة التنشيط؟
إذا لم تُستخدم دالة تنشيط، فسيكون الناتج خطيًا، لكن وظائف الدالة الخطية محدودة. لتحقيق وظائف معقدة مثل اكتشاف الكائنات، وتصنيف الصور، و...ping عند استخدام الصوت في معالجة النصوص، والعديد من المخرجات غير الخطية الأخرى، يلزم وجود دالة تنشيط.
كيف يتم حساب طبقة التنشيط في تضمين الكلمات (Word2vec)
طبقة Softmax (الدالة الأسية المعيارية) هي دالة طبقة الإخراج التي تُفعّل أو تُشغّل كل عقدة. وهناك نهج آخر مُستخدم وهو Softmax الهرمي، حيث تُحسب التعقيدية بواسطة O(log2في حين أن التعقيد في دالة softmax هو O(V)، حيث V هو حجم المفردات. ويكمن الفرق بينهما في تقليل التعقيد في طبقة softmax الهرمية. لفهم آلية عملها، يُرجى الاطلاع على مثال تضمين الكلمات أدناه:
لنفترض أننا نريد حساب احتمالية ملاحظة الكلمة حب في سياق معين، ينتقل التدفق من الجذر إلى العقدة الطرفية أولاً إلى العقدة 2 ثم إلى العقدة 5. لذا، إذا كان حجم المفردات 8، فسنحتاج إلى ثلاث عمليات حسابية فقط. وهذا يسمح بتقسيم حساب احتمالية كلمة واحدة (حب).
ما هي الخيارات الأخرى المتاحة غير Hierarchical Softmax؟
بشكل عام، خيارات تضمين الكلمات المتاحة هي: Softmax التفاضلي، وCNN-Softmax، وأخذ العينات المهمة، وأخذ العينات المهمة التكيفية، وتقدير التباين الضوضائي، وأخذ العينات السلبية، والتطبيع الذاتي، والتطبيع غير المتكرر.
وبالحديث تحديداً عن Word2vec، لدينا أخذ عينات سلبية متاح.
أخذ العينات السلبية هو أسلوب لأخذ عينات من بيانات التدريب. وهو يشبه إلى حد ما أسلوب التدرج العشوائي، ولكن مع بعض الاختلافات. إذ يبحث أخذ العينات السلبية فقط عن أمثلة تدريب سلبية. ويعتمد على تقدير التباين الضوضائي، حيث يأخذ عينات عشوائية من الكلمات غير الموجودة في السياق. وهو أسلوب تدريب سريع، ويختار السياق عشوائيًا. إذا ظهرت الكلمة المتوقعة في السياق المختار عشوائيًا، فإن كلا المتجهين يكونان متقاربين.
ما الاستنتاج الذي يمكن استخلاصه؟
تُفعّل المُنشّطات الخلايا العصبية تمامًا كما تُفعّل خلايانا العصبية عند استخدام مُحفزات خارجية. تُعدّ طبقة Softmax إحدى وظائف طبقة الإخراج التي تُفعّل الخلايا العصبية في حالة تضمين الكلمات. في Word2vec، لدينا خيارات مثل Softmax الهرمي وأخذ العينات السلبية. باستخدام المُنشّطات، يُمكن تحويل دالة خطية إلى دالة غير خطية، كما يُمكن تطبيق خوارزمية تعلّم آلي مُعقدة باستخدام هذه الدوال.
ما هو جينسيم؟
جينسيم عبارة عن مجموعة أدوات مفتوحة المصدر لنمذجة المواضيع ومعالجة اللغة الطبيعية والتي يتم تنفيذها في Python وCython. تتيح مجموعة أدوات Gensim للمستخدمين استيراد Word2vec لنمذجة المواضيع واكتشاف البنية الخفية في متن النص. لا توفر Gensim تطبيقًا لـ Word2vec فحسب، بل توفر أيضًا Doc2vec وFastText.
يركز هذا القسم على Word2vec، لذلك سنلتزم بالموضوع الحالي.
كيفية تنفيذ Word2vec باستخدام Gensim
حتى الآن، ناقشنا ماهية Word2vec، وبنيتها المختلفة، وسبب التحول من استخدام الكلمات إلى Word2vec، والعلاقة بين Word2vec وNLTK مع التعليمات البرمجية الحية، ووظائف التنشيط.
فيما يلي الطريقة خطوة بخطوة لتطبيق Word2vec باستخدام Gensim:
الخطوة 1) جمع البيانات
الخطوة الأولى لتطبيق أي نموذج للتعلم الآلي أو تطبيق معالجة اللغة الطبيعية هي جمع البيانات.
يرجى ملاحظة البيانات لبناء روبوت محادثة ذكي كما هو موضح في مثال Gensim Word2vec أدناه.
[{"tag": "welcome",
"patterns": ["Hi", "How are you", "Is any one to talk?", "Hello", "hi are you available"],
"responses": ["Hello, thanks for contacting us", "Good to see you here", "Hi there, how may I assist you?"]
},
{"tag": "goodbye",
"patterns": ["Bye", "See you later", "Goodbye", "I will come back soon"],
"responses": ["See you later, thanks for visiting", "have a great day ahead", "Wish you Come back again soon."]
},
{"tag": "thankful",
"patterns": ["Thanks for helping me", "Thank your guidance", "That's helpful and kind from you"],
"responses": ["Happy to help!", "Any time!", "My pleasure", "It is my duty to help you"]
},
{"tag": "hoursopening",
"patterns": ["What hours are you open?", "Tell your opening time?", "When are you open?", "Just your timing please"],
"responses": ["We're open every day 8am-7pm", "Our office hours are 8am-7pm every day", "We open office at 8 am and close at 7 pm"]
},
{"tag": "payments",
"patterns": ["Can I pay using credit card?", "Can I pay using Mastercard?", "Can I pay using cash only?"],
"responses": ["We accept VISA, Mastercard and credit card", "We accept credit card, debit cards and cash. Please don't worry"]
}
]
إليكم ما فهمناه من البيانات:
- تحتوي هذه البيانات على ثلاثة عناصر: الوسم، والنمط، والاستجابات. الوسم هو الغرض (ما هو موضوع النقاش).
- البيانات بتنسيق JSON.
- النمط هو سؤال يطرحه المستخدمون على الروبوت.
- الاستجابات هي الإجابات التي سيقدمها برنامج الدردشة الآلي للسؤال/النمط المقابل.
الخطوة 2) المعالجة المسبقة للبيانات
من المهم جدًا معالجة البيانات الأولية. إذا تم تغذية البيانات المنظفة إلى الجهاز، فسوف يستجيب النموذج بشكل أكثر دقة وسيتعلم البيانات بشكل أكثر كفاءة.
تتضمن هذه الخطوة إزالة الكلمات الشائعة، وتجذير الكلمات، وإزالة الكلمات غير الضرورية، وما إلى ذلك. قبل المتابعة، من المهم تحميل البيانات وتحويلها إلى إطار بيانات. يرجى الاطلاع على الكود أدناه لهذا الغرض.
import json json_file = 'intents.json' with open('intents.json', 'r') as f: data = json.load(f)
شرح Code:
- بما أن البيانات بتنسيق JSON، يتم استيرادها بتنسيق JSON.
- يتم تخزين الملف في المتغير.
- يتم فتح الملف وتحميله في متغير البيانات.
تم الآن استيراد البيانات، وحان وقت تحويلها إلى إطار بيانات. يرجى الاطلاع على الكود أدناه للخطوة التالية.
import pandas as pd df = pd.DataFrame(data) df['patterns'] = df['patterns'].apply(', '.join)
شرح Code:
1. يتم تحويل البيانات إلى إطار بيانات باستخدام مكتبة pandas، والتي تم استيرادها أعلاه.
2. يقوم بتحويل القائمة الموجودة في أنماط الأعمدة إلى سلسلة نصية.
from nltk.corpus import stopwords from textblob import Word stop = stopwords.words('english') df['patterns'] = df['patterns'].apply(lambda x: ' '.join(x.lower() for x in x.split())) df['patterns'] = df['patterns'].apply(lambda x: ' '.join(x for x in x.split() if x not in string.punctuation)) df['patterns'] = df['patterns'].str.replace('[^\w\s]', '') df['patterns'] = df['patterns'].apply(lambda x: ' '.join(x for x in x.split() if not x.isdigit())) df['patterns'] = df['patterns'].apply(lambda x: ' '.join(x for x in x.split() if x not in stop)) df['patterns'] = df['patterns'].apply(lambda x: " ".join([Word(word).lemmatize() for word in x.split()]))
Code التفسير:
1. يتم استيراد الكلمات الإنجليزية الموقوفة باستخدام وحدة الكلمات الموقوفة من مجموعة أدوات nltk.
2. يتم تحويل جميع كلمات النص إلى أحرف صغيرة باستخدام شرط حلقة التكرار ودالة لامدا. وظيفة لامدا هي وظيفة مجهولة.
3. يتم فحص جميع صفوف النص في إطار البيانات بحثًا عن علامات الترقيم، ويتم تصفية هذه الصفوف.
4. تتم إزالة الأحرف مثل الأرقام أو النقاط باستخدام تعبير نمطي.
5. Digiتتم إزالة نهاية الخبر من النص.
6. تتم إزالة كلمات التوقف في هذه المرحلة.
7. يتم الآن تصفية الكلمات، وإزالة الأشكال المختلفة للكلمة نفسها باستخدام عملية التجريد. وبهذا نكون قد انتهينا من معالجة البيانات الأولية.
الإخراج:
, patterns, responses, tag 0,hi one talk hello hi available,"['Hello, thanks for contacting us', 'Good to see you here', ' Hi there, how may I assist you?']",welcome 1,bye see later goodbye come back soon,"['See you later, thanks for visiting', 'have a great day ahead', 'Wish you Come back again soon.']",goodbye 2,thanks helping thank guidance thats helpful kind,"['Happy to help!', 'Any time!', 'My pleasure', 'It is my duty to help you']",thankful 3,hour open tell opening time open timing please,"[""We're open every day 8am-7pm"", 'Our office hours are 8am-7pm every day', 'We open office at 8 am and close at 7 pm']",hoursopening 4,pay using credit card pay using mastercard pay using cash,"['We accept VISA, Mastercard and credit card', 'We accept credit card, debit cards and cash. Please dont worry']",payments
الخطوة 3) بناء الشبكة العصبية باستخدام Word2vec
حان الآن وقت بناء نموذج باستخدام وحدة Word2vec من مكتبة Gensim. علينا استيراد Word2vec من Gensim. لنقم بذلك، ثم سنبني النموذج، وفي المرحلة النهائية سنختبره على بيانات حقيقية.
from gensim.models import Word2Vec
الآن، يمكننا بنجاح بناء النموذج باستخدام Word2Vec. يُرجى الرجوع إلى سطر الكود التالي لمعرفة كيفية إنشاء النموذج باستخدام Word2Vec. يتم تزويد النموذج بالنص على شكل قائمة، لذا سنقوم بتحويل النص من إطار البيانات إلى قائمة باستخدام الكود أدناه.
Bigger_list = [] for i in df['patterns']: li = list(i.split("")) Bigger_list.append(li) Model = Word2Vec(Bigger_list, min_count=1, size=300, workers=4)
شرح Code:
1. تم إنشاء قائمة أكبر حيث يتم إلحاق القائمة الداخلية. هذا هو التنسيق الذي يتم إدخاله إلى نموذج Word2Vec.
2. يتم تنفيذ حلقة تكرارية، ويتم تكرار كل إدخال من عمود الأنماط في إطار البيانات.
3. يتم تقسيم كل عنصر من عناصر أنماط الأعمدة وتخزينه في القائمة الداخلية li.
4. يتم إلحاق القائمة الداخلية بالقائمة الخارجية.
5. تُقدَّم هذه القائمة إلى نموذج Word2Vec. دعونا نفهم بعض المعلمات الواردة هنا.
الحد الأدنى_للعدد: يتجاهل البرنامج جميع الكلمات التي يقل ترددها الإجمالي عن هذا الحد.
المقاس : إنه يحكي أبعاد ناقلات الكلمة.
عمال: هذه هي الخيوط المستخدمة لتدريب النموذج.
هناك أيضًا خيارات أخرى متاحة، وسيتم شرح بعض الخيارات المهمة أدناه.
نافذة: الحد الأقصى للمسافة بين الكلمة الحالية والمتوقعة داخل الجملة.
سان جرمان: إنها خوارزمية تدريب: 1 لنموذج skip-gram و0 لنموذج Continuous Bag of Words. وقد ناقشنا هذه النماذج بالتفصيل أعلاه.
النظام المنسق: إذا كانت هذه القيمة 1، فإننا نستخدم softmax الهرمي للتدريب، وإذا كانت 0، فسيتم استخدام أخذ العينات السلبية.
ألفا: معدل التعلم الأولي.
دعونا نعرض الكود النهائي أدناه:
# list of libraries used by the code import string from gensim.models import Word2Vec import logging from nltk.corpus import stopwords from textblob import Word import json import pandas as pd # data in json format json_file = 'intents.json' with open('intents.json', 'r') as f: data = json.load(f) # displaying the list of stopwords stop = stopwords.words('english') # dataframe df = pd.DataFrame(data) df['patterns'] = df['patterns'].apply(', '.join) # cleaning the data using the NLP approach print(df) df['patterns'] = df['patterns'].apply(lambda x: ' '.join(x.lower() for x in x.split())) df['patterns'] = df['patterns'].apply(lambda x: ' '.join(x for x in x.split() if x not in string.punctuation)) df['patterns'] = df['patterns'].str.replace('[^\w\s]', '') df['patterns'] = df['patterns'].apply(lambda x: ' '.join(x for x in x.split() if not x.isdigit())) df['patterns'] = df['patterns'].apply(lambda x: ' '.join(x for x in x.split() if x not in stop)) df['patterns'] = df['patterns'].apply(lambda x: " ".join([Word(word).lemmatize() for word in x.split()])) # taking the outer list bigger_list = [] for i in df['patterns']: li = list(i.split(" ")) bigger_list.append(li) # structure of data to be taken by the model.word2vec print("Data format for the overall list:", bigger_list) # custom data is fed to machine for further processing model = Word2Vec(bigger_list, min_count=1, size=300, workers=4)
الخطوة 4) حفظ النموذج
يمكن حفظ النموذج بصيغة ملف ثنائي (bin) وملف نموذج (model). الملف الثنائي (bin) هو صيغة البيانات الثنائية. يرجى الاطلاع على الأسطر التالية لحفظ النموذج.
model.save("word2vec.model") model.save("model.bin")
شرح الكود أعلاه
1. يتم حفظ النموذج في شكل ملف .model.
2. يتم حفظ النموذج في شكل ملف .bin.
سنستخدم هذا النموذج لإجراء اختبارات في الوقت الفعلي مثل الكلمات المتشابهة والكلمات غير المتشابهة والكلمات الأكثر شيوعًا.
الخطوة 5) تحميل النموذج وإجراء الاختبار في الوقت الحقيقي
يتم تحميل النموذج باستخدام الكود التالي:
model = Word2Vec.load('model.bin')
إذا كنت ترغب في طباعة المفردات منه، فيمكنك القيام بذلك باستخدام الأمر التالي:
vocab = list(model.wv.vocab)
يرجى الاطلاع على النتيجة:
['see', 'thank', 'back', 'thanks', 'soon', 'open', 'mastercard', 'card', 'time', 'pay', 'talk', 'cash', 'one', 'please', 'goodbye', 'thats', 'helpful', 'hour', 'credit', 'hi', 'later', 'guidance', 'opening', 'timing', 'hello', 'helping', 'bye', 'tell', 'come', 'using', 'kind', 'available']
الخطوة 6) فحص معظم الكلمات المشابهة
فلننفذ الأمور عمليا:
similar_words = model.most_similar('thanks') print(similar_words)
يرجى الاطلاع على النتيجة:
[('kind', 0.16104359924793243), ('using', 0.1352398842573166), ('come', 0.11500970274209976), ('later', 0.09989878535270691), ('helping', 0.04855936020612717), ('credit', 0.04659383371472359), ('pay', 0.0329081267118454), ('thank', 0.02484947443008423), ('hour', 0.0202352125197649), ('opening', 0.018177658319473267)]
الخطوة 7) لا يطابق كلمة من الكلمات المقدمة
dissimlar_words = model.doesnt_match('See you later, thanks for visiting'.split()) print(dissimlar_words)
لقد زودنا الكلمات أراك لاحقاً، شكراً لزيارتك.هذا يطبع الكلمة الأكثر اختلافًا عن هذه الكلمات. لنقم بتشغيل هذا الكود ونرى النتيجة.
النتيجة بعد تنفيذ الكود أعلاه:
Thanks
الخطوة 8) إيجاد التشابه بين كلمتين
يوضح هذا النتيجة من حيث احتمالية التشابه بين كلمتين. يرجى الاطلاع على الكود أدناه لمعرفة كيفية تنفيذ هذا الجزء.
similarity_two_words = model.similarity('please', 'see') print("Please provide the similarity between these two words:") print(similarity_two_words)
نتيجة الكود أعلاه هي كما يلي:
0.13706
يمكنك العثور على كلمات مشابهة أخرى عن طريق تنفيذ الكود التالي:
similar = model.similar_by_word('kind') print(similar)
إخراج الكود أعلاه:
[('credit', 0.11764447391033173), ('cash', 0.11440904438495636), ('one', 0.11151769757270813), ('hour', 0.0944807156920433), ('using', 0.0705675333738327), ('thats', 0.05206916481256485), ('later', 0.04502468928694725), ('bye', 0.03960943967103958), ('back', 0.03837274760007858), ('thank', 0.0380823090672493)]



