Preprocesamiento de datos de texto: un tutorial en Python

Esta publicación servirá como un recorrido práctico de una tarea de preprocesamiento de datos de texto utilizando algunas herramientas comunes de Python.

Matthew Mayo
Ciencia y Datos
8 min readMay 3, 2018

--

Preprocesamiento, en el contexto del marco de la ciencia de datos textuales.

En un par de publicaciones anteriores, primero discutimos un marco para abordar tareas de ciencia de datos textuales , y seguimos con una discusión sobre un enfoque general para el preprocesamiento de datos de texto . Esta publicación servirá como un recorrido práctico de una tarea de preprocesamiento de datos de texto utilizando algunas herramientas comunes de Python.

Nuestro objetivo es pasar de lo que describiremos como un trozo de texto (que no debe confundirse con fragmentación de texto), una cadena única larga y sin procesar, y terminar con una lista (o varias listas) de tokens limpios que serían útiles para tareas adicionales de minería de textos y / o procesamiento de lenguaje natural.

Primero comenzamos con nuestras importaciones.

Más allá de las bibliotecas estándar de Python, también usamos lo siguiente:

  • NLTK : el kit de herramientas de lenguaje natural es una de las bibliotecas NLP más conocidas y más utilizadas en el ecosistema de Python, útil para todo tipo de tareas, desde tokenización, hasta derivación, etiquetado de parte del habla y más
  • BeautifulSoup — BeautifulSoup es una biblioteca útil para extraer datos de documentos HTML y XML
  • Inflect — Esta es una biblioteca simple para realizar las tareas relacionadas con el lenguaje natural de generar plurales, sustantivos singulares, ordinales y artículos indefinidos, y (lo que más nos interesa) convertir números en palabras
  • Contractions — Otra biblioteca simple, únicamente para contracciones en expansión

Si tienes instalado NLTK, pero requiere la descarga de sus datos adicionales, consulte aquí .

Necesitamos algunos ejemplos de texto. Comenzaremos con algo muy pequeño y artificial para poder ver los resultados de lo que estamos haciendo paso a paso.

Un conjunto de datos de juguetes de hecho, pero no se equivoquen; los pasos que estamos tomando aquí para preprocesar estos datos son totalmente transferibles.

El marco de preprocesamiento de datos de texto.

Eliminación de ruido

Definamos de forma aproximada la eliminación de ruido como tareas de normalización de texto específico que a menudo tienen lugar antes de la tokenización. Yo diría que, aunque los otros 2 pasos principales del marco de preprocesamiento (tokenización y normalización) son básicamente independientes de la tarea, la eliminación del ruido es mucho más específica de la tarea.

Las tareas de eliminación de ruido de muestra podrían incluir:

  • eliminar encabezados de archivos de texto, pies de página
  • eliminar HTML, XML, etc. marcado y metadatos
  • extraer datos valiosos de otros formatos, como JSON

Como se puede imaginar, el límite entre la eliminación de ruido y la recopilación y el ensamblaje de datos, por un lado, es confuso, mientras que la línea entre la eliminación de ruido y la normalización se ve borrosa por el otro. Dada su estrecha relación con textos específicos y su recopilación y montaje, muchas tareas de eliminación de ruido, como el análisis sintáctico de una estructura JSON, obviamente tendrían que implementarse antes de la tokenización.

En nuestro canal de preprocesamiento de datos, eliminaremos el marcado HTML con la ayuda de la biblioteca BeautifulSoup y utilizaremos expresiones regulares para eliminar los corchetes dobles abiertos y cerrados y cualquier elemento intermedio (suponemos que esto es necesario en función de nuestro texto de muestra).

Aunque no es obligatorio hacerlo en esta etapa antes de la tokenización (encontrarás que esta afirmación es la norma para el ordenamiento relativamente flexible de las tareas de preprocesamiento de datos de texto), reemplazar las contracciones con sus expansiones puede ser beneficioso en este punto, ya que nuestro tokenizador de palabras Dividirá palabras como “did not” en “did” y “not”. No es imposible remediar esta tokenización en una etapa posterior, pero hacerlo antes lo hace más fácil y directo.

Y aquí está el resultado de la eliminación de ruidos en nuestro texto de muestra.

Title Goes Here
Bolded Text
Italicized Text
But this will still be here!I run. He ran. She is running. Will they stop running?I talked. She was talking. They talked to them about running. Who ran to the talking runner?¡Sebastián, Nicolás, Alejandro and Jéronimo are going to the store tomorrow morning!something... is! wrong() with.,; this :: sentence.I cannot do this anymore. I did not know them. Why could not you have dinner at the restaurant?My favorite movie franchises, in order: Indiana Jones; Marvel Cinematic Universe; Star Wars; Back to the Future; Harry Potter.do not do it.... Just do not. Billy! I know what you are doing. This is a great little house you have got here.John: "Well, well, well."
James: "There, there. There, there."
There are a lot of reasons not to do this. There are 101 reasons not to do it. 1000000 reasons, actually.
I have to go get 2 tutus from 2 different stores, too.
22 45 1067 445{{Here is some stuff inside of double curly braces.}}
{Here is more stuff in single curly braces.}

