Implementar 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 lanzamiento de Android 11

Android 11 presenta una implementación predeterminada actualizable del servicio clasificador de texto en el módulo ExtServices . En dispositivos con Android 11 o superior, el método getTextClassifier() devuelve esta implementación predeterminada en el módulo ExtServices. Se recomienda a los fabricantes de dispositivos que utilicen esta implementación de TextClassifierService , ya que se puede actualizar a través de las actualizaciones OTA de Mainline.

Android 11 también elimina la implementación predeterminada del clasificador de texto local introducida 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() .

Para los fabricantes de dispositivos que deseen utilizar 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 utiliza 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, consulte Implementación de un servicio de clasificador de texto personalizado .

Pruebas

Para validar su implementación del servicio clasificador de texto, utilice 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 Android 10

Android 10 introduce dos métodos para la API 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 idioma del texto.

Los archivos 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 del último modelo en su imagen de fábrica, haga lo siguiente:

  1. Obtenga los archivos del último modelo.

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

    Esta es una muestra 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 amplió el marco de clasificación de texto introducido en Android 8.1 con el nuevo servicio de clasificación de texto. El servicio de clasificador de texto es la forma recomendada para que los OEM proporcionen soporte para el sistema de clasificación de texto. El servicio clasificador de texto puede ser parte de cualquier APK del sistema y puede actualizarse cuando sea necesario.

Android 9 incluye una implementación de servicio de clasificador de texto predeterminada ( TextClassifierImpl ) que se usa a menos que la reemplace con una implementación de servicio de clasificador de texto personalizada.

Implementar un servicio de clasificador de texto personalizado

Las siguientes secciones describen cómo implementar un servicio clasificador de texto personalizado que usted desarrolle.

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

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>

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

Establecer un servicio clasificador de texto predeterminado del sistema en la superposición de configuración

[ config.xml ]

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

Construya el servicio clasificador de texto en la imagen del sistema.

Su servicio de clasificador de texto personalizado puede ser un APK independiente integrado en la imagen del sistema o una parte de otro APK del sistema. El sistema utiliza PackageManager.MATCH_SYSTEM_ONLY para resolver el servicio.

Pruebas

Ejecute pruebas en android.view.textclassifier.cts .

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

Consulte Inspección de los módulos de idioma instalados .

Los archivos de modelo de Android 9 son incompatibles con los archivos de modelo de Android 8.x.

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

Obtenga los archivos de modelos de clasificación de texto más recientes

Para obtener los modelos más actualizados, se puede ejecutar el siguiente script, que actualiza los modelos 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 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 configurar un clasificador de texto personalizado:

tcm.setTextClassifier(customTextClassifier);

Pero si un desarrollador de aplicaciones establece el clasificador de texto en null , se devuelve un clasificador de texto predeterminado del sistema para getTextClassifier() .

Consulte android.view.textclassifier.TextClassifierImpl .

TextView y WebView utilizan TextClassifier para 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) presenta varios modelos de redes neuronales para clasificar texto. Cada archivo de modelo está entrenado para un único idioma. Puede instalar cualquier combinación de modelos. Los modelos se definen en:

external/libtextclassifier/Android.mk

Preinstalar modelos de idiomas en dispositivos

Puede especificar un conjunto de modelos de idiomas e instalarlos 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

Inspeccionar los módulos de idioma instalados

Utilice ADB para enumerar los archivos en el 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 ya sea incluyendo un nuevo modelo como parte de una actualización de la imagen del sistema o dinámicamente al tener un componente del sistema que activa una actualización a través de la intención API ACTION_UPDATE_SMART_SELECTION del sistema. Al transmitir la intención de la API del sistema, el marco puede actualizar el modelo de idioma del idioma configurado actualmente. Los propios modelos contienen el idioma admitido y un número de versión para que se utilice el último modelo apropiado.

Por lo tanto, no es necesario precargar modelos para todos los idiomas porque 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 de Android (CTS) se pueden encontrar en:

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