מדריך להטמעת טקסט ב-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 לשימוש ב-sparse checkout, כך שיישארו רק הקבצים של אפליקציית הדוגמה של Text Embedder:

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

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

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

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

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

הגדרה

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

יחסי תלות

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

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

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

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

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

דגם

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

בוחרים מודל ומורידים אותו, ומוסיפים אותו לספריית הפרויקט באמצעות 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 Op. ברוב המקרים, זה כבר המצב. נירמול L2 נוצר באמצעות הסקת TFLite ללא צורך באפשרות הזו. Boolean False
quantize אם יש לכמת את ההטמעה שהוחזרה לבייטים באמצעות כימות סקלרי. ההנחה לגבי הטמעות היא שהן נורמליות ליחידה, ולכן לכל מאפיין מובטח ערך בטווח [-1.0, 1.0]. אם זה לא המצב, השתמשו באפשרות l2_regularize. Boolean False

הרצת המשימה

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

Swift

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

Objective-C

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

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