Implementar o classificador de texto

O classificador de texto usa técnicas de aprendizado de máquina para ajudar os desenvolvedores a classificar textos.

Classificador de texto da versão do Android 11

O Android 11 introduz uma implementação padrão atualizável do serviço de classificação de texto no módulo ExtServices. Em dispositivos com o Android 11 ou versões mais recentes, o método getTextClassifier() retorna essa implementação padrão no módulo ExtServices. Recomendamos que os fabricantes de dispositivos usem essa implementação do TextClassifierService, porque ela pode ser atualizada por meio de atualizações do OTA do Mainline.

O Android 11 também remove a implementação padrão do classificador de texto local, que foi introduzida no Android 8.1. Como resultado, getLocalTextClassifier() retorna um classificador de texto NO_OP. Em vez da implementação local, use o método getDefaultTextClassifierImplementation().

Os fabricantes de dispositivos que quiserem usar os próprios algoritmos de classificação de texto podem implementar um serviço personalizado especificando config_defaultTextClassifierPackage no arquivo config.xml. Se essa configuração não for especificada, a implementação padrão do sistema será usada. As implementações personalizadas podem receber uma instância da implementação padrão chamando TextClassifierService.getDefaultTextClassifierImplementation(Context). Para mais informações, consulte Implementar um serviço de classificador de texto personalizado.

Teste

Para validar sua implementação do serviço de classificador de texto, use os testes do Compatibility Test Suite (CTS) em platform/cts/tests/tests/textclassifier/.

Melhorias no classificador de texto da versão do Android 10

O Android 10 apresenta dois métodos para a API TextClassifier: suggestConversationActions e detectLanguage. O método suggestConversationActions gera respostas e ações sugeridas de uma determinada conversa, e o método detectLanguage detecta o idioma do texto.

Os arquivos de modelo para esses métodos são mostrados abaixo e podem ser encontrados em external/libtextclassifier/models/.

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

Para lançar um dispositivo com os arquivos de modelo mais recentes na imagem de fábrica, faça o seguinte:

  1. Busque os arquivos de modelo mais recentes.

    external/libtextclassifier/models/update.sh
    
  2. Renomeie os arquivos baixados para substituir os atuais.
  3. Verifique a configuração.
    adb shell dumpsys textclassification
    

    Este é um exemplo da saída desse 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 }

Melhorias no classificador de texto da versão do Android 9

O Android 9 estendeu o framework de classificação de texto introduzido no Android 8.1 com o novo serviço de classificação de texto. O serviço de classificação de texto é a maneira recomendada para OEMs oferecer suporte ao sistema de classificação de texto. O serviço de classificação de texto pode fazer parte de qualquer APK do sistema e ser atualizado quando necessário.

O Android 9 inclui uma implementação padrão do serviço de classificação de texto ( TextClassifierImpl) que é usada, a menos que você a substitua por uma implementação personalizada.

Implementar um serviço de classificador de texto personalizado

As seções a seguir descrevem como implementar um serviço de classificador de texto personalizado que você desenvolve.

Estender 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 o serviço no manifesto do 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>

O serviço precisa exigir a permissão android.permission.BIND_TEXTCLASSIFIER_SERVICE e especificar a ação de intent android.service.textclassifier.TextClassifierService.

Definir um serviço de classificador de texto padrão do sistema na sobreposição de configuração

[config.xml]

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

Criar o serviço de classificação de texto na imagem do sistema

Seu serviço de classificador de texto personalizado pode ser um APK independente integrado à imagem do sistema ou parte de outro APK do sistema. O sistema usa PackageManager.MATCH_SYSTEM_ONLY para resolver o serviço.

Teste

Execute testes em android.view.textclassifier.cts.

Outras mudanças na classificação de texto no Android 9

Consulte Inspecionar módulos de idioma instalados.

Os arquivos de modelo do Android 9 são incompatíveis com os arquivos de modelo do Android 8.x.

Os arquivos de modelo do Android 9 têm o padrão de nomenclatura: texclassifier.[language-code].model (por exemplo, textclassifier.en.model) em vez de textclassifier.smartselection.en.model no Android 8.x.

Receber os arquivos mais recentes do modelo de classificação de texto

Para obter os modelos mais atualizados, execute o script a seguir, que atualiza os modelos TextClassifier na árvore de origem:

external/libtextclassifier/native/models/update.sh

Classificador de texto da versão 8.1 do Android

O Android 8.1 introduziu a API TextClassfier para implementar a classificação de texto.

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

Os desenvolvedores podem definir um classificador de texto personalizado:

tcm.setTextClassifier(customTextClassifier);

Mas se um desenvolvedor de apps definir o classificador de texto como null, um classificador de texto padrão do sistema será retornado para getTextClassifier().

Consulte android.view.textclassifier.TextClassifierImpl.

TextView e WebView usam TextClassifier para seleção inteligente e recursos de compartilhamento de texto inteligente.

Uso do classificador de texto

Figura 1. Uso do TextClassifier

Modelos de rede neural do TextClassifier

O Android Open Source Project (AOSP) tem vários modelos de rede neural para classificar texto. Cada arquivo de modelo é treinado para um único idioma. É possível instalar qualquer combinação de modelos. Os modelos são definidos em:

external/libtextclassifier/Android.mk

Pré-instalar modelos de idioma em dispositivos

É possível especificar um pacote de modelos de linguagem e instalá-los em um 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 exemplo, em device/google/marlin/device-common.mk.

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

Inspecionar módulos de idioma instalados

Use o ADB para listar os arquivos no diretório:

$ 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

Atualizações do modelo

Os modelos podem ser atualizados com a inclusão de um novo modelo como parte de uma atualização de imagem do sistema ou dinamicamente com um componente do sistema que aciona uma atualização pela intent API ACTION_UPDATE_SMART_SELECTION do sistema. Ao transmitir essa intent da API do sistema, o framework consegue atualizar o modelo de linguagem do idioma definido no momento. Os modelos contêm o idioma compatível e um número de versão para que o modelo mais recente e adequado seja usado.

Assim, não é necessário pré-carregar modelos para todos os idiomas, porque eles podem ser adicionados depois. Se nenhum arquivo de modelo for encontrado para o idioma especificado, a classificação de texto não vai retornar valores.

Testes do conjunto de teste de compatibilidade

Os testes associados do Teste de compatibilidade do Android (CTS) podem ser encontrados em:

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