Clasificación de texto con Android

Este tutorial le muestra cómo crear una aplicación de Android usando TensorFlow Lite para clasificar texto en lenguaje natural. Esta aplicación está diseñada para un dispositivo Android físico, pero también puede ejecutarse en un emulador de dispositivo.

La aplicación de ejemplo utiliza TensorFlow Lite para clasificar texto como positivo o negativo, utilizando la biblioteca de tareas para lenguaje natural (NL) para permitir la ejecución de los modelos de aprendizaje automático de clasificación de texto.

Si está actualizando un proyecto existente, puede utilizar la aplicación de ejemplo como referencia o plantilla. Para obtener instrucciones sobre cómo agregar clasificación de texto a una aplicación existente, consulte Actualización y modificación de su aplicación .

Descripción general de la clasificación de texto

La clasificación de texto es la tarea de aprendizaje automático de asignar un conjunto de categorías predefinidas a un texto abierto. Un modelo de clasificación de texto se entrena en un corpus de texto en lenguaje natural, donde las palabras o frases se clasifican manualmente.

El modelo entrenado recibe texto como entrada e intenta categorizar el texto de acuerdo con el conjunto de clases conocidas para las que fue entrenado. Por ejemplo, los modelos de este ejemplo aceptan un fragmento de texto y determinan si el sentimiento del texto es positivo o negativo. Para cada fragmento de texto, el modelo de clasificación de texto genera una puntuación que indica la confianza de que el texto se clasifique correctamente como positivo o negativo.

Para obtener más información sobre cómo se generan los modelos de este tutorial, consulte el tutorial Clasificación de texto con TensorFlow Lite Model Maker .

Modelos y conjunto de datos

Este tutorial utiliza modelos que se entrenaron utilizando el conjunto de datos SST-2 (Stanford Sentiment Treebank). SST-2 contiene 67,349 reseñas de películas para capacitación y 872 reseñas de películas para pruebas, y cada reseña se clasifica como positiva o negativa. Los modelos utilizados en esta aplicación se entrenaron utilizando la herramienta TensorFlow Lite Model Maker .

La aplicación de ejemplo utiliza los siguientes modelos previamente entrenados:

  • Vector de palabras promedio ( NLClassifier ): el NLClassifier de la biblioteca de tareas clasifica el texto de entrada en diferentes categorías y puede manejar la mayoría de los modelos de clasificación de texto.

  • MobileBERT ( BertNLClassifier ): el BertNLClassifier de la biblioteca de tareas es similar al NLClassifier, pero está diseñado para casos que requieren tokenizaciones de Wordpiece y Sentencepiece fuera del gráfico.

Configurar y ejecutar la aplicación de ejemplo

Para configurar la aplicación de clasificación de texto, descargue la aplicación de ejemplo de GitHub y ejecútela con Android Studio .

Requisitos del sistema

  • Android Studio versión 2021.1.1 (Bumblebee) o superior.
  • Android SDK versión 31 o superior
  • Dispositivo Android con una versión mínima del sistema operativo SDK 21 (Android 7.0 - Nougat) con el modo de desarrollador habilitado o un emulador de Android.

Obtenga el código de ejemplo

Cree una copia local del código de ejemplo. Utilizará este código para crear un proyecto en Android Studio y ejecutar la aplicación de ejemplo.

Para clonar y configurar el código de ejemplo:

  1. Clonar el repositorio git
    git clone https://github.com/tensorflow/examples.git
    
  2. Opcionalmente, configure su instancia de git para usar el pago disperso, de modo que solo tenga los archivos para la aplicación de ejemplo de clasificación de texto:
    cd examples
    git sparse-checkout init --cone
    git sparse-checkout set lite/examples/text_classification/android
    

Importar y ejecutar el proyecto.

Cree un proyecto a partir del código de ejemplo descargado, compílelo y luego ejecútelo.

Para importar y construir el proyecto de código de ejemplo:

  1. Inicie Android Studio .
  2. Desde Android Studio, seleccione Archivo > Nuevo > Importar proyecto .
  3. Navegue hasta el directorio del código de ejemplo que contiene el archivo build.gradle ( .../examples/lite/examples/text_classification/android/build.gradle ) y seleccione ese directorio.
  4. Si Android Studio solicita Gradle Sync, elija Aceptar.
  5. Asegúrese de que su dispositivo Android esté conectado a su computadora y que el modo de desarrollador esté habilitado. Haga clic en la flecha verde Run .

