Importación de los Textos

library(tm)
library(pdftools)
library(SnowballC)
library(wordcloud)
library(RColorBrewer)
library(syuzhet)
library(ggplot2)
library(stringr)
library(text)
library(textdata)
library(tidytext)
library(dplyr)
library(tidyr)
library(zoo)
library(gridExtra)
t1992 <- readLines("/Users/gabrielmedina/Downloads/Aladdin_1992.txt")
corp_1992 <- Corpus(VectorSource(t1992))

t2019 <- readLines("/Users/gabrielmedina/Downloads/Aladdin_2019.txt")
corp_2019 <- Corpus(VectorSource(t2019))

Limpieza de los textos

# Convert the text to lower case
corp_1992 <- tm_map(corp_1992, content_transformer(tolower))
# Remove numbers
corp_1992 <- tm_map(corp_1992, removeNumbers)
# Remove english common stopwords
corp_1992 <- tm_map(corp_1992, removeWords, stopwords("english"))

# Remove punctuations
corp_1992 <- tm_map(corp_1992, removePunctuation)
# Eliminate extra white spaces
corp_1992 <- tm_map(corp_1992, stripWhitespace) 

# Convert the text to lower case
corp_2019 <- tm_map(corp_2019, content_transformer(tolower))
# Remove numbers
corp_2019 <- tm_map(corp_2019, removeNumbers)
# Remove english common stopwords
corp_2019 <- tm_map(corp_2019, removeWords, stopwords("english"))

# Remove punctuations
corp_2019<- tm_map(corp_2019, removePunctuation)
# Eliminate extra white spaces
corp_2019 <- tm_map(corp_2019, stripWhitespace) 
# base combinada
aladin_2_versiones=c(corp_2019,corp_1992)

Análisis de texto

dtm_1992 <- TermDocumentMatrix(corp_1992)
dtm_2019 <- TermDocumentMatrix(corp_2019)
dtm_2 <- TermDocumentMatrix(aladin_2_versiones)

Análisis de frecuencias

freq_1992=findFreqTerms(dtm_1992, lowfreq = 30)
freq_1992
##  [1] "aladdin"  "like"     "back"     "right"    "carpet"   "look"    
##  [7] "will"     "pulls"    "never"    "one"      "can"      "see"     
## [13] "lamp"     "man"      "iago"     "jafar"    "get"      "head"    
## [19] "now"      "away"     "turns"    "just"     "got"      "looks"   
## [25] "abu"      "wish"     "sees"     "prince"   "princess" "sultan"  
## [31] "jasmine"  "genie"    "ali"
freq_2019=findFreqTerms(dtm_2019, lowfreq = 30)
freq_2019
##  [1] "wish"    "genie"   "like"    "never"   "will"    "aladdin" "lamp"   
##  [8] "right"   "think"   "can"     "one"     "okay"    "know"    "get"    
## [15] "jasmine" "got"     "jafar"   "sultan"  "now"     "see"     "just"   
## [22] "prince"  "ali"
# Convertir las DTM en matrices para facilitar la manipulación
mat_1992 <- as.matrix(dtm_1992)
mat_2019 <- as.matrix(dtm_2019)

# Extraer frecuencias para los términos frecuentes en cada año
freq_1992_data <- rowSums(mat_1992[rownames(mat_1992) %in% freq_1992, , drop=FALSE])
freq_2019_data <- rowSums(mat_2019[rownames(mat_2019) %in% freq_2019, , drop=FALSE])

# Convertir en data frames para facilitar la combinación
df_1992 <- data.frame(term=names(freq_1992_data), freq_1992=freq_1992_data)
df_2019 <- data.frame(term=names(freq_2019_data), freq_2019=freq_2019_data)

# Combinar los data frames por término
combined_df <- merge(df_1992, df_2019, by="term", all=TRUE)

# Rellenar NAs con 0 para indicar ausencia de frecuencia
combined_df[is.na(combined_df)] <- 0

# Ordenar por una de las columnas de frecuencia, si se desea
combined_df <- combined_df[order(-combined_df$freq_1992),]

# Mostrar el data frame combinado
print(combined_df)
##        term freq_1992 freq_2019
## 2   aladdin       382       195
## 13    jafar       200        66
## 14  jasmine       194        74
## 1       abu       168         0
## 8     genie       166       133
## 32   sultan       111        43
## 12     iago        93         0
## 7    carpet        89         0
## 5      back        72         0
## 26   prince        63        77
## 20    looks        60         0
## 17     lamp        57        38
## 18     like        52        52
## 25      one        48        47
## 27 princess        46         0
## 11     head        44         0
## 15     just        44        42
## 30      see        43        31
## 34    turns        42         0
## 28    pulls        41         0
## 3       ali        40        45
## 19     look        38         0
## 23      now        38        40
## 9       get        35        39
## 10      got        35        30
## 31     sees        35         0
## 4      away        32         0
## 21      man        32         0
## 29    right        32        43
## 35     will        32        47
## 6       can        31        43
## 22    never        30        37
## 36     wish        30        46
## 16     know         0        41
## 24     okay         0        32
## 33    think         0        40
ggplot(head(df_1992, 10), aes(x = reorder(term, -freq_1992), y = freq_1992)) +
  geom_bar(stat = "identity", fill = "lightblue")+
  labs(x= "Palabra", y = "Frecuencia", title = "Top 10 Palabras en Aladdin 1992")+
  geom_text(aes(label = freq_1992), vjust = -0.5) +
  ylim(0,400)