Tokenización

La tokenización es un paso que divide cadenas de texto más largas en piezas más pequeñas o tokens. Los trozos de texto más grandes pueden ser convertidos en oraciones, las oraciones pueden ser tokenizadas en palabras, etc. El procesamiento adicional generalmente se realiza después de que una pieza de texto ha sido apropiadamente concatenada. La tokenización también se conoce como segmentación de texto o análisis léxico. A veces la segmentación se usa para referirse al desglose de un gran trozo de texto en partes más grandes que las palabras (por ejemplo, párrafos u oraciones), mientras que la tokenización se reserva para el proceso de desglose que se produce exclusivamente en palabras.

Para nuestra tarea, vamos a tokenizar nuestro texto de muestra en una lista de palabras. Esto se hace usando la word_tokenize()función de NTLK .

Y aquí están nuestros tokens de palabras:

['Title', 'Goes', 'Here', 'Bolded', 'Text', 'Italicized', 'Text', 'But', 'this', 'will', 'still',
'be', 'here', '!', 'I', 'run', '.', 'He', 'ran', '.', 'She', 'is', 'running', '.', 'Will', 'they',
'stop', 'running', '?', 'I', 'talked', '.', 'She', 'was', 'talking', '.', 'They', 'talked', 'to', 'them',
'about', 'running', '.', 'Who', 'ran', 'to', 'the', 'talking', 'runner', '?', '¡Sebastián', ',',
'Nicolás', ',', 'Alejandro', 'and', 'Jéronimo', 'are', 'going', 'tot', 'he', 'store', 'tomorrow',
'morning', '!', 'something', '...', 'is', '!', 'wrong', '(', ')', 'with.', ',', ';', 'this', ':', ':',
'sentence', '.', 'I', 'can', 'not', 'do', 'this', 'anymore', '.', 'I', 'did', 'not', 'know', 'them', '.',
'Why', 'could', 'not', 'you', 'have', 'dinner', 'at', 'the', 'restaurant', '?', 'My', 'favorite',
'movie', 'franchises', ',', 'in', 'order', ':', 'Indiana', 'Jones', ';', 'Star', 'Wars', ';', 'Marvel',
'Cinematic', 'Universe', ';', 'Back', 'to', 'the', 'Future', ';', 'Harry', 'Potter', '.', 'do', 'not',
'do', 'it', '...', '.', 'Just', 'do', 'not', '.', 'Billy', '!', 'I', 'know', 'what', 'you', 'are',
'doing', '.', 'This', 'is', 'a', 'great', 'little', 'house', 'you', 'have', 'got', 'here', '.', 'John',
':', '``', 'Well', ',', 'well', ',', 'well', '.', "''", 'James', ':', '``', 'There', ',', 'there', '.',
'There', ',', 'there', '.', "''", 'There', 'are', 'a', 'lot', 'of', 'reasons', 'not', 'to', 'do', 'this',
'.', 'There', 'are', '101', 'reasons', 'not', 'to', 'do', 'it', '.', '1000000', 'reasons', ',',
'actually', '.', 'I', 'have', 'to', 'go', 'get', '2', 'tutus', 'from', '2', 'different', 'stores', ',',
'too', '.', '22', '45', '1067', '445', '{', '{', 'Here', 'is', 'some', 'stuff', 'inside', 'of', 'double',
'curly', 'braces', '.', '}', '}', '{', 'Here', 'is', 'more', 'stuff', 'in', 'single', 'curly', 'braces',
'.', '}']

Normalización

La normalización generalmente se refiere a una serie de tareas relacionadas destinadas a poner todo el texto en igualdad de condiciones: convirtiendo todo el texto en el mismo caso (superior o inferior), eliminando la puntuación, convirtiendo los números a sus equivalentes de palabras, y así sucesivamente. La normalización pone todas las palabras en pie de igualdad, y permite que el procesamiento proceda de manera uniforme.

La normalización del texto puede significar realizar una serie de tareas, pero para nuestro marco abordaremos la normalización en 3 pasos distintos: (1) derivación, (2) lematización y (3) todo lo demás. Para obtener información específica sobre cuáles pueden ser estos distintos pasos, consulte esta publicación .

Recuerde, después de la tokenización, ya no estamos trabajando en un nivel de texto, pero ahora a nivel de palabra. Nuestras funciones de normalización, que se muestran a continuación, reflejan esto. Los nombres de funciones y los comentarios deben proporcionar la información necesaria sobre lo que hace cada uno.

