TensorFlow.js: إعادة تدريب نموذج رصد التعليقات غير المرغوب فيها للتعامل مع الحالات الحدّية

1. قبل البدء

صُمِّم هذا الدرس التطبيقي حول الترميز استنادًا إلى النتيجة النهائية للدرس التطبيقي السابق حول الترميز في هذه السلسلة لرصد التعليقات غير المرغوب فيها باستخدام TensorFlow.js.

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

في ما يلي النتيجة النهائية للدرس التطبيقي حول الترميز:

a4511e5d445706b1.gif

بينما عمل ذلك بشكل جيد للغاية، هناك حالات هامشية لاستكشافها لم تتمكن من اكتشافها. يمكنك إعادة تدريب النموذج لمراعاة المواقف التي تعذّر عليه التعامل معها.

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

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

المتطلبات الأساسية

  • أكملت أول تمرين تطبيقي حول الترميز في هذه السلسلة.
  • المعرفة الأساسية بتقنيات الويب بما في ذلك HTML وCSS وJavaScript.

ما الذي ستنشئه

سيكون عليك إعادة استخدام الموقع الإلكتروني الذي سبق إنشاؤه لإنشاء مدونة فيديو وهمية مع قسم تعليقات في الوقت الفعلي، ثم ترقية الموقع الإلكتروني لتحميل نسخة مدرَّبة مخصّصة من نموذج رصد المحتوى غير المرغوب فيه باستخدام TensorFlow.js، ما يحسّن أداءه في الحالات الحدّية التي كان يتعذّر عليه تشغيله في السابق. وبالطبع، يمكنك تغيير تجربة المستخدم الافتراضية هذه لإعادة استخدامها على أي موقع إلكتروني تعمل عليه في مهامك اليومية وتعديل الحل لتناسب أي حالة من حالات استخدام العميل، وقد تكون مثلاً مدونة أو منتدى أو شكلاً من أشكال نظام إدارة المحتوى (CMS)، مثل Drupal.

لنبدأ الاختراق...

المعلومات التي ستطّلع عليها

وسوف تقوم بما يلي:

  • تحديد الحالات الهامشية التي فشل فيها النموذج المدرَّب مسبقًا
  • إعادة تدريب نموذج تصنيف الرسائل غير المرغوب فيها الذي تم إنشاؤه باستخدام مصمم النماذج.
  • صدِّر هذا النموذج المستند إلى بايثون إلى تنسيق TensorFlow.js لاستخدامه في المتصفحات.
  • عدِّل النموذج المستضاف والقاموس الخاص به باستخدام النموذج المدرَّب حديثًا واطّلِع على النتائج

يفترض أن تكون الإلمام بتطبيقات HTML5 وCSS وJavaScript في هذا التمرين المعملي. بإمكانك أيضًا تشغيل بعض رموز Python من خلال "co lab" لإعادة تدريب النموذج الذي تم إنشاؤه باستخدام مصمم النماذج، ولكن لا يلزم الإلمام بلغة بايثون للقيام بذلك.

2. إعداد الرمز

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

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

3- اكتشف الحالات الهامشية في الحل السابق

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

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

التعليقات المشروعة التي تم نشرها بدون مشاكل (سلبية صحيحة):

  1. "رائع، أحب هذا الفيديو، إنه عمل رائع". احتمالية وجود محتوى غير مرغوب فيه: 47.91854%
  2. "أحببت هذه العروض التوضيحية تمامًا. هل لديك المزيد من التفاصيل؟" احتمالية وجود محتوى غير مرغوب فيه: 47.15898%
  3. "ما الموقع الإلكتروني الذي يمكنني الانتقال إليه للاطّلاع على مزيد من المعلومات؟" احتمالية وجود محتوى غير مرغوب فيه: 15.32495%

هذا أمر رائع، إنّ الاحتمالات لكل ما سبق منخفضة جدًا، ما يجعلها ناجحة من خلال SPAM_THRESHOLD التلقائية بنسبة% 75 كحد أدنى قبل اتخاذ الإجراء (المحدّدة في رمز script.js من الدرس التطبيقي السابق حول الترميز).

