تصنيف النص مع أندرويد

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

يستخدم تطبيق المثال TensorFlow Lite لتصنيف النص على أنه إيجابي أو سلبي، باستخدام مكتبة المهام للغة الطبيعية (NL) لتمكين تنفيذ نماذج التعلم الآلي لتصنيف النص.

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

نظرة عامة على تصنيف النص

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

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

لمزيد من المعلومات حول كيفية إنشاء النماذج في هذا البرنامج التعليمي، راجع تصنيف النص مع البرنامج التعليمي TensorFlow Lite Model Maker .

النماذج ومجموعة البيانات

يستخدم هذا البرنامج التعليمي النماذج التي تم تدريبها باستخدام مجموعة بيانات SST-2 (Stanford Sentiment Treebank). يحتوي SST-2 على 67,349 مراجعة للأفلام للتدريب و872 مراجعة للأفلام للاختبار، مع تصنيف كل مراجعة على أنها إيجابية أو سلبية. تم تدريب النماذج المستخدمة في هذا التطبيق باستخدام أداة TensorFlow Lite Model Maker .

يستخدم تطبيق المثال النماذج التالية المدربة مسبقًا:

  • متوسط ​​ناقل الكلمات ( NLClassifier ) ​​- يقوم NLClassifier بمكتبة المهام بتصنيف نص الإدخال إلى فئات مختلفة، ويمكنه التعامل مع معظم نماذج تصنيف النص.

  • MobileBERT ( BertNLClassifier ) - يشبه BertNLClassifier الخاص بمكتبة المهام NLClassifier ولكنه مصمم للحالات التي تتطلب رموزًا مميزة لقطع الكلمات وقطعة الجملة خارج الرسم البياني.

قم بإعداد وتشغيل التطبيق المثال

لإعداد تطبيق تصنيف النص، قم بتنزيل التطبيق النموذجي من GitHub وقم بتشغيله باستخدام Android Studio .

متطلبات النظام

  • إصدار Android Studio 2021.1.1 (Bumblebee) أو أعلى.
  • Android SDK الإصدار 31 أو أعلى
  • جهاز Android مزود بإصدار نظام تشغيل أدنى SDK 21 (Android 7.0 - Nougat) مع تمكين وضع المطور ، أو محاكي Android.

احصل على رمز المثال

قم بإنشاء نسخة محلية من رمز المثال. ستستخدم هذا الرمز لإنشاء مشروع في Android Studio وتشغيل تطبيق المثال.

لاستنساخ رمز المثال وإعداده:

  1. استنساخ مستودع git
    git clone https://github.com/tensorflow/examples.git
    
  2. بشكل اختياري، قم بتكوين مثيل git الخاص بك لاستخدام الدفع المتناثر، بحيث يكون لديك فقط الملفات الخاصة بتطبيق مثال تصنيف النص:
    cd examples
    git sparse-checkout init --cone
    git sparse-checkout set lite/examples/text_classification/android
    

استيراد وتشغيل المشروع

قم بإنشاء مشروع من رمز المثال الذي تم تنزيله، وقم ببناء المشروع، ثم قم بتشغيله.

لاستيراد وإنشاء مشروع التعليمات البرمجية النموذجي:

  1. ابدأ تشغيل أندرويد ستوديو .
  2. من Android Studio، حدد File > New > Import Project .
  3. انتقل إلى دليل التعليمات البرمجية النموذجي الذي يحتوي على ملف build.gradle ( .../examples/lite/examples/text_classification/android/build.gradle ) وحدد هذا الدليل.
  4. إذا طلب Android Studio إجراء Gradle Sync، فاختر "موافق".
  5. تأكد من أن جهاز Android الخاص بك متصل بجهاز الكمبيوتر الخاص بك وأن وضع المطور ممكّن. انقر فوق سهم Run الأخضر.

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

لتشغيل المشروع:

  1. من Android Studio، قم بتشغيل المشروع عن طريق تحديد Run > Run… .
  2. حدد جهاز Android متصلًا (أو محاكيًا) لاختبار التطبيق.

باستخدام التطبيق

تطبيق مثال لتصنيف النص في Android

بعد تشغيل المشروع في Android Studio، سيتم فتح التطبيق تلقائيًا على الجهاز المتصل أو محاكي الجهاز.

لاستخدام مصنف النص:

  1. أدخل مقتطفًا من النص في مربع النص.
  2. من القائمة المنسدلة " التفويض"، اختر إما وحدة المعالجة CPU أو NNAPI .
  3. حدد نموذجًا عن طريق اختيار AverageWordVec أو MobileBERT .
  4. اختر تصنيف .

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

لديك الآن تطبيق فعال لتصنيف النصوص. استخدم الأقسام التالية لفهم كيفية عمل تطبيق المثال بشكل أفضل، وكيفية تنفيذ ميزات تصنيف النص لتطبيقات الإنتاج الخاصة بك:

