Clasificación de texto con Android

Este tutorial le muestra cómo crear una aplicación de Android con 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 usa TensorFlow Lite para clasificar texto como positivo o negativo, usando 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 usar 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 que fue entrenado para clasificar. Por ejemplo, los modelos de este ejemplo aceptan un fragmento de texto y determinan si la opinión del texto es positiva o negativa. 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 en 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 con el conjunto de datos SST-2 (Stanford Sentiment Treebank). SST-2 contiene 67,349 reseñas de películas para entrenamiento y 872 reseñas de películas para prueba, con cada reseña categorizada como positiva o negativa. Los modelos utilizados en esta aplicación se entrenaron con la herramienta TensorFlow Lite Model Maker .

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

  • Vector de palabra 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 de sistema operativo mínima de SDK 21 (Android 7.0 - Nougat) con el modo de desarrollador habilitado o un emulador de Android.

Obtener 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, compile el proyecto y luego ejecútelo.

Para importar y compilar 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 de 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 desarrollador esté habilitado. Haga clic en la flecha verde Run .

Si selecciona el directorio correcto, Android Studio crea un nuevo proyecto y lo compila. Este proceso puede demorar algunos 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 adjunto (o emulador) 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 conectado o en el emulador de dispositivo.

Para usar el clasificador de texto:

  1. Introduzca 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 de entrada 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 la biblioteca de tareas para el paquete de lenguaje natural (NL) para implementar los modelos de clasificación de texto. Los dos modelos, Average Word Vector y MobileBERT, se entrenaron con 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 de la aplicación de ejemplo.

Abra o cree 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 básico de desarrollo 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 proyectos específicas para ejecutar modelos de aprendizaje automático de TensorFlow Lite y acceder a funciones de utilidades que convierten datos, como cadenas, en un formato de datos de tensor que puede procesar 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ódulo:

  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 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. Ejecutar 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 de 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 del modelo contiene la lógica de predicción y, por lo general, incluye metadatos sobre cómo interpretar los resultados de la predicción, como los nombres de las clases de predicción. Por lo general, los archivos del 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

Para mayor comodidad 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 mediante hardware de procesamiento especializado en un dispositivo móvil, como unidades 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 usará la aplicación. En la aplicación de ejemplo, esta variable se encuentra al principio de TextClassificationHelper.kt :

    var currentDelegate: Int = 0
    
  2. Cree 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 usar 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 mediante la transformación de datos existentes, como texto sin formato, en un formato de datos Tensor que puede procesar su modelo. Los datos de un tensor que pasas 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 de 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 de 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 ingresar texto de entrada para que el modelo se clasifique como "positivo" o "negativo".

Para ejecutar predicciones:

  1. Cree una función de classify , que use 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 de 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 los 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