دعونا الآن نحاول كتابة بعض التعليقات الجريئة التي يتم وضع علامة عليها كمحتوى غير مرغوب فيه على الرغم من أنها ليست...

التعليقات المشروعة التي تم وضع علامة عليها كغير مرغوب فيها (النتائج الموجبة الخاطئة):

  1. "هل يمكن لأحد المستخدمين ربط الموقع الإلكتروني للقناع الذي يرتديه؟" احتمالية وجود محتوى غير مرغوب فيه: 98.46466%
  2. "هل يمكنني شراء هذه الأغنية على Spotify؟ أرجو إبلاغي بأي شخص". احتمالية وجود محتوى غير مرغوب فيه: 94.40953%
  3. "هل يمكن لأي شخص التواصل معي وتزويدي بالتفاصيل حول كيفية تنزيل TensorFlow.js؟" احتمالية وجود محتوى غير مرغوب فيه: 83.20084%

يا للهول! يبدو أنّه يتم وضع علامة "محتوى غير مرغوب فيه" على هذه التعليقات الصالحة في حال السماح بذلك. كيف يمكنك حلّ هذه المشكلة؟

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

التعليقات غير المرغوب فيها التي تم وضع علامة عليها كمحتوى غير مرغوب فيه (إيجابيات صحيحة):

  1. "هذا رائع، ولكن ننصحك بالتحقّق من روابط التنزيل المتوفّرة على موقعي الإلكتروني والتي تكون أفضل". احتمالية وجود محتوى غير مرغوب فيه: 99.77873%
  2. "أعرف بعض الأشخاص الذين يمكنهم إعطائك بعض الأدوية فقط، يمكنهم فقط الاطّلاع على ملفي الشخصي للحصول على التفاصيل" احتمالية وجود محتوى غير مرغوب فيه: 98.46955%
  3. "يمكنك الاطّلاع على ملفي الشخصي لتنزيل المزيد من الفيديوهات الرائعة التي تصلنا إلى ما هو أفضل. http://example.com" احتمالية وجود محتوى غير مرغوب فيه: 96.26383%

حسنًا، تعمل هذه الميزة على النحو المتوقّع مع الحدّ الأدنى الأصلي الذي يبلغ% 75، ولكن بما أنّك غيّرت في الخطوة السابقة SPAM_THRESHOLD لتصبح واثقة بنسبة أكثر من% 98.5، يعني ذلك أنّه سنسمح بمثالَين هنا، لذلك قد يكون الحدّ الأدنى مرتفعًا جدًا. هل نسبة 96% هي الأفضل؟ ولكن إذا فعلت ذلك، فسيتم وضع علامة على أحد التعليقات في القسم السابق (النتائج الموجبة الخاطئة) تشير إلى كونها غير مرغوب فيها إذا كانت شرعية، حيث تم تقييمها بنسبة 98.46466%.

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

لنواصل...

التعليقات غير المرغوب فيها التي تم السماح بنشرها (التعليقات السلبية الخاطئة):

  1. "الاطّلاع على ملفي الشخصي لتنزيل المزيد من الفيديوهات الرائعة التي تتحسّن أيضًا" احتمالية وجود محتوى غير مرغوب فيه: 7.54926%
  2. "احصل على خصم على دروس التدريب في الصالة الرياضية، اطّلِع على ملف pr0file!" احتمالية وجود محتوى غير مرغوب فيه: 17.49849%
  3. "ارتفعت أسعار سهم GOOG بشكلٍ فوري. عليك الانتظار قبل فوات الأوان". احتمالية وجود محتوى غير مرغوب فيه: 20.42894%

بالنسبة إلى هذه التعليقات، ليس عليك اتخاذ أي إجراء من خلال تغيير قيمة SPAM_THRESHOLD بشكل أكبر. سيؤدي خفض الحدّ المسموح به من المحتوى غير المرغوب فيه من% 96 إلى% 9 تقريبًا إلى وضع علامة على التعليقات الحقيقية كغير مرغوب فيها، علمًا أنّ أحد هذه التعليقات حصل على تقييم% 58، مع أنّ المحتوى صحيح. والطريقة الوحيدة للتعامل مع مثل هذه التعليقات هي إعادة تدريب النموذج الذي يشتمل على مثل هذه الحالات الهامشية في بيانات التدريب حتى يتعلم كيفية تعديل وجهة نظره للعالم من أجل ما هو غير مرغوب فيه أو غير مرغوب فيه.

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

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

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

