Implémenter un classificateur de texte

Le classificateur de texte utilise des techniques de machine learning pour aider les développeurs à classer le texte.

Classificateur de texte de la version Android 11

Android 11 introduit une implémentation par défaut pouvant être mise à jour du service de classificateur de texte dans le module ExtServices. Sur les appareils équipés d'Android 11 ou version ultérieure, la méthode getTextClassifier() renvoie cette implémentation par défaut dans le module ExtServices. Nous recommandons aux fabricants d'appareils d'utiliser cette implémentation de TextClassifierService, car elle peut être mise à jour via les mises à jour OTA principales.

Android 11 supprime également l'implémentation par défaut du classificateur de texte local précédemment introduite dans Android 8.1. Par conséquent, getLocalTextClassifier() renvoie un classificateur de texte NO_OP. Au lieu de l'implémentation locale, vous devez utiliser la méthode getDefaultTextClassifierImplementation().

Les fabricants d'appareils qui souhaitent utiliser leurs propres algorithmes de classification de texte peuvent implémenter un service de classification de texte personnalisé en spécifiant config_defaultTextClassifierPackage dans le fichier config.xml. Si cette configuration n'est pas spécifiée, l'implémentation système par défaut est utilisée. Les implémentations personnalisées peuvent obtenir une instance de l'implémentation par défaut en appelant TextClassifierService.getDefaultTextClassifierImplementation(Context). Pour en savoir plus, consultez la section Implémenter un service de classification de texte personnalisé.

Tests

Pour valider votre implémentation du service de classification du texte, utilisez les tests Compatibility Test Suite (CTS) dans platform/cts/tests/tests/textclassifier/.

Améliorations apportées au classificateur de texte dans Android 10

Android 10 introduit deux méthodes pour l'API TextClassifier : suggestConversationActions et detectLanguage. La méthode suggestConversationActions génère des suggestions de réponses et d'actions à partir d'une conversation donnée, et la méthode detectLanguage détecte la langue du texte.

Les fichiers de modèle pour ces méthodes sont présentés ci-dessous et se trouvent dans external/libtextclassifier/models/.

  • suggestionConversationActions : actions_suggestions.universal.model
  • detectLanguage : lang_id.model

Pour publier un appareil avec les derniers fichiers de modèle dans votre image d'usine, procédez comme suit:

  1. Récupérez les derniers fichiers de modèle.

    external/libtextclassifier/models/update.sh
    
  2. Renommez les fichiers téléchargés pour remplacer les fichiers existants.
  3. Vérifiez la configuration.
    adb shell dumpsys textclassification
    

    Voici un exemple du résultat de cette commande.

    TextClassifierImpl:
      Annotator model file(s):
        ModelFile { path=/etc/textclassifier/textclassifier.universal.model name=textclassifier.universal.model version=608 locales=und }
        ModelFile { path=/etc/textclassifier/textclassifier.en.model name=textclassifier.en.model version=608 locales=en }
      LangID model file(s):
        ModelFile { path=/etc/textclassifier/lang_id.model name=lang_id.model version=0 locales=und }
      Actions model file(s):
        ModelFile { path=/etc/textclassifier/actions_suggestions.universal.model name=actions_suggestions.universal.model version=0 locales=und }

Améliorations apportées au classificateur de texte dans Android 9

Android 9 a étendu le framework de classification du texte introduit dans Android 8.1 avec le nouveau service de classification du texte. Le service de classification du texte est la méthode recommandée pour les OEM de fournir une prise en charge du système de classification du texte. Le service de classification du texte peut faire partie de n'importe quel APK système et peut être mis à jour si nécessaire.

Android 9 inclut une implémentation de service de classification de texte par défaut (TextClassifierImpl) qui est utilisée, sauf si vous la remplacez par une implémentation de service de classification de texte personnalisée.

Implémenter un service de classificateur de texte personnalisé

Les sections suivantes expliquent comment implémenter un service de classification de texte personnalisé que vous développez.

Étendre android.service.textclassifier.TextClassifierService

public final class TextClassifierServiceImpl
        extends TextClassifierService {

    // Returns TextClassifierImpl.
    private final TextClassifier tc = getLocalTextClassifier();

    @Override
    public void onSuggestSelection(
            @Nullable TextClassificationSessionId sessionId,
            @NonNull TextSelection.Request request,
            @NonNull CancellationSignal cancellationSignal,
            @NonNull Callback<TextSelection> callback) {
        CompletableFuture.supplyAsync(
                () -> tc.suggestSelection(request))
                .thenAccept(r -> callback.onSuccess(r));
    }

    @Override
    public void onClassifyText(
            @Nullable TextClassificationSessionId sessionId,
		@NonNull TextClassification.Request request,
		@NonNull CancellationSignal cancellationSignal,
		@NonNull Callback<TextClassification> callback) {
        ...
    }

    @Override
    public void onGenerateLinks(
            @Nullable TextClassificationSessionId sessionId,
            @NonNull TextLinks.Request request,
            @NonNull CancellationSignal cancellationSignal,
            @NonNull Callback<TextLinks> callback) {
        ...
    }
    ...
}

Définir le service dans le fichier manifeste Android

[AndroidManifest.xml]

<service android:name=".TextClassifierServiceImpl"
  android:permission="android.permission.BIND_TEXTCLASSIFIER_SERVICE">
    <intent-filter>
      <action android:name=
        "android.service.textclassifier.TextClassifierService"/>
    </intent-filter>
