מדריך לסיווג טקסט ב-Android

המשימה MediaPipe Text Classifier מאפשרת לכם לסווג טקסט בקבוצה של קטגוריות מוגדרות כמו סנטימנט חיובי או שלילי. לפי הקטגוריות נקבעות המודל שבהם משתמשים, ואופן האימון של המודל. ההוראות האלה מראות איך להשתמש במסווג טקסט באפליקציות ל-Android.

אפשר לראות את המשימה הזו בפעולה: demo. לקבלת מידע נוסף על היכולות, המודלים אפשרויות ההגדרה של המשימה הזו, ראו סקירה כללית.

קוד לדוגמה

הקוד לדוגמה של מסווג הטקסט מספק הטמעה פשוטה של לעיונך. הקוד הזה יעזור לך לבדוק את המשימה הזו ולהתחיל בעבודה לפיתוח אפליקציה משלכם לסיווג טקסט. אפשר לעיין קוד לדוגמה של מסווג טקסט ב-GitHub.

להורדת הקוד

בהוראות הבאות מוסבר איך ליצור עותק מקומי של הדוגמה באמצעות כלי שורת הפקודה git לניהול גרסאות.

כדי להוריד את הקוד לדוגמה:

  1. משכפלים את מאגר ה-Git באמצעות הפקודה הבאה:
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. אפשר גם להגדיר את ה-Git למכונת ה-Git לשימוש בקופה מועטה, קיימים רק הקבצים של האפליקציה לדוגמה של מסווג הטקסט:
    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/text_classification/android
    

לקבלת הוראות להגדרה ולהרצה של דוגמה ב-Android Studio, ההוראות להגדרת קוד לדוגמה מדריך ההגדרה ל-Android.

רכיבים מרכזיים

הקבצים הבאים מכילים את הקוד החיוני לסיווג הטקסט אפליקציה לדוגמה:

  • TextClassifierHelper.kt – הפעלת מסווג הטקסט וטיפול בבחירת המודל.
  • MainActivity.kt - מטמיע את האפליקציה, כולל קריאה ל-TextClassifierHelper ול ResultsAdapter
  • ResultsAdapter.kt – טיפול בתוצאות ובעיצוב שלהן.

הגדרה

בקטע הזה מתוארים השלבים העיקריים להגדרת סביבת הפיתוח פרויקטים של קוד שישמשו באופן ספציפי לשימוש במסווג טקסט. למידע כללי על להגדיר את סביבת הפיתוח לשימוש ב-MediaPipe Tasks, כולל הדרישות לגרסת הפלטפורמה. מדריך ההגדרה ל-Android.

יחסי תלות

מסווג הטקסט משתמש בספריות com.google.mediapipe:tasks-text. הוספת הפריט שתלויות בקובץ build.gradle של פרויקט פיתוח האפליקציה ל-Android. אפשר לייבא את יחסי התלות הנדרשים באמצעות הקוד הבא:

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

דגם

למשימה של מסווג הטקסט של MediaPipe נדרש מודל מאומן שתואם למשימה הזו. מידע נוסף על מודלים זמינים מאומנים של מסווג טקסט זמין בכתובת בסקירה הכללית על המשימה בקטע 'מודלים'.

בוחרים מודל ומורידים אותו, ואז מאחסנים אותו בפרויקט 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 Writer API קוד שפה en
maxResults מגדיר את המספר המקסימלי האופציונלי של תוצאות סיווג מובילות ל- החזרה. אם < 0, כל התוצאות הזמינות יוחזרו. מספרים חיוביים כלשהם -1
scoreThreshold הגדרת סף הציון של התחזית שמבטל את הסף שצוין ב את המטא-נתונים של המודל (אם יש). תוצאות מתחת לערך הזה נדחות. כל מספר ממשי (float) לא מוגדר
categoryAllowlist מגדיר את הרשימה האופציונלית של שמות קטגוריות מותרות. אם השדה לא ריק, תוצאות הסיווג שבהן שם הקטגוריה לא נמצא בקבוצה הזו יהיו מסונן. המערכת מתעלמת משמות קטגוריות כפולים או לא ידועים. האפשרות הזו בלעדית למשתמשי categoryDenylist ומשתמשים ושניהם יובילו לשגיאה. כל מחרוזת לא מוגדר
categoryDenylist מגדיר את הרשימה האופציונלית של שמות קטגוריות שאינם מותרים. אם המיקום לא ריקות, תוצאות סיווג שבהן שם הקטגוריה נמצא בקבוצה זו יסוננו החוצה. המערכת מתעלמת משמות קטגוריות כפולים או לא ידועים. האפשרות הזו מקבילה בלעדי ל-categoryAllowlist ושימוש בשתי התוצאות עלול לגרום לשגיאה. כל מחרוזת לא מוגדר

הכנת נתונים

התכונה 'סיווג טקסט' פועלת עם נתוני טקסט (String). המשימה מטפלת בקלט הנתונים מראש, כולל יצירת אסימונים ועיבוד מראש של tensor.

כל העיבוד מראש מטופל בתוך הפונקציה classify(). אין צורך לעיבוד מראש נוסף של טקסט הקלט מראש.

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

הרצת המשימה

'מסווג טקסט' משתמש בפונקציה TextClassifier.classify() כדי להריץ את מסקנות. לביצוע הסיווג, צריך להשתמש בשרשור הפעלה נפרד כדי לא לחסום את השרשור בממשק המשתמש של Android עם האפליקציה שלכם.

הקוד הבא מדגים איך מבצעים את העיבוד באמצעות המשימה באמצעות שרשור ביצוע נפרד.

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

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

בדוגמה עם הקוד אפשר לראות דוגמה להרצת משימה. TextClassifierHelper מחלקה classify().

טיפול בתוצאות והצגתן

מסווג הטקסט מפיק פלט של 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 כיתה פנימית.