Blog
Cómo Preparar Datos de Texto con Keras
- Publicado por: Rafael Fernandez
- Categoría: Natural Language Processing
Los datos de texto deben codificarse como números que se utilizarán como entrada o salida para el aprendizaje automático y los modelos de aprendizaje profundo. La biblioteca de aprendizaje profundo de Keras proporciona algunas herramientas básicas para ayudarle a preparar sus datos de texto. En este tutorial, descubrirá cómo puede utilizar Keras para preparar sus datos de texto. Después de completar este tutorial, usted sabrá:
- Acerca de los métodos prácticos que puede utilizar para preparar rápidamente datos de texto.
- La API de Tokenizer se puede ajustar a los datos de formación y se utiliza para codificar la formación y la validación de pruebas.
- El rango de 4 diferentes esquemas de codificación de documentos ofrecidos por la API del Tokenizer.
Tutorial: Preparación de Datos de Texto con Keras
Este tutorial está dividido en las siguientes partes:
- Dividir palabras con text_to_word_sequence.
- Codificación en caliente o Codificación one_hot
- Codificación Hash con truco hashing.
- API de Tokenizer
Dividir palabras con text_to_word_sequence
Un buen primer paso cuando se trabaja con texto es dividirlo en palabras. Las palabras se denominan tokens y el proceso de dividir el texto en tokens se denomina tokenización. Keras proporciona la función text_to_word_sequence() que puedes usar para dividir el texto en una lista de palabras. Por defecto, esta función hace automáticamente 3 cosas:
- Divide las palabras por espacio.
- Filtra la puntuación.
- Convierte texto a minúsculas (lower=True)
Puede cambiar cualquiera de estos valores predeterminados pasando argumentos a la función. A continuación se muestra un ejemplo del uso de la función text_to_word_sequence() para dividir un documento (en este caso una simple cadena) en una lista de palabras.
from keras.preprocessing.text import text_to_word_sequence # definir el documento text = 'The quick brown fox jumped over the lazy dog.' # tokenizar el documento result = text_to_word_sequence(text) print(result)
Al ejecutar el ejemplo se crea una matriz que contiene todas las palabras del documento. La lista de palabras se imprime para su revisión.
['the', 'quick', 'brown', 'fox', 'jumped', 'over', 'the', 'lazy', 'dog']
Este es un buen primer paso, pero se requiere un preprocesamiento adicional antes de poder trabajar con el texto.
Codificación con one_hot
Es popular representar un documento como una secuencia de valores enteros, donde cada palabra en el documento se representa como un entero único. Keras proporciona la función one_hot() que se puede usar para tokenizar y codificar un documento de texto en un solo paso. El nombre sugiere que creará una codificación en caliente del documento, lo cual no es el caso. En su lugar, la función es una envoltura para la función hashing_trick() descrita en la siguiente sección. La función devuelve una versión entera codificada del documento. El uso de una función de hash significa que puede haber colisiones y que no a todas las palabras se les asignarán valores enteros únicos. Al igual que con la función text_to_word_sequence() en la sección anterior, la función one_hot() hará que el texto sea en minúsculas, filtrará la puntuación y dividirá las palabras según el espacio en blanco.
Además del texto, se debe especificar el tamaño del vocabulario (palabras totales). Puede ser el número total de palabras del documento o más si desea codificar documentos adicionales que contengan palabras adicionales. El tamaño del vocabulario define el espacio de hash desde el cual se han hashado las palabras. Por defecto, se utiliza la función hash, aunque como veremos en la siguiente sección, se pueden especificar funciones hash alternativas cuando se llama directamente a la función hashing_trick().
Podemos usar la función text_to_word_sequence() de la sección anterior para dividir el documento en palabras y luego usar un conjunto para representar sólo las palabras únicas del documento. El tamaño de este conjunto se puede utilizar para estimar el tamaño del vocabulario de un documento. Por ejemplo:
from keras.preprocessing.text import text_to_word_sequence # definir el documento text = 'The quick brown fox jumped over the lazy dog.' # estimar el tamaño del vocabulario words = set(text_to_word_sequence(text)) vocab_size = len(words) print(vocab_size)
Podemos poner esto junto con la función one_hot() y codificar las palabras en el documento. El ejemplo completo se enumera a continuación. El tamaño del vocabulario se incrementa en un tercio para minimizar las colisiones al tener palabras.
from keras.preprocessing.text import one_hot from keras.preprocessing.text import text_to_word_sequence # definir el documento text = 'The quick brown fox jumped over the lazy dog.' # estimar el tamaño del vocabulario words = set(text_to_word_sequence(text)) vocab_size = len(words) print(vocab_size) # un número entero codifica el documento result = one_hot(text, round(vocab_size*1.3)) print(result)
Ejecutando el ejemplo primero se imprime el tamaño del vocabulario como 8. El documento codificado se imprime como una matriz de palabras enteras codificadas.
8 [3, 2, 5, 8, 7, 1, 3, 9, 2]
Codificación Hash con hashing_trick
Una limitación de las codificaciones de números enteros y base de conteo es que deben mantener un vocabulario de palabras y su asignación a números enteros. Una alternativa a este enfoque es utilizar una función de hash unidireccional para convertir palabras en enteros. Esto evita la necesidad de hacer un seguimiento de un vocabulario, que es más rápido y requiere menos memoria.
Keras proporciona la función hashing_trick() que tokeniza y luego codifica el documento, igual que la función one_hot(). Proporciona más flexibilidad, permitiéndole especificar la función hash como hash (por defecto) u otras funciones hash como la función md5 integrada o su propia función. A continuación se muestra un ejemplo de un número entero que codifica un documento utilizando la función hash de md5.
from keras.preprocessing.text import hashing_trick from keras.preprocessing.text import text_to_word_sequence # definir el documento text = 'The quick brown fox jumped over the lazy dog.' # estimar el tamaño del vocabulario words = set(text_to_word_sequence(text)) vocab_size = len(words) print(vocab_size) # un número entero codifica el documento result = hashing_trick(text, round(vocab_size*1.3), hash_function='md5') print(result)
Al ejecutar el ejemplo se imprime el tamaño del vocabulario y el documento entero codificado. Podemos ver que el uso de una función hash diferente resulta en enteros consistentes, pero diferentes para las palabras como la función one_hot() en la sección anterior.
8 [6, 4, 1, 2, 7, 5, 6, 2, 6]
API Tokenizer
Hasta ahora hemos buscado métodos de conveniencia únicos para preparar textos con Keras. Keras proporciona una API más sofisticada para la preparación de texto que se puede ajustar y reutilizar para preparar múltiples documentos de texto. Este puede ser el enfoque preferido para grandes proyectos. Keras proporciona la clase Tokenizer para preparar documentos de texto para un aprendizaje profundo. El Tokenizer debe ser construido y luego encajar en documentos de texto sin procesar o en documentos de texto codificados como enteros. Por ejemplo:
from keras.preprocessing.text import Tokenizer # define 5 documentos docs = ['Well done!', 'Good work', 'Great effort', 'nice work', 'Excellent!'] # crear el tokenizador t = Tokenizer() # ajustar el tokenizador en los documentos t.fit_on_texts(docs)
Una vez ajustado, el Tokenizer proporciona 4 atributos que puede utilizar para consultar lo que se ha aprendido sobre sus documentos:
- word_counts: Un diccionario que mapea las palabras y su ocurrencia cuenta cuando el Tokenizer estaba ajustado.
- word_docs: Aparece un diccionario que mapea las palabras y el número de documentos que alcanzan.
- word_index: Un diccionario de palabras y sus números enteros únicamente asignados.
- document_count: Una asignación de diccionario y el número de documentos en los que aparecen calculados durante el ajuste.
Por ejemplo:
# resumir lo que se extrajo print(t.word_counts) print(t.document_count) print(t.word_index) print(t.word_docs)
Una vez que el Tokenizer ha sido instalado en los datos de entrenamiento, puede ser utilizado para codificar documentos en el tren o en los conjuntos de datos de prueba. La función the_texts_to_matrix() en el Tokenizer puede usarse para crear un vector por documento proporcionado por entrada. La longitud de los vectores es el tamaño total del vocabulario. Esta función proporciona un conjunto de esquemas de codificación de texto modelo de bolsa de palabras estándar que se pueden proporcionar mediante un argumento de modo a la función. Los modos disponibles incluyen:
- binary: Si cada palabra está presente o no en el documento. Este es el valor por defecto.
- count: El recuento de cada palabra del documento.
- tfidf: La puntuación de Frecuencia de documento inversa de texto (TF-IDF) para cada palabra del documento.
- freq: La frecuencia de cada palabra como una relación de palabras dentro de cada documento.
Podemos poner todo esto junto con un ejemplo que funcione.
from keras.preprocessing.text import Tokenizer # definir 5 documentos docs = ['Well done!', 'Good work', 'Great effort', 'nice work', 'Excellent!'] # crear el tokenizador t = Tokenizer() # ajustar el tokenizador en los documentos t.fit_on_texts(docs) # resumir lo que se aprendió print(t.word_counts) print(t.document_count) print(t.word_index) print(t.word_docs) # enteros codificando documentos encoded_docs = t.texts_to_matrix(docs, mode='count') print(encoded_docs)
Ejecutando el ejemplo se ajusta al Tokenizer con 5 documentos pequeños. Se imprimen los detalles del Tokenizer ajustado. A continuación, los 5 documentos se codifican utilizando un recuento de palabras. Cada documento está codificado como un vector de 9 elementos con una posición para cada palabra y el valor del esquema de codificación elegido para cada posición de palabra. En este caso, se utiliza un modo de recuento de palabras simple.
OrderedDict([('well', 1), ('done', 1), ('good', 1), ('work', 2), ('great', 1), ('effort',1), ('nice', 1), ('excellent', 1)]) 5 {'work': 1, 'effort': 6, 'done': 3, 'great': 5, 'good': 4, 'excellent': 8, 'well': 2,'nice': 7} {'work': 2, 'effort': 1, 'done': 1, 'well': 1, 'good': 1, 'great': 1, 'excellent': 1,'nice': 1} [[ 0. 0. 1. 1. 0. 0. 0. 0. 0.] [ 0. 1. 0. 0. 1. 0. 0. 0. 0.] [ 0. 0. 0. 0. 0. 1. 1. 0. 0.] [ 0. 1. 0. 0. 0. 0. 0. 1. 0.] [ 0. 0. 0. 0. 0. 0. 0. 0. 1.]]
➡ Continúa aprendiendo con nuestro curso:
El código a correrlo da error. Quien es “t” ???
T es para crear el tokenizador. Gracias por comentar!