Anleitung zum Einbetten von Text unter Android

Mit der Aufgabe „MediaPipe-Texteinbettung“ können Sie eine numerische Darstellung von Textdaten erstellen, um ihre semantische Bedeutung zu erfassen. In dieser Anleitung erfahren Sie, wie Sie den Texteinbetter mit Android-Apps verwenden.

Weitere Informationen zu den Funktionen, Modellen und Konfigurationsoptionen dieser Aufgabe finden Sie in der Übersicht.

Codebeispiel

Der Beispielcode von MediaPipe Tasks ist eine einfache Implementierung einer Text Embedder-Anwendung für Android. In diesem Beispiel werden die semantischen Ähnlichkeiten zwischen zwei Textelementen ausgewertet. Es ist entweder ein physisches Android-Gerät oder ein Android-Emulator erforderlich.

Du kannst die App als Ausgangspunkt für deine eigene Android-App verwenden oder beim Ändern einer vorhandenen App darauf zurückgreifen. Der Beispielcode für Texteinbetter wird auf GitHub gehostet.

Code herunterladen

In der folgenden Anleitung erfahren Sie, wie Sie mit dem git-Befehlszeilentool eine lokale Kopie des Beispielcodes erstellen.

So laden Sie den Beispielcode herunter:

  1. Klonen Sie das Git-Repository mit dem folgenden Befehl:
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. Konfigurieren Sie optional die Git-Instanz für die Verwendung von Sparse Checkout, sodass Sie nur die Dateien für die Beispielanwendung „Text Embedder“ haben:
    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/text_embedder/android
    

Nachdem Sie eine lokale Version des Beispielcodes erstellt haben, können Sie das Projekt in Android Studio importieren und die App ausführen. Eine Anleitung finden Sie im Einrichtungsleitfaden für Android.

Schlüsselkomponenten

Die folgenden Dateien enthalten den wichtigen Code für diese Beispielanwendung zum Einbetten von Texten:

  • TextEmbedderHelper.kt: Initialisiert den Texteinbetter und verarbeitet die Modell- und Delegierungsauswahl.
  • MainActivity.kt: Implementiert die Anwendung und stellt die Komponenten der Benutzeroberfläche zusammen.

Einrichtung

In diesem Abschnitt werden die wichtigsten Schritte zum Einrichten Ihrer Entwicklungsumgebung und Codeprojekte speziell für die Verwendung von Text Embedder beschrieben. Allgemeine Informationen zum Einrichten der Entwicklungsumgebung für die Verwendung von MediaPipe-Aufgaben, einschließlich der Anforderungen an die Plattformversion, finden Sie im Einrichtungsleitfaden für Android.

Abhängigkeiten

Text Embedder verwendet die com.google.mediapipe:tasks-text-Bibliotheken. Füge diese Abhängigkeit in die Datei build.gradle deines Android-App-Entwicklungsprojekts ein. Sie können die erforderlichen Abhängigkeiten mit dem folgenden Code importieren:

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

Modell

Die „MediaPipe-Texteinbettung“-Aufgabe erfordert ein trainiertes Modell, das mit dieser Aufgabe kompatibel ist. Weitere Informationen zu verfügbaren trainierten Modellen für Text Embedder finden Sie in der Aufgabenübersicht im Abschnitt „Modelle“.

Wählen Sie das Modell aus, laden Sie es herunter und speichern Sie es dann in Ihrem Projektverzeichnis:

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

Geben Sie den Pfad des Modells innerhalb des Parameters ModelAssetPath an. Im Beispielcode wird das Modell in der Funktion setupTextEmbedder() in der Datei TextEmbedderHelper.kt definiert:

Verwenden Sie die Funktion BaseOptions.Builder.setModelAssetPath(), um den vom Modell verwendeten Pfad anzugeben. Auf diese Methode wird im Codebeispiel im nächsten Abschnitt verwiesen.

Aufgabe erstellen

Sie können eine der createFrom...()-Funktionen verwenden, um die Aufgabe zu erstellen. Die Funktion createFromOptions() akzeptiert Konfigurationsoptionen, um die Einbettungsoptionen festzulegen. Sie können die Aufgabe auch mit der Factory-Funktion createFromFile() initialisieren. Die Funktion createFromFile() akzeptiert einen relativen oder absoluten Pfad zur Datei des trainierten Modells. Weitere Informationen zu Konfigurationsoptionen finden Sie unter Konfigurationsoptionen.

Im folgenden Codebeispiel wird gezeigt, wie diese Aufgabe erstellt und konfiguriert wird.

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

Durch die Implementierung des Beispielcodes werden die Optionen für Texteinbettungen in der Funktion setupTextEmbedder() in der Datei TextEmbedderHelper.kt festgelegt.

Konfigurationsoptionen

Diese Aufgabe umfasst die folgenden Konfigurationsoptionen für Android-Apps:

Option Beschreibung Wertebereich Standardwert
l2_normalize Gibt an, ob der zurückgegebene Featurevektor mit der L2-Norm normalisiert werden soll. Verwenden Sie diese Option nur, wenn das Modell noch keinen nativen L2_NORMALIZATION TFLite-Vorgang enthält. In den meisten Fällen ist dies bereits der Fall und die L2-Normalisierung wird daher durch TFLite-Inferenz erreicht, ohne dass diese Option erforderlich ist. Boolean False
quantize Gibt an, ob die zurückgegebene Einbettung über eine skalare Quantisierung in Byte quantisiert werden soll. Bei Einbettungen wird implizit davon ausgegangen, dass es sich um eine Einheitsnorm handelt. Daher hat jede Dimension garantiert einen Wert bei [-1,0, 1,0]. Sollte dies nicht der Fall sein, verwenden Sie die Option „l2_normalize“. Boolean False

Daten vorbereiten

Der Texteinbetter funktioniert mit Textdaten (String). Die Aufgabe übernimmt die Vorverarbeitung der Dateneingabe, einschließlich Tokenisierung und Tensor-Vorverarbeitung. Die gesamte Vorverarbeitung erfolgt in der embed()-Funktion. Es ist keine zusätzliche Vorverarbeitung des Eingabetexts im Voraus erforderlich.

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

Task ausführen

Der Texteinbetter nutzt die Funktion embed, um Inferenzen auszulösen. Bei der Texteinbettung bedeutet dies, dass die Einbettungsvektoren für den Eingabetext zurückgegeben werden.

Der folgende Code zeigt, wie die Verarbeitung mit dem Aufgabenmodell ausgeführt wird.

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

Im Beispielcode wird die Funktion embed in der Datei TextEmbedderHelper.kt aufgerufen.

Ergebnisse verarbeiten und anzeigen

Nach der Ausführung der Inferenz gibt die Texteinbettung ein TextEmbedderResult-Objekt zurück, das eine Liste von Einbettungen (entweder Gleitkomma- oder skalarquantisiert) für den Eingabetext enthält.

Im Folgenden sehen Sie ein Beispiel für die Ausgabedaten dieser Aufgabe:

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

Mit der Funktion TextEmbedder.cosineSimilarity können Sie die semantische Ähnlichkeit von zwei Einbettungen vergleichen. Im folgenden Codebeispiel sehen Sie ein Beispiel.

val similarity = TextEmbedder.cosineSimilarity(firstEmbed, secondEmbed)

Im Beispielcode wird die Funktion TextEmbedder.cosineSimilarity() in der Datei TextEmbedderHelper.kt aufgerufen.