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
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
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 texto
que 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:
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.
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 sobresummarise()
. No tiene mayor relevancia.
Ejecuta ahora la instrucción anterior y comprueba el resultado escribiendo en la consola
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
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
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.