كيف يعمل التطبيق المثال

يستخدم التطبيق حزمة مكتبة المهام للغة الطبيعية (NL) لتنفيذ نماذج تصنيف النص. تم تدريب النموذجين، Average Word Vector وMobileBERT، باستخدام TensorFlow Lite Model Maker . يعمل التطبيق على وحدة المعالجة المركزية بشكل افتراضي، مع خيار تسريع الأجهزة باستخدام مندوب NNAPI.

تحتوي الملفات والأدلة التالية على الكود المهم لتطبيق تصنيف النص هذا:

  • TextClassificationHelper.kt - يقوم بتهيئة مصنف النص ويتعامل مع اختيار النموذج والمفوض.
  • MainActivity.kt - ينفذ التطبيق، بما في ذلك استدعاء TextClassificationHelper و ResultsAdapter .
  • ResultsAdapter.kt - يعالج النتائج وينسقها.

تعديل التطبيق الخاص بك

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

افتح أو أنشئ مشروع Android

أنت بحاجة إلى مشروع تطوير Android في Android Studio لمتابعة بقية هذه التعليمات. اتبع الإرشادات أدناه لفتح مشروع موجود أو إنشاء مشروع جديد.

لفتح مشروع تطوير Android حالي:

  • في Android Studio، حدد ملف > فتح وحدد مشروعًا موجودًا.

لإنشاء مشروع تطوير Android أساسي:

لمزيد من المعلومات حول استخدام Android Studio، راجع وثائق Android Studio .

إضافة تبعيات المشروع

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

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

لإضافة تبعيات الوحدة النمطية:

  1. في الوحدة التي تستخدم TensorFlow Lite، قم بتحديث ملف build.gradle الخاص بالوحدة ليشمل التبعيات التالية.

    في تطبيق المثال، توجد التبعيات في app/build.gradle :

    dependencies {
      ...
      implementation 'org.tensorflow:tensorflow-lite-task-text:0.4.0'
    }
    

    يجب أن يتضمن المشروع مكتبة المهام النصية ( tensorflow-lite-task-text ).

    إذا كنت تريد تعديل هذا التطبيق ليعمل على وحدة معالجة الرسومات (GPU)، فإن مكتبة GPU ( tensorflow-lite-gpu-delegate-plugin ) توفر البنية الأساسية لتشغيل التطبيق على وحدة معالجة الرسومات (GPU)، وDelegate ( tensorflow-lite-gpu ) يوفر قائمة التوافق. تشغيل هذا التطبيق على GPU يقع خارج نطاق هذا البرنامج التعليمي.

  2. في Android Studio، قم بمزامنة تبعيات المشروع عن طريق تحديد: File > Sync Project with Gradle Files .

تهيئة نماذج ML

في تطبيق Android الخاص بك، يجب عليك تهيئة نموذج التعلم الآلي TensorFlow Lite باستخدام المعلمات قبل تشغيل التنبؤات مع النموذج.

يتم تخزين نموذج TensorFlow Lite كملف *.tflite . يحتوي ملف النموذج على منطق التنبؤ ويتضمن عادةً بيانات تعريف حول كيفية تفسير نتائج التنبؤ، مثل أسماء فئات التنبؤ. عادة، يتم تخزين ملفات النموذج في دليل src/main/assets لمشروع التطوير الخاص بك، كما في مثال التعليمات البرمجية:

  • <project>/src/main/assets/mobilebert.tflite
  • <project>/src/main/assets/wordvec.tflite

من أجل الراحة وسهولة قراءة التعليمات البرمجية، يعلن المثال عن كائن مصاحب يحدد إعدادات النموذج.

لتهيئة النموذج في تطبيقك:

  1. قم بإنشاء كائن مصاحب لتحديد إعدادات النموذج. في تطبيق المثال، يوجد هذا الكائن في TextClassificationHelper.kt :

    companion object {
      const val DELEGATE_CPU = 0
      const val DELEGATE_NNAPI = 1
      const val WORD_VEC = "wordvec.tflite"
      const val MOBILEBERT = "mobilebert.tflite"
    }
    
  2. قم بإنشاء إعدادات النموذج عن طريق إنشاء كائن مصنف، وإنشاء كائن TensorFlow Lite باستخدام BertNLClassifier أو NLClassifier .

    في التطبيق النموذجي، يوجد هذا في وظيفة initClassifier داخل TextClassificationHelper.kt :

    fun initClassifier() {
      ...
      if( currentModel == MOBILEBERT ) {
        ...
        bertClassifier = BertNLClassifier.createFromFileAndOptions(
          context,
          MOBILEBERT,
          options)
      } else if (currentModel == WORD_VEC) {
          ...
          nlClassifier = NLClassifier.createFromFileAndOptions(
            context,
            WORD_VEC,
            options)
      }
    }
    

