Guide de classification de texte pour Android

La tâche de classificateur de texte MediaPipe vous permet de classer du texte selon un ensemble de catégories définies, comme les sentiments positifs ou négatifs. Les catégories sont déterminées par le modèle utilisé et la manière dont ce modèle a été entraîné. Ces instructions vous expliquent comment utiliser le classificateur de texte avec des applications Android.

Pour voir cette tâche en action, regardez la démonstration. Pour en savoir plus sur les fonctionnalités, les modèles et les options de configuration de cette tâche, consultez la présentation.

Exemple de code

L'exemple de code pour le classificateur de texte fournit une implémentation simple de cette tâche à titre de référence. Ce code vous aide à tester cette tâche et à créer votre propre application de classification de texte. Vous pouvez consulter l'exemple de code du classificateur de texte sur GitHub.

Télécharger le code

Les instructions suivantes vous expliquent comment créer une copie locale de l'exemple de code à l'aide de l'outil de ligne de commande du contrôle des versions git.

Pour télécharger l'exemple de code, procédez comme suit:

  1. Clonez le dépôt git à l'aide de la commande suivante :
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. Vous pouvez éventuellement configurer votre instance Git pour utiliser le paiement creux afin de n'avoir que les fichiers de l'application exemple de classificateur de texte :
    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/text_classification/android
    

Pour savoir comment configurer et exécuter un exemple avec Android Studio, consultez les instructions de configuration d'exemple de code dans le guide de configuration pour Android.

Composants clés

Les fichiers suivants contiennent le code crucial de l'exemple d'application de classification de texte:

Préparation

Cette section décrit les étapes clés de la configuration de votre environnement de développement et de vos projets de code spécifiquement pour l'utilisation du classificateur de texte. Pour obtenir des informations générales sur la configuration de votre environnement de développement pour l'utilisation de MediaPipe Tasks, y compris sur les exigences de version de la plate-forme, consultez le guide de configuration pour Android.

Dépendances

Le classificateur de texte utilise les bibliothèques com.google.mediapipe:tasks-text. Ajoutez cette dépendance au fichier build.gradle de votre projet de développement d'application Android. Vous pouvez importer les dépendances requises à l'aide du code suivant:

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

Modèle

La tâche de classificateur de texte MediaPipe nécessite un modèle entraîné compatible avec cette tâche. Pour en savoir plus sur les modèles entraînés disponibles pour le classificateur de texte, consultez la section Modèles de la présentation des tâches.

Sélectionnez et téléchargez un modèle, puis stockez-le dans le répertoire assets de votre projet:

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

Utilisez la méthode BaseOptions.Builder.setModelAssetPath() pour spécifier le chemin d'accès du modèle à utiliser. Pour obtenir un exemple de code, consultez la section suivante.

Créer la tâche

Utilisez l'une des fonctions TextClassifier.createFrom...() du classificateur de texte pour préparer la tâche à l'exécution d'inférences. Vous pouvez utiliser la fonction createFromFile() avec un chemin d'accès relatif ou absolu au fichier du modèle entraîné. L'exemple de code ci-dessous illustre l'utilisation de la fonction TextClassifier.createFromOptions(). Pour en savoir plus sur les options de configuration disponibles, consultez la section Options de configuration.

Le code suivant montre comment créer et configurer cette tâche.

// 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
    }
}

Vous pouvez voir comment créer une tâche dans l'exemple de code de la fonction initClassifier() de la classe TextClassifierHelper.

Options de configuration

Cette tâche dispose des options de configuration suivantes pour les applications Android:

Nom de l'option Description Plage de valeurs Valeur par défaut
displayNamesLocale Définit la langue des libellés à utiliser pour les noms à afficher fournis dans les métadonnées du modèle de la tâche, le cas échéant. La valeur par défaut est en pour l'anglais. Vous pouvez ajouter des thèmes localisés aux métadonnées d'un modèle personnalisé à l'aide de l'API TensorFlow Lite Metadata Writer. Code des paramètres régionaux en
maxResults Définit le nombre maximal (facultatif) de résultats de classification les mieux notés à renvoyer. Si la valeur est inférieure à 0, tous les résultats disponibles sont renvoyés. Tout nombre positif -1
scoreThreshold Définit le seuil de score de prédiction qui remplace celui fourni dans les métadonnées du modèle (le cas échéant). Les résultats inférieurs à cette valeur sont refusés. N'importe quelle valeur flottante Non définie
categoryAllowlist Définit la liste facultative des noms de catégories autorisés. S'ils ne sont pas vides, les résultats de classification dont le nom de catégorie ne figure pas dans cet ensemble sont filtrés. Les noms de catégorie en double ou inconnus sont ignorés. Cette option s'exclut mutuellement avec categoryDenylist. L'utilisation des deux résultats génère une erreur. N'importe quelle chaîne Non définie
categoryDenylist Définit la liste facultative des noms de catégorie qui ne sont pas autorisés. S'ils ne sont pas vides, les résultats de classification dont le nom de catégorie figure dans cet ensemble seront filtrés. Les noms de catégorie en double ou inconnus sont ignorés. Cette option s'exclut mutuellement avec categoryAllowlist. L'utilisation des deux entraîne une erreur. N'importe quelle chaîne Non définie

Préparation des données

Le classificateur de texte fonctionne avec les données textuelles (String). Cette tâche gère le prétraitement de l'entrée des données, y compris la tokenisation et le prétraitement du Tensor.

L'ensemble du prétraitement est géré dans la fonction classify(). Aucun prétraitement supplémentaire du texte d'entrée n'est nécessaire au préalable.

String inputText = "The input text to be classified.";

Exécuter la tâche

Le classificateur de texte utilise la fonction TextClassifier.classify() pour exécuter des inférences. Utilisez un thread d'exécution distinct pour exécuter la classification afin d'éviter de bloquer le thread de l'interface utilisateur Android avec votre application.

Le code suivant montre comment exécuter le traitement avec le modèle de tâche à l'aide d'un thread d'exécution distinct.

    fun classify(text: String) {
        executor = ScheduledThreadPoolExecutor(1)

        executor.execute {
            val results = textClassifier.classify(text)
            listener.onResult(results)
        }
    }

Vous pouvez voir un exemple d'exécution d'une tâche dans l'exemple de code de la fonction classify() de la classe TextClassifierHelper.

Gérer et afficher les résultats

Le classificateur de texte génère un TextClassifierResult qui contient la liste des catégories possibles pour le texte d'entrée. Les catégories sont définies par le modèle que vous utilisez. Par conséquent, si vous souhaitez des catégories différentes, choisissez un autre modèle ou réentraînez un modèle existant.

Voici un exemple des données de sortie de cette tâche:

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

Vous avez obtenu ce résultat en exécutant BERT-classifier sur le texte d'entrée : "an imperfect but overall entertaining mystery".

Vous pouvez voir comment afficher les résultats dans l'exemple de code de la classe ResultsAdapter et de la classe interne ViewHolder.