Guía de incorporación de texto para Android

La tarea MediaPipe Text Embedder te permite crear una representación numérica de los datos de texto para capturar su significado semántico. En estas instrucciones, se muestra cómo usar la incorporación de texto con apps para Android.

Para obtener más información sobre las capacidades, los modelos y las opciones de configuración de esta tarea, consulta la Descripción general.

Ejemplo de código

El código de ejemplo de MediaPipe Tasks es una implementación simple de una app de incorporación de texto para Android. En el ejemplo, se evalúan las similitudes semánticas entre dos fragmentos de texto y se requiere un dispositivo Android físico o un emulador de Android.

Puedes usar la app como punto de partida de tu propia app para Android o consultarla cuando modifiques una app existente. El código de ejemplo de Text Embedder se aloja en GitHub.

Descarga el código

En las siguientes instrucciones, se muestra cómo crear una copia local del código de ejemplo con la herramienta de línea de comandos git.

Para descargar el código de ejemplo, haz lo siguiente:

  1. Usa el siguiente comando para clonar el repositorio de Git:
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. De manera opcional, configura tu instancia de Git para que use un proceso de confirmación de compra disperso, de modo que solo tengas los archivos para la app de ejemplo de Incorporación de texto:
    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/text_embedder/android
    
    .

Después de crear una versión local del código de ejemplo, puedes importar el proyecto a Android Studio y ejecutar la app. Para obtener instrucciones, consulta la Guía de configuración de Android.

Componentes clave

Los siguientes archivos contienen el código fundamental para esta aplicación de ejemplo de incorporación de texto:

  • TextEmbedderHelper.kt: Inicializa la incorporación de texto y controla la selección del modelo y del delegado.
  • MainActivity.kt: Implementa la aplicación y ensambla los componentes de la interfaz de usuario.

Configuración

En esta sección, se describen los pasos clave para configurar tu entorno de desarrollo y los proyectos de código específicamente para usar Text Embedder. Si quieres obtener información general sobre cómo configurar tu entorno de desarrollo para usar tareas de MediaPipe, incluidos los requisitos de la versión de la plataforma, consulta la Guía de configuración para Android.

Dependencias

Text Embedder usa las bibliotecas com.google.mediapipe:tasks-text. Agrega esta dependencia al archivo build.gradle de tu proyecto de desarrollo de apps para Android. Puedes importar las dependencias requeridas con el siguiente código:

dependencies {
    implementation 'com.google.mediapipe:tasks-text:latest.release'
}

Modelo

La tarea MediaPipe Text Embedder requiere un modelo entrenado que sea compatible con esta tarea. Si deseas obtener más información sobre los modelos entrenados disponibles para Text Embedder, consulta la descripción general de la tarea en la sección Modelos.

Selecciona y descarga el modelo. Luego, almacénalo en el directorio de tu proyecto:

<dev-project-root>/src/main/assets

Especifica la ruta del modelo dentro del parámetro ModelAssetPath. En el código de ejemplo, el modelo se define en la función setupTextEmbedder() del archivo TextEmbedderHelper.kt:

Usa la función BaseOptions.Builder.setModelAssetPath() para especificar la ruta que usa el modelo. Se hace referencia a este método en el ejemplo de código de la siguiente sección.

Crea la tarea

Puedes usar una de las funciones createFrom...() para crear la tarea. La función createFromOptions() acepta opciones de configuración para establecer las opciones de incorporación. También puedes inicializar la tarea con la función de fábrica createFromFile(). La función createFromFile() acepta una ruta de acceso relativa o absoluta al archivo del modelo entrenado. Si deseas obtener más información sobre las opciones de configuración, consulta Opciones de configuración.

En el siguiente código, se muestra la compilación y configuración de esta tarea.

val baseOptions = baseOptionsBuilder.build()
val optionsBuilder =
    TextEmbedderOptions.builder().setBaseOptions(baseOptions)
val options = optionsBuilder.build()
textEmbedder = TextEmbedder.createFromOptions(context, options)

La implementación de código de ejemplo configura las opciones de incorporación de texto en la función setupTextEmbedder() del archivo TextEmbedderHelper.kt.

Opciones de configuración

Esta tarea incluye las siguientes opciones de configuración para apps para Android:

Nombre de la opción Descripción Rango de valores Valor predeterminado
l2_normalize Indica si se debe normalizar el vector de atributos mostrados con la norma L2. Usa esta opción solo si el modelo todavía no contiene una operación nativa de TFLite L2_NORMALIZATION. En la mayoría de los casos, este ya es el caso y, por lo tanto, la normalización L2 se logra a través de inferencia de TFLite sin necesidad de esta opción. Boolean False
quantize Indica si la incorporación que se muestra debe cuantizarse en bytes a través de la cuantización escalar. Se supone implícitamente que las incorporaciones son la norma unitaria y, por lo tanto, se garantiza que cualquier dimensión tenga un valor en [-1.0, 1.0]. Si este no es el caso, usa la opción l2_normalize. Boolean False

Preparar los datos

Text Embedder funciona con datos de texto (String). Esta tarea controla el procesamiento previo de la entrada de datos, incluida la asignación de token y el procesamiento previo del tensor. Todo el procesamiento previo se controla dentro de la función embed(). No es necesario realizar un procesamiento previo adicional del texto de entrada con anterioridad.

val inputText = "The input text to be embedded."

Ejecuta la tarea

Text Embedder usa la función embed para activar inferencias. Para la incorporación de texto, esto significa mostrar los vectores de incorporación para el texto de entrada.

En el siguiente código, se muestra cómo ejecutar el procesamiento con el modelo de tareas.

textEmbedder?.let {
    val firstEmbed =
        it.embed(firstText).embeddingResult().embeddings().first()
    val secondEmbed =
        it.embed(secondText).embeddingResult().embeddings().first()
    ...
}

En el código de ejemplo, se llama a la función embed en el archivo TextEmbedderHelper.kt.

Cómo controlar y mostrar los resultados

Cuando se ejecuta la inferencia, la tarea de incorporación de texto muestra un objeto TextEmbedderResult que contiene una lista de incorporaciones (ya sea de punto flotante o cuantizadas de forma escalar) para el texto de entrada.

A continuación, se muestra un ejemplo de los datos de salida de esta tarea:

TextEmbedderResult:
  Embedding #0 (sole embedding head):
    float_embedding: {0.2345f, 0.1234f, ..., 0.6789f}
    head_index: 0

Puedes comparar la similitud semántica de dos incorporaciones con la función TextEmbedder.cosineSimilarity. Consulta el siguiente código para ver un ejemplo.

val similarity = TextEmbedder.cosineSimilarity(firstEmbed, secondEmbed)

En el código de ejemplo, se llama a la función TextEmbedder.cosineSimilarity() en el archivo TextEmbedderHelper.kt.