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

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

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

קוד לדוגמה

הקוד לדוגמה של Tasks MediaPipe הוא יישום בסיסי של אפליקציה של Text Classifier ל-iOS.

אפשר להשתמש באפליקציה כנקודת התחלה לאפליקציה ל-iOS או להפנות אליה כשמשנים אפליקציה קיימת. אפשר לעיין בקוד לדוגמה של 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/ios/
    

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

רכיבים עיקריים

הקבצים הבאים מכילים את הקוד החיוני לאפליקציה לדוגמה של Text Classifier:

הגדרה

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

יחסי תלות

מסווג טקסט משתמש בספרייה MediaPipeTasksText, שאותה צריך להתקין באמצעות CocoaPods. הספרייה תואמת לאפליקציות של Swift וגם לאפליקציות Objective-C, ואין צורך בהגדרות נוספות ספציפיות לשפה.

תוכלו למצוא הוראות להתקנת CocoaPods ב-macOS במדריך ההתקנה של CocoaPods. לשימוש ב-CocoaPods תוכלו למצוא הוראות ליצירת Podfile עם הרפידות הנדרשות לאפליקציה.

מוסיפים את רצף MediaPipeTasksText ב-Podfile באמצעות הקוד הבא:

target 'MyTextClassifierApp' do
  use_frameworks!
  pod 'MediaPipeTasksText'
end

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

מודל

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

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

השתמשו במאפיין BaseOptions.modelAssetPath כדי לציין את הנתיב למודל ב-App Bundle. דוגמה לקוד זמינה בקטע הבא.

יצירת המשימה

אפשר ליצור את המשימה של מסווג טקסט על ידי קריאה לאחד מהמפעילים שלה. המאתחל TextClassifier(options:) מגדיר ערכים לאפשרויות התצורה.

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

הקוד הבא מדגים איך ליצור ולהגדיר את המשימה הזו.

Swift

import MediaPipeTasksText

let modelPath = Bundle.main.path(forResource: "model",
                                      ofType: "tflite")

let options = TextClassifierOptions()
options.baseOptions.modelAssetPath = modelPath
options.scoreThreshold = 0.6

let textClassifier = try TextClassifier(options: options)

Objective-C

@import MediaPipeTasksText;

NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"model"
                                                      ofType:@"tflite"];

MPPTextClassifierOptions *options = [[MPPTextClassifierOptions alloc] init];
options.baseOptions.modelAssetPath = modelPath;
options.scoreThreshold = 0.6;

MPPTextClassifier *textClassifier =
      [[MPPTextClassifier alloc] initWithOptions:options error:nil];

אפשרויות הגדרה

המשימה כוללת את אפשרויות ההגדרה הבאות לאפליקציות ל-iOS:

שם האפשרות תיאור טווח ערכים ערך ברירת מחדל
displayNamesLocale ההגדרה הזו מגדירה את השפה של התוויות שישמשו לשמות תצוגה שנמסרים במטא-נתונים של מודל המשימה, אם יש כאלה. ברירת המחדל היא en עבור אנגלית. אפשר להוסיף תוויות שהותאמו לשוק המקומי למטא-נתונים של מודל מותאם אישית באמצעות TensorFlow Lite Metadata Writer API קוד הלוקאל en
maxResults הפונקציה מגדירה את המספר המקסימלי האופציונלי של תוצאות מהסיווג הגבוה ביותר להחזרה. אם הערך קטן מ-0, יוחזרו כל התוצאות הזמינות. כל מספר חיובי -1
scoreThreshold השדה הזה מגדיר את סף הציון של החיזוי ששונה מהסף שצוין במטא-נתונים של המודל (אם יש כזה). תוצאות מתחת לערך הזה יידחו. כל מספר ממשי (float) לא הוגדרה
categoryAllowlist מגדיר את הרשימה האופציונלית של שמות הקטגוריות המותרות. אם השדה לא ריק, תוצאות סיווג ששם הקטגוריה שלהן לא נכלל בקבוצה הזו יסוננו. המערכת מתעלמת משמות כפולים או לא ידועים של קטגוריות. האפשרות הזו בלעדית ל-categoryDenylist ומשתמשת בשתי התוצאות כשגיאה. כל מחרוזת לא הוגדרה
categoryDenylist מגדיר את הרשימה האופציונלית של שמות קטגוריות אסורים. אם התוצאות לא ריקות, תוצאות הסיווג ששם הקטגוריה שלהן נכלל בקבוצה הזו יסוננו. המערכת מתעלמת משמות כפולים או לא ידועים של קטגוריות. האפשרות הזו בלעדית ל-categoryAllowlist, והשימוש בשתי האפשרויות האלה גורם לשגיאה. כל מחרוזת לא הוגדרה

הכנת הנתונים

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

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

Swift

let text = "The input text to be classified."

Objective-C

NSString *text = @"The input text to be classified.";

מריצים את המשימה.

כדי להפעיל את מסווג הטקסט, יש להשתמש בשיטה classify(text:). מסווג הטקסט מחזיר את הקטגוריות האפשריות לטקסט הקלט.

Swift

let result = try textClassifier.classify(text: text)

Objective-C

MPPTextClassifierResult *result = [textClassifier classifyText:text
                                                          error:nil];

הערה: המשימה חוסמת את ה-thread הנוכחי עד שהוא מסיים להריץ את ההסקה של הטקסט. כדי לא לחסום את ה-thread הנוכחי, צריך להפעיל את העיבוד בשרשור ברקע באמצעות Dispatch של iOS או NSOperation.

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

לאחר ההסקה, המשימה של 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".

הקובץ ViewController.swift בקוד לדוגמה מדגים איך להציג את תוצאות הזיהוי שהוחזרו מהמשימה.