Fundación Universitaria Konrad Lorenz
Docente: Viviana Márquez vivianam.penama@konradlorenz.edu.co
Clase #11: Mayo 6, 2020
Visualizaciones para proyectos de NLP 🚵♀️
La próxima clase: Twitter y Plotly
Source: HubSpot + Visage
Piensa en la audiencia:
Menos es más
Herramientas | Gráficas |
Herramientas Libres | Mapas |
Gráficos dinámicos | |
Nube de palabras | |
Bigotes y cajas |
pip install RISE
jupyter-nbextension install rise --py --sys-prefix
jupyter nbextension enable rise --py --sys-prefix
https://nbviewer.jupyter.org/github/
--- Ejemplo Botón de presentación debe aparecer
Seleccionar Markdown
Modo presentación
Exportar
Los Jupyter Notebooks pueden ser usados para otros lenguajes de programación
import pandas as pd
data = pd.read_csv("../archivos/dia_madre.csv")
data.head()
tweet | date | city | lat | lon | |
---|---|---|---|---|---|
0 | #ParoNacional6M marica todos en el centro y su... | 2021-05-06 16:44:19 | Bogotá | 4.649178 | -74.062827 |
1 | En la CCCE creemos que un día no es suficiente... | 2021-05-06 16:28:48 | Bogotá | 4.649178 | -74.062827 |
2 | @Compensar_info buen día ya realicé la actuali... | 2021-05-06 16:16:40 | Bogotá | 4.649178 | -74.062827 |
3 | Gordo, te acuerdas cuando un país se movilizó ... | 2021-05-06 16:12:20 | Bogotá | 4.649178 | -74.062827 |
4 | @Annge_myg Creería que quiere aprovechar el fi... | 2021-05-06 15:49:45 | Bogotá | 4.649178 | -74.062827 |
import numpy as np
from wordcloud import WordCloud, ImageColorGenerator
from nltk.corpus import stopwords
stopwords = stopwords.words("spanish")
import matplotlib.pyplot as plt
import PIL.Image
from IPython.display import display
palabras = data.tweet.str.cat(sep=" ")
wordcloud = WordCloud().generate(palabras)
plt.imshow(wordcloud)
plt.show()
import re
# stopwords.append("https")
# stopwords.append("co")
stopwords.extend(["https", "co", "día", "dia", "madres", "madre"])
def pre_procesado(texto):
texto = texto.lower()
texto = re.sub(r"[\W\d_]+", " ", texto)
texto = [palabra for palabra in texto.split() if palabra not in stopwords]
texto = " ".join(texto)
return texto
data['pp'] = data.tweet.apply(lambda texto: pre_procesado(texto))
data.head()
tweet | date | city | lat | lon | pp | |
---|---|---|---|---|---|---|
0 | #ParoNacional6M marica todos en el centro y su... | 2021-05-06 16:44:19 | Bogotá | 4.649178 | -74.062827 | paronacional m marica centro sur haciendo paro... |
1 | En la CCCE creemos que un día no es suficiente... | 2021-05-06 16:28:48 | Bogotá | 4.649178 | -74.062827 | ccce creemos suficiente celebrar mamá queremos... |
2 | @Compensar_info buen día ya realicé la actuali... | 2021-05-06 16:16:40 | Bogotá | 4.649178 | -74.062827 | compensar info buen realicé actualización dato... |
3 | Gordo, te acuerdas cuando un país se movilizó ... | 2021-05-06 16:12:20 | Bogotá | 4.649178 | -74.062827 | gordo acuerdas país movilizó muerte violenta s... |
4 | @Annge_myg Creería que quiere aprovechar el fi... | 2021-05-06 15:49:45 | Bogotá | 4.649178 | -74.062827 | annge myg creería quiere aprovechar fin semana... |
# Más en https://www.datacamp.com/community/tutorials/wordcloud-python
palabras = data.pp.str.cat(sep=" ")
wordcloud = WordCloud(width=800, height=400,
max_font_size=150, max_words=100,
background_color="white", colormap="spring",
stopwords=stopwords, collocations=True).generate(palabras) # https://matplotlib.org/3.1.0/tutorials/colors/colormaps.html
plt.figure(figsize=(10,8))
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis("off")
plt.tight_layout(pad=0)
plt.show()
img = PIL.Image.open("../img/clase11/flower2.png")
display(img)
mask = np.array(img)
mask
array([[[255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255], ..., [255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255]], [[255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255], ..., [255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255]], [[255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255], ..., [255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255]], ..., [[255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255], ..., [255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255]], [[255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255], ..., [255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255]], [[255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255], ..., [255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255]]], dtype=uint8)
# Más en https://www.datacamp.com/community/tutorials/wordcloud-python
palabras = data.pp.str.cat(sep=" ")
wordcloud = WordCloud(width=800, height=400,
max_font_size=150, max_words=100,
background_color="white", colormap="spring",
stopwords=stopwords, collocations=True,
mask=mask, contour_width=1, contour_color='pink').generate(palabras) # https://matplotlib.org/3.1.0/tutorials/colors/colormaps.html
wordcloud.to_file("nlp_flor.png")
plt.figure(figsize=(10,8))
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis("off")
plt.tight_layout(pad=0)
plt.show()
# Más en https://www.datacamp.com/community/tutorials/wordcloud-python
palabras = data.pp.str.cat(sep=" ")
wordcloud = WordCloud(width=800, height=400,
max_font_size=150, max_words=100,
background_color="white", colormap="spring",
stopwords=stopwords, collocations=True,
mask=mask, contour_width=1, contour_color='pink').generate(palabras) # https://matplotlib.org/3.1.0/tutorials/colors/colormaps.html
image_colors=ImageColorGenerator(mask)
wordcloud.to_file("nlp_flor.png")
plt.figure(figsize=(10,8))
plt.imshow(wordcloud.recolor(color_func=image_colors), interpolation='bilinear')
plt.axis("off")
plt.tight_layout(pad=0)
plt.show()
Link de descarga: https://public.tableau.com/en-us/s/download
data.city.value_counts()
Bogotá 100 Santa Marta 100 Neiva 100 Cartagena 100 Cali 100 Barranquilla 100 Villavicencio 100 Medellín 92 Armenia 85 Pereira 81 Manizales 36 Ibagué 35 Valledupar 29 Bucaramanga 27 Cúcuta 20 Tunja 18 Ríohacha 18 Sincelejo 16 Montería 12 Yopal 11 Arauca 7 Pasto 4 Florencia 2 Puerto Carreño 2 Quibdó 2 San José del Guaviare 2 Mocoa 2 Leticia 1 Popayán 1 Name: city, dtype: int64
# Nube de palabras & Mapa de árbol
ciudad1 = "Cali"
ciudad2 = "Armenia"
data1 = data[data.city==ciudad1]
data2 = data[data.city==ciudad2]
palabras1 = data1.pp.str.cat(sep=" ")
palabras2 = data2.pp.str.cat(sep=" ")
wordcloud1 = WordCloud().generate(palabras1).words_
wordcloud2 = WordCloud().generate(palabras2).words_
temp1 = pd.DataFrame.from_dict(wordcloud1, orient='index').reset_index()
temp1.columns = ['palabra', 'peso']
temp1['ciudad'] = ciudad1
temp2 = pd.DataFrame.from_dict(wordcloud2, orient='index').reset_index()
temp2.columns = ['palabra', 'peso']
temp2['ciudad'] = ciudad2
data_nube = pd.concat([temp1, temp2])
data_nube.to_csv("nube.csv", index=False)
palabra | peso | ciudad | |
---|---|---|---|
0 | hijo | 1.000000 | Cali |
1 | si | 0.576923 | Cali |
2 | hoy | 0.500000 | Cali |
3 | días | 0.346154 | Cali |
4 | colombia | 0.346154 | Cali |
... | ... | ... | ... |
195 | común | 0.058824 | Armenia |
196 | disidencias | 0.058824 | Armenia |
197 | farc | 0.058824 | Armenia |
198 | bacrim | 0.058824 | Armenia |
199 | verdaderos | 0.058824 | Armenia |
400 rows × 3 columns
# Mapa
data['contador_palabras'] = data.pp.apply(lambda texto: len(texto.split()))
data[['city', 'lat', 'lon', 'contador_palabras']].to_csv("mapa.csv", index=False)
Plotly: Herramienta de visualización interactiva. Funciona con Python, R, Julia, etc. Recurso
Dash: Entorno de trabajo para construir aplicaciones web (usa Flask y Plotly) Recurso. Ejemplo
Flask: Entorno de trabajo para construir aplicaciones web para Python Recurso
pip install plotly
Taller #10: Realizar una nube de palabras (Python ó Tableau, subir al aula virtual cualquiera de los dos links) con cualquier texto (excepto el que usamos en la clase de hoy)
Fecha de entrega: Mayo 13, 2021. (Antes del inicio de la próxima clase)