دليل تصنيف النصوص على Android

تتيح لك مهمة MediaPipe Text Classife تصنيف النص إلى مجموعة من الفئات المحددة، مثل الآراء الإيجابية أو السلبية. تحدد الفئات النموذج الذي تستخدمه وكيفية تدريب هذا النموذج. توضح لك هذه التعليمات كيفية استخدام "Text Classifier" مع تطبيقات Android.

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

مثال الرمز البرمجي

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

تنزيل الرمز

توضّح لك التعليمات التالية كيفية إنشاء نسخة محلية من رمز المثال باستخدام أداة سطر أوامر التحكم في الإصدار git.

لتنزيل نموذج الرمز:

  1. استنسِخ مستودع git باستخدام الأمر التالي:
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. يمكنك اختياريًا ضبط مثيل git لاستخدام طريقة الدفع المتفرقة، بحيث لا يكون لديك سوى ملفات مثال تطبيق Text Classifier:
    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/text_classification/android
    

للحصول على تعليمات حول كيفية إعداد نموذج من "استوديو Android" وتشغيله، يمكنك الاطّلاع على مثال تعليمات إعداد الرمز في دليل الإعداد لنظام التشغيل Android.

المكونات الرئيسية

تحتوي الملفات التالية على الرمز الأساسي لتطبيق تصنيف النص مثال:

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

ضبط إعدادات الجهاز

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

التبعيات

يستخدم "Text Classifier" مكتبات com.google.mediapipe:tasks-text. أضِف هذه التبعية إلى ملف build.gradle لمشروع تطوير تطبيقات Android. يمكنك استيراد التبعيات المطلوبة باستخدام الرمز التالي:

dependencies {
    implementation 'com.google.mediapipe:tasks-text:latest.release'
}

الطراز

تتطلب مهمة MediaPipe Text Classife نموذجًا مدرَّبًا متوافقًا مع هذه المهمة. للحصول على مزيد من المعلومات حول النماذج المدربة المتاحة لأدوات تصنيف النص، راجع نظرة عامة على المهمة في قسم النماذج.

حدد نموذجًا ونزّله ثم خزنه في دليل assets المشروع:

<dev-project-root>/src/main/assets

استخدِم طريقة BaseOptions.Builder.setModelAssetPath() لتحديد مسار النموذج المطلوب استخدامه. للاطّلاع على مثال على الرمز البرمجي، راجِع القسم التالي.

إنشاء المهمة

استخدِم إحدى وظائف TextClassifier.createFrom...() في "مصنِّف النص" لإعداد المهمة لتشغيل الاستنتاجات. يمكنك استخدام الدالة createFromFile() مع مسار نسبي أو مطلق إلى ملف النموذج المدرَّب. يوضح مثال التعليمة البرمجية أدناه استخدام الدالة TextClassifier.createFromOptions(). لمزيد من المعلومات عن خيارات الضبط المتاحة، يُرجى الاطّلاع على خيارات الضبط.

يوضح الرمز التالي كيفية إنشاء هذه المهمة وتكوينها.

// no directory path required if model file is in src/main/assets:
String currentModel = "text_classifier_model.tflite";

fun initClassifier() {
    val baseOptionsBuilder = BaseOptions.builder()
        .setModelAssetPath(currentModel)
    try {
        val baseOptions = baseOptionsBuilder.build()
        val optionsBuilder = TextClassifier.TextClassifierOptions.builder()
            .setBaseOptions(baseOptions)
        val options = optionsBuilder.build()
        textClassifier = TextClassifier.createFromOptions(context, options)
    } catch (e: IllegalStateException) { // exception handling
    }
}

يمكنك رؤية مثال حول كيفية إنشاء مهمة في مثال الرمز TextClassifierHelper الدالة initClassifier().

خيارات الضبط

تشمل هذه المهمة خيارات الضبط التالية لتطبيقات Android:

