13 Palabras más características de cada episodio

Hemos visto las palabras características de cada uno de los personajes. Ahora vas a extrear la palabra característica de cada uno de los episodios. En gran medida es repetir la mayoría de las operaciones que has realziado en la sección anterior. Pero antes de explicarte cómo se hace, te propongo la última práctica

Extrae las palabras características de cada uno de los Episodios Nacionales de Benito Pérez Galdós. Lo tienes todos en el repositorio del libro, aunque ya descargaste los de la primera serie en el capítulo del Análisis de sentimientos aplicado a la literatura. Además, allí lancé el reto de descargar los 46 episodios que conforman la colección.

No necesitas nada nuevo para extraer la palabra características de cada episodio. Al comienzo de este capítulo cargaste todos los guiones en el objeto MdT y le añadiste alguna información extra como fue convertir el título en factor y crear la columna personaje2. Échale una ojeada tecleando en la consola

MdT

lo que imprimirá el comienzo de la tabla.

## # A tibble: 18,178 × 6
##    temporada episodio titulo                 personaje texto                                  personaje2
##        <dbl>    <dbl> <fct>                  <chr>     <chr>                                  <chr>     
##  1         1        1 El tiempo es el que es CAPITÁN   ¡Atacasteis antes de tiempo! ¿Por qué… RESTO     
##  2         1        1 El tiempo es el que es ALONSO    Porque vos lo ordenasteis.             ALONSO    
##  3         1        1 El tiempo es el que es CAPITÁN   ¿Tenéis testigos de lo que decís?      RESTO     
##  4         1        1 El tiempo es el que es ALONSO    Si los muertos pudieran hablar, los t… ALONSO    
##  5         1        1 El tiempo es el que es CAPITÁN   Mentís. ¡Mentís!                       RESTO     
##  6         1        1 El tiempo es el que es ALONSO    Yo nunca miento.                       ALONSO    
##  7         1        1 El tiempo es el que es CAPITÁN   ¡Prendedle!                            RESTO     
##  8         1        1 El tiempo es el que es ALONSO    ¡¡Todos han muerto por vos!!! ¡¡¡Todo… ALONSO    
##  9         1        1 El tiempo es el que es BLANCA    ¿Por qué le atacaste? ¡Era tu superio… RESTO     
## 10         1        1 El tiempo es el que es ALONSO    ¡Como si es San Pedro! A veces, un ho… ALONSO    
## # ℹ 18,168 more rows

De toda la tabla solo te interesan tres columnas: la del número del episodio (episodio), la del título (titulo) y los diálogos (texto) que has de convertir en palabras sueltas (palabras-token). Los personajes ni los números de temporada tienen interés. Asi que lo primero que tienes que hacer es una tabla como esta

## # A tibble: 57,872 × 4
##    episodio titulo                  palabra     n
##       <dbl> <fct>                   <chr>   <int>
##  1       19 Tiempo de lo oculto     que       307
##  2       25 Tiempo de ilustrados    de        286
##  3       15 Tiempo de valientes I   que       277
##  4       18 Separadas por el tiempo que       274
##  5       25 Tiempo de ilustrados    que       273
##  6       28 Tiempo de censura       que       273
##  7       31 Refugiados en el tiempo que       271
##  8       14 Tiempo de magia         que       263
##  9        8 La leyenda del tiempo   que       262
## 10       19 Tiempo de lo oculto     de        261
## # ℹ 57,862 more rows

Lo que tienes en el objeto anterior son el número de cada episodio en episodio, el título en la columna titulo, cada una de las palabras que aparece en cada episodio recogidas en la variable palabra y el número de ocurrencias de cada una de ellas en cada episodio almacenado en n. El código para conseguirlo es

palabras_episodio <- MdT %>% 
  unnest_tokens(palabra, texto) %>% 
  count(episodio, titulo, palabra, sort = TRUE)

