הוספת סיווג טקסט במכשיר לאפליקציה באמצעות TensorFlow Lite ו-Firebase – Android Codelab

1. סקירה כללית

text-classification-result.png

ברוכים הבאים ל-codelab בנושא סיווג טקסט באמצעות TensorFlow Lite ו-Firebase. ב-Codelab הזה תלמדו איך להשתמש ב-TensorFlow Lite וב-Firebase כדי לאמן מודל לסיווג טקסט ולפרוס אותו באפליקציה. ה-Codelab הזה מבוסס על הדוגמה הזו של TensorFlow Lite.

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

ניתוח סנטימנטים הוא תהליך של פירוש וסיווג של רגשות (חיוביים, שליליים וניטרליים) בנתוני טקסט באמצעות טכניקות של ניתוח טקסט. ניתוח סנטימנט מאפשר לעסקים לזהות את הסנטימנט של הלקוחות כלפי מוצרים, מותגים או שירותים בשיחות ובמשוב באינטרנט.

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

מה תלמדו

  • אימון מודלים של ניתוח סנטימנט ב-TF Lite באמצעות TF Lite Model Maker
  • פריסת מודלים של TF Lite ב-Firebase ML וגישה אליהם מהאפליקציה
  • שילוב של מודלים של ניתוח סנטימנטים ב-TF Lite באפליקציה באמצעות ספריית המשימות של TF Lite

מה צריך

  • הגרסה האחרונה של Android Studio.
  • קוד לדוגמה.
  • מכשיר בדיקה עם Android מגרסה 5.0 ומעלה ו-Google Play Services מגרסה 9.8 ומעלה, או אמולטור עם Google Play Services מגרסה 9.8 ומעלה
  • אם משתמשים במכשיר, צריך כבל חיבור.

איך תשתמשו במדריך הזה?

קריאה בלבד קריאה והשלמת התרגילים

איך היית מדרג את חוויית הפיתוח שלך באפליקציות ל-Android?

מתחילים ביניים מומחים

2. קבלת קוד לדוגמה

משכפלים את המאגר ב-GitHub משורת הפקודה.

$ git clone https://github.com/FirebaseExtended/codelab-textclassification-android.git

אם לא התקנתם את git, אתם יכולים גם להוריד את פרויקט הדוגמה מדף GitHub שלו או בלחיצה על הקישור הזה.

3. ייבוא של אפליקציה למתחילים

ב-Android Studio, בוחרים את הספרייה codelab-textclassification-android-master ( android_studio_folder.png) מתוך ההורדה של קוד לדוגמה (File > Open > .../codelab-textclassification-android-master/start).

עכשיו הפרויקט ההתחלתי אמור להיפתח ב-Android Studio.

4. הפעלת האפליקציה למתחילים

אחרי שיובא הפרויקט ל-Android Studio, אפשר להריץ את האפליקציה בפעם הראשונה. מחברים את מכשיר Android ולוחצים על Run (הפעלה) ( execute.png) בסרגל הכלים של Android Studio.

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

2fb4e69fafb2e3ed.png

5. יצירת פרויקט במסוף Firebase

הוספת Firebase לפרויקט

  1. עוברים אל מסוף Firebase.
  2. בוחרים באפשרות הוספת פרויקט.
  3. בוחרים או מזינים שם פרויקט.
  4. ממשיכים לבצע את שאר שלבי ההגדרה במסוף Firebase, ואז לוחצים על Create project (יצירת פרויקט) (או על Add Firebase (הוספת Firebase) אם משתמשים בפרויקט קיים ב-Google).

6. הוספת Firebase לאפליקציה

  1. במסך הסקירה הכללית של הפרויקט החדש, לוחצים על סמל Android כדי להפעיל את תהליך ההגדרה.
  2. מזינים את שם החבילה של ה-codelab: org.tensorflow.lite.codelabs.textclassification

הוספת קובץ google-services.json לאפליקציה

אחרי שמוסיפים את שם החבילה ובוחרים באפשרות Register** (הרשמה), לוחצים על Download google-services.json** (הורדת google-services.json) כדי לקבל את קובץ ההגדרות של Firebase Android, ואז מעתיקים את הקובץ google-services.json לספרייה *app* בפרויקט.

הוספת הפלאגין google-services לאפליקציה

פועלים לפי ההוראות במסוף Firebase לעדכון הקבצים build.gradle.kts כדי להוסיף את Firebase לאפליקציה.

הפלאגין google-services משתמש בקובץ google-services.json כדי להגדיר את האפליקציה לשימוש ב-Firebase.

סנכרון הפרויקט עם קובצי gradle

כדי לוודא שכל התלויות זמינות לאפליקציה, בשלב הזה צריך לסנכרן את הפרויקט עם קובצי gradle. בסרגל הכלים של Android Studio, בוחרים באפשרות File > Sync Project with Gradle Files (קובץ > סנכרון הפרויקט עם קובצי Gradle).

