Path: blob/master/site/es-419/tutorials/load_data/text.ipynb
25118 views
Copyright 2018 The TensorFlow Authors.
Carga de texto
En este tutorial se demuestran dos formas de cargar y preprocesar texto.
Primero, deberá usar las utilidades y las capas de procesamiento de Keras. Esto incluye
tf.keras.utils.text_dataset_from_directory
para convertir los datos en untf.data.Dataset
ytf.keras.layers.TextVectorization
para la estandarización, la "tokenización" y la vectorización de datos. Si no ha trabajado antes con TensorFlow, debería empezar con esto.Después, usará utilidades de bajo nivel como
tf.data.TextLineDataset
para cargar los archivos de texto y las API TensorFlow Text, comotext.UnicodeScriptTokenizer
ytext.case_fold_utf8
, para procesar previamente los datos y lograr un control de granulado fino.
Ejemplo 1: predicción de la etiqueta para una pregunta de Stack Overflow
Como primer ejemplo, deberá descargar un conjunto de datos de preguntas sobre programación de Stack Overflow. Cada pregunta ("How do I sort a dictionary by value?") (¿Cómo ordeno un diccionario por valores?) está marcada exactamente con una etiqueta (Python
, CSharp
, JavaScript
o Java
). La tarea consiste en desarrollar un modelo que prediga la etiqueta para una pregunta. Este es un ejemplo de clasificación en clases múltiples, un tipo importante y ampliamente aplicable de problemas relacionados con el aprendizaje automático.
Descarga y exploración de conjuntos de datos
Comience por descargar el conjunto de datos de Stack Overflow con tf.keras.utils.get_file
y explore la estructura del directorio:
Los directorios train/csharp
, train/java
, train/python
y train/javascript
contienen muchos archivos de texto, cada uno es una pregunta de Stack Overflow.
Imprima un archivo de ejemplo e inspeccione los datos:
Carga del conjunto de datos
A continuación, deberá cargar los datos en memoria y prepararlos en un formato adecuado para el entrenamiento. Para hacerlo, deberá usar la utilidad tf.keras.utils.text_dataset_from_directory
, a fin de crear un tf.data.Dataset
marcado. Si no ha usado antes tf.data
, deberá saber que es una recopilación potente de herramientas para construir canalizaciones de entrada. (Para más información, consulte la guía sobre tf.data: Construir canalizaciones de entrada de TensorFlow).
La API tf.keras.utils.text_dataset_from_directory
espera una estructura de directorio como la siguiente:
A la hora de hacer un experimento de aprendizaje automático, lo mejor es dividir el conjunto de datos en tres partes: entrenamiento, validación y prueba.
El conjunto de datos Stack Overflow ya se ha dividido en conjuntos de prueba y entrenamiento, pero aún falta un conjunto de validación.
Cree un conjunto de validación con una proporción de 80:20 de los datos de entrenamiento tf.keras.utils.text_dataset_from_directory
con validation_split
configurado como 0.2
(es decir, 20 %):
Tal como lo sugieren los resultados de celdas anteriores, hay 8000 ejemplos en la carpeta de entrenamiento, de los cuales se usará el 80% (o 6400) para entrenamiento. En un momento aprenderá que puede entrenar un modelo pasando un tf.data.Dataset
directamente a Model.fit
.
Primero, itere sobre el conjunto de datos e imprima algunos ejemplos para familiarizarse con los datos.
Nota: Para aumentar la dificultad del problema de clasificación, el autor del conjunto de datos reemplazó las apariciones de las palabras Python, CSharp, JavaScript o Java en la pregunta de programación con la palabra blank.
Las etiquetas son 0
, 1
, 2
o 3
. Para comprobar cuáles corresponden a qué etiqueta de cadena, se puede inspeccionar la propiedad class_names
en el conjunto de datos:
A continuación, creará un conjunto de datos de validación y prueba con tf.keras.utils.text_dataset_from_directory
. Usará las 1600 reseñas restantes del conjunto de entrenamiento para ejecutar la validación.
Nota: Cuando use los argumentos validation_split
y subset
de tf.keras.utils.text_dataset_from_directory
, asegúrese de especificar una semilla aleatoria o de pasar shuffle=False
, para que las fracciones de validación y entrenamiento no se superpongan.
Preparación del conjunto de datos para entrenamiento
A continuación, usará la capa tf.keras.layers.TextVectorization
para estandarizar, tokenizar y vectorizar los datos.
La estandarización se refiere al procesamiento previo del texto. Normalmente, quitar la puntuación o los elementos HTML para simplificar el conjunto de datos.
La tokenización se refiere a la separación de cadenas en tokens (por ejemplo, al separar una oración en palabras individuales haciendo la división en los espacios en blanco).
La vectorización se refiere a convertir tokens en números para que se puedan usar para alimentar una red neuronal.
Todas estas tareas se pueden cumplir con esta capa. (Para más información sobre cada una de estas opciones, consulte los documentos sobre la API tf.keras.layers.TextVectorization
).
Tenga en cuenta que:
La estandarización predeterminada transforma el texto en minúscula y quita la puntuación (
standardize='lower_and_strip_punctuation'
).El tokenizador predeterminado hace las divisiones en los espacios en blanco (
split='whitespace'
).El modo de vectorización predeterminado es
'int'
(output_mode='int'
). Devuelve índices enteros (uno por token). Este modo se puede usar para crear modelos que tengan en cuenta el orden de las palabras. También puede usar otros modelos, como'binary'
para crear modelos bolsa de palabras.
Cree dos modelos para aprender más sobre la estandarización, la tokenización y la vectorización con TextVectorization
:
Primero, use el modo de vectorización
'binary'
para crear un modelo de bolsa de palabras.Después, use el modo
'int'
con una ConvNet de 1 D.
Para el modo 'int'
, además del tamaño de vocabulario máximo, necesitará establecer una longitud de secuencia máxima (MAX_SEQUENCE_LENGTH
) explícita, que hará que la capa rellene o trunque las secuencias según los valores output_sequence_length
exactos:
A continuación, llamará TextVectorization.adapt
para que ajuste el estado de la capa de preprocesamiento al conjunto de datos. Esto hará que el modelo convierta un índice de cadenas a enteros.
Nota: Es importante que solamente use los datos de entrenamiento para llamar a TextVectorization.adapt
, ya que si usa el conjunto de prueba, se podría filtrar información.
Imprima el resultado de usar estas capas para el procesamiento previo de los datos:
Tal como se muestra arriba, el modo 'binary'
de TextVectorization
devuelve un arreglo que denota qué tokens existen al menos una vez en la entrada; mientras que el modo 'int'
reemplaza a cada token por un entero y así conserva su orden.
Se puede llamar a TextVectorization.get_vocabulary
en la capa para buscar el token (cadena) al que corresponde cada entero:
Ya esta casi todo listo para entrenar el modelo.
Como último paso, deberá aplicara las capas de TextVectorization
que creó antes para los conjuntos de entrenamiento, validación y prueba:
Configuración del conjunto de datos para rendimiento
Hay dos métodos importantes que debería usar cuando cargue los datos para garantizar que la entrada o la salida no se bloqueen.
.cache()
conserva los datos en la memoria después de que descarga del disco. Esto evitará que el conjunto de datos se transforme en un cuello de botella mientras entrena su modelo. Si su conjunto de datos es demasiado grande para caber en la memoria, también puede usar este método para crear un potente caché en disco, que se lea de forma más eficiente que muchos archivos pequeños.Dataset.prefetch
se superpone con el procesamiento de los datos y la ejecución del modelo durante el entrenamiento.
Para más información sobre ambos métodos y sobre cómo almacenar los datos en la memoria caché del disco, consulte la sección Preextracción de la guía Mejor rendimiento con la API tf.data API.
Entrenamiento del modelo
Llegó la hora de crear su red neuronal.
Para los datos 'binary'
vectorizados, defina un modelo lineal de bolsa de palabras simple. Luego, prepárelo y entrénelo:
Luego, use la capa vectorizada 'int'
para crear una ConvNet de 1 D:
Compare los dos modelos:
Evalúe ambos modelos con los datos de prueba:
Nota: En este ejemplo el conjunto de datos representa un problema de clasificación bastante simple. Los conjuntos de datos y problemas más complejos presentan diferencias sutiles pero importantes en las estrategias de procesamiento de datos y las arquitecturas del modelo. Pruebe diferentes hiperparámetros y épocas para comparar los distintos métodos.
Exportación del modelo
En el código que vimos arriba, se aplicó tf.keras.layers.TextVectorization
al conjunto de datos antes de alimentar el modelo con el texto. Si desea que su modelo sea capaz de procesar cadenas sin procesar (por ejemplo, para simplificar la implementación), puede incluir la capa TextVectorization
dentro del modelo.
Para hacerlo, puede crear un modelo nuevo con los pesos que ha entrenado recién:
Ahora, su modelo puede tomar las cadenas sin procesar como entradas y predecir un puntaje para cada etiqueta con Model.predict
. Defina una función para buscar la etiqueta con el puntaje máximo:
Ejecución de la inferencia en datos nuevos
Incluir la lógica de preprocesamiento de textos en su modelo le permitirá exportar un modelo para producción que simplifique la implementación y reduzca la probabilidad de que se produzca un sesgo entre entrenamiento y prueba.
Hay una diferencia de rendimiento que debemos tener en cuenta a la hora de elegir dónde aplicar la capa tf.keras.layers.TextVectorization
. Si la usa fuera del modelo puede hacer un procesamiento asincrónico en CPU y almacenar en búfer los datos cuando se entrena en GPU. Por lo tanto, si entrena su modelo en GPU, probablemente debería elegir esta opción para obtener el mejor rendimiento mientras desarrolla su modelo y luego, cambiar para incluir la capa TextVectorization
dentro de su modelo, cuando esté listo para prepararse para la implementación.
Para más información acerca de cómo guardar modelos, consulte el tutorial sobre cómo guardar y cargar modelos.
Ejemplo 2: predicción de los autores de las traducciones de La Ilíada
A continuación, se brinda un ejemplo de cómo se usa tf.data.TextLineDataset
para cargar ejemplos a partir de archivos de texto y TensorFlow Text para procesar los datos. Usará tres traducciones diferentes del mismo trabajo, la Ilíada de Homero, al idioma inglés y entrenará un modelo para identificar al autor con una sola línea de texto.
Descarga y exploración de conjuntos de datos
Los autores de los textos de las tres traducciones son:
Los archivos de texto usados en este tutorial ya sufrieron algunas modificaciones realizadas con algunas tareas típicas de procesamiento como las de quitar el encabezado y el pie de página, los números de línea y los títulos de los capítulos.
Descargue estos archivos ligeramente modificados en un dispositivo local:
Carga del conjunto de datos
Anteriormente, con tf.keras.utils.text_dataset_from_directory
todo el contenido de un archivo se trataba como un único ejemplo. Ahora, usará tf.data.TextLineDataset
, que está diseñado para crear un tf.data.Dataset
a partir de un archivo de texto en el que cada ejemplo es una línea de texto del archivo original. TextLineDataset
es útil para datos de texto que se basa principalmente en líneas (por ejemplo, registros de poesía o errores).
Itere en estos archivos, cargando cada uno en su propio conjunto de datos. Los ejemplos se deben etiquetar cada uno por separado. Entonces, use Dataset.map
para aplicar una función para etiquetar a cada uno. Esto hará que se itere sobre cada ejemplo en el conjunto de datos, devolviendo pares (example, label
).
A continuación, combinará estos conjuntos de datos etiquetados en un único conjunto de datos con Dataset.concatenate
y lo aleatorizará con Dataset.shuffle
:
Imprima algunos ejemplos como antes. El conjunto de datos todavía no se ha agrupado, por lo tanto cada entrada de all_labeled_data
corresponde a un dato puntual:
Preparación del conjunto de datos para entrenamiento
En vez de usar tf.keras.layers.TextVectorization
para el proceso previo del conjunto de datos de texto; en este caso, usará las API TensorFlow Text para estandarizar y tokenizar los datos. Además, elaborará un vocabulario y usará tf.lookup.StaticVocabularyTable
para mapear los tokens con los enteros a fin de incorporarlos al modelo. (Acceda a más información sobre TensorFlow Text).
Defina una función para convertir el texto, pasarlo a minúsculas y tokenizarlo:
TensorFlow Text brinda varios tokenizadores. En este ejemplo, se usará el
text.UnicodeScriptTokenizer
para tokenizar el conjunto de datos.Para aplicar la tokenización al conjunto de datos, deberá usar
Dataset.map
.
Se puede iterar sobre el conjunto de datos e imprimir algunos ejemplos tokenizados:
A continuación, creará un vocabulario. Para ello, deberá ordenar los tokens por frecuencia y conservará los principales tokens VOCAB_SIZE
:
Para convertir los tokens en enteros, use el conjunto vocab
y cree con él una tf.lookup.StaticVocabularyTable
. Lo que hará será vincular (mapear) los tokens con los enteros en el rango [2
, vocab_size + 2
]. Del mismo modo, con la capa TextVectorization
, se reserva 0
para denotar el amortiguado y se reserva 1
para denotar un token fuera del vocabulario (OOV).
Finalmente, defina una función para estandarizar, tokenizar y vectorizar el conjunto de datos con el tokenizador y la tabla de búsqueda:
Puede intentarlo con un ejemplo solo para imprimir el resultado:
Ahora, ejecute la función de preproceso del conjunto de datos con Dataset.map
:
División de los conjuntos de datos en conjuntos de entrenamiento y prueba
La capa TextVectorization
de Keras también se agrupa en lotes y amortigua los datos vectorizados. El amortiguado (padding) es necesario porque los ejemplos que se encuentran dentro de cada lote deben tener el mismo tamaño y la misma forma, pero los ejemplos de estos conjuntos de datos no son todos del mismo tamaño, cada línea de texto tiene una cantidad diferente de palabras.
tf.data.Dataset
es compatible con la división y el agrupamiento amortiguado de los conjuntos de datos:
Ahora, validation_data
y train_data
no son recopilaciones de pares (example, label
), sino de lotes. Cada lote es un par (muchos ejemplos, muchas etiquetas) representado como arreglo.
A modo ilustrativo:
Como usa 0
para el amortiguado y 1
para los tokens fuera de vocabulario (OOV), el tamaño del vocabulario ha aumentado a 2:
Configure los conjuntos de datos para mejorar el rendimiento como antes:
Entrenamiento del modelo
Igual que antes, puede entrenar el modelo de este conjunto de datos:
Exportación del modelo
Para que el modelo sea capaz de tomar cadenas sin procesar como entradas, deberá crear una capa TextVectorization
de Keras que realice los mismos pasos que su función de preprocesamiento personalizada. Como ya ha entrenado un vocabulario, puede usar TextVectorization.set_vocabulary
, en vez de TextVectorization.adapt
que entrena a un vocabulario nuevo.
La pérdida y la exactitud del modelo en el conjunto de validación codificado y en el modelo exportado en el conjunto de validación sin procesar son iguales, tal como se espera.
Ejecución de la inferencia en datos nuevos
Descarga de más conjuntos de datos con TensorFlow Datasets (TFDS)
Puede descargar muchos más conjuntos de datos con los Datasets de TensorFlow.
Para este ejemplo, usará conjuntos de datos para revisión de películas largas de IMDB para entrenar un modelo de clasificación de sentimientos:
Imprima algunos ejemplos:
Ahora puede preprocesar los datos y entrenar un modelo como antes.
Nota: Deberá usar tf.keras.losses.BinaryCrossentropy
en vez de tf.keras.losses.SparseCategoricalCrossentropy
para su modelo, ya que se trata de un problema de clasificación binaria.
Preparación del conjunto de datos para entrenamiento
Creación, configuración y entrenamiento del modelo
Exportación del modelo
Conclusión
En este tutorial se demostraron varias formas de cargar y preprocesar texto. Para avanzar al paso siguiente, puede explorar otros tutoriales de TensorFlow Text sobre preprocesamiento de texto, tales como:
También puede buscar conjuntos nuevos de datos en TensorFlow Datasets. Y, para más información sobre tf.data
, consulte la guía sobre cómo construir canalizaciones de entrada.