Mit der Aufgabe „MediaPipe-Textklassifikator“ können Sie Text in eine Reihe definierter Kategorien einteilen, z. B. nach positiver oder negativer Stimmung. Die Kategorien richten sich nach dem von Ihnen verwendeten Modell und danach, wie dieses Modell trainiert wurde. Hier erfahren Sie, wie Sie den Textklassifikator in Android-Apps verwenden.
In der Demo können Sie sich diese Aufgabe in Aktion ansehen. Weitere Informationen zu den Funktionen, Modellen und Konfigurationsoptionen dieser Aufgabe finden Sie in der Übersicht.
Codebeispiel
Der Beispielcode für den Textklassifikator bietet eine einfache Implementierung dieser Aufgabe. Mit diesem Code können Sie diese Aufgabe testen und Ihre eigene Anwendung zur Textklassifizierung erstellen. Den Beispielcode für den Textklassifikator finden Sie auf GitHub.
Code herunterladen
Die folgende Anleitung zeigt, wie Sie mit dem git-Befehlszeilentool zur Versionsverwaltung eine lokale Kopie des Beispielcodes erstellen können.
So laden Sie den Beispielcode herunter:
- Klonen Sie das Git-Repository mit dem folgenden Befehl:
git clone https://github.com/google-ai-edge/mediapipe-samples
- Optional können Sie die Git-Instanz für die Verwendung von Sparse Checkout konfigurieren, sodass Sie nur die Dateien für die Beispielanwendung „Textklassifikator“ haben:
cd mediapipe git sparse-checkout init --cone git sparse-checkout set examples/text_classification/android
Eine Anleitung zum Einrichten und Ausführen eines Beispiels mit Android Studio finden Sie in der Anleitung zum Einrichten des Beispielcodes im Einrichtungsleitfaden für Android.
Schlüsselkomponenten
Die folgenden Dateien enthalten den wichtigen Code für die Beispiel-App zur Textklassifizierung:
- TextClassifierHelper.kt: Initialisiert den Textklassifikator und verarbeitet die Modellauswahl.
- MainActivity.kt: Implementiert die Anwendung und ruft
TextClassifierHelper
undResultsAdapter
auf. - ResultsAdapter.kt verarbeitet und formatiert die Ergebnisse.
Einrichtung
In diesem Abschnitt werden die wichtigsten Schritte zum Einrichten Ihrer Entwicklungsumgebung und Codeprojekte speziell für die Verwendung des Textklassifikators beschrieben. Allgemeine Informationen zum Einrichten der Entwicklungsumgebung für MediaPipe Tasks, einschließlich der Anforderungen an die Plattformversion, finden Sie im Einrichtungsleitfaden für Android.
Abhängigkeiten
Der Textklassifikator 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-Textklassifikatoraufgabe erfordert ein trainiertes Modell, das mit dieser Aufgabe kompatibel ist. Weitere Informationen zu verfügbaren trainierten Modellen für den Textklassifikator finden Sie in der Aufgabenübersicht im Abschnitt „Modelle“.
Wählen Sie ein Modell aus, laden Sie es herunter und speichern Sie es dann im Projektverzeichnis assets
:
<dev-project-root>/src/main/assets
Verwenden Sie die Methode BaseOptions.Builder.setModelAssetPath()
, um den Pfad des zu verwendenden Modells anzugeben. Ein Codebeispiel finden Sie im nächsten Abschnitt.
Aufgabe erstellen
Verwenden Sie eine der TextClassifier.createFrom...()
-Funktionen des Textklassifikators, um die Aufgabe zum Ausführen von Inferenzen vorzubereiten. Sie können die Funktion createFromFile()
mit einem relativen oder absoluten Pfad zur trainierten Modelldatei verwenden. Im Codebeispiel unten wird die Verwendung der Funktion TextClassifier.createFromOptions()
veranschaulicht. Weitere Informationen zu den verfügbaren Konfigurationsoptionen finden Sie unter Konfigurationsoptionen.
Im folgenden Codebeispiel wird gezeigt, wie diese Aufgabe erstellt und konfiguriert wird.
// no directory path required if model file is in src/main/assets:
String currentModel = "text_classifier_model.tflite";
fun initClassifier() {
val baseOptionsBuilder = BaseOptions.builder()
.setModelAssetPath(currentModel)
try {
val baseOptions = baseOptionsBuilder.build()
val optionsBuilder = TextClassifier.TextClassifierOptions.builder()
.setBaseOptions(baseOptions)
val options = optionsBuilder.build()
textClassifier = TextClassifier.createFromOptions(context, options)
} catch (e: IllegalStateException) { // exception handling
}
}
Ein Beispiel für das Erstellen einer Aufgabe finden Sie in der TextClassifierHelper-Klasse initClassifier()
als Codebeispiel.
Konfigurationsoptionen
Diese Aufgabe umfasst die folgenden Konfigurationsoptionen für Android-Apps:
Option | Beschreibung | Wertebereich | Standardwert |
---|---|---|---|
displayNamesLocale |
Legt die Sprache von Labels fest, die für Anzeigenamen bereitgestellt werden, die in den Metadaten des Aufgabenmodells angegeben sind, sofern verfügbar. Der Standardwert für Englisch ist en . Mit der TensorFlow Lite Metadata Writer API können Sie den Metadaten eines benutzerdefinierten Modells lokalisierte Labels hinzufügen.
| Sprachcode | en |
maxResults |
Legt die optionale maximale Anzahl der Klassifizierungsergebnisse mit den besten Bewertungen fest, die zurückgegeben werden sollen. Wenn < 0, werden alle verfügbaren Ergebnisse zurückgegeben. | Beliebige positive Zahlen | -1 |
scoreThreshold |
Legt den Schwellenwert für den Vorhersagewert fest, der den in den Modellmetadaten angegebenen Grenzwert überschreibt (falls vorhanden). Ergebnisse unter diesem Wert werden abgelehnt. | Beliebige Gleitkommazahl | Nicht festgelegt |
categoryAllowlist |
Legt die optionale Liste der zulässigen Kategorienamen fest. Wenn das Feld nicht leer ist, werden Klassifizierungsergebnisse herausgefiltert, deren Kategoriename nicht in diesem Set enthalten ist. Doppelte oder unbekannte Kategorienamen werden ignoriert.
Diese Option und categoryDenylist schließen sich gegenseitig aus und die Verwendung beider Werte führt zu einem Fehler. |
Beliebige Strings | Nicht festgelegt |
categoryDenylist |
Legt die optionale Liste der nicht zulässigen Kategorienamen fest. Wenn das Feld nicht leer ist, werden Klassifizierungsergebnisse herausgefiltert, deren Kategoriename in diesem Satz enthalten ist. Doppelte oder unbekannte Kategorienamen werden ignoriert. Diese Option und categoryAllowlist schließen sich gegenseitig aus und die Verwendung beider Optionen führt zu einem Fehler. |
Beliebige Strings | Nicht festgelegt |
Daten vorbereiten
Der Textklassifikator funktioniert mit Textdaten (String
). Die Aufgabe übernimmt die Vorverarbeitung der Dateneingabe, einschließlich Tokenisierung und Tensor-Vorverarbeitung.
Die gesamte Vorverarbeitung erfolgt in der classify()
-Funktion. Eine zusätzliche Vorverarbeitung des Eingabetexts ist im Voraus nicht erforderlich.
String inputText = "The input text to be classified.";
Task ausführen
Der Textklassifikator verwendet die Funktion TextClassifier.classify()
, um Inferenzen auszuführen. Verwenden Sie zum Ausführen der Klassifizierung einen separaten Ausführungsthread, um zu vermeiden, dass der Thread der Android-Benutzeroberfläche durch Ihre Anwendung blockiert wird.
Der folgende Code zeigt, wie die Verarbeitung mit dem Aufgabenmodell unter Verwendung eines separaten Ausführungsthreads ausgeführt wird.
fun classify(text: String) {
executor = ScheduledThreadPoolExecutor(1)
executor.execute {
val results = textClassifier.classify(text)
listener.onResult(results)
}
}
Ein Beispiel für das Ausführen einer Aufgabe finden Sie in der Codebeispiel-Klasse classify()
der Klasse TextClassifierHelper.
Ergebnisse verarbeiten und anzeigen
Der Textklassifikator gibt einen TextClassifierResult
aus, der die Liste der möglichen Kategorien für den Eingabetext enthält. Die Kategorien werden durch das von Ihnen verwendete Modell definiert. Wenn Sie also andere Kategorien verwenden möchten, wählen Sie ein anderes Modell aus oder trainieren Sie ein vorhandenes Modell neu.
Im Folgenden sehen Sie ein Beispiel für die Ausgabedaten dieser Aufgabe:
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
Dieses Ergebnis erhalten Sie durch Ausführen des BERT-Klassifikators für den Eingabetext: "an imperfect but overall entertaining mystery"
.
Ein Beispiel für die Anzeige von Ergebnissen finden Sie in der Codebeispiel-Klasse ResultsAdapter und der inneren Klasse ViewHolder
.