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

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

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

קוד לדוגמה

קוד הדוגמה למשימות MediaPipe הוא יישום בסיסי של מסווג טקסט אפליקציה ל-iOS.

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

להורדת הקוד

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

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

  1. משכפלים את מאגר ה-Git באמצעות הפקודה הבאה:

    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. לחלופין, להגדיר את מכונת ה-Git שלך לשימוש בקופה עם היעדר תשלום, כדי רק הקבצים עבור האפליקציה לדוגמה של מסווג הטקסט:

    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/text_classification/ios/
    

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

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

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

הגדרה

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

יחסי תלות

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

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

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

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

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

דגם

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

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

משתמשים במאפיין 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];

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

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

כשמריצים את ההסקה, המשימה של מסווג הטקסט מחזירה 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 בקוד לדוגמה מדגים איך להציג את תוצאות הזיהוי שהוחזרו מהמשימה.