7. הפעלת האפליקציה עם Firebase

אחרי שמגדירים את התוסף google-services באמצעות קובץ ה-JSON, אפשר להפעיל את האפליקציה עם Firebase. מחברים את מכשיר Android ולוחצים על Run (הפעלה) ( execute.png) בסרגל הכלים של Android Studio.

האפליקציה אמורה להיפתח במכשיר. בשלב הזה, האפליקציה עדיין אמורה להיבנות בהצלחה.

8. אימון מודל לניתוח סנטימנטים

נשתמש ב-TensorFlow Lite Model Maker כדי לאמן מודל לסיווג טקסט, במטרה לחזות את הסנטימנט של טקסט נתון.

השלב הזה מוצג כ-notebook של Python שאפשר לפתוח ב-Google Colab. אפשר לבחור באפשרות Runtime > Run all (זמן ריצה > הפעלת הכול) כדי להריץ את כל ה-notebook בבת אחת.

פתיחה ב-Colab

אחרי שתסיימו את השלב הזה, יהיה לכם מודל לניתוח סנטימנט של TensorFlow Lite שמוכן לפריסה באפליקציה לנייד.

9. פריסת מודל ב-Firebase ML

יש שתי סיבות עיקריות לכך שכדאי לפרוס מודל ל-Firebase ML:

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

אפשר לפרוס את המודל דרך המסוף או באופן פרוגרמטי באמצעות Firebase Admin SDK. בשלב הזה נבצע פריסה דרך המסוף.

קודם פותחים את מסוף Firebase ולוחצים על Machine Learning (למידת מכונה) בחלונית הניווט הימנית. אם זו הפעם הראשונה שאתם פותחים את הכלי הזה, לוחצים על 'שנתחיל?'. לאחר מכן עוברים אל 'בהתאמה אישית' ולוחצים על הלחצן 'הוספת מודל'.

כשמוצגת בקשה, נותנים למודל את השם sentiment_analysis ומעלים את הקובץ שהורדתם מ-Colab בשלב הקודם.

3c3c50e6ef12b3b.png

10. הורדת מודל מ-Firebase ML

יכול להיות שיהיה לכם קשה להחליט מתי להוריד את המודל המרוחק מ-Firebase לאפליקציה, כי מודלים של TFLite יכולים להיות גדולים יחסית. הכי טוב להימנע מטעינת המודל באופן מיידי כשהאפליקציה מופעלת, כי אם המודל ישמש רק לתכונה אחת והמשתמש אף פעם לא ישתמש בתכונה הזו, נוריד כמות משמעותית של נתונים ללא סיבה. אפשר גם להגדיר אפשרויות הורדה, כמו אחזור מודלים רק כשיש חיבור ל-Wi-Fi. אם רוצים לוודא שהמודל יהיה זמין גם ללא חיבור לרשת, חשוב גם לארוז אותו ללא האפליקציה כגיבוי.

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

בקובץ app/build.gradle.kts, מוסיפים את התלות של Firebase Machine Learning.

app/build.gradle.kts

חיפוש התגובה הזו:

// TODO 1: Add Firebase ML dependency

לאחר מכן מוסיפים:

implementation(platform("com.google.firebase:firebase-bom:32.0.0"))
implementation("com.google.firebase:firebase-ml-modeldownloader:24.1.2")

כש-Android Studio מבקש לסנכרן את הפרויקט, בוחרים באפשרות Sync Now (סנכרון עכשיו).

עכשיו נוסיף קוד להורדת המודל מ-Firebase.

MainActivity.java

חיפוש התגובה הזו:

// TODO 2: Implement a method to download TFLite model from Firebase

לאחר מכן מוסיפים:

  /** Download model from Firebase ML. */
  private synchronized void downloadModel(String modelName) {
      CustomModelDownloadConditions conditions = new CustomModelDownloadConditions.Builder()
            .requireWifi()
            .build();
      FirebaseModelDownloader.getInstance()
              .getModel("sentiment_analysis", DownloadType.LOCAL_MODEL, conditions)
              .addOnSuccessListener(model -> {
                  try {
                      // TODO 6: Initialize a TextClassifier with the downloaded model

                      predictButton.setEnabled(true);
                  } catch (IOException e) {
                      Log.e(TAG, "Failed to initialize the model. ", e);
                      Toast.makeText(
                              MainActivity.this,
                              "Model initialization failed.",
                              Toast.LENGTH_LONG)
                              .show();
                      predictButton.setEnabled(false);
                  }
              })
              .addOnFailureListener(e -> {
                      Log.e(TAG, "Failed to download the model. ", e);
                      Toast.makeText(
                              MainActivity.this,
                              "Model download failed, please check your connection.",
                              Toast.LENGTH_LONG)
                              .show();

                      }
              );

}

לאחר מכן, קוראים לשיטה downloadModel בשיטה onCreate של הפעילות.

