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

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

classification_result_screen.png

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

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

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

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

מה תלמדו

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

מה צריך להכין

  • ‫Xcode 11 (או גרסה מתקדמת יותר)
  • ‫CocoaPods 1.9.1 (או גרסה מתקדמת יותר)

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

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

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

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

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

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

  1. עוברים אל מסוף Firebase.
  2. בוחרים באפשרות Create New Project (יצירת פרויקט חדש) ונותנים לפרויקט את השם Firebase ML iOS Codelab.

3. קבלת פרויקט לדוגמה

הורדת הקוד

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

git clone https://github.com/FirebaseExtended/codelab-textclassification-ios.git
cd codelab-textclassification-ios
pod install --repo-update

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

הגדרת Firebase

פועלים לפי התיעוד כדי ליצור פרויקט חדש ב-Firebase. אחרי שיוצרים את הפרויקט, מורידים את קובץ GoogleService-Info.plist מה-Firebase console וגוררים אותו לשורש של פרויקט Xcode.

9efb62a92f27e939.png

מוסיפים את Firebase ל-Podfile ומריצים את הפקודה pod install.

pod 'FirebaseMLModelDownloader', '9.3.0-beta'

בשיטה AppDelegate's didFinishLaunchingWithOptions, מייבאים את Firebase לחלק העליון של הקובץ

import FirebaseCore

מוסיפים קריאה להגדרת Firebase.

FirebaseApp.configure()

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

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

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

השלב הזה מוצג כ-notebook של Python שאפשר לפתוח ב-Google Colab.

פתיחה ב-Colab

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

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

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

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

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

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

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

3c3c50e6ef12b3b.png

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

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

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

בחלק העליון של ModelLoader.swift, מייבאים את מודול Firebase.

import FirebaseCore
import FirebaseMLModelDownloader

ואז מטמיעים את השיטות הבאות.

static func downloadModel(named name: String,
                          completion: @escaping (CustomModel?, DownloadError?) -> Void) {
  guard FirebaseApp.app() != nil else {
    completion(nil, .firebaseNotInitialized)
    return
  }
  guard success == nil && failure == nil else {
    completion(nil, .downloadInProgress)
    return
  }
  let conditions = ModelDownloadConditions(allowsCellularAccess: false)
  ModelDownloader.modelDownloader().getModel(name: name, downloadType: .localModelUpdateInBackground, conditions: conditions) { result in
          switch (result) {
          case .success(let customModel):
                  // Download complete.
                  // The CustomModel object contains the local path of the model file,
                  // which you can use to instantiate a TensorFlow Lite classifier.
                  return completion(customModel, nil)
          case .failure(let error):
              // Download was unsuccessful. Notify error message.
            completion(nil, .downloadFailed(underlyingError: error))
          }
  }
}

ב-ViewController.swift viewDidLoad, מחליפים את הקריאה אל loadModel() בשיטה החדשה להורדת המודל.

// Download the model from Firebase
print("Fetching model...")
ModelLoader.downloadModel(named: "sentiment_analysis") { (customModel, error) in
  guard let customModel = customModel else {
    if let error = error {
      print(error)
    }
    return
  }

  print("Model download complete")

  // TODO: Initialize an NLClassifier from the downloaded model
}

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

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

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

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

עוברים אל קובץ ה-Podfile של האפליקציה ומוסיפים את TensorFlow Lite Task Library (Text) לתלות של האפליקציה. חשוב להוסיף את יחסי התלות מתחת להצהרה target 'TextClassification'.

pod 'TensorFlowLiteTaskText', '~> 0.2.0'

מריצים את הפקודה pod install כדי להתקין את התלות החדשה.

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

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

ViewController.swift

נצהיר על משתנה מופע של TFLNLClassifier. בחלק העליון של הקובץ, מייבאים את התלות החדשה:

import TensorFlowLiteTaskText

התגובה הזו מופיעה מעל השיטה ששינינו בשלב האחרון:

// TODO: Add a TFLNLClassifier property.

מחליפים את הערך TODO בקוד הבא:

private var classifier: TFLNLClassifier?

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

// TODO: Initialize an NLClassifier from the downloaded model

מחליפים את הערך TODO בקוד הבא:

let options = TFLNLClassifierOptions()
self.classifier = TFLNLClassifier.nlClassifier(modelPath: customModel.path, options: options)

סיווג טקסט

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

ViewController.swift

בשיטה classify(text:), מאתרים את התגובה TODO:

// TODO: Run sentiment analysis on the input text

מחליפים את ההערה בקוד הבא:

guard let classifier = self.classifier else { return }

// Classify the text
let classifierResults = classifier.classify(text: text)

// Append the results to the list of results
let result = ClassificationResult(text: text, results: classifierResults)
results.append(result)

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

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

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

classification_result_screen.png

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

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

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

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

10. כל הכבוד!

ב-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.

מידע נוסף

יש לכם שאלה?

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