4. إعادة ضبط نموذج رصد التعليقات غير المرغوب فيها

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

ملخّص النموذج المعدّ مسبقًا

كان النموذج المعدّ مسبقًا الذي استخدمته نموذجًا من إنشاء جهة خارجية عبر مصمم النماذج الذي يستخدم "تضمين كلمات متوسط". عمل نموذجي.

بما أنّ النموذج قد تم إنشاؤه باستخدام "مصمم النماذج"، ستحتاج إلى التبديل لفترة وجيزة إلى Python لإعادة تدريب النموذج، ثم تصدير النموذج الذي تمّ إنشاؤه إلى تنسيق TensorFlow.js لتتمكّن من استخدامه في المتصفّح. لحسن الحظ، ساعد مصمم النماذج في تسهيل استخدام نماذجهم، لذا من السهل جدًا اتباعها وسنرشدك خلال العملية، فلا تقلق إذا لم يسبق لك استخدام بايثون من قبل!

مشاريع التعاون

بما أنّك لست مهتمًا كثيرًا في هذا الدرس التطبيقي حول الترميز برغبتك في إعداد خادم Linux يحتوي على جميع برامج Python المساعدة المختلفة، يمكنك تنفيذ الرمز البرمجي من خلال متصفّح الويب باستخدام "Colab Notebook". يمكن ربط دفاتر الملاحظات هذه بـ "واجهة خلفية" - وهو ببساطة خادم يحتوي على بعض العناصر المثبَّتة مسبقًا، ويمكنك من خلاله تنفيذ رمز عشوائي داخل متصفّح الويب والاطّلاع على النتائج. هذا مفيد جدًا لإنشاء نماذج أولية سريعة أو للاستخدام في برامج تعليمية مثل هذه.

ما عليك سوى الانتقال إلى colab.research.google.com وستظهر لك شاشة ترحيب على النحو التالي:

6b82258445885c50.png

انقر الآن على الزر "دفتر ملاحظات جديد" (New Notebook) أسفل يسار النافذة المنبثقة، ومن المفترض أن يظهر لك مساعد فارغ على النحو التالي:

2d52c8f7afa88564.png

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

fa5f578a1a3d352b.png

بمجرد الاتصال، من المفترض أن تظهر رموز ذاكرة الوصول العشوائي ورموز القرص في مكانها، على النحو التالي:

541c9894fb39d4cb.png

أحسنت! يمكنك الآن بدء الترميز في بايثون لإعادة تدريب نموذج "مصمم النماذج". ما عليك سوى اتباع الخطوات التالية.

الخطوة 1

في الخلية الأولى التي تكون فارغة حاليًا، انسخ الرمز أدناه. سيتم تثبيت TensorFlow Lite model Maker من أجلك باستخدام مدير حزم Python المُسمّى "pip". (يشبه npm معظم قراء مختبر الترميز هذا قد يكون أكثر دراية به من منظومة JavaScript المتكاملة):

!apt-get install libasound-dev portaudio19-dev libportaudio2 libportaudiocpp0
!pip install -q tflite-model-maker

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

7ac5e3516bed6335.png انقر على زر التشغيل لتنفيذ الرمز الذي تمت كتابته في الخلية.

سترى الآن مصمم النماذج قيد التثبيت:

651f21b04fb648cc.png

بعد اكتمال تنفيذ هذه الخلية كما هو موضّح، انتقِل إلى الخطوة التالية أدناه.

الخطوة 2

بعد ذلك، أضِف خلية رمز برمجي جديدة كما هو موضّح حتى تتمكّن من لصق المزيد من الرموز بعد الخلية الأولى وتنفيذها بشكل منفصل:

869904a9d774c455.png

