Classificação de texto com Android

Este tutorial mostra como criar um aplicativo Android usando o TensorFlow Lite para classificar texto em linguagem natural. Este aplicativo foi projetado para um dispositivo Android físico, mas também pode ser executado em um emulador de dispositivo.

O aplicativo de exemplo usa o TensorFlow Lite para classificar o texto como positivo ou negativo, usando a biblioteca de tarefas para linguagem natural (NL) para permitir a execução dos modelos de aprendizado de máquina de classificação de texto.

Se você estiver atualizando um projeto existente, poderá usar o aplicativo de exemplo como referência ou modelo. Para obter instruções sobre como adicionar classificação de texto a um aplicativo existente, consulte Atualizando e modificando seu aplicativo .

Visão geral da classificação de texto

A classificação de texto é a tarefa de aprendizado de máquina de atribuir um conjunto de categorias predefinidas a um texto aberto. Um modelo de classificação de texto é treinado em um corpus de texto em linguagem natural, onde palavras ou frases são classificadas manualmente.

O modelo treinado recebe o texto como entrada e tenta categorizar o texto de acordo com o conjunto de classes conhecidas que foi treinado para classificar. Por exemplo, os modelos neste exemplo aceitam um trecho de texto e determinam se o sentimento do texto é positivo ou negativo. Para cada trecho de texto, o modelo de classificação de texto gera uma pontuação que indica a confiança do texto sendo classificado corretamente como positivo ou negativo.

Para obter mais informações sobre como os modelos neste tutorial são gerados, consulte o tutorial Classificação de texto com o TensorFlow Lite Model Maker .

Modelos e conjunto de dados

Este tutorial usa modelos que foram treinados usando o conjunto de dados SST-2 (Stanford Sentiment Treebank). O SST-2 contém 67.349 resenhas de filmes para treinamento e 872 resenhas de filmes para teste, com cada resenha classificada como positiva ou negativa. Os modelos usados ​​neste aplicativo foram treinados usando a ferramenta TensorFlow Lite Model Maker .

O aplicativo de exemplo usa os seguintes modelos pré-treinados:

  • Average Word Vector ( NLClassifier ) - O NLClassifier da Biblioteca de Tarefas classifica o texto de entrada em diferentes categorias e pode lidar com a maioria dos modelos de classificação de texto.

  • MobileBERT ( BertNLClassifier ) - O BertNLClassifier da Biblioteca de Tarefas é semelhante ao NLClassifier, mas é adaptado para casos que exigem tokenizações Wordpiece e Sentencepiece fora do gráfico.

Configure e execute o aplicativo de exemplo

Para configurar o aplicativo de classificação de texto, baixe o aplicativo de exemplo do GitHub e execute-o usando o Android Studio .

requisitos de sistema

  • Android Studio versão 2021.1.1 (Bumblebee) ou superior.
  • Android SDK versão 31 ou superior
  • Dispositivo Android com uma versão mínima do SO do SDK 21 (Android 7.0 - Nougat) com o modo de desenvolvedor ativado ou um emulador do Android.

Obtenha o código de exemplo

Crie uma cópia local do código de exemplo. Você usará esse código para criar um projeto no Android Studio e executar o aplicativo de exemplo.

Para clonar e configurar o código de exemplo:

  1. Clone o repositório git
    git clone https://github.com/tensorflow/examples.git
    
  2. Opcionalmente, configure sua instância do git para usar check-out esparso, para que você tenha apenas os arquivos para o aplicativo de exemplo de classificação de texto:
    cd examples
    git sparse-checkout init --cone
    git sparse-checkout set lite/examples/text_classification/android
    

Importar e executar o projeto

Crie um projeto a partir do código de exemplo baixado, compile o projeto e execute-o.

Para importar e construir o projeto de código de exemplo:

  1. Inicie o Android Studio .
  2. No Android Studio, selecione File > New > Import Project .
  3. Navegue até o diretório de código de exemplo que contém o arquivo build.gradle ( .../examples/lite/examples/text_classification/android/build.gradle ) e selecione esse diretório.
  4. Se o Android Studio solicitar um Gradle Sync, escolha OK.
  5. Certifique-se de que seu dispositivo Android esteja conectado ao seu computador e que o modo de desenvolvedor esteja ativado. Clique na seta verde Run .

Se você selecionar o diretório correto, o Android Studio cria um novo projeto e o compila. Esse processo pode levar alguns minutos, dependendo da velocidade do seu computador e se você já usou o Android Studio para outros projetos. Quando a compilação for concluída, o Android Studio exibirá uma mensagem BUILD SUCCESSFUL no painel de status Build Output .

Para executar o projeto:

  1. No Android Studio, execute o projeto selecionando Run > Run… .
  2. Selecione um dispositivo Android conectado (ou emulador) para testar o aplicativo.

Usando o aplicativo

Aplicativo de exemplo de classificação de texto no Android

Após executar o projeto no Android Studio, o aplicativo será aberto automaticamente no dispositivo conectado ou no emulador de dispositivo.