Lo que has hecho ha sido guardar en palabras_episodio el resultado de convertir en palabras-token (que tienes en palabra) el textoque tienes en el objeto MdT. A continuación, le has dicho que las recuente teniendo en cuenta las tres variables que quieres conservar: episodio, titulo y palabra y que las organice de mayor a menor frecuencia absoluta con sort = TRUE.

Lo siguiente es averiguar el número total de palabras que hay en cada episodio y guardarlas en total_palabras. En la sección anterior lo hicieste para cada uno de los personajes y lo guardaste en total_palabras. Te recuerdo el contenido de esta tabla.

## # A tibble: 7 × 2
##   personaje2  total
##   <chr>       <int>
## 1 ALONSO      18079
## 2 AMELIA      17859
## 3 ERNESTO     11422
## 4 JULIÁN      13437
## 5 PACINO      18321
## 6 RESTO      100434
## 7 SALVADOR    22795

Si te acuerdas, en ese momento lo primero que hiciste fue agrupar los datos por personajes. En esta ocasión lo tienes que hacer por el número del episodio y su correspondiente título, es decir, deben quedar unidos ambos elementos, aunque deben mantener su independencia como variables. Para conseguirlo la instrucción que debes usar es group_by(episodio, titulo).

Pero antes que nada, tienes que declarar cómo se llamará el objeto en el que guardarás este cálculo. Lo llamarás total_palabras y le indicará a R de dónde ha de extraer los datos, del objeto que acabas de crear, de palabras_episodio. Así que el comienzo de la expresión es:

total_palabras <- palabras_episodio %>% 
  group_by(episodio, titulo)

Lo siguiente es calcular el total de palabras. Ya lo viste también antes, se consigue con la función summarize que creará una nueva columna, que llamarás total y en la que guardarás la suma de los valores absolutos de todas las palabras de cada uno de los episodios. La expresión es summarize(total = sum(n)). La orden completa es la que hay a continuación, pero no la ejecutes hasta haber leído el aviso que hay después.

total_palabras <- palabras_episodio %>% 
  group_by(episodio, titulo) %>% 
  summarize(total = sum(n))

Al ejecutar la orden anterior sustituirás el contenido del objeto total_palabras que creaste en la sección anterior para averiguar las palabras características de cada personaje. Esa tabla tenía dos variables y siete observaciones. La nueva tendrá tres variables, el número del episodio, el título y el número tal de palabras en cada uno de ellos, y 34 observaciones, una línea por cada episodio.

Lo que has hecho ha sido reutilizar un nombre de un objeto que ya no te era necesario. Podrías haberle dado un nombre nuevo, pero no merecía la pena.

¡Ah! también habrá impreso un mensaje sobre summarise(). No tiene mayor relevancia.

Ejecuta ahora la instrucción anterior y comprueba el resultado escribiendo en la consola

total_palabras

con lo que podrás ver el comienzo de la tabla con el nuevo contenido.

## # A tibble: 34 × 3
## # Groups:   episodio [34]
##    episodio titulo                      total
##       <dbl> <fct>                       <int>
##  1        1 El tiempo es el que es       5056
##  2        2 Tiempo de gloria             5453
##  3        3 Cómo se reescribe el tiempo  4983
##  4        4 Una negociación a tiempo     6052
##  5        5 Cualquier tiempo pasado      5337
##  6        6 Tiempo de pícaros            6228
##  7        7 Tiempo de veganza            5384
##  8        8 La leyenda del tiempo        6335
##  9        9 Tiempo de leyenda            6246
## 10       10 El tiempo en sus manos       6029
## # ℹ 24 more rows
Ya sé que lo aprendiste en los primeros capítulos, pero no viene mal recordarlo. Averigua el total de palabras de toda la serie, la media, la mediana, el valor máximo y mínimo.

Ahora tienes que unir a palabras_episodio el total de palabras de cada uno de los episodios. Eso lo hiciste cuando tratabas de averiguar las palabras característivcas de cada personaje con left_join() y en el paso siguiente calculaste el tf, el idf y el tf_idf. Esta vez lo vas a hacer todo de una vez y no en dos pasos como en la ocasión anterior.

