Preprocesamiento de texto (basura entra basura sale)

Según el Oxford Dictionary of Phrase and Fable, la frase “Entra basura, sale basura”. Se ha e n utilizado en el ámbito de la informática desde la década de 1950 para significar que una entrada de programación deficiente producirá resultados deficientes porque las computadoras no pueden pensar por sí mismas y autoajustarse en un forma relevante. Este adagio suena particularmente cierto en el procesamiento de datos de texto. Habiendo pasado por el proceso varias veces, ahora quería escribir una guía corta que sirva como una lista de verificación aproximada sobre cómo procesar previamente el texto para ingresarlo en un modelo de aprendizaje automático o para técnicas como el modelado de temas LDA. Para esta guía, hice mi preprocesamiento de texto en Pandas y Spacy, por lo que todo el código y los ejemplos se formatearán como tales, pero siéntase libre de usar otras herramientas como NLTK y similares. Para mi conjunto de datos, raspé la sección de comentarios de cada escuela en la ciudad de Nueva York en insideschools.org con el objetivo de realizar modelos de temas para encontrar temas de interés para las comunidades con respecto a sus escuelas locales. Los comentarios se combinaron con otro conjunto de datos en la columna “comentario” y contenían 22,810 entradas antes de cualquier limpieza.

[√] Eliminando valores nulos e innecesarios

Lo primero y más importante es saber si hay valores nulos. Para hacer esto usamos el comando

<×df[‘comment’].isna().value_counts()

que en mi caso dio como resultado: Falso – 22677 y True 133 lo que significa que hay 133 entradas nulas. Nuestro trabajo no se detiene aquí. Mientras me tomaba el tiempo para revisar los comentarios individuales, noté que un comentario era simplemente un punto. Para comprobar si había más instancias de estos comentarios inútiles utilicé el comando

df [df [‘comentario’] == ‘.’]

que produce un marco de datos que muestra todas las instancias donde un comentario contiene solo un carácter de punto que terminó siendo 4 instancias. En algunos casos, es posible que desee imputar un valor, pero en este caso los valores nulos son innecesarios, por lo que los descartamos. Para eliminar estos valores, podemos decir

df = df.dropna ()
df = df [df [“comentario”]! = “.”]

[√] Eliminando texto no deseado

Si está trabajando con texto como datos extraídos, es posible que el formato le haya dejado bloques de texto no deseados, como comentarios html o URL completas. Si bien puede usar un programa como Spacy y el comando token.like_url para filtrar tokens que están formateados como una URL, también es sencillo usar el método de reemplazo con un poco de expresión regular. En mi caso, necesitaba eliminar las etiquetas de párrafo, los hipervínculos, los caracteres de nueva línea, la representación Unicode para el espacio que no se rompe y los comentarios html.

# Eliminar etiquetas de párrafo
df = df.replace (to_replace = ‘& lt; /? [pP] & gt;’, value = ”, regex = True)
df = df.replace (to_replace = ‘& lt; [pP] & gt;’, value = ”, regex = True)

# Eliminar hipervínculos
df = df.replace (to_replace = ‘& lt; [aA]. * & lt; / [aA] & gt;’, value = ”, regex = True)

# Eliminar nueva línea
df = df.replace (to_replace = ’\ n’, value = ’’, regex = True)

