Crea tu “nube de palabras” Word Cloud con Python a partir de varias webs
Extrae de forma automatizada los textos de diferentes páginas webs y crea nubes de palabras personalizadas
En esta ocasión vamos a ver cómo podemos crear una nube de palabras gracias a la librería WordCloud de Andreas Muller (ver web), como por ejemplo este:
Si bien no se trata de un proyecto de “data analytics” per se, vamos a aprender a:
- Extraer textos de varias páginas web (web scraping)
- “Limpiar” los textos (NLP-natural language processing o procesamiento del lenguaje natural) para eliminar signos de puntuación y palabras demasiado comunes (artículos, pronombres, adverbios, etc)
- Abrir y convertir una imagen
- Generar las nubes de palabras con WordCloud
- GitHub — https://github.com/afernandez119/wordcloud
- Jupyter Notebook WordCloud si quieres ver la ejecución del código
0. Librerías que usaremos
Éste será un artículo más sencillo que otros y usaremos las siguientes librerías:
1. Obtención de textos de páginas web temáticas
Aunque resulta evidente, cuando uno quiere generar una nube de palabras necesita muuuchos textos, textos que contenga palabras relacionadas con un tema en particular.
Por ejemplo, si queremos generar una nube de palabras relacionadas con el big data, necesitaremos encontrar páginas web con textos que hablen sobre el big data.
Con este fin, vamos a definir una función que llamaremos “get_texto_url” que:
- Acepte una lista de urls/páginas web en html
- Acceda una por una mediante la librería requests
- Extraigamos los textos entre etiquetas <p> (párrafos) de la web
- Nos devuelva todo el texto en una variable
Vamos con ello:
1.1. Raw text o texto sin tratar
A continuación, solo tendremos que pasar el listado de páginas web a la función y obtendremos el resultado:
1.2. Limpieza del texto
Tal y como podemos observar, hemos obtenido más de 100.000 caracteres de diferentes páginas web. ¿Qué problema tenemos ahora? pues que en el texto encontramos un montón de caracteres, signos de puntuación y palabras que NO nos interesan.
Este proceso es “iterativo” y depende de las fuentes que hayamos escogido. En algunos casos tendremos solo signos de puntuación. En otros más complejos tendremos saltos de línea, emoticonos y urls….
Podríamos realizar la limpieza del texto utilizado expresiones regulares REGEX, a mi parecer, IMPRESCINDIBLES. Sin embargo, es cierto que de primeras son bastante complejas por eso vamos a utilizar otra aproximación para la eliminación de esos caracteres que queremos eliminar.
En este caso vamos a generar varias listas de elementos que queremos eliminar y utilizaremos la función “replace” para eliminarlos:
Si hacemos un print de las listas “punctuation” y “stop_words” veremos lo siguiente:
Una vez que tenemos los listados de signos de puntuación y de stop_words a eliminar de nuestro texto, procederemos a reemplazarlos por “”.
Nota: Hay que ir probando a incluir más o menos palabras y signos de puntuación en las listas puesto que hay veces que puede aparecer un emoji o caracter raro que es necesario incluir para eliminarlo
Y ahora sí que tendremos un texto “limpio” con el que poder continuar trabajando:
1.3. Análisis de la frecuencia de palabras en el “clean texto”
Resulta evidente que con el fin de identificar qué palabras tendrán un mayor tamaño en nuestra nube de palabras, es conveniente contabilizar la frecuencia de aparición de las mismas.
Si hubiera algún error de limpieza, podríamos detectarlo aquí. Para ello seguiremos los siguientes pasos:
- Filtramos palabras muy cortas (< 3) y palabras muy largas (>18) para volver a filtrar errores que hubieran quedado (como urls)
- Creación de un diccionario con “key” la palabra y “value” la frecuencia de aparición
- Convertimos el diccionario a un Pandas Data Frame para ordenarlo de mayor a menor
Y el resultado que obtenemos:
2. ¡Word Cloud o nube de palabras!
Una vez tenemos el texto limpio y hemos validado las palabras más frecuentes de nuestro texto, pasaremos a crear nuestra nube de palabras.
Vamos a ver 3 opciones:
- Word cloud sencillo
- Word cloud aplicando una “máscara”
- Word cloud aplicando una “máscara” manteniendo el color de la imagen original
2.1. Word Cloud sencillo
Caso sencillo de uso de la librería WordCloud. He ajustado algunos parámetros de la función, como son la altura y anchura, el color del fondo y la utilización de palabras compuestas “collocation_threshold” entre otros.
Nota: el parámetro “collocation_threshold” nos permite utilizar conjuntos de palabras que aparecen muy frecuentemente juntas, como “big data” o “análisis de datos”. Tenemos que ir ajustándolo manualmente
En la página oficial de la librería tenéis mucha documentación al respecto. Así mismo, siempre podéis ejecutar el comando ?WordCloud y os mostrará todas las variables que podemos ajustar.
2.2. Word Cloud aplicando una máscara de contorno
Ahora vamos a generar una nube de palabras pero que se adapte a una imagen “contorno”. Para ello, lo ideal es contar con una imagen en blanco y negro en formato PNG.
En este caso vamos a utilizar el logotipo de Python:
ATENCIÓN: WordCloud rellenará aquellos espacios que NO estén de color blanco. Hay que tener cuidado con imágenes PNG con el fondo transparente, primero debemos incluir un fondo blanco.
Con el fin de evitar problemas con PNGs con fondo transparente, programé una función “pegar” las imágenes de fondo transparente en fondo blanco:
En caso de que la imagen que estemos utilizando NO tenga fondo blanco, podemos crear directamente nuestra máscara utilizando la librería Image y convirtiendo a numpy la imagen:
Una vez tenemos nuestra máscara, lo único que tenemos que hacer en incluir la misma en la creación del objeto de clase WordCloud:
Y éste será el resultado final:
2.3. Word cloud aplicando una máscara de contorno y los colores de la máscara
Por último, vamos a ver el ejemplo de utilizar una máscara con colores y que el texto de la nube de palabras utilice esos mismos colores para la tipografía.
En este caso, además de crear la máscara de contorno, tendremos que crear un objeto de clase ImageColorGenerator que “guardará” el color de la máscara:
Al igual que en el apartado anterior, será necesario incluir la máscara como atributo de la clase WordCloud.
Por último, tendremos que recolorear la imagen con nuestra “máscara de color” utilizando la función .recolor de WordCloud:
¡Y éste será el resultado final!
Como siempre, os dejo el código completo en GitHub, el notebook de Jupyter y todas las imágenes utilizadas en este artículo.