library(tidyverse)
library(janitor)
library(tm)
library(wordcloud)
C1. Taller práctico
Para la actividad de hoy vamos a trabajar con el libro de Harry Potter 3 - El prisionero de Azkaban de J.K Rowling1
Los paquetes
Sobre los paquetes
Tidyverse
es un conjunto de paquetes de R. Se utiliza para analizar datos y está compuesto por paquetes que comparten una filosofía de diseño, gramática y estructura. Más información acá
esquisse
es un paquete que permite generar graficos con ggplot
a partir de una manera interactiva utilizando drag and drop. Más información acá
janitor
contiene funciones para limpiar y examinar datos. Más información acá
Cargamos el libro
# Cargamos los datos
<- readLines("data/hp3.txt")
hp3
# Lo convertimos en un solo vector
<- paste(hp3, collapse = " ")
libro
# Vemos los primeros caracteres
print(substr(libro, 1, 500))
[1] "J.K. Rowling Harry Potter y el prisionero de Azkaban Por la cicatriz que lleva en la frente, sabemos que Harry Potter no es un niño como los demás, sino el héroe que venció a lord Voldemort, el mago más temible y maligno de todos los tiempos y culpable de la muerte de los padres de Harry. Desde entonces, Harry no tiene más remedio que vivir con sus pesados tíos y su insoportable primo Dudley, todos ellos muggles, o sea, personas no magas, que desprecian a su sobrino debido a sus poderes. Igual"
¿Cuantos caracteres tiene el libro?
# ¿Cuantos caracteres tiene el libro?
nchar(libro)
[1] 644726
¿Cuantas oraciones tiene el libro?
<- unlist(str_split(libro, "(?<=[.!?])\\s+"))
oraciones length(oraciones)
[1] 10603
Frecuencia de palabras más utilizadas
Limpiamos el texto
gsub()
es una función en R que se usa para buscar y reemplazar texto dentro de cadenas de caracteres.
La sintaxis es:
gsub("patrón_a_buscar", "nuevo_texto", texto)
A través de esta función vamos a limpiar el texto del libro para mejorar el conteo de las palabrbas
# Convertimos a minusculas
<- tolower(libro)
libro_limpio # Eliminamos las puntuaciones
<- gsub("[[:punct:]]", "", libro_limpio)
libro_limpio # Eliminamos los números
<- gsub("[[:digit:]]", "", libro_limpio)
libro_limpio # Eliminamos espacios múltiples
<- gsub("\\s+", " ", libro_limpio)
libro_limpio <- gsub("[^\x20-\x7E]", "", libro_limpio) # Elimina caracteres no imprimibles libro_limpio
Dividimos las palabras
# Divido las palabras:
<- unlist(strsplit(libro_limpio, "\\s+")) palabras
Eliminamos las stopwords
Las stopwords (o palabras vacías) son palabras muy comunes en un idioma que suelen tener poco valor en análisis de texto porque no aportan significado relevante. Ejemplos en español incluyen:
🔹 Preposiciones: “de”, “a”, “con”, “por”, “para” 🔹 Artículos: “el”, “la”, “los”, “las” 🔹 Conjunciones: “y”, “o”, “pero”, “aunque” 🔹 Pronombres: “yo”, “tú”, “él”, “ella”, “nosotros” 🔹 Verbos auxiliares: “ser”, “estar”, “haber”
<- stopwords("es")
stopwords_es
# Vector sin los stopwords
<- palabras[!palabras %in% stopwords_es] palabras_filtradas
Contamos
<- table(palabras_filtradas)
frecuencia # Ordenamos por la frecuencia
<- sort(frecuencia, decreasing = TRUE)
frecuencia
# Top 20 palabras
head(frecuencia, 20)
palabras_filtradas
harry dijo ron hermione haba si lupin ms
1935 1020 769 656 649 404 401 400
qu black l hacia hagrid snape profesor pregunt
397 307 264 260 253 245 242 223
voz s profesora malfoy
222 206 203 185
Graficamos
- Convertimos nuestras frecuencias en una tabla
<- as.data.frame(frecuencia)
df_frec colnames(df_frec) <- c("Palabra", "Frecuencia")
head(df_frec)
Palabra Frecuencia
1 harry 1935
2 dijo 1020
3 ron 769
4 hermione 656
5 haba 649
6 si 404
Me quedo con las 20 palabras más mencionadas y grafico utilizando esquisser
<- df_frec |>
df_grafico head(20)
::esquisser(df_grafico) esquisse
Lo diseñamos a gusto y luego guardamos el código
# Grafico final
ggplot(df_grafico) +
aes(x = Palabra, y = Frecuencia) +
geom_col(fill = "#440154") +
labs(
x = "Palabras",
y = "Cantidad",
title = "Palabras mas mencionadas en Harry Potter 3"
+
) ::theme_fivethirtyeight() +
ggthemestheme(
legend.justification = "top",
plot.title = element_text(size = 14L,
face = "bold",
hjust = 0.5)
)
Nube de palabras
También podemos realizar una nube de palabras:
wordcloud(names(frecuencia), frecuencia, max.words = 100, colors = brewer.pal(8, "Dark2"))
J. K. Rowling . (1999). Harry Potter y el prisionero de Azkaban. Reino Unido: Bloomsbury.↩︎