# Eliminar el espacio que no se rompe
df = df.replace (to_replace = ’\ xa0 & # x27 ;, value =’ ’, regex = True)

# Eliminar comentarios html
df = df.replace (to_replace = ’& lt ;! -. * →’, value = ’’, regex = True)

Para aquellos que no están familiarizados con las expresiones regulares, el “?” en & lt; /? [pP] & gt; significa que el espacio antes del signo de interrogación se puede registrar o no, mientras que los corchetes alrededor de las dos P significan que el carácter puede ser una P mayúscula o minúscula, por lo que todas las iteraciones siguientes se registrarán como verdaderas & lt; / p & gt; , & lt; / P & gt ;, & lt; / p & gt; y & lt; / P & gt ;. Los “.” en & lt; [aA]. * & lt; / [aA] & gt; significa cualquier carácter excepto una nueva línea, mientras que el “*” significa 0 o más repeticiones del carácter anterior. Esto eliminará las etiquetas junto con los caracteres entre ellas.

[√] Corrector ortográfico

Cuando se utilizan conjuntos de datos como secciones de comentarios de un sitio web, es probable que haya errores. La forma más sencilla de corregir errores ortográficos es utilizar una biblioteca como SymSpell. Según la página oficial de GitHub de SymSpell, “El algoritmo de corrección ortográfica Symmetric Delete reduce la complejidad de la generación de candidatos a editar y la búsqueda de diccionario para una distancia Damerau-Levenshtein determinada. Es seis órdenes de magnitud más rápido (que el enfoque estándar con elimina + transpone + reemplaza + inserta) y es independiente del idioma ”.

[√] Dar formato al texto

Dependiendo del programa / canalización al que esté pasando el texto, es posible que deba formatear el texto de una manera particular. En mi caso, Spacy acepta un conjunto de documentos separados por un carácter de nueva línea (\ n). Para lograr esto, ejecuté el siguiente código:

text = df [‘comentario’]. str.cat (sep = ‘\ n’)

Esta línea agrupa todos los documentos en un documento grande con cada comentario separado por el carácter de nueva línea como se indica en el atributo sep. Acceder al índice 0 de texto le dará un solo carácter en lugar de una palabra.

[√] Derivado, lematización y revestimiento

Para obtener una representación más fiel de la frecuencia de las palabras dentro de un texto, utilizamos técnicas como la lematización y la lematización. Estas técnicas eliminan las extensiones de las palabras raíz como prefijos y sufijos para extraer solo la raíz. Mientras que en programas como NLTK podemos usar módulos como PorterStemmer para reducir las palabras a su raíz, Spacy se encarga de eso en su canalización facilitando un poco nuestro trabajo. Spacy también pondrá en minúscula todas las palabras que no sean nombres propios. Por ejemplo, después de ejecutar mi texto a través de la canalización de Spacy, el objeto “doc” contiene una lista de tokens de palabras de Spacy. Acceder al token en el documento [377] produce la palabra “siente”. Cuando usamos el método .lemma_ (doc [377] .lemma_) obtenemos la palabra raíz “feel”. Al acceder al lema de la palabra “Oculto” en el documento [372], aparecerá la palabra “oculto” en minúscula.

[√] Palabras vacías

Uno de los pasos más importantes en técnicas como el modelado de temas es eliminar las palabras vacías. Si bien Spacy contiene su propia lista de palabras vacías, según su conjunto de datos, lo más probable es que no sean suficientes. En Spacy, las palabras vacías se agregan con el siguiente código:

my_stop_words = [u’school ’, u’schools’, u’School ’, u’Schools’]

para palabras vacías en my_stop_words:
lexeme = nlp.vocab [palabra irrelevante]
lexeme.is_stop = True

Debido a que el procesamiento de texto con atributos como reconocimiento de entidades, derivación y lematización puede ser complicado, según la palabra, el espacio a veces puede malinterpretar palabras como escuelas, escuelas, escuelas, escuelas como palabras separadas. Para asegurarme de que se eliminen todas las instancias, me gusta usar todas las iteraciones por si acaso.

Para reiterar un punto de la introducción a esta publicación: “Quería escribir una guía corta que sirva como una lista de verificación aproximada sobre cómo preprocesar el texto para la entrada”. Si bien los pasos anteriores son importantes para el preprocesamiento del texto, dependiendo de los detalles de su conjunto de datos, es posible que deba hacer más o menos de lo que se ha explicado aquí. El mejor consejo que puedo darte es que seas atento y diligente al trabajar con cualquier información de texto que tengas. Debido a que el lenguaje es tan rico y diverso, debemos esperar que su procesamiento sea el mismo.