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

library(tidyverse)
library(janitor)
library(tm)
library(wordcloud)

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á

Fuente: https://x.com/RosanaFerrero/status/1521396654829617153/photo/1

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
hp3 <- readLines("data/hp3.txt")

# Lo convertimos en un solo vector
libro <- paste(hp3, collapse = " ")

# 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?

oraciones <- unlist(str_split(libro, "(?<=[.!?])\\s+"))
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
libro_limpio <- tolower(libro)  
# Eliminamos las puntuaciones
libro_limpio <- gsub("[[:punct:]]", "", libro_limpio)  
# Eliminamos los números
libro_limpio <- gsub("[[:digit:]]", "", libro_limpio) 
# Eliminamos espacios múltiples
libro_limpio <- gsub("\\s+", " ", libro_limpio) 
libro_limpio <- gsub("[^\x20-\x7E]", "", libro_limpio)  # Elimina caracteres no imprimibles

Dividimos las palabras

# Divido las palabras:

palabras <- unlist(strsplit(libro_limpio, "\\s+")) 

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_filtradas <- palabras[!palabras %in% stopwords_es] 

Contamos

frecuencia <- table(palabras_filtradas)
# Ordenamos por la frecuencia
frecuencia <- sort(frecuencia, decreasing = TRUE) 

# 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

  1. Convertimos nuestras frecuencias en una tabla
df_frec <- as.data.frame(frecuencia)
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_grafico <- df_frec |> 
  head(20)
esquisse::esquisser(df_grafico)

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"
  ) +
  ggthemes::theme_fivethirtyeight() +
  theme(
    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"))


  1. J. K. Rowling . (1999). Harry Potter y el prisionero de Azkaban. Reino Unido: Bloomsbury.↩︎