Si selecciona el directorio correcto, Android Studio crea un nuevo proyecto y lo construye. Este proceso puede tardar unos minutos, dependiendo de la velocidad de tu computadora y si has usado Android Studio para otros proyectos. Cuando se completa la compilación, Android Studio muestra un mensaje BUILD SUCCESSFUL en el panel de estado de Salida de la compilación .

Para ejecutar el proyecto:

  1. Desde Android Studio, ejecute el proyecto seleccionando Ejecutar > Ejecutar… .
  2. Seleccione un dispositivo Android (o emulador) conectado para probar la aplicación.

Usando la aplicación

Aplicación de ejemplo de clasificación de texto en Android

Después de ejecutar el proyecto en Android Studio, la aplicación se abrirá automáticamente en el dispositivo o emulador de dispositivo conectado.

Para utilizar el clasificador de texto:

  1. Ingrese un fragmento de texto en el cuadro de texto.
  2. En el menú desplegable Delegado , elija CPU o NNAPI .
  3. Especifique un modelo eligiendo AverageWordVec o MobileBERT .
  4. Elija Clasificar .

La aplicación genera una puntuación positiva y una puntuación negativa . Estas dos puntuaciones sumarán 1 y miden la probabilidad de que el sentimiento del texto ingresado sea positivo o negativo. Un número más alto denota un mayor nivel de confianza.

Ahora tiene una aplicación de clasificación de texto en funcionamiento. Utilice las siguientes secciones para comprender mejor cómo funciona la aplicación de ejemplo y cómo implementar funciones de clasificación de texto en sus aplicaciones de producción:

Cómo funciona la aplicación de ejemplo

La aplicación utiliza el paquete de biblioteca de tareas para lenguaje natural (NL) para implementar los modelos de clasificación de texto. Los dos modelos, Average Word Vector y MobileBERT, se entrenaron utilizando TensorFlow Lite Model Maker . La aplicación se ejecuta en la CPU de forma predeterminada, con la opción de aceleración de hardware mediante el delegado NNAPI.

Los siguientes archivos y directorios contienen el código crucial para esta aplicación de clasificación de texto:

Modifica tu aplicación

Las siguientes secciones explican los pasos clave para modificar su propia aplicación de Android para ejecutar el modelo que se muestra en la aplicación de ejemplo. Estas instrucciones utilizan la aplicación de ejemplo como punto de referencia. Los cambios específicos necesarios para su propia aplicación pueden variar respecto a la aplicación de ejemplo.

Abrir o crear un proyecto de Android

Necesita un proyecto de desarrollo de Android en Android Studio para seguir el resto de estas instrucciones. Siga las instrucciones a continuación para abrir un proyecto existente o crear uno nuevo.

Para abrir un proyecto de desarrollo de Android existente:

  • En Android Studio, seleccione Archivo > Abrir y seleccione un proyecto existente.

Para crear un proyecto de desarrollo básico de Android:

Para obtener más información sobre el uso de Android Studio, consulte la documentación de Android Studio .

Agregar dependencias del proyecto

En su propia aplicación, debe agregar dependencias de proyecto específicas para ejecutar modelos de aprendizaje automático de TensorFlow Lite y acceder a funciones de utilidad que convierten datos, como cadenas, en un formato de datos tensorial que puede ser procesado por el modelo que está utilizando.

Las siguientes instrucciones explican cómo agregar las dependencias requeridas del proyecto y del módulo a su propio proyecto de aplicación de Android.

Para agregar dependencias de módulos:

  1. En el módulo que usa TensorFlow Lite, actualice el archivo build.gradle del módulo para incluir las siguientes dependencias.

    En la aplicación de ejemplo, las dependencias se encuentran en app/build.gradle :

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

    El proyecto debe incluir la biblioteca de tareas de Texto ( tensorflow-lite-task-text ).

    Si desea modificar esta aplicación para que se ejecute en una unidad de procesamiento de gráficos (GPU), la biblioteca de GPU ( tensorflow-lite-gpu-delegate-plugin ) proporciona la infraestructura para ejecutar la aplicación en GPU y Delegate ( tensorflow-lite-gpu ) proporciona la lista de compatibilidad. La ejecución de esta aplicación en GPU está fuera del alcance de este tutorial.

  2. En Android Studio, sincronice las dependencias del proyecto seleccionando: Archivo > Sincronizar proyecto con archivos Gradle .

Inicializar los modelos ML

