Leitfaden zur Textklassifizierung für Android

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:

  1. Klonen Sie das Git-Repository mit dem folgenden Befehl:
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. 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:

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.