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

Antonio Fernández Troyano
6 min readOct 19, 2020
Photo by Nathaniel Shuman on Unsplash

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:

Imagen de Andreas Muller (enlace)

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

0. Librerías que usaremos

Éste será un artículo más sencillo que otros y usaremos las siguientes librerías:

Librerías utilizadas

1. Obtención de textos de páginas web temáticas

Necesitamos textos, textos y más textos

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.

Resulta evidente… ¡pero por si acaso!

Con este fin, vamos a definir una función que llamaremos “get_texto_url” que:

  1. Acepte una lista de urls/páginas web en html
  2. Acceda una por una mediante la librería requests
  3. Extraigamos los textos entre etiquetas <p> (párrafos) de la web
  4. 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:

En este caso obtuvimos 183.604 caracteres
Fácil, ¿no?

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:

Primero hay que instalar la librería “nltk” y después stopwords en español

Si hacemos un print de las listas “punctuation” y “stop_words” veremos lo siguiente:

Ejemplo de los signos de puntuación que contiene punctuation[:10]
Ejemplo de palabras que contiene stop_wrods[:10]

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:

En algunos casos quedarán ciertos “errores” como \u200b, sin embargo, tampoco es algo preocupante ya que nunca va a quedar 100% perfecto

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:

  1. Filtramos palabras muy cortas (< 3) y palabras muy largas (>18) para volver a filtrar errores que hubieran quedado (como urls)
  2. Creación de un diccionario con “key” la palabra y “value” la frecuencia de aparición
  3. Convertimos el diccionario a un Pandas Data Frame para ordenarlo de mayor a menor

Y el resultado que obtenemos:

Top 10 de palabras más frecuentes en las páginas que hemos seleccionado
Top 5: también podemos plotear el resultado

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.

Resultado del caso sencillo de uso de la librería WordCloud

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:

Creación de una máscara para Word Cloud cuando tenemos una imagen PNG con fondo transparente

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:

Ejemplo de WordCloud utilizando una máscara de contorno

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:

Creación de máscara de contorno con imagen a color

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!

Nube de palabras con máscara de contorno y máscara de color

Como siempre, os dejo el código completo en GitHub, el notebook de Jupyter y todas las imágenes utilizadas en este artículo.

--

--

Antonio Fernández Troyano

Civil Engineer | 📈Management consultant and Master in Data Analytics and Big Data💻 | Website: www.fernandeztroyano.es | Git https://github.com/afernandez119