En su aplicación de Android, debe inicializar el modelo de aprendizaje automático de TensorFlow Lite con parámetros antes de ejecutar predicciones con el modelo.

Un modelo de TensorFlow Lite se almacena como un archivo *.tflite . El archivo de modelo contiene la lógica de predicción y normalmente incluye metadatos sobre cómo interpretar los resultados de la predicción, como los nombres de las clases de predicción. Normalmente, los archivos de modelo se almacenan en el directorio src/main/assets de su proyecto de desarrollo, como en el ejemplo de código:

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

Por conveniencia y legibilidad del código, el ejemplo declara un objeto complementario que define la configuración del modelo.

Para inicializar el modelo en su aplicación:

  1. Cree un objeto complementario para definir la configuración del modelo. En la aplicación de ejemplo, este objeto se encuentra en 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. Cree la configuración para el modelo creando un objeto clasificador y construya un objeto TensorFlow Lite usando BertNLClassifier o NLClassifier .

    En la aplicación de ejemplo, esto se encuentra en la función initClassifier dentro de 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)
      }
    }
    

Habilitar la aceleración de hardware (opcional)

Al inicializar un modelo de TensorFlow Lite en su aplicación, debe considerar el uso de funciones de aceleración de hardware para acelerar los cálculos de predicción del modelo. Los delegados de TensorFlow Lite son módulos de software que aceleran la ejecución de modelos de aprendizaje automático utilizando hardware de procesamiento especializado en un dispositivo móvil, como una unidad de procesamiento de gráficos (GPU) o unidades de procesamiento de tensor (TPU).

Para habilitar la aceleración de hardware en su aplicación:

  1. Cree una variable para definir el delegado que utilizará la aplicación. En la aplicación de ejemplo, esta variable se encuentra al principio de TextClassificationHelper.kt :

    var currentDelegate: Int = 0
    
  2. Crea un selector de delegados. En la aplicación de ejemplo, el selector de delegado se encuentra en la función initClassifier dentro de TextClassificationHelper.kt :

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

Se recomienda utilizar delegados para ejecutar modelos de TensorFlow Lite, pero no es obligatorio. Para obtener más información sobre el uso de delegados con TensorFlow Lite, consulte Delegados de TensorFlow Lite .

Preparar datos para el modelo.

En su aplicación de Android, su código proporciona datos al modelo para su interpretación transformando datos existentes, como texto sin formato, en un formato de datos Tensor que puede ser procesado por su modelo. Los datos de un tensor que pasa a un modelo deben tener dimensiones o formas específicas que coincidan con el formato de los datos utilizados para entrenar el modelo.

Esta aplicación de clasificación de texto acepta una cadena como entrada y los modelos se entrenan exclusivamente en un corpus en idioma inglés. Los caracteres especiales y las palabras que no están en inglés se ignoran durante la inferencia.

Para proporcionar datos de texto al modelo:

  1. Asegúrese de que la función initClassifier contenga el código para el delegado y los modelos, como se explica en las secciones Inicializar los modelos ML y Habilitar la aceleración de hardware .

  2. Utilice el bloque init para llamar a la función initClassifier . En la aplicación de ejemplo, el init se encuentra en TextClassificationHelper.kt :

    init {
      initClassifier()
    }
    

Ejecutar predicciones

En su aplicación de Android, una vez que haya inicializado un objeto BertNLClassifier o NLClassifier , puede comenzar a introducir texto de entrada para que el modelo lo categorice como "positivo" o "negativo".

Para ejecutar predicciones:

  1. Cree una función classify , que utilice el clasificador seleccionado ( currentModel ) y mida el tiempo necesario para clasificar el texto de entrada ( inferenceTime ). En la aplicación de ejemplo, la función classify se encuentra en 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. Pase los resultados de classify al objeto de escucha.

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

Manejar la salida del modelo

Después de ingresar una línea de texto, el modelo produce una puntuación de predicción, expresada como flotante, entre 0 y 1 para las categorías "positiva" y "negativa".

Para obtener los resultados de predicción del modelo:

  1. Cree una función onResult para que el objeto de escucha maneje la salida. En la aplicación de ejemplo, el objeto de escucha se encuentra en 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. Agregue una función onError al objeto de escucha para manejar errores:

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

Una vez que el modelo ha devuelto un conjunto de resultados de predicción, su aplicación puede actuar sobre esas predicciones presentando el resultado a su usuario o ejecutando lógica adicional. La aplicación de ejemplo enumera las puntuaciones de predicción en la interfaz de usuario.

Próximos pasos