ستحتوي الخلية التالية المنفَّذة على عدد من عمليات الاستيراد التي سيحتاج الرمز البرمجي في باقي ورقة الملاحظات إلى استخدامها. انسخ والصق ما يلي في الخلية الجديدة التي تم إنشاؤها:

import numpy as np
import os

from tflite_model_maker import configs
from tflite_model_maker import ExportFormat
from tflite_model_maker import model_spec
from tflite_model_maker import text_classifier
from tflite_model_maker.text_classifier import DataLoader

import tensorflow as tf
assert tf.__version__.startswith('2')
tf.get_logger().setLevel('ERROR')

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

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

الخطوة 3

بعد ذلك، عليك تنزيل البيانات من خادم بعيد إلى جهازك وضبط المتغيّر training_data ليكون مسار الملف المحلي الناتج الذي تم تنزيله:

data_file = tf.keras.utils.get_file(fname='comment-spam-extras.csv', origin='https://storage.googleapis.com/jmstore/TensorFlowJS/EdX/code/6.5/jm_blog_comments_extras.csv', extract=False)

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

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

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

نفِّذ هذه الخلية، وبعد الانتهاء من تنفيذها، أضِف خلية جديدة وانتقِل إلى الخطوة 4.

الخطوة الرابعة

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

يوفّر "أداة إنشاء النماذج" العديد من عمليات تضمين النماذج التي يمكنك استخدامها قبل التعلّم، لكنّ أبسط الطرق وأسرعها هي "average_word_vec"، وهي الطريقة التي استخدمتها في الدرس التطبيقي السابق حول الترميز لإنشاء موقعك الإلكتروني. ها هو الرمز:

spec = model_spec.get('average_word_vec')
spec.num_words = 2000
spec.seq_len = 20
spec.wordvec_dim = 7

ابدأ وقم بتشغيل ذلك بمجرد لصقه في الخلية الجديدة.

يمكن أن يساعدك فهم

num_words

المَعلمة

هذا هو عدد الكلمات التي تريد أن يستخدمها النموذج. قد تعتقد أنه كلما كان ذلك أفضل، إلا أن هناك مكانًا أفضل بشكل عام يعتمد على تكرار استخدام كل كلمة. إذا استخدمت كل كلمة في المجموعة بأكملها، فقد ينتهي الأمر بمحاولة النموذج للتعلم والموازنة بين ترجيحات الكلمات التي تستخدم مرة واحدة فقط - وهذا ليس مفيدًا للغاية. ستجد في أي مجموعة نصية أن العديد من الكلمات لا يتم استخدامها إلا مرة واحدة أو مرتين، وبالتالي لا يستحق الأمر بشكل عام استخدامها في نموذجك لأن لها تأثير يذكر على الشعور العام. لذا يمكنك ضبط نموذجك على عدد الكلمات التي تريدها باستخدام معلَمة num_words. وكلما كان الرقم أصغر هنا، سيكون النموذج أصغر وأسرع، ولكنه قد يكون أقل دقة لأنّه يتعرّف على عدد أقل من الكلمات. وسيؤدي العدد الأكبر هنا إلى نموذج أكبر وربما أبطأ. ومما لا شك فيه أن العثور على النقطة المناسبة أمر متروك لك بصفتك مهندسًا في تقنية تعلُّم الآلة لمعرفة ما يناسب حالة استخدامك.

يمكن أن يساعدك فهم

wordvec_dim

المَعلمة

المعلمة wordvec_dim هي عدد الأبعاد التي تريد استخدامها لمتجه كل كلمة. وتمثّل هذه السمات في الأساس السمات المختلفة (التي تنشئها خوارزمية تعلُّم الآلة أثناء التدريب) التي يمكن قياس أي كلمة معيّنة من خلالها والتي سيستخدمها البرنامج لتجربة أفضل الكلمات المرتبطة ببعضها بعض الشيء.

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

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

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

القاعدة الأساسية التي تم تحديدها من خلال البحث هي أن الجذر الرابع لعدد الكلمات يعمل بشكل جيد لهذه المعلمة. لذا، إذا كنت أستخدم 2000 كلمة، فإنّ نقطة البداية الجيدة لذلك هي 7 أبعاد. إذا غيّرت عدد الكلمات المستخدَمة، يمكنك أيضًا تغيير هذا العدد.