</service>

Notez que le service doit nécessiter l'autorisation android.permission.BIND_TEXTCLASSIFIER_SERVICE et doit spécifier l'action d'intent android.service.textclassifier.TextClassifierService.

Définir un service de classification de texte par défaut du système dans la superposition de configuration

[config.xml]

<string name="config_defaultTextClassifierPackage" translatable="false">com.example.textclassifierservice</string>

Créer le service de classification de texte dans l'image système

Votre service de classificateur de texte personnalisé peut être un APK autonome intégré à l'image système ou une partie d'un autre APK système. Le système utilise PackageManager.MATCH_SYSTEM_ONLY pour résoudre le service.

Tests

Exécutez des tests dans android.view.textclassifier.cts.

Autres modifications apportées à la classification du texte dans Android 9

Consultez Inspecter les modules de langue installés.

Les fichiers de modèle Android 9 ne sont pas compatibles avec les fichiers de modèle Android 8.x.

Les fichiers de modèle Android 9 suivent le format de dénomination texclassifier.[language-code].model (par exemple, textclassifier.en.model) au lieu de textclassifier.smartselection.en.model dans Android 8.x.

Obtenir les derniers fichiers du modèle de classification de texte

Pour obtenir les modèles les plus à jour, vous pouvez exécuter le script suivant, qui met à jour les modèles TextClassifier dans l'arborescence source:

external/libtextclassifier/native/models/update.sh

Classificateur de texte de la version 8.1 d'Android

Android 8.1 a introduit l'API TextClassfier pour implémenter la classification de texte.

TextClassificationManager tcm =
    context.getSystemService(TextClassificationManager.class);
TextClassifier classifier = tcm.getTextClassifier();
TextSelection selection = classifier.suggestSelection(...);
TextClassification classification = classifier.classifyText(...);

Les développeurs peuvent définir un classificateur de texte personnalisé :

tcm.setTextClassifier(customTextClassifier);

Toutefois, si un développeur d'application définit le classificateur de texte sur null, un classificateur de texte par défaut du système est renvoyé pour getTextClassifier().

Consultez la android.view.textclassifier.TextClassifierImpl.

TextView et WebView utilisent TextClassifier pour les fonctionnalités de sélection intelligente et de partage de texte intelligent.

Utilisation du classificateur de texte

Figure 1 : Utilisation de TextClassifier

Modèles de réseau de neurones TextClassifier

Le projet Android Open Source (AOSP) propose plusieurs modèles de réseaux de neurones pour la classification du texte. Chaque fichier de modèle est entraîné pour un seul langage. Vous pouvez installer n'importe quelle combinaison de modèles. Les modèles sont définis dans:

external/libtextclassifier/Android.mk

Préinstaller des modèles de langage sur les appareils

Vous pouvez spécifier un bundle de modèles de langage et l'installer sur un appareil:

# -----------------------
# Smart Selection bundles
# -----------------------

include $(CLEAR_VARS)
LOCAL_MODULE           := textclassifier.smartselection.bundle1
LOCAL_REQUIRED_MODULES := textclassifier.smartselection.en.model
LOCAL_REQUIRED_MODULES += textclassifier.smartselection.es.model
LOCAL_REQUIRED_MODULES += textclassifier.smartselection.de.model
LOCAL_REQUIRED_MODULES += textclassifier.smartselection.fr.model
include $(BUILD_STATIC_LIBRARY)

Par exemple, dans device/google/marlin/device-common.mk.

# TextClassifier smart selection model files
PRODUCT_PACKAGES += \
    textclassifier.smartselection.bundle1

Inspecter les modules de langue installés

Utilisez ADB pour lister les fichiers du répertoire:

$ adb shell ls -l /etc/textclassifier
-rw-r--r-- 1 root root ... textclassifier.smartselection.de.model
-rw-r--r-- 1 root root ... textclassifier.smartselection.en.model
-rw-r--r-- 1 root root ... textclassifier.smartselection.es.model
-rw-r--r-- 1 root root ... textclassifier.smartselection.fr.model

Mises à jour du modèle

Vous pouvez mettre à jour les modèles soit en incluant un nouveau modèle dans le cadre d'une mise à jour d'image système, soit de manière dynamique avec un composant système qui déclenche une mise à jour via l'intent système API ACTION_UPDATE_SMART_SELECTION. En diffusant cet intent d'API système, le framework peut mettre à jour le modèle de langage de la langue actuellement définie. Les modèles eux-mêmes contiennent la langue compatible et un numéro de version afin que le modèle approprié le plus récent soit utilisé.

Vous n'avez donc pas besoin de précharger les modèles pour toutes les langues, car vous pouvez les ajouter ultérieurement. Si aucun fichier de modèle n'est trouvé pour la langue spécifiée, la classification de texte renvoie des valeurs sans opération.

Tests de la suite de tests de compatibilité

Les tests de la suite de tests de compatibilité Android (CTS) associés sont disponibles dans:

cts/tests/tests/view/src/android/view/textclassifier/cts/TextClassificationManagerTest.java

cts/tests/tests/widget/src/android/widget/cts/TextViewTest.java

  • testSmartSelection
  • testSmartSelection_dragSelection
  • testSmartSelection_resetSelection