اسم الخيار الوصف نطاق القيمة القيمة التلقائية
displayNamesLocale تحدِّد هذه السياسة لغة التصنيفات التي سيتم استخدامها للأسماء المعروضة في البيانات الوصفية لنموذج المهمة، إذا كان ذلك متاحًا. الإعداد التلقائي هو en للغة الإنجليزية. يمكنك إضافة تصنيفات مترجَمة إلى البيانات الوصفية لنموذج مخصّص باستخدام TensorFlow Lite Metadata Scriptr API. رمز اللغة en
maxResults يضبط الحد الأقصى الاختياري لعدد نتائج التصنيف ذات أعلى الدرجات التي تريد عرضها. وإذا كانت القيمة أقل من 0، سيتم عرض جميع النتائج المتاحة. أي أرقام موجبة -1
scoreThreshold لتعيين الحد الأدنى لدرجة التنبؤ الذي يتجاوز الحد المقدم في البيانات الوصفية للنموذج (إن يتوفر). يتم رفض النتائج التي تقلّ عن هذه القيمة. أي عائم لم يتم الضبط.
categoryAllowlist تُحدِّد القائمة الاختيارية لأسماء الفئات المسموح بها. وإذا لم يكن هذا الحقل فارغًا، ستتم فلترة نتائج التصنيف التي لا يكون اسم فئتها ضمن هذه المجموعة. ويتم تجاهل أسماء الفئات المكررة أو غير المعروفة. لا يمكن استخدام هذا الخيار مع categoryDenylist، ويؤدي استخدام كلاهما إلى حدوث خطأ. أي سلاسل لم يتم الضبط.
categoryDenylist تُحدِّد القائمة الاختيارية لأسماء الفئات غير المسموح بها. وإذا لم تكن نتائج التصنيف فارغة، فستتم تصفية نتائج التصنيف التي يوجد اسم فئتها في هذه المجموعة. ويتم تجاهل أسماء الفئات المكررة أو غير المعروفة. لا يمكن استخدام هذا الخيار إلّا مع categoryAllowlist، ويؤدي استخدام كلا الخيارين إلى حدوث خطأ. أي سلاسل لم يتم الضبط.

إعداد البيانات

تعمل أداة Text Classifier مع البيانات النصية (String). تتعامل المهمة مع المعالجة المسبقة لإدخال البيانات، بما في ذلك إنشاء الرموز المميزة والمعالجة المسبقة للتوتر.

وتتم معالجة كل عمليات المعالجة المسبقة ضمن دالة classify(). ليست هناك حاجة إلى معالجة مسبقة إضافية للنص المدخل مسبقًا.

String inputText = "The input text to be classified.";

تنفيذ المهمة

يستخدم "Text Classifier" الدالة TextClassifier.classify() لتشغيل الاستنتاجات. استخدِم سلسلة تعليمات تنفيذ منفصلة لتنفيذ التصنيف لتجنُّب حظر سلسلة محادثات واجهة مستخدم Android مع تطبيقك.

توضح التعليمة البرمجية التالية كيفية تنفيذ المعالجة باستخدام نموذج المهام باستخدام سلسلة تنفيذ منفصلة.

    fun classify(text: String) {
        executor = ScheduledThreadPoolExecutor(1)

        executor.execute {
            val results = textClassifier.classify(text)
            listener.onResult(results)
        }
    }

يمكنك رؤية مثال حول كيفية تشغيل مهمة في مثال الرمز TextClassifierHelper الدالة classify().

التعامل مع النتائج وعرضها

يُخرج "Text Classifier" TextClassifierResult الذي يحتوي على قائمة بالفئات المحتملة لنص الإدخال. يتم تحديد الفئات من خلال النموذج الذي تستخدمه، لذلك إذا كنت تريد فئات مختلفة، فاختر نموذجًا مختلفًا أو أعد تدريب نموذج موجود.

ويوضح ما يلي مثالاً على بيانات المخرجات من هذه المهمة:

TextClassificationResult:
  Classification #0 (single classification head):
    ClassificationEntry #0:
      Category #0:
        category name: "positive"
        score: 0.8904
        index: 0
      Category #1:
        category name: "negative"
        score: 0.1096
        index: 1

تم الحصول على هذه النتيجة عن طريق تشغيل مصنِّف BERT على نص الإدخال: "an imperfect but overall entertaining mystery".

يمكنك الاطّلاع على مثال عن كيفية عرض النتائج في مثال الرمز فئة ResultsAdapter وفئة ViewHolder الداخلية.