يمكن أن يساعدك فهم

seq_len

المَعلمة

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

الخطوة 5: تحميل بيانات التدريب

قمت سابقًا بتنزيل ملف CSV. حان الوقت الآن لاستخدام أداة تحميل بيانات لتحويل هذا إلى بيانات تدريب يمكن أن يتعرف عليها النموذج.

data = DataLoader.from_csv(
      filename=data_file,
      text_column='commenttext', 
      label_column='spam', 
      model_spec=spec,
      delimiter=',',
      shuffle=True,
      is_training=True)

train_data, test_data = data.split(0.9)

إذا فتحت ملف CSV في محرر، فسترى أن كل سطر يحتوي على قيمتين فقط، ويتم وصف هذه القيم بنص في السطر الأول من الملف. ويتم عادةً اعتبار كل إدخال "عمودًا". سترى أن واصف العمود الأول هو commenttext، وأن الإدخال الأول في كل سطر هو نص التعليق.

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

ستستخدم بعد ذلك data.split() لتقسيم البيانات إلى بيانات تدريب واختبار. يشير 9 .إلى أنه سيتم استخدام 90٪ من مجموعة البيانات للتدريب، والباقي للاختبار.

الخطوة 6: إنشاء النموذج

إضافة خلية أخرى حيث سنضيف الرمز لإنشاء النموذج:

model = text_classifier.create(train_data, model_spec=spec, epochs=50)

يؤدي هذا إلى إنشاء نموذج مصنِّف نصي باستخدام "مصمم النماذج"، وتحديد بيانات التدريب التي تريد استخدامها (والتي تم تحديدها في الخطوة 4)، ومواصفات النموذج (التي تم إعدادها أيضًا في الخطوة 4)، وعدد الفترات، وهي 50 في هذه الحالة.

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

bbe4b896d8060bc4.png

وسيقيس عند ذلك نتائج هذا ويغيّر معاملات النموذج لتعديل التنبؤ، ثم يحاول مرة أخرى. هذه هي حقبة. إذًا، بتعيين epochs=50، سوف يمر عبر "loop" 50 مرة كما هو موضّح:

4ed286d114960ca.png

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

الخطوة 7: تصدير النموذج

بعد الانتهاء من التدريب، يمكنك تصدير النموذج. يعمل TensorFlow على تدريب نموذج بتنسيقه الخاص، ويجب تحويل هذا النموذج إلى تنسيق TensorFlow.js لاستخدامه على صفحة الويب. ما عليك سوى لصق ما يلي في خلية جديدة وتنفيذها:

model.export(export_dir="/js_export/", export_format=[ExportFormat.TFJS, ExportFormat.LABEL, ExportFormat.VOCAB])
!zip -r /js_export/ModelFiles.zip /js_export/

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

نزِّل ملف ZIP هذا إلى جهاز الكمبيوتر الآن، حيث ستستخدم هذه الملفات كما هو الحال في الدرس التطبيقي الأول حول الترميز:

cda3c681ebf144b4.png

رائع! انتهى جزء Python، يمكنك الآن الرجوع إلى JavaScript الأصلي الذي تعرفه وتحبه. أخيرًا!

5- عرض النموذج الجديد لتعلُّم الآلة

أنت الآن جاهز تقريبًا لتحميل النموذج. ولكن قبل أن تتمكّن من إجراء ذلك، عليك تحميل ملفات النموذج الجديدة التي تم تنزيلها في وقت سابق في الدرس التطبيقي حول الترميز كي تتم استضافتها واستخدامها في الرمز البرمجي.

أولاً، إذا لم تكن قد فعلت ذلك من قبل، عليك فك ضغط ملفات النموذج الذي تم تنزيله للتو من ورقة ملاحظات Colab Maker التي قمت بتشغيلها للتو. من المفترض أن تظهر الملفات التالية داخل مجلداته المختلفة:

3ace87c57b98cfbc.png

