Cómo implementar el clasificador de texto

El clasificador de texto utiliza técnicas de aprendizaje automático para ayudar a los desarrolladores a clasificar el texto.

Clasificador de texto de la versión de Android 11

Android 11 presenta una implementación predeterminada actualizable del servicio de clasificador de texto en el módulo de ExtServices. En dispositivos que ejecutan Android 11 o versiones posteriores, el método getTextClassifier() devuelve esta implementación predeterminada en el módulo de ExtServices. Se recomienda a los fabricantes de dispositivos que usen esta implementación de TextClassifierService, ya que puede actualizarse de manera inalámbrica por la línea principal.

Android 11 también quita la implementación predeterminada del clasificador de texto local que se introdujo anteriormente en Android 8.1. Como resultado, getLocalTextClassifier() devuelve un clasificador de texto NO_OP. En lugar de la implementación local, debes usar el método getDefaultTextClassifierImplementation().

Los fabricantes de dispositivos que deseen usar sus propios algoritmos de clasificación de texto pueden implementar un servicio de clasificación de texto personalizado especificando config_defaultTextClassifierPackage en el archivo config.xml. Si no se especifica esta configuración, se usa la implementación predeterminada del sistema. Las implementaciones personalizadas pueden obtener una instancia de la implementación predeterminada llamando a TextClassifierService.getDefaultTextClassifierImplementation(Context). Para obtener más información, consulta Cómo implementar un servicio de clasificación de texto personalizado.

Prueba

Para validar tu implementación del servicio de clasificador de texto, usa las pruebas del Conjunto de pruebas de compatibilidad (CTS) en platform/cts/tests/tests/textclassifier/.

Mejoras en el clasificador de texto de la versión de Android 10

Android 10 presenta dos métodos en la API de TextClassifier: suggestConversationActions y detectLanguage. El método suggestConversationActions genera respuestas y acciones sugeridas a partir de una conversación determinada y el método detectLanguage detecta el lenguaje del texto.

Los archivos del modelo para estos métodos se muestran a continuación y se pueden encontrar en external/libtextclassifier/models/.

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

Para lanzar un dispositivo con los archivos de modelo más recientes en la imagen de fábrica, haz lo siguiente:

  1. Recupera los archivos del modelo más reciente.

    external/libtextclassifier/models/update.sh
    
  2. Cambia el nombre de los archivos descargados para reemplazar los existentes.
  3. Verifica la configuración.
    adb shell dumpsys textclassification
    

    Este es un ejemplo del resultado de ese comando.

    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 }

Mejoras en el clasificador de texto de la versión de Android 9

Android 9 extendió el framework de clasificación de texto que se introdujo en Android 8.1 con el nuevo servicio de clasificación de texto. El servicio de clasificación de texto es la forma recomendada para que los OEM proporcionen compatibilidad con el sistema de clasificación de texto. El servicio de clasificación de texto puede formar parte de cualquier APK del sistema y se puede actualizar cuando sea necesario.

Android 9 incluye una implementación predeterminada del servicio de clasificación de texto ( TextClassifierImpl) que se usa a menos que la reemplaces por una implementación personalizada del servicio de clasificación de texto.

Implementa un servicio de clasificador de texto personalizado

En las siguientes secciones, se describe cómo implementar un servicio de clasificación de texto personalizado que desarrolles.

Extiende 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) {
        ...
    }
    ...
}

Cómo definir el servicio en el manifiesto de 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>

Ten en cuenta que el servicio debe requerir el permiso android.permission.BIND_TEXTCLASSIFIER_SERVICE y especificar la acción de intent android.service.textclassifier.TextClassifierService.

Cómo establecer un servicio predeterminado del sistema para el clasificador de texto en la superposición de configuración

[config.xml]

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

Compila el servicio de clasificación de texto en la imagen del sistema

Tu servicio personalizado de clasificación de texto puede ser un APK independiente integrado en la imagen del sistema o parte de otro APK del sistema. El sistema usa PackageManager.MATCH_SYSTEM_ONLY para resolver el servicio.

Prueba

Ejecuta pruebas en android.view.textclassifier.cts.

Otros cambios en la clasificación de texto en Android 9

Consulta Cómo inspeccionar los módulos de idiomas instalados.

Los archivos de modelos de Android 9 no son compatibles con los archivos de modelos de Android 8.x.

Los archivos de modelos de Android 9 tienen el siguiente patrón de nombres: texclassifier.[language-code].model (por ejemplo, textclassifier.en.model) en lugar de textclassifier.smartselection.en.model en Android 8.x.

Obtén los archivos del modelo de clasificación de texto más reciente

Para obtener los modelos más actualizados, se puede ejecutar la siguiente secuencia de comandos, que actualiza los modelos de TextClassifier en el árbol de origen:

external/libtextclassifier/native/models/update.sh

Clasificador de texto de la versión 8.1 de Android

Android 8.1 introdujo la API de TextClassfier para implementar la clasificación de texto.

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

Los desarrolladores pueden establecer un clasificador de texto personalizado:

tcm.setTextClassifier(customTextClassifier);

Sin embargo, si un desarrollador de apps configura el clasificador de texto como null, se devolverá un clasificador de texto predeterminado del sistema para getTextClassifier().

Consulta los android.view.textclassifier.TextClassifierImpl.

TextView y WebView usan TextClassifier para las funciones de selección inteligente y uso compartido de texto inteligente.

Uso del clasificador de texto

Figura 1: Uso de TextClassifier

Modelos de redes neuronales de TextClassifier

El Proyecto de código abierto de Android (AOSP) incluye varios modelos de redes neuronales para clasificar texto. Cada archivo de modelo se entrena para un solo idioma. Puedes instalar cualquier combinación de modelos. Los modelos se definen en los siguientes archivos:

external/libtextclassifier/Android.mk

Preinstalar modelos de lenguaje en dispositivos

Puedes especificar un paquete de modelos de lenguaje e instalarlo en un dispositivo:

# -----------------------
# 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)

Por ejemplo, en device/google/marlin/device-common.mk.

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

Inspecciona los módulos de idiomas instalados

Usa ADB para enumerar los archivos del directorio:

$ 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

Actualizaciones de modelos

Los modelos se pueden actualizar incluyendo un modelo nuevo como parte de una actualización de la imagen del sistema o de forma dinámica con un componente del sistema que active una actualización a través del intent de API ACTION_UPDATE_SMART_SELECTION del sistema. Cuando se transmite esta intención de la API del sistema, el framework puede actualizar el modelo de lenguaje del idioma configurado actualmente. Los modelos contienen el idioma admitido y un número de versión para que se use el modelo más reciente y adecuado.

Por lo tanto, no es necesario que cargues previamente los modelos para todos los idiomas, ya que se pueden agregar más adelante. Si no se encuentra ningún archivo de modelo para el idioma especificado, la clasificación de texto devuelve valores no operativos.

Pruebas del Conjunto de pruebas de compatibilidad

Las pruebas asociadas del Conjunto de pruebas de compatibilidad (CTS) de Android se pueden encontrar en las siguientes ubicaciones:

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