מדריך להטמעת טקסט ב-iOS

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

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

קוד לדוגמה

קוד הדוגמה של Text Embedder מספק הטמעה בסיסית של אפליקציה ל-iOS שמשלבת את המשימה הזו. בדוגמה מוערכת הדמיון הסמנטי בין שני קטעי טקסט, ונדרש מכשיר iOS פיזי או סימולטור של iOS.

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

מורידים את הקוד

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

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

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

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

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

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

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

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

  • TextEmbedderService.swift: הפונקציה הזו מאתחלת את הטקסט שמוטמע ומפעילה את ההסקה על נתוני הקלט.
  • ViewController.swift: הקוד שמטמיע את ממשק המשתמש ומעצב את התוצאות.

הגדרה

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

יחסי תלות

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

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

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

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

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

דגם

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

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

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

יצירת המשימה

אפשר ליצור את המשימה Text Embedder על ידי קריאה לאחד מהמפעילים שלה. ה-initializer של TextEmbedder(options:) מקבל ערכים לאפשרויות ההגדרה.

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

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

Swift

import MediaPipeTasksText

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

let options = TextEmbedderOptions()
options.baseOptions.modelAssetPath = modelPath
options.quantize = true

let textEmbedder = try TextEmbedder(options: options)

Objective-C

@import MediaPipeTasksText;

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

MPPTextEmbedderOptions *options = [[MPPTextEmbedderOptions alloc] init];
options.baseOptions.modelAssetPath = modelPath;
options.quantize = YES;

MPPTextEmbedder *textEmbedder =
      [[MPPTextEmbedder alloc] initWithOptions:options error:nil];

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

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

שם האפשרות תיאור טווח ערכים ערך ברירת מחדל
l2_normalize האם לבצע נורמליזציה של וקטור המאפיינים המוחזר באמצעות נורמלי L2. משתמשים באפשרות הזו רק אם המודל כבר לא מכיל אופרטור L2_NORMALIZATION מקורי של TFLite. ברוב המקרים, המצב הזה כבר קיים, ולכן נורמליזציה של L2 מתבצעת באמצעות היסק של TFLite ללא צורך באפשרות הזו. Boolean False
quantize האם להצפין את הטמעת הנתונים שחוזרת לבייטים באמצעות קידוד סקלר. ההנחה במרומז היא שהטמעות הטמעות הן יחידה נורמלית (unit-norm), ולכן מובטח שלכל מאפיין יהיה ערך בתקן [ -1.0, 1.0]. אם זה לא המצב, צריך להשתמש באפשרות l2_normalize. Boolean False

הרצת המשימה

כדי להטמיע את טקסט הקלט ולקבל את וקטורי ההטמעה שלו, אפשר להשתמש בשיטה embed(text:) של TextEmbedder.

Swift

let result = try textEmbedder.embed(text: text)

Objective-C

MPPTextEmbedderResult *result = [textEmbedder embedText:text
                                                  error:nil];

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

בקוד לדוגמה, השיטה embed(text:) נקראת בקובץ TextEmbedderService.swift.

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

לאחר הפעלת ההסקה, המשימה Text Embedder מחזירה אובייקט TextEmbedderResult שמכיל רשימה של הטמעות (נקודות צפות או סקלר-קוונטיזציה) של טקסט הקלט.

בהמשך מוצגת דוגמה לנתוני הפלט של המשימה הזו:

TextEmbedderResult:
  Embedding #0 (sole embedding head):
    float_embedding: {0.2345f, 0.1234f, ..., 0.6789f}
    head_index: 0

אפשר להשוות את הדמיון הסמנטי בין שתי הטמעות באמצעות השיטה TextEmbedder.cosineSimilarity.

Swift

let similarity = try TextEmbedder.cosineSimilarity(
  embedding1: result.embeddingResult.embeddings[0],
  embedding2: otherResult.embeddingResult.embeddings[0])
    

Objective-C

NSNumber *similarity = [MPPTextEmbedder
      cosineSimilarityBetweenEmbedding1:result.embeddingResult.embeddings[0]
                          andEmbedding2:otherResult.embeddingResult.embeddings[0]
                                  error:nil];
    

בקוד לדוגמה, השיטה TextEmbedder.cosineSimilarity נקראת בקובץ TextEmbedderService.swift.