MainActivity.java

חיפוש התגובה הזו:

// TODO 3: Call the method to download TFLite model

לאחר מכן מוסיפים:

downloadModel("sentiment_analysis");

11. הטמעת המודל באפליקציה

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

הוספת יחסי תלות

עוברים לקובץ Gradle של האפליקציה ומוסיפים את ספריית המשימות של TensorFlow Lite (טקסט) לתלות של האפליקציה.

app/build.gradle

חיפוש התגובה הזו:

// TODO 4: Add TFLite Task API (Text) dependency

לאחר מכן מוסיפים:

implementation("org.tensorflow:tensorflow-lite-task-text:0.3.0")

כש-Android Studio מבקש לסנכרן את הפרויקט, בוחרים באפשרות Sync Now (סנכרון עכשיו).

הפעלת סיווג טקסט

לאחר מכן נטען את מודל ניתוח הסנטימנטים שהורד מ-Firebase באמצעות NLClassifier של Task Library.

MainActivity.java

נצהיר על משתנה מופע NLClassifier. חיפוש התגובה הזו:

// TODO 5: Define a NLClassifier variable

לאחר מכן מוסיפים:

private NLClassifier textClassifier;

מאתחלים את המשתנה textClassifier באמצעות מודל ניתוח הסנטימנט שהורד מ-Firebase. חיפוש התגובה הזו:

// TODO 6: Initialize a TextClassifier with the downloaded model

לאחר מכן מוסיפים:

textClassifier = NLClassifier.createFromFile(model.getFile());

סיווג טקסט

אחרי שמגדירים את המופע של textClassifier, אפשר להריץ ניתוח סנטימנט באמצעות קריאה אחת בלבד לשיטה.

MainActivity.java

חיפוש התגובה הזו:

// TODO 7: Run sentiment analysis on the input text

לאחר מכן מוסיפים:

List<Category> results = textClassifier.classify(text);

הטמעה של עיבוד תמונה (Post Processing)

לבסוף, נמיר את הפלט של המודל לטקסט תיאורי שיוצג במסך.

MainActivity.java

חיפוש התגובה הזו:

// TODO 8: Convert the result to a human-readable text

מסירים את הקוד שיוצר את הטקסט של התוצאה הפיקטיבית:

String textToShow = "Dummy classification result.\n";

לאחר מכן מוסיפים:

String textToShow = "Input: " + text + "\nOutput:\n";
for (int i = 0; i < results.size(); i++) {
  Category result = results.get(i);
  textToShow += String.format("    %s: %s\n", result.getLabel(),
                              result.getScore());
}
textToShow += "---------\n";

12. הרצת האפליקציה הסופית

הטמעתם את מודל ניתוח הסנטימנטים באפליקציה, אז בואו נבדוק אותו. מחברים את מכשיר Android ולוחצים על Run (הפעלה) ( execute.png) בסרגל הכלים של Android Studio.

האפליקציה צריכה לחזות בצורה נכונה את הסנטימנט של הביקורת על הסרט שתזינו.

img/text-classification-result.png

13. שיפור האפליקציה באמצעות תכונות נוספות של Firebase

בנוסף לאירוח מודלים של TFLite, פלטפורמת Firebase מספקת כמה תכונות נוספות שיכולות לשפר את תרחישי השימוש שלכם בלמידת מכונה:

  • מעקב אחר ביצועים ב-Firebase כדי למדוד את מהירות ההסקה של המודל שפועל במכשיר של המשתמשים.
  • ‫Firebase Analytics כדי למדוד את הביצועים של המודל בסביבת הייצור על ידי מדידת התגובה של המשתמשים.
  • ‫Firebase A/B Testing כדי לבדוק כמה גרסאות של המודל
  • זוכר שאמנו קודם שתי גרסאות של מודל TFLite? בדיקות A/B הן דרך טובה לגלות איזו גרסה מניבה ביצועים טובים יותר בסביבת הייצור.

כדי לקבל מידע נוסף על השימוש בתכונות האלה באפליקציה, אפשר לעיין ב-codelabs הבאים:

14. כל הכבוד!

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

מה נכלל

  • TensorFlow Lite
  • Firebase ML

השלבים הבאים

  • מדידת מהירות ההסקה של המודל באמצעות מעקב אחר ביצועים ב-Firebase.
  • פריסת המודל מ-Colab ישירות ל-Firebase באמצעות Firebase ML Model Management API.
  • מוסיפים מנגנון שמאפשר למשתמשים לשלוח משוב על תוצאת החיזוי, ומשתמשים ב-Firebase Analytics כדי לעקוב אחרי המשוב מהמשתמשים.
  • מבצעים בדיקת A/B למודל Average Word Vector ולמודל MobileBERT באמצעות Firebase A/B Testing.

מידע נוסף

יש לכם שאלה?

דיווח על בעיות