ماذا يوجد لديك هنا؟

  • model.json: هذا هو أحد الملفات التي يتكوّن منها نموذج TensorFlow.js المدرَّب. ستشير إلى هذا الملف المحدد في رمز JS.
  • group1-shard1of1.bin: هذا ملف ثنائي يحتوي على الكثير من البيانات المحفوظة لنموذج TensorFlow.js الذي تم تصديره ويجب استضافته في مكان ما على الخادم لتنزيله في الدليل نفسه مثل model.json أعلاه.
  • vocab - هذا الملف الغريب الذي لا يحتوي على امتداد هو ملف من "مصمم النماذج" يوضح لنا كيفية ترميز الكلمات في الجمل بحيث يفهم النموذج طريقة استخدامها. سوف تتعمق أكثر في هذا الأمر في القسم التالي.
  • labels.txt - تحتوي هذه القيم ببساطة على أسماء الفئات الناتجة التي سيتنبأ بها النموذج. بالنسبة إلى هذا النموذج، إذا فتحت هذا الملف في محرر النصوص، سيحتوي الملف على "خطأ" و"صحيح" مدرجة تشير إلى "ليست رسالة غير مرغوب فيها" أو "رسالة غير مرغوب فيها" كمخرجات التنبؤ.

استضافة ملفات نموذج TensorFlow.js

عليك أولاً وضع الملفَّين model.json و*.bin اللذين تم إنشاؤهما على خادم ويب لتتمكّن من الوصول إليهما من خلال صفحة الويب.

حذف ملفات النماذج الحالية

بما أنّك تعتمد على النتيجة النهائية لأول درس تطبيقي حول الترميز في هذه السلسلة، عليك أولاً حذف ملفات النموذج الحالية التي تم تحميلها. إذا كنت تستخدم Glitch.com، تحقق ببساطة من لوحة الملفات على اليمين لـ model.json وgroup1-shard1of1.bin، وانقر على القائمة المنسدلة لقائمة النقاط الثلاث لكل ملف وحدد حذف كما هو موضح:

c72bfdc5a0db4d0d.png

تحميل ملفات جديدة إلى أداة Glitch

رائع! الآن قم بتحميل الملفات الجديدة:

  1. افتح مجلد assets (مواد العرض) في اللوحة اليمنى من مشروع Glitch واحذف أي مواد عرض قديمة تم تحميلها إذا كانت تحمل الأسماء نفسها.
  2. انقر على تحميل مادة عرض واختَر group1-shard1of1.bin ليتم تحميله إلى هذا المجلد. من المفترض أن يظهر الآن على النحو التالي بعد تحميله:

c6739dd30e6df977.png

  1. رائع! نفِّذ الأمر نفسه الآن مع ملف model.json أيضًا، بحيث يكون الملفان في مجلد "مواد العرض" على النحو التالي:

b7858eb08bea9ac3.png

  1. إذا نقرت على ملف group1-shard1of1.bin الذي حمّلته للتو، ستتمكّن من نسخ عنوان URL إلى موقعه. انسخ هذا المسار الآن كما هو موضّح:

19999f6644f61153.png

  1. الآن في أسفل يمين الشاشة، انقر على الأدوات > Terminal الانتظار إلى أن يتم تحميل نافذة المحطة الطرفية
  2. بعد التحميل، اكتب ما يلي ثم اضغط على Enter لتغيير الدليل إلى مجلد www:

طرفية:

cd www
  1. بعد ذلك، استخدِم wget لتنزيل الملفَّين اللذين تم تحميلهما للتوّ عن طريق استبدال عناوين URL أدناه بعناوين URL التي أنشأتها للملفات في مجلّد مواد العرض على تطبيق Glitch (تحقَّق من مجلد "مواد العرض" للاطّلاع على عنوان URL المخصّص لكل ملف).

يُرجى العلم أنّ المسافة بين عنوانَي URL، وأنّ عناوين URL التي ستحتاج إلى استخدامها ستكون مختلفة عن العناوين المعروضة، ولكنّها ستبدو متشابهة:

محطة طرفية