palabras_episodio <- left_join(palabras_episodio,
                               total_palabras) %>%
  bind_tf_idf(palabra,
              episodio,
              n)

Tan pronto como pulses intro, se imprimirá en la consola el aviso

## Joining with `by = join_by(episodio, titulo)`

Sencillamente informa de que la unión de las dos tablas se ha hecho por medio de las variables episodio y titulo. Y se habrá creado una tabla con 57872 líneas y 8 columnas. Échale una ojeada teclando en la consola

palabras_episodio

lo que imprimirá el comienzo de la tabla.

## # A tibble: 57,872 × 8
##    episodio titulo                  palabra     n total     tf   idf tf_idf
##       <dbl> <fct>                   <chr>   <int> <int>  <dbl> <dbl>  <dbl>
##  1       19 Tiempo de lo oculto     que       307  7107 0.0432     0      0
##  2       25 Tiempo de ilustrados    de        286  6939 0.0412     0      0
##  3       15 Tiempo de valientes I   que       277  6632 0.0418     0      0
##  4       18 Separadas por el tiempo que       274  6330 0.0433     0      0
##  5       25 Tiempo de ilustrados    que       273  6939 0.0393     0      0
##  6       28 Tiempo de censura       que       273  6425 0.0425     0      0
##  7       31 Refugiados en el tiempo que       271  6505 0.0417     0      0
##  8       14 Tiempo de magia         que       263  6746 0.0390     0      0
##  9        8 La leyenda del tiempo   que       262  6335 0.0414     0      0
## 10       19 Tiempo de lo oculto     de        261  7107 0.0367     0      0
## # ℹ 57,862 more rows

La verdad es que el comienzo es decepcionante. Las columnas idf y tf_idf son todo ceros, luego son las palabras más usuales en todos los textos. Ya lo viste en el caso de cada uno de los personajes, pero no fue tan descarado como en esta ocasión. Lo más curioso es que las palabras cuyo tf_idf es 0 son tan solo 147 y suponen el 56.57 % de las palabras que constituyen todos los diálogos de la serie, que son 202347 (sin contar los números). Pero este es otro problema. La palabra característica de cada uno de los episodios la tienes en esta tabla que llamarás episodio_peculiar.

## # A tibble: 34 × 3
##    episodio titulo                         palabra    
##       <dbl> <fct>                          <chr>      
##  1        1 El tiempo es el que es         1808       
##  2        2 Tiempo de gloria               esteban    
##  3        3 Cómo se reescribe el tiempo    montserrat 
##  4        4 Una negociación a tiempo       torquemada 
##  5        5 Cualquier tiempo pasado        recibo     
##  6        6 Tiempo de pícaros              lázaro     
##  7        7 Tiempo de veganza              leiva      
##  8        8 La leyenda del tiempo          dalí       
##  9        9 Tiempo de leyenda              cid        
## 10       10 El tiempo en sus manos         armario    
## 11       11 Tiempo de hidalgos             manuscrito 
## 12       12 El monasterio del tiempo       abadesa    
## 13       13 Un virus de otro tiempo        virus      
## 14       14 Tiempo de magia                argamasilla
## 15       15 Tiempo de valientes I          teniente   
## 16       16 Tiempo de valientes II         teniente   
## 17       17 Óleo sobre tiempo              cuadros    
## 18       18 Separadas por el tiempo        vampira    
## 19       19 Tiempo de lo oculto            lombardi   
## 20       20 Hasta que el tiempo nos separe constanza  
## 21       21 Cambio de tiempo               argüelles  
## 22       22 Con el tiempo en los talones   hitchcock  
## 23       23 Tiempo de espías               mincemeat  
## 24       24 Tiempo de hechizos             mencía     
## 25       25 Tiempo de ilustrados           inclusa    
## 26       26 Tiempo de esplendor            lerma      
## 27       27 Tiempo de esclavos             marqués    
## 28       28 Tiempo de censura              viridiana  
## 29       29 Tiempo de conquista            aguilar    
## 30       30 El cisma del tiempo            papa       
## 31       31 Refugiados en el tiempo        moriscos   
## 32       32 Tiempo de verbena              verbena    
## 33       33 Contratiempos                  suárez     
## 34       34 Entre dos tiempos              ureña

