¡Google I / O regresa del 18 al 20 de mayo! Reserva espacio y crea tu horario Regístrate ahora

TF.Texto

Ver en TensorFlow.org Ejecutar en Google Colab Ver fuente en GitHub Descargar cuaderno

Introducción

TensorFlow Text proporciona una colección de clases y operaciones relacionadas con el texto listas para usar con TensorFlow 2.0. La biblioteca puede realizar el preprocesamiento que requieren regularmente los modelos basados ​​en texto e incluye otras funciones útiles para el modelado de secuencias que no proporciona el núcleo de TensorFlow.

El beneficio de usar estas operaciones en el preprocesamiento de texto es que se realizan en el gráfico de TensorFlow. No necesita preocuparse de que la tokenización en el entrenamiento sea diferente a la tokenización en la inferencia o la administración de scripts de preprocesamiento.

Ejecución ansiosa

TensorFlow Text requiere TensorFlow 2.0 y es totalmente compatible con el modo ansioso y el modo gráfico.


pip install -q tensorflow-text
import tensorflow as tf
import tensorflow_text as text

Unicode

La mayoría de las operaciones esperan que las cadenas estén en UTF-8. Si está usando una codificación diferente, puede usar la operación de transcodificación de flujo de sensor principal para transcodificar en UTF-8. También puede usar la misma operación para coaccionar su cadena a UTF-8 estructuralmente válido si su entrada podría no ser válida.

docs = tf.constant([u'Everything not saved will be lost.'.encode('UTF-16-BE'), u'Sad☹'.encode('UTF-16-BE')])
utf8_docs = tf.strings.unicode_transcode(docs, input_encoding='UTF-16-BE', output_encoding='UTF-8')

Tokenización

La tokenización es el proceso de dividir una cadena en tokens. Por lo general, estos tokens son palabras, números y / o puntuación.

Las interfaces principales son Tokenizer y TokenizerWithOffsets cada una de las cuales tiene un único método tokenize y tokenize_with_offsets respectivamente. Hay varios tokenizadores disponibles ahora. Cada uno de estos implementa TokenizerWithOffsets (que extiende Tokenizer ) que incluye una opción para obtener compensaciones de bytes en la cadena original. Esto permite a la persona que llama conocer los bytes de la cadena original a partir de la cual se creó el token.

Todos los tokenizadores devuelven RaggedTensors con la dimensión más interna de la asignación de tokens a las cadenas individuales originales. Como resultado, el rango de la forma resultante aumenta en uno. Revise la guía de tensores irregulares si no está familiarizado con ellos. tensores_hechosos

WhitespaceTokenizer

Este es un tokenizador básico que divide cadenas UTF-8 en caracteres de espacio en blanco definidos por ICU (por ejemplo, espacio, tabulación, nueva línea).

tokenizer = text.WhitespaceTokenizer()
tokens = tokenizer.tokenize(['everything not saved will be lost.', u'Sad☹'.encode('UTF-8')])
print(tokens.to_list())
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/util/dispatch.py:201: batch_gather (from tensorflow.python.ops.array_ops) is deprecated and will be removed after 2017-10-25.
Instructions for updating:
`tf.batch_gather` is deprecated, please use `tf.gather` with `batch_dims=-1` instead.
[[b'everything', b'not', b'saved', b'will', b'be', b'lost.'], [b'Sad\xe2\x98\xb9']]

UnicodeScriptTokenizer

Este tokenizador divide las cadenas UTF-8 según los límites del script Unicode. Los códigos de secuencia de comandos utilizados corresponden a los valores de UScriptCode de International Components for Unicode (ICU). Ver: http://icu-project.org/apiref/icu4c/uscript_8h.html

En la práctica, esto es similar al WhitespaceTokenizer con la diferencia más aparente de que dividirá la puntuación (USCRIPT_COMMON) de los textos del idioma (por ejemplo, USCRIPT_LATIN, USCRIPT_CYRILLIC, etc.) al tiempo que separa los textos del idioma entre sí.

tokenizer = text.UnicodeScriptTokenizer()
tokens = tokenizer.tokenize(['everything not saved will be lost.', u'Sad☹'.encode('UTF-8')])
print(tokens.to_list())
[[b'everything', b'not', b'saved', b'will', b'be', b'lost', b'.'], [b'Sad', b'\xe2\x98\xb9']]

División Unicode

Cuando se tokenizan idiomas sin espacios en blanco para segmentar palabras, es común dividirlos por carácter, lo que se puede lograr usando la operación unicode_split que se encuentra en core.