wget https://cdn.glitch.com/1cb82939-a5dd-42a2-9db9-0c42cab7e407%2Fmodel.json?v=1616111344958 https://cdn.glitch.com/1cb82939-a5dd-42a2-9db9-0c42cab7e407%2Fgroup1-shard1of1.bin?v=1616017964562

ممتاز! لقد أنشأت الآن نسخة من الملفات التي تم تحميلها إلى مجلد www.

ومع ذلك، سيتم تنزيلها الآن بأسماء غريبة. إذا كتبت ls في الوحدة الطرفية والضغط على مفتاح enter، سيظهر لك ما يلي:

6c417fdfc64762f1.png

  1. باستخدام الأمر mv، يجب إعادة تسمية الملفات. اكتب ما يلي في وحدة التحكم واضغط على enter بعد كل سطر:

طرفية:

mv *group1-shard1of1.bin* group1-shard1of1.bin
mv *model.json* model.json
  1. أخيرًا، أعِد تحميل مشروع Glitch من خلال كتابة refresh في الوحدة الطرفية والضغط على enter:

طرفية:

refresh

بعد إعادة التحميل، من المفترض أن يظهر لك الآن model.json وgroup1-shard1of1.bin في المجلد www لواجهة المستخدم:

530bb651f4dbac64.png

رائع! الخطوة الأخيرة هي تعديل ملف dictionary.js.

  1. يمكنك تحويل ملف النطق الجديد الذي تم تنزيله إلى تنسيق JS الصحيح إما يدويًا عبر محرِّر النصوص أو باستخدام هذه الأداة وحفظ الناتج الناتج باسم dictionary.js في مجلد www. إذا كان لديك ملف dictionary.js، يمكنك ببساطة نسخ المحتوى الجديد ولصقه فوقه وحفظ الملف.

رائع! لقد قمت بتحديث جميع الملفات التي تم تغييرها بنجاح وإذا حاولت الآن واستخدام موقع الويب، ستلاحظ كيف يجب أن يكون النموذج المُعاد تدريبه قادرًا على مراعاة الحالات الهامشية التي تم اكتشافها والتعلم منها كما هو موضح:

64e5cf6f6e158d6c.gif

وكما ترون، يتم الآن تصنيف أول 6 حملات بشكل صحيح على أنها ليست محتوى غير مرغوب فيه، وتم تحديد الدفعة الثانية المكونة من 6 منها جميعًا على أنها محتوى غير مرغوب فيه. ممتاز.

لنجرب بعض الاختلافات أيضًا لنرى ما إذا كانت قد تم تعميمها بشكل جيد. في الأصل كانت هناك جملة فاشلة مثل:

"ارتفعت أسهم GOOG الآن! عليك الانتظار قبل فوات الأوان!"

تم تصنيف ذلك الآن بشكل صحيح على أنه محتوى غير مرغوب فيه، ولكن ماذا سيحدث إذا غيّرته إلى:

"زادت قيمة سهم XYZ الآن. ننصحك بشراء بعضها مباشرةً قبل فوات الأوان."

تحصل هنا على توقع بنسبة 98٪ من المرجح أن يكون محتوى غير مرغوب فيه وهو صحيح على الرغم من تغيير رمز المخزون والصياغة قليلاً.

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

6- تهانينا!

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

الملخّص

في هذا الدرس التطبيقي حول الترميز، يمكنك:

  1. تم اكتشاف الحالات الحدّية التي لم تعمل عند استخدام نموذج التعليقات غير المرغوب فيها المعدّ مسبقًا.
  2. إعادة تدريب نموذج مصمم النماذج ليأخذ في الاعتبار الحالات الحدّية التي اكتشفتها
  3. تم تصدير النموذج الجديد المدرَّب إلى تنسيق TensorFlow.js.
  4. تم تحديث تطبيق الويب لاستخدام الملفات الجديدة.

الخطوات التالية

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

مشاركة إبداعاتك معنا

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

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

المزيد من الدروس التطبيقية حول الترميز من TensorFlow.js للتعرّف على مزيد من التفاصيل

المواقع الإلكترونية المقترَحة