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

1. قبل البدء

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

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

تظهر النتيجة النهائية لهذا الدرس العملي أدناه:

a4511e5d445706b1.gif

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

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

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

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

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

ما ستنشئه

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

لنبدأ عملية الاختراق...

ما ستتعلمه

عليك إجراء ما يلي:

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

يُفترض أن تكون على دراية بلغات HTML5 وCSS وJavaScript في هذا الدرس التطبيقي. ستنفّذ أيضًا بعض رموز Python البرمجية من خلال دفتر ملاحظات "التعاون" لإعادة تدريب النموذج الذي تم إنشاؤه باستخدام Model Maker، ولكن لا تحتاج إلى معرفة Python لتنفيذ ذلك.

2. الاستعداد للترميز

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

على Glitch، ما عليك سوى النقر على الزر remix this لإنشاء نسخة معدَّلة منه وإنشاء مجموعة جديدة من الملفات يمكنك تعديلها.

3- اكتشاف الحالات الحدّية في الحلّ السابق

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

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

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

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

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

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

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

  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. "احصل على خصم على دروس التدريب في النادي الرياضي، اطّلِع على الملف الشخصي!" احتمالية أن يكون المحتوى غير مرغوب فيه: ‎17.49849%
  3. "يا إلهي، لقد ارتفع سعر سهم GOOG بشكل كبير! احصل على العرض قبل فوات الأوان". الاحتمالية غير المرغوب فيها: ‎20.42894%

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

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

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

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

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

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

ملخّص النموذج الجاهز

النموذج الجاهز الذي استخدمته هو نموذج أنشأته جهة خارجية من خلال Model Maker، وهو يستخدم نموذج "تضمين الكلمات المتوسط" ليعمل.

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

Colabs

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

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

6b82258445885c50.png

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

2d52c8f7afa88564.png

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

fa5f578a1a3d352b.png

بعد الربط، من المفترض أن تظهر رموز ذاكرة الوصول العشوائي (RAM) والقرص في مكانها، كما يلي:

541c9894fb39d4cb.png

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

الخطوة 1

في الخلية الأولى الفارغة حاليًا، انسخ الرمز أدناه. سيتم تثبيت أداة TensorFlow Lite Model Maker لك باستخدام أداة إدارة الحِزم في Python، والتي تُسمى "pip" (وهي تشبه npm التي قد يكون معظم قارئي هذا الدرس التطبيقي على دراية بها من نظام JS المتكامل):

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

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

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

سيظهر لك الآن أنّه يتم تثبيت أداة Model Maker:

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. أنت بصدد استيراد بعض الأدوات ووظائف Model Maker اللازمة لتصنيف الرسائل غير المرغوب فيها. سيتحقّق هذا الرمز أيضًا مما إذا كنت تستخدم TensorFlow 2.x، وهو شرط لاستخدام Model Maker.

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

الخطوة 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)

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

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

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

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

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

عند استخدام Model Maker، لن تحتاج إلى إنشاء نماذج من البداية. بشكل عام، يمكنك استخدام نماذج حالية ثم تخصيصها لتلبية احتياجاتك.

توفّر أداة Model Maker العديد من عمليات تضمين النماذج المدرَّبة مسبقًا التي يمكنك استخدامها، ولكنّ أبسطها وأسرعها للبدء هي 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 هي عدد السمات التي تريد استخدامها لمتّجه كل كلمة. هذه السمات هي في الأساس الخصائص المختلفة (التي تنشئها خوارزمية التعلّم الآلي أثناء التدريب) التي يمكن قياس أي كلمة معيّنة بها، وسيستخدمها البرنامج لمحاولة ربط الكلمات المتشابهة بأفضل طريقة ممكنة.

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

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

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

تشير القاعدة الأساسية التي تم تحديدها من خلال البحث إلى أنّ الجذر الرابع لعدد الكلمات مناسب لهذه المَعلَمة. لذا، إذا كنت أستخدم 2, 000 كلمة، فإنّ نقطة البداية الجيدة لذلك هي 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() لتقسيم البيانات إلى بيانات تدريب واختبار. يشير الرقم 0 .9 إلى أنّه سيتم استخدام% 90 من مجموعة البيانات للتدريب، وسيتم استخدام الباقي للاختبار.

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

أضِف خلية أخرى سنضيف فيها رمزًا برمجيًا لإنشاء النموذج:

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

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

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

bbe4b896d8060bc4.png

بعد ذلك، سيقيس النتائج ويغيّر أوزان النموذج لتعديل توقّعه، ثم سيحاول مرة أخرى. هذه حقبة. لذا، من خلال تحديد epochs=50، سيتم تكرار هذه "الحلقة" 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، يمكنك الانتقال إلى المجلد الذي تم التصدير إليه أعلاه (في الدليل الجذر - قد تحتاج إلى الانتقال إلى مستوى أعلى) والعثور على حزمة zip الخاصة بالملفات التي تم تصديرها والمضمّنة في ModelFiles.zip.

نزِّل ملف zip هذا على جهاز الكمبيوتر الآن لأنّك ستستخدم هذه الملفات كما في الدرس العملي الأول:

cda3c681ebf144b4.png

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

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

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

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

3ace87c57b98cfbc.png

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

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

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

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

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

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

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. في أسفل يمين الشاشة، انقر على الأدوات > الطرفية. انتظِر إلى أن يتم تحميل نافذة المحطة الطرفية.
  2. بعد التحميل، اكتب ما يلي ثم اضغط على Enter لتغيير الدليل إلى المجلد www:

terminal:

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

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

terminal

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 بعد كل سطر:

terminal:

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

terminal:

refresh

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

530bb651f4dbac64.png

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

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

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

64e5cf6f6e158d6c.gif

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

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

"يا إلهي، لقد ارتفع سعر سهم GOOG بشكل كبير! احصل على العرض قبل فوات الأوان!"

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

"إذًا، ارتفعت قيمة سهم XYZ للتو. اشترِ بعضًا منها قبل فوات الأوان!"

في هذه الحالة، ستحصل على توقّع بنسبة% 98 بأنّ الرسالة غير مرغوب فيها، وهذا التوقّع صحيح على الرغم من أنّك غيّرت رمز السهم والصيغة قليلاً.

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

6. تهانينا!

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

ملخّص

في هذا الدرس التطبيقي حول الترميز، ستتعرّف على ما يلي:

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

ما هي الخطوات التالية؟

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

مشاركة المحتوى الذي تصنعه معنا

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

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

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

مواقع إلكترونية ننصحك بالاطّلاع عليها