ggplot(head(df_2019, 10), aes(x = reorder(term, -freq_2019), y = freq_2019)) +
  geom_bar(stat = "identity", fill = "lightblue")+
  labs(x= "Palabra", y = "Frecuencia", title = "Top 10 Palabras en el Aladdin 2019")+
  geom_text(aes(label = freq_2019), vjust = -0.5) +
  ylim(0,400)

findAssocs(dtm_1992, terms = "ali", corlimit = 0.2)
## $ali
##  ababwa  prince   lousy loyalty  mighty 
##    0.53    0.48    0.29    0.29    0.20

Word Cloud

set.seed(123)
wordcloud(words= df_1992$term, freq=df_1992$freq_1992, min.freq = 1, random.order = FALSE, colors = brewer.pal(8, "RdPu"))

set.seed(123)
wordcloud(words= df_2019$term, freq=df_2019$freq_2019, min.freq = 1, random.order = FALSE, colors = brewer.pal(8, "RdPu"))

Análisis de sentimientos

texto_palabras = get_tokens(corp_1992)
    emocionesdf=get_nrc_sentiment(texto_palabras, language = "spanish" )
    plot1 = barplot(colSums(prop.table(emocionesdf[,1:8])))

# Generate the simplified macro shape plot
    emocionesdf=get_nrc_sentiment(texto_palabras, language = "spanish" )
    sentimientos=(emocionesdf$negative-1) + emocionesdf$positive
    plot2 = simple_plot(sentimientos)

texto_palabras2 = get_tokens(corp_2019)
    emocionesdf2=get_nrc_sentiment(texto_palabras2, language = "spanish" )
    plot2 = barplot(colSums(prop.table(emocionesdf2[,1:8])))

# Generate the simplified macro shape plot
    emocionesdf2=get_nrc_sentiment(texto_palabras2, language = "spanish" )
    sentimientos2=(emocionesdf2$negative-1) + emocionesdf2$positive
    plot2 = simple_plot(sentimientos2)

Conclusiones

Limpieza de datos

En este análisis de texto, primero que nada se realizó una limpieza de datos, en la cual se llevó acabo una análisis de exploración del texto para encontrar inconsistencias. Gracias a dicha exploración se determinó eliminar stopwords “the”,“at”, etc. que no aportan nada al contexto o el entendimiento de las versiones. Además, para un correcto análisis, se eliminaron signos de puntuación, se cambió todo el texto a minúsculas, se eliminaron los números y los espacios en blanco repetidos. Posteriormente se llevaron acabo transformaciones que permitieran el análisis del texto, específicamente, se hizo una base de datos combinada, así como se convirtieron los corpus a matrices y a dataframes.

Análisis

Personajes Principales Mantienen Relevancia: La persistencia de personajes como “Aladdin”, “Jafar” y “Jasmine” en ambas versiones, aunque con una reducción en la frecuencia, sugiere que mientras estos personajes siguen siendo centrales, la narrativa alrededor de ellos podría haberse expandido para incluir nuevas subtramas o personajes secundarios, ajustando su enfoque narrativo.

Reducción en la Mención de Personajes Secundarios y Elementos: La notable disminución en la mención de personajes como “Abu”, “Iago” y “Carpet” en la versión de 2019 podría indicar un cambio en la relevancia de estos personajes dentro de la historia o una posible modernización de la narrativa que prioriza elementos diferentes. La ausencia de “Abu”, “Iago” y “Carpet” en la lista de 2019 sugiere que la nueva versión podría haber reducido la atención en las travesuras cómicas o las dinámicas de personajes secundarios para centrarse más en el desarrollo de personajes principales o introducir nuevos elementos narrativos.

Consistencia en Temas Universales: La presencia de términos como “prince” (príncipe) y “princess” (princesa) en ambas versiones, con una frecuencia similar o incluso aumentada en el caso de “prince”, refleja la conservación de temas universales de nobleza, romance y aspiración, fundamentales en la trama de “Aladdin”. Sin embargo, en la versión de 1992, se nota un enfoque más mágino e imaginativo, con una mayor frecuencia de palabras como “magis”, “lamp”, etc.

Modernización del Lenguaje y Contexto: La presencia de términos más neutrales o genéricos como “looks”, “like”, “one”, “just”, y “see” en ambas versiones, con poca variación en su frecuencia, puede indicar un esfuerzo por mantener un lenguaje accesible y relevante para las audiencias contemporáneas. Esto podría reflejar un intento de hacer la historia más atemporal o de enfocarse en elementos de la narrativa que resuenan universalmente.

En cuanto al análisis de sentimientos, se puede apreciar cómo la versión de 1992 tiene un presencia mayoritaria de emociones negativas como disgusto, miedo y coraje, por otro lado la versión de 2019 tiene un enfoque más positivo y amigable, donde predomina ampliamente la emoción de confianza. Por otro lado, el desarrollo de las emociones a lo largo de la trama es muy similiar entre ambas versiones, es decir, el desarrollo de las tramas es muy similar notandose un desarrollo del problema al principio de la película u un clímas poco antes de la parte final.