Wordclouds (nubes de palabras) en Python

Librería

wordcloud

Autor principal

Andreas Mueller

La función WordCloud

La función WordCloud de la librería wordcloud permite crear nubes de palabras en Python. Esta función proporciona varios métodos, pero generate es el que necesitas para crear un a word cloud a partir de un texto. Ten en cuenta que el tamaño de la imagen será 400x200 por defecto, pero puedes personalizar el tamaño con los argumentos width (ancho) y height (alto), como en en el ejemplo siguiente, o reescalando la imagen con el argumento scale que por defecto es 1 y se recomienda para nubes de palabras muy grandes.

Cabe mencionar que si quieres que en la nube aparezcan palabras repetidas puedes establecer repeat = True. Esto es muy útil para crear word clouds con una sola palabra o con textos muy pequeños.

import matplotlib.pyplot as plt
from wordcloud import WordCloud

texto = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat"

wc = WordCloud(width = 300, height = 300).generate(texto)

# Eliminar los ejes y mostrar los datos como imagen
plt.axis("off")
plt.imshow(wc, interpolation = "bilinear")

# plt.show()

Word cloud en Python

Color de fondo

El argumento background_color permite modificar el color de fondo negro que aparece por defecto al crear un word cloud.

import matplotlib.pyplot as plt
from wordcloud import WordCloud

texto = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat"

wc = WordCloud(width = 300, height = 300, background_color = "white")
wc.generate(texto)

plt.axis("off")
plt.imshow(wc, interpolation = "bilinear")

# plt.show()

Word cloud en matplotlib

Paleta de colores

Utilizando colormap puedes personalizar la paleta de colores utilizada para colorear cada palabra. Estos colores se seleccionan de manera aleatoria de la paleta de colores (por defecto "viridis").

import matplotlib.pyplot as plt
from wordcloud import WordCloud

texto = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat"

wc = WordCloud(width = 300, height = 300, background_color = "white",
               colormap = "magma")
wc.generate(texto)

plt.axis("off")
plt.imshow(wc, interpolation = "bilinear")

# plt.show()

Librería wordcloud en Python

Tamaño de la fuente

La función WordCloud proporciona los argumentos min_font_size (por defecto: 4) y max_font_size (por defecto: None) que son los tamaños de letra más pequeños y más grandes a ser usados en el word cloud.

import matplotlib.pyplot as plt
from wordcloud import WordCloud

texto = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat"

wc = WordCloud(width = 300, height = 300,
               max_font_size = 20, min_font_size = 10)
wc.generate(texto)

plt.axis("off")
plt.imshow(wc, interpolation = "bilinear")

# plt.show()

Tamaño de fuente en un wordcloud de matplotlib

Número máximo de palabras

Por defecto, el word cloud intentará mostrar hasta 200 palabras, pero puedes reducir o incrementar el número de palabras con max_words. En el ejemplo siguiente limitamos a cinco el número máximo de palabras.

import matplotlib.pyplot as plt
from wordcloud import WordCloud

texto = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat"

wc = WordCloud(width = 300, height = 300,
               max_words = 5)
wc.generate(texto)


plt.axis("off")
plt.imshow(wc, interpolation = "bilinear")

# plt.show()

Número máximo de palabras de un wordcloud de Python

Palabras irrelevantes

Si tu texto contiene palabras que te gustaría descartar de la nube de palabras puedes pasarlas en una lista al argumento stopwords. Por defecto, la función tiene en cuenta una lista predefinida de palabras que se descartan (probablemente solo palabras en inglés).

import matplotlib.pyplot as plt
from wordcloud import WordCloud

texto = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat"

wc = WordCloud(width = 300, height = 300,
               stopwords = ["Lorem", "ipsum", "ut"])
wc.generate(texto)


plt.axis("off")
plt.imshow(wc, interpolation = "bilinear")

# plt.show()

Eliminar palabras de un wordcloud en Python

Incluir números

Los word clouds de Python no incluyen números por defecto, pero puedes agregarlos con include_numbers = True si tu texto contiene números y quieres que se muestren.

import matplotlib.pyplot as plt
from wordcloud import WordCloud