Para usar o classificador de texto:

  1. Insira um trecho de texto na caixa de texto.
  2. Na lista suspensa Delegado , escolha CPU ou NNAPI .
  3. Especifique um modelo escolhendo AverageWordVec ou MobileBERT .
  4. Escolha Classificar .

O aplicativo gera uma pontuação positiva e uma pontuação negativa . Essas duas pontuações somarão 1 e medirão a probabilidade de que o sentimento do texto de entrada seja positivo ou negativo. Um número mais alto denota um nível mais alto de confiança.

Agora você tem um aplicativo de classificação de texto em funcionamento. Use as seções a seguir para entender melhor como o aplicativo de exemplo funciona e como implementar recursos de classificação de texto em seus aplicativos de produção:

Como o aplicativo de exemplo funciona

O aplicativo usa o pacote Biblioteca de tarefas para linguagem natural (NL) para implementar os modelos de classificação de texto. Os dois modelos, Average Word Vector e MobileBERT, foram treinados usando o TensorFlow Lite Model Maker . O aplicativo é executado na CPU por padrão, com a opção de aceleração de hardware usando o delegado NNAPI.

Os seguintes arquivos e diretórios contêm o código crucial para este aplicativo de classificação de texto:

Modifique seu aplicativo

As seções a seguir explicam as principais etapas para modificar seu próprio aplicativo Android para executar o modelo mostrado no aplicativo de exemplo. Estas instruções usam o aplicativo de exemplo como ponto de referência. As alterações específicas necessárias para seu próprio aplicativo podem variar do aplicativo de exemplo.

Abra ou crie um projeto Android

Você precisa de um projeto de desenvolvimento Android no Android Studio para seguir o restante destas instruções. Siga as instruções abaixo para abrir um projeto existente ou criar um novo.

Para abrir um projeto de desenvolvimento Android existente:

  • No Android Studio, selecione Arquivo > Abrir e selecione um projeto existente.

Para criar um projeto básico de desenvolvimento Android:

Para obter mais informações sobre como usar o Android Studio, consulte a documentação do Android Studio .

Adicionar dependências do projeto

Em seu próprio aplicativo, você deve adicionar dependências de projeto específicas para executar modelos de aprendizado de máquina do TensorFlow Lite e acessar funções de utilitário que convertem dados, como strings, em um formato de dados de tensor que pode ser processado pelo modelo que você está usando.

As instruções a seguir explicam como adicionar as dependências necessárias do projeto e do módulo ao seu próprio projeto de aplicativo Android.

Para adicionar dependências de módulo:

  1. No módulo que usa o TensorFlow Lite, atualize o arquivo build.gradle do módulo para incluir as dependências a seguir.

    No aplicativo de exemplo, as dependências estão localizadas em app/build.gradle :

    dependencies {
      ...
      implementation 'org.tensorflow:tensorflow-lite-task-text:0.4.0'
    }
    

    O projeto deve incluir a biblioteca de tarefas Text ( tensorflow-lite-task-text ).

    Se você deseja modificar este aplicativo para ser executado em uma unidade de processamento gráfico (GPU), a biblioteca GPU ( tensorflow-lite-gpu-delegate-plugin ) fornece a infraestrutura para executar o aplicativo na GPU e Delegate ( tensorflow-lite-gpu ) fornece a lista de compatibilidade. A execução deste aplicativo na GPU está fora do escopo deste tutorial.

  2. No Android Studio, sincronize as dependências do projeto selecionando: File > Sync Project with Gradle Files .

Inicialize os modelos de ML

No seu aplicativo Android, você deve inicializar o modelo de aprendizado de máquina do TensorFlow Lite com parâmetros antes de executar previsões com o modelo.

Um modelo do TensorFlow Lite é armazenado como um arquivo *.tflite . O arquivo de modelo contém a lógica de previsão e normalmente inclui metadados sobre como interpretar os resultados da previsão, como nomes de classe de previsão. Normalmente, os arquivos de modelo são armazenados no diretório src/main/assets do seu projeto de desenvolvimento, como no exemplo de código:

  • <project>/src/main/assets/mobilebert.tflite
  • <project>/src/main/assets/wordvec.tflite

Por conveniência e legibilidade do código, o exemplo declara um objeto complementar que define as configurações do modelo.

Para inicializar o modelo em seu aplicativo:

  1. Crie um objeto complementar para definir as configurações do modelo. No aplicativo de exemplo, este objeto está localizado em TextClassificationHelper.kt :

    companion object {
      const val DELEGATE_CPU = 0
      const val DELEGATE_NNAPI = 1
      const val WORD_VEC = "wordvec.tflite"
      const val MOBILEBERT = "mobilebert.tflite"
    }
    
  2. Crie as configurações para o modelo criando um objeto classificador e construa um objeto TensorFlow Lite usando BertNLClassifier ou NLClassifier .

    No aplicativo de exemplo, isso está localizado na função initClassifier em TextClassificationHelper.kt :

    fun initClassifier() {
      ...
      if( currentModel == MOBILEBERT ) {
        ...
        bertClassifier = BertNLClassifier.createFromFileAndOptions(
          context,
          MOBILEBERT,
          options)
      } else if (currentModel == WORD_VEC) {
          ...
          nlClassifier = NLClassifier.createFromFileAndOptions(
            context,
            WORD_VEC,
            options)
      }
    }
    