que se consigue con este código

episodio_peculiar <- palabras_episodio %>% 
  arrange(episodio, desc(tf_idf)) %>% 
  filter(!duplicated(episodio)) %>% 
  select(1,2,3)

En la primera líneas reorganizas toda la tabla de resultados de mayor a menor de acuerdo con el valor de tf_idf. Es enorme, tiene cerca de 57900 líneas y solo te interesa extraer la que haya obtenido la mayor puntuación en cada episodio. Como no puedes saber cuál es la primera línea en la que comienza cada episodio, que es donde estará situada la palabra con mayor puntuación, la mejor manera de quedarte con esas 34 primeras líneas es borrando de la segunda a la última línea de cada episodio. Sé que suena muy complicado, pero es más sencillo de lo que parece.

Para quedarte con una serie de líneas ya has usado varias veces la función filter() que necesita saber cuál es la condición, que expresas como argumento, por medio de la que harás el filtrado. Aquí la columna, la variable, que te servirá como índice es el número de episodio, el cual tienes guardado en episodio. Esta tendrá un número variable de veces el número de cada episodio y como solo te interesa quedarte con la primera línea, de ahí que reorganizaras la tabla en el paso anterior, considerarás que todas las demás son duplicados. Para indicar qué cosas están duplicadas en R existe la función duplicated() cuyo argumento ha de ser la variable en la que ha de mirar qué valores están duplicados, en este caso episodio. Para decirle que no quieres extraer las líneas duplicadas tienes que anteponer ! que es la negación lógica, con lo que la orden que tienes que usar es filter(!duplicated(episodios)). Al hacer esto, la tabla se reduce a 34 líneas.

El resultado interno es esta tabla

## # A tibble: 34 × 8
##    episodio titulo                      palabra        n total      tf   idf  tf_idf
##       <dbl> <fct>                       <chr>      <int> <int>   <dbl> <dbl>   <dbl>
##  1        1 El tiempo es el que es      1808           6  5056 0.00119  2.83 0.00336
##  2        2 Tiempo de gloria            esteban       13  5453 0.00238  2.83 0.00675
##  3        3 Cómo se reescribe el tiempo montserrat    12  4983 0.00241  3.53 0.00849
##  4        4 Una negociación a tiempo    torquemada    17  6052 0.00281  2.83 0.00796
##  5        5 Cualquier tiempo pasado     recibo        17  5337 0.00319  2.43 0.00773
##  6        6 Tiempo de pícaros           lázaro        18  6228 0.00289  2.83 0.00819
##  7        7 Tiempo de veganza           leiva         35  5384 0.00650  1.92 0.0125 
##  8        8 La leyenda del tiempo       dalí          24  6335 0.00379  2.43 0.00920
##  9        9 Tiempo de leyenda           cid           34  6246 0.00544  1.92 0.0104 
## 10       10 El tiempo en sus manos      armario       19  6029 0.00315  2.14 0.00674
## # ℹ 24 more rows

Fíjate que esta tabla solo tiene 34 líneas, te lo dice la primera línea de la respuesta. Ya podrías dejar de trabajar. Ya tienes la respuesta, la columna palabra tiene la palabra más peculiar de cada episodio. Pero solo quieres mostrar el número de episodio, el título y la palabra. Las demás columnas no te interesan, por lo que procede deshacerse de ellas. La manera de quedarse con unas columnas o borrar las otras es con la función select() cuyo argumentos son los nombres de las variables que quieres conservar, en este caso episodio, titulo y palabra, que son las columna 1, 2 y 3 de la tabla. Luego la última función que has de ejecutar es select(episodio, titulo, palabra) o select(1,2,3), cualquiera de las dos funcionará, como puedes ver en esta tabla final.