texto = "Texto de muestra con algunos números: 1, 2, 3, 1, 14, 15, 14"

wc = WordCloud(width = 300, height = 300, include_numbers = True)
wc.generate(texto)

plt.axis("off")
plt.imshow(wc, interpolation = "bilinear")

# plt.show()

Word cloud con números en Python

Forma de la nube de puntos

Puedes modificar la forma de un word cloud en base a una forma (círculo, triángulo) y en base a una imagen con mask. Ten en cuenta que si mask no es None, entonces width y height se ignorarán. En el ejemplo siguiente vamos a crear un círculo y utilizarlo para crear una nube de puntos con forma circular.

Forma de un word cloud en Python

import numpy as np
import matplotlib.pyplot as plt
from wordcloud import WordCloud

texto = "Python Charts"

# Cículo
x, y = np.ogrid[:300, :300]
mask = (x - 150) ** 2 + (y - 150) ** 2 > 130 ** 2
mask = 255 * mask.astype(int)

wc = WordCloud(background_color = "white", repeat = True, mask = mask)
wc.generate(texto)

plt.axis("off")
plt.imshow(wc, interpolation = "bilinear")

# plt.show()

Forma de una imagen

También puedes cargar una imagen y usarla para generar una forma. En este escenario, todas las zonas que no sean blancas (#FFFFFF) se utilizarán para crear la forma de la nube de palabras. Para los dos ejemplos siguientes utilizaremos esta imagen.

Word cloud con la forma de una imagen en matplotlib

import numpy as np
import matplotlib.pyplot as plt
from wordcloud import WordCloud
from PIL import Image
from io import BytesIO
import requests

texto = "Python Charts"

# Desde una URL
response = requests.get("https://raw.githubusercontent.com/R-CoderDotCom/samples/main/wordcloud-mask.jpg")
mask = np.array(Image.open(BytesIO(response.content)))

# Desde una archivo local
# mask = np.array(Image.open("file_name.png"))

wc = WordCloud(background_color = "white", repeat = True, mask = mask)
wc.generate(texto)

plt.axis("off")
plt.imshow(wc, interpolation = "bilinear")

plt.show()

Color a partir de una imagen

Es posible utilizar los colores de la imagen para generar los colores del word cloud. Tendrás que generar los colores de la imagen con ImageColorGenerator y utilizar la función recolor, como en el ejemplo siguiente.

Word cloud en Python con la paleta de colores obtenida de la imagen

import numpy as np
import matplotlib.pyplot as plt
from wordcloud import WordCloud, ImageColorGenerator
from PIL import Image
from io import BytesIO
import requests

texto = "Python Charts"

# Desde una URL
response = requests.get("https://365psd.com/images/istock/previews/1004/100424327-vector-cloud-icon.jpg")
mask = np.array(Image.open(BytesIO(response.content)))

# Colores
image_colors = ImageColorGenerator(mask)

wc = WordCloud(background_color = "white", repeat = True, mask = mask)
wc.generate(texto)

plt.axis("off")
plt.imshow(wc.recolor(color_func=image_colors), interpolation = "bilinear")

plt.show()

Grosor y color del borde o contorno

Por último, si usas una forma puedes agregar un borde a dicha forma con contour_width. Además, el color del contorno se puede personalizar con contour_color.

Color y grosor del borde de la forma del wordcloud de Python

import numpy as np
import matplotlib.pyplot as plt
from wordcloud import WordCloud

texto = "Python Charts"

# Círculo
x, y = np.ogrid[:300, :300]
mask = (x - 150) ** 2 + (y - 150) ** 2 > 130 ** 2
mask = 255 * mask.astype(int)

wc = WordCloud(height = 500, width = 500, background_color = "white",
               repeat = True, mask = mask,
               contour_width = 3, contour_color = "black")
wc.generate(texto)

plt.axis("off")
plt.imshow(wc, interpolation = "bilinear")

plt.show()
Better Data Visualizations

A Guide for Scholars, Researchers, and Wonks

Comprar en Amazon
Fundamentals of Data Visualization

A Primer on Making Informative and Compelling Figures

Comprar en Amazon

También te puede interesar