Ativar aceleração de hardware (opcional)

Ao inicializar um modelo do TensorFlow Lite em seu aplicativo, considere o uso de recursos de aceleração de hardware para acelerar os cálculos de previsão do modelo. Os delegados do TensorFlow Lite são módulos de software que aceleram a execução de modelos de aprendizado de máquina usando hardware de processamento especializado em um dispositivo móvel, como unidade de processamento gráfico (GPUs) ou unidades de processamento de tensor (TPUs).

Para habilitar a aceleração de hardware em seu aplicativo:

  1. Crie uma variável para definir o delegado que o aplicativo usará. No aplicativo de exemplo, essa variável está localizada no início de TextClassificationHelper.kt :

    var currentDelegate: Int = 0
    
  2. Crie um seletor de delegado. No aplicativo de exemplo, o seletor de delegado está localizado na função initClassifier em TextClassificationHelper.kt :

    val baseOptionsBuilder = BaseOptions.builder()
    when (currentDelegate) {
       DELEGATE_CPU -> {
           // Default
       }
       DELEGATE_NNAPI -> {
           baseOptionsBuilder.useNnapi()
       }
    }
    

O uso de representantes para executar modelos do TensorFlow Lite é recomendado, mas não obrigatório. Para obter mais informações sobre como usar representantes com o TensorFlow Lite, consulte Delegados do TensorFlow Lite .

Preparar dados para o modelo

Em seu aplicativo Android, seu código fornece dados ao modelo para interpretação, transformando dados existentes, como texto bruto, em um formato de dados do Tensor que pode ser processado por seu modelo. Os dados em um tensor que você passa para um modelo devem ter dimensões ou formas específicas que correspondam ao formato de dados usado para treinar o modelo.

Este aplicativo de classificação de texto aceita uma string como entrada e os modelos são treinados exclusivamente em um corpus de idioma inglês. Caracteres especiais e palavras não inglesas são ignorados durante a inferência.

Para fornecer dados de texto ao modelo:

  1. Certifique-se de que a função initClassifier contenha o código para o delegado e os modelos, conforme explicado nas seções Inicializar os modelos de ML e Ativar aceleração de hardware .

  2. Use o bloco init para chamar a função initClassifier . No aplicativo de exemplo, o init está localizado em TextClassificationHelper.kt :

    init {
      initClassifier()
    }
    

Executar previsões

Em seu aplicativo Android, depois de inicializar um objeto BertNLClassifier ou NLClassifier , você pode começar a alimentar o texto de entrada para o modelo categorizar como "positivo" ou "negativo".

Para executar previsões:

  1. Crie uma função de classify , que usa o classificador selecionado ( currentModel ) e mede o tempo necessário para classificar o texto de entrada ( inferenceTime ). No aplicativo de exemplo, a função classify está localizada em TextClassificationHelper.kt :

    fun classify(text: String) {
      executor = ScheduledThreadPoolExecutor(1)
    
      executor.execute {
        val results: List<Category>
        // inferenceTime is the amount of time, in milliseconds, that it takes to
        // classify the input text.
        var inferenceTime = SystemClock.uptimeMillis()
    
        // Use the appropriate classifier based on the selected model
        if(currentModel == MOBILEBERT) {
          results = bertClassifier.classify(text)
        } else {
          results = nlClassifier.classify(text)
        }
    
        inferenceTime = SystemClock.uptimeMillis() - inferenceTime
    
        listener.onResult(results, inferenceTime)
      }
    }
    
  2. Passe os resultados de classify para o objeto ouvinte.

    fun classify(text: String) {
      ...
      listener.onResult(results, inferenceTime)
    }
    

Lidar com a saída do modelo

Depois de inserir uma linha de texto, o modelo produz uma pontuação de previsão, expressa como um Float, entre 0 e 1 para as categorias 'positivo' e 'negativo'.

Para obter os resultados de previsão do modelo:

  1. Crie uma função onResult para o objeto listener para manipular a saída. No aplicativo de exemplo, o objeto ouvinte está localizado em MainActivity.kt

    private val listener = object : TextClassificationHelper.TextResultsListener {
      override fun onResult(results: List<Category>, inferenceTime: Long) {
        runOnUiThread {
          activityMainBinding.bottomSheetLayout.inferenceTimeVal.text =
            String.format("%d ms", inferenceTime)
    
          adapter.resultsList = results.sortedByDescending {
            it.score
          }
    
          adapter.notifyDataSetChanged()
        }
      }
      ...
    }
    
  2. Adicione uma função onError ao objeto listener para lidar com erros:

      private val listener = object : TextClassificationHelper.TextResultsListener {
        ...
        override fun onError(error: String) {
          Toast.makeText(this@MainActivity, error, Toast.LENGTH_SHORT).show()
        }
      }
    

Depois que o modelo retornar um conjunto de resultados de previsão, seu aplicativo poderá agir nessas previsões apresentando o resultado ao usuário ou executando lógica adicional. O aplicativo de exemplo lista as pontuações de previsão na interface do usuário.

Próximos passos