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

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

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

קוד לדוגמה

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

אפשר להשתמש באפליקציה כנקודת התחלה של אפליקציה משלכם ל-Android, או להתייחס אליה כשאתם משנים אפליקציה קיימת. הקוד לדוגמה של Text Implementder מתארח ב-GitHub.

הורדת הקוד

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

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

  1. משכפלים את מאגר ה-Git באמצעות הפקודה הבאה:
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. לחלופין, אפשר להגדיר את מכונת ה-Git לשימוש בקופה עם נפח נתונים sparse, כדי שיהיו לכם רק את הקבצים של האפליקציה לדוגמה של Text Implementder:
    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/text_embedder/android
    

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

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

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

  • TextEmbedderHelper.kt: הפעלה של הטמעת הטקסט ומטפלת בבחירת המודל והנציגים.
  • MainActivity.kt: יישום והרכבה של רכיבי ממשק המשתמש.

הגדרה

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

יחסי תלות

'הטמעת טקסט' משתמש בספריות com.google.mediapipe:tasks-text. מוסיפים את התלות הזאת לקובץ build.gradle של פרויקט פיתוח האפליקציה ל-Android. אפשר לייבא את יחסי התלות הנדרשים באמצעות הקוד הבא:

dependencies {
    implementation 'com.google.mediapipe:tasks-text:latest.release'
}

מודל

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

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

<dev-project-root>/src/main/assets

מציינים את הנתיב של המודל בתוך הפרמטר ModelAssetPath. בקוד לדוגמה, המודל מוגדר בפונקציה setupTextEmbedder() בקובץ TextEmbedderHelper.kt:

השתמשו בפונקציה BaseOptions.Builder.setModelAssetPath() כדי לציין את הנתיב שהמודל משתמש בו. ניתן למצוא את השיטה הזו בקטע הקוד בדוגמה הבאה.

יצירת המשימה

אפשר להשתמש באחת מהפונקציות של createFrom...() כדי ליצור את המשימה. הפונקציה createFromOptions() מקבלת אפשרויות תצורה כדי להגדיר את אפשרויות ההטמעה. אפשר גם לאתחל את המשימה באמצעות פונקציית היצרן createFromFile(). הפונקציה createFromFile() מקבלת נתיב יחסי או מוחלט לקובץ המודל שעבר אימון. מידע נוסף על אפשרויות ההגדרה זמין במאמר אפשרויות תצורה.

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

val baseOptions = baseOptionsBuilder.build()
val optionsBuilder =
    TextEmbedderOptions.builder().setBaseOptions(baseOptions)
val options = optionsBuilder.build()
textEmbedder = TextEmbedder.createFromOptions(context, options)

הטמעת הקוד לדוגמה מגדירה את האפשרויות של הטמעת הטקסט בפונקציה setupTextEmbedder() בקובץ TextEmbedderHelper.kt.

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

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

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

הכנת הנתונים

'הטמעת טקסט' פועל עם נתוני טקסט (String). המשימה מטפלת בעיבוד מראש של קלט הנתונים, כולל המרה לאסימונים ועיבוד מראש של tensor. כל העיבוד מראש מתבצע בפונקציה embed(). אין צורך בעיבוד מראש נוסף של טקסט הקלט לפני כן.

val inputText = "The input text to be embedded."

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

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

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

textEmbedder?.let {
    val firstEmbed =
        it.embed(firstText).embeddingResult().embeddings().first()
    val secondEmbed =
        it.embed(secondText).embeddingResult().embeddings().first()
    ...
}

בקוד לדוגמה, הפונקציה embed מופעלת בקובץ TextEmbedderHelper.kt.

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

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

דוגמה לנתוני הפלט מהמשימה הזאת:

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

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

val similarity = TextEmbedder.cosineSimilarity(firstEmbed, secondEmbed)

בקוד לדוגמה, הפונקציה TextEmbedder.cosineSimilarity() מופעלת בקובץ TextEmbedderHelper.kt.