تمكين تسريع الأجهزة (اختياري)

عند تهيئة نموذج TensorFlow Lite في تطبيقك، يجب أن تفكر في استخدام ميزات تسريع الأجهزة لتسريع حسابات التنبؤ للنموذج. مندوبو TensorFlow Lite عبارة عن وحدات برمجية تعمل على تسريع تنفيذ نماذج التعلم الآلي باستخدام أجهزة معالجة متخصصة على جهاز محمول، مثل وحدة معالجة الرسومات (GPUs) أو وحدات معالجة الموتر (TPUs).

لتمكين تسريع الأجهزة في تطبيقك:

  1. قم بإنشاء متغير لتعريف المفوض الذي سيستخدمه التطبيق. في تطبيق المثال، يوجد هذا المتغير مبكرًا في TextClassificationHelper.kt :

    var currentDelegate: Int = 0
    
  2. إنشاء محدد مندوب. في تطبيق المثال، يوجد محدد المفوض في وظيفة initClassifier داخل TextClassificationHelper.kt :

    val baseOptionsBuilder = BaseOptions.builder()
    when (currentDelegate) {
       DELEGATE_CPU -> {
           // Default
       }
       DELEGATE_NNAPI -> {
           baseOptionsBuilder.useNnapi()
       }
    }
    

يوصى باستخدام المفوضين لتشغيل نماذج TensorFlow Lite، ولكنه غير مطلوب. لمزيد من المعلومات حول استخدام المفوضين مع TensorFlow Lite، راجع مندوبو TensorFlow Lite .

تحضير البيانات للنموذج

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

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

لتوفير بيانات نصية للنموذج:

  1. تأكد من أن وظيفة initClassifier تحتوي على الكود الخاص بالمفوض والنماذج، كما هو موضح في قسمي تهيئة نماذج ML وتمكين تسريع الأجهزة .

  2. استخدم كتلة init لاستدعاء وظيفة initClassifier . في التطبيق النموذجي، يوجد الحرف init في TextClassificationHelper.kt :

    init {
      initClassifier()
    }
    

تشغيل التوقعات

في تطبيق Android الخاص بك، بمجرد تهيئة كائن BertNLClassifier أو NLClassifier ، يمكنك البدء في تغذية نص الإدخال للنموذج لتصنيفه على أنه "إيجابي" أو "سلبي".

لتشغيل التوقعات:

  1. قم بإنشاء وظيفة classify ، والتي تستخدم المصنف المحدد ( currentModel ) وتقيس الوقت المستغرق لتصنيف نص الإدخال ( inferenceTime ). في تطبيق المثال، توجد وظيفة classify في TextClassificationHelper.kt :

    fun classify(text: String) {
      executor = ScheduledThreadPoolExecutor(1)
    
      executor.execute {
        val results: List<Category>
        // inferenceTime is the amount of time, in milliseconds, that it takes to
        // classify the input text.
        var inferenceTime = SystemClock.uptimeMillis()
    
        // Use the appropriate classifier based on the selected model
        if(currentModel == MOBILEBERT) {
          results = bertClassifier.classify(text)
        } else {
          results = nlClassifier.classify(text)
        }
    
        inferenceTime = SystemClock.uptimeMillis() - inferenceTime
    
        listener.onResult(results, inferenceTime)
      }
    }
    
  2. تمرير النتائج من classify إلى كائن المستمع.

    fun classify(text: String) {
      ...
      listener.onResult(results, inferenceTime)
    }
    

التعامل مع إخراج النموذج

بعد إدخال سطر من النص، ينتج النموذج درجة تنبؤ، يتم التعبير عنها على شكل عائم، بين 0 و1 للفئتين "الإيجابية" و"السلبية".

للحصول على نتائج التنبؤ من النموذج:

  1. قم بإنشاء دالة onResult لكائن المستمع للتعامل مع الإخراج. في تطبيق المثال، يوجد كائن المستمع في MainActivity.kt

    private val listener = object : TextClassificationHelper.TextResultsListener {
      override fun onResult(results: List<Category>, inferenceTime: Long) {
        runOnUiThread {
          activityMainBinding.bottomSheetLayout.inferenceTimeVal.text =
            String.format("%d ms", inferenceTime)
    
          adapter.resultsList = results.sortedByDescending {
            it.score
          }
    
          adapter.notifyDataSetChanged()
        }
      }
      ...
    }
    
  2. أضف دالة onError إلى كائن المستمع لمعالجة الأخطاء:

      private val listener = object : TextClassificationHelper.TextResultsListener {
        ...
        override fun onError(error: String) {
          Toast.makeText(this@MainActivity, error, Toast.LENGTH_SHORT).show()
        }
      }
    

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

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