tokens = tf.strings.unicode_split([u"仅今年前".encode('UTF-8')], 'UTF-8')
print(tokens.to_list())
[[b'\xe4\xbb\x85', b'\xe4\xbb\x8a', b'\xe5\xb9\xb4', b'\xe5\x89\x8d']]

Compensaciones

Cuando se tokenizan cadenas, a menudo se desea saber en qué parte de la cadena original se originó el token. Por esta razón, cada tokenizador que implementa TokenizerWithOffsets tiene un método tokenize_with_offsets que devolverá las compensaciones de bytes junto con los tokens. Start_offsets enumera los bytes en la cadena original en la que comienza cada token, y end_offsets enumera los bytes inmediatamente después del punto donde termina cada token. Nota: las compensaciones iniciales son inclusivas y las compensaciones finales son exclusivas.

tokenizer = text.UnicodeScriptTokenizer()
(tokens, start_offsets, end_offsets) = tokenizer.tokenize_with_offsets(['everything not saved will be lost.', u'Sad☹'.encode('UTF-8')])
print(tokens.to_list())
print(start_offsets.to_list())
print(end_offsets.to_list())
[[b'everything', b'not', b'saved', b'will', b'be', b'lost', b'.'], [b'Sad', b'\xe2\x98\xb9']]
[[0, 11, 15, 21, 26, 29, 33], [0, 3]]
[[10, 14, 20, 25, 28, 33, 34], [3, 6]]

Ejemplo de TF.Data

Los tokenizadores funcionan como se esperaba con la API tf.data. A continuación se proporciona un ejemplo sencillo.

docs = tf.data.Dataset.from_tensor_slices([['Never tell me the odds.'], ["It's a trap!"]])
tokenizer = text.WhitespaceTokenizer()
tokenized_docs = docs.map(lambda x: tokenizer.tokenize(x))
iterator = iter(tokenized_docs)
print(next(iterator).to_list())
print(next(iterator).to_list())
[[b'Never', b'tell', b'me', b'the', b'odds.']]
[[b"It's", b'a', b'trap!']]

Otras operaciones de texto

TF.Text empaqueta otras operaciones de preprocesamiento útiles. Revisaremos un par a continuación.

Forma de palabra

Una característica común utilizada en algunos modelos de comprensión del lenguaje natural es ver si la cadena de texto tiene una propiedad determinada. Por ejemplo, un modelo de ruptura de oraciones puede contener características que comprueben el uso de mayúsculas en las palabras o si hay un carácter de puntuación al final de una cadena.

Wordshape define una variedad de funciones auxiliares útiles basadas en expresiones regulares para hacer coincidir varios patrones relevantes en su texto de entrada. Aquí están algunos ejemplos.

tokenizer = text.WhitespaceTokenizer()
tokens = tokenizer.tokenize(['Everything not saved will be lost.', u'Sad☹'.encode('UTF-8')])

# Is capitalized?
f1 = text.wordshape(tokens, text.WordShape.HAS_TITLE_CASE)
# Are all letters uppercased?
f2 = text.wordshape(tokens, text.WordShape.IS_UPPERCASE)
# Does the token contain punctuation?
f3 = text.wordshape(tokens, text.WordShape.HAS_SOME_PUNCT_OR_SYMBOL)
# Is the token a number?
f4 = text.wordshape(tokens, text.WordShape.IS_NUMERIC_VALUE)

print(f1.to_list())
print(f2.to_list())
print(f3.to_list())
print(f4.to_list())
[[True, False, False, False, False, False], [True]]
[[False, False, False, False, False, False], [False]]
[[False, False, False, False, False, True], [True]]
[[False, False, False, False, False, False], [False]]

N-gramos y ventana deslizante

Los N-gramas son palabras secuenciales con un tamaño de ventana deslizante de n . Al combinar los tokens, se admiten tres mecanismos de reducción. Para el texto, querrá usar Reduction.STRING_JOIN que agrega las cadenas entre sí. El carácter separador predeterminado es un espacio, pero esto se puede cambiar con el argumento string_separater.

Los otros dos métodos de reducción se utilizan con mayor frecuencia con valores numéricos, y estos son Reduction.SUM y Reduction.MEAN .

tokenizer = text.WhitespaceTokenizer()
tokens = tokenizer.tokenize(['Everything not saved will be lost.', u'Sad☹'.encode('UTF-8')])

# Ngrams, in this case bi-gram (n = 2)
bigrams = text.ngrams(tokens, 2, reduction_type=text.Reduction.STRING_JOIN)

print(bigrams.to_list())
[[b'Everything not', b'not saved', b'saved will', b'will be', b'be lost.'], []]