Después de llamar a la función de normalización:

['title', 'goes', 'bolded', 'text', 'italicized', 'text', 'still', 'run', 'ran', 'running', 'stop', 
'running', 'talked', 'talking', 'talked', 'running', 'ran', 'talking', 'runner', 'sebastian', 'nicolas',
'alejandro', 'jeronimo', 'going', 'store', 'tomorrow', 'morning', 'something', 'wrong', 'sentence',
'anymore', 'know', 'could', 'dinner', 'restaurant', 'favorite', 'movie', 'franchises', 'order',
'indiana', 'jones', 'marvel', 'cinematic', 'universe', 'star', 'wars', 'back', 'future', 'harry',
'potter', 'billy', 'know', 'great', 'little', 'house', 'got', 'john', 'well', 'well', 'well', 'james',
'lot', 'reasons', 'one hundred and one', 'reasons', 'one million', 'reasons', 'actually', 'go', 'get',
'two', 'tutus', 'two', 'different', 'stores', 'twenty-two', 'forty-five', 'one thousand and sixty-seven',
'four hundred and forty-five', 'stuff', 'inside', 'double', 'curly', 'braces', 'stuff', 'single',
'curly', 'braces']

Llamar a las funciones de derivación y lemming se realiza de la siguiente manera:

Esto da como resultado un retorno de 2 nuevas listas: una de tokens de origen y otra de tokens de lematización con respecto a los verbos. Dependiendo de su próxima tarea o preferencia NLP, una de ellas puede ser más apropiada que la otra. Vea aquí para una discusión sobre lemmatización vs. stemming .

Stemmed:
['titl', 'goe', 'bold', 'text', 'it', 'text', 'stil', 'run', 'ran', 'run', 'stop', 'run', 'talk',
'talk', 'talk', 'run', 'ran', 'talk', 'run', 'sebast', 'nicola', 'alejandro', 'jeronimo', 'going',
'stor', 'tomorrow', 'morn', 'someth', 'wrong', 'sent', 'anym', 'know', 'could', 'din', 'resta',
'favorit', 'movy', 'franch', 'ord', 'indian', 'jon', 'marvel', 'cinem', 'univers', 'star', 'war', 'back',
'fut', 'harry', 'pot', 'bil', 'know', 'gre', 'littl', 'hous', 'got', 'john', 'wel', 'wel', 'wel', 'jam',
'lot', 'reason', 'one hundred and on', 'reason', 'one million', 'reason', 'act', 'go', 'get', 'two',
'tut', 'two', 'diff', 'stor', 'twenty-two', 'forty-five', 'one thousand and sixty-seven', 'four hundred
and forty-five', 'stuff', 'insid', 'doubl', 'cur', 'brac', 'stuff', 'singl', 'cur', 'brac']
Lemmatized:
['title', 'go', 'bolded', 'text', 'italicize', 'text', 'still', 'run', 'run', 'run', 'stop', 'run',
'talk', 'talk', 'talk', 'run', 'run', 'talk', 'runner', 'sebastian', 'nicolas', 'alejandro', 'jeronimo',
'go', 'store', 'tomorrow', 'morning', 'something', 'wrong', 'sentence', 'anymore', 'know', 'could',
'dinner', 'restaurant', 'favorite', 'movie', 'franchise', 'order', 'indiana', 'jones', 'marvel',
'cinematic', 'universe', 'star', 'war', 'back', 'future', 'harry', 'potter', 'billy', 'know', 'great',
'little', 'house', 'get', 'john', 'well', 'well', 'well', 'jam', 'lot', 'reason', 'one hundred and one',
'reason', 'one million', 'reason', 'actually', 'go', 'get', 'two', 'tutus', 'two', 'different', 'store',
'twenty-two', 'forty-five', 'one thousand and sixty-seven', 'four hundred and forty-five', 'stuff',
'inside', 'double', 'curly', 'brace', 'stuff', 'single', 'curly', 'brace']

¡Y listo! Acá tienes un tutorial de un proceso simple de preprocesamiento de datos de texto usando Python en una muestra de texto. Te recomiendo que realices estas tareas en algunos textos adicionales para verificar los resultados. Utilizaremos este mismo proceso para limpiar los datos de texto para nuestra próxima tarea, en la cual realizaremos algunas tareas reales de NLP, en lugar de perder tiempo preparando nuestros datos para una tarea tan real.

Originalmente publicado en inglés en KDnuggets.

--

--

Matthew Mayo
Ciencia y Datos

I turn coffee into code in desperate need of refactoring, which I then refactor. #MachineLearning Researcher & Editor @kdnuggets #NeuralNetworks