output: html_document: toc: TRUE toc_float: TRUE code_download: TRUE theme: yeti —

Teoría

La minería de texto (TM) es el proceso de extraer información útil, patrones o conocimiento de textos no estructurados.

Cargar paquetes y librerías

library(tidyverse)
library(syuzhet)
library(tm)
library(wordcloud)
library(RColorBrewer)

Leer archivo

pelis<- read.csv("C:\\Users\\Emili\\OneDrive\\Desktop\\TEC\\Tec 6to Semestre Concentracion\\Modulo 2\\Archivos CSV\\movie_reviews.csv")
pelis_2001 <- pelis %>%
  filter(movie_name %in% c(
    "Meet Joe Black",
    "Se7en",
    "Bridget Jones's Diary",
    "American Beauty"
  ))

table(pelis_2001$movie_name)
## 
##       American Beauty Bridget Jones's Diary        Meet Joe Black 
##                    55                    10                    27 
##                 Se7en 
##                    20

Unir Reviews por Película

reviews_por_peli <- pelis_2001 %>%
  group_by(movie_name) %>%
  summarise(texto = paste(review_text, collapse = " "))

reviews_por_peli
## # A tibble: 4 × 2
##   movie_name            texto                                                   
##   <chr>                 <chr>                                                   
## 1 American Beauty       "Yet another biting satire that savagely deconstructs t…
## 2 Bridget Jones's Diary "My favorite moment: two British blokes engage in a\nst…
## 3 Meet Joe Black        "For more reviews and trivia, go to http://surf.to/jobl…
## 4 Se7en                 "(Warning to those who have not seen SEVEN: This review…

Tokenizar reviews

reviews_por_peli$tokens <- lapply(reviews_por_peli$texto, get_tokens)

Análisis de Emociones y Sentimientos

reviews_por_peli <- reviews_por_peli %>%
  mutate(emociones = lapply(tokens, get_nrc_sentiment))
emociones_se7en <- reviews_por_peli %>%
  filter(movie_name == "Se7en") %>%
  pull(emociones) %>%
  .[[1]]

barplot(colSums(prop.table(emociones_se7en[,1:8])),
        main = "Emociones - Se7en",
        col = "steelblue")

emociones_american_beauty <- reviews_por_peli %>%
  filter(movie_name == "American Beauty") %>%
  pull(emociones) %>%
  .[[1]]

barplot(colSums(prop.table(emociones_american_beauty[,1:8])),
        main = "Emociones - American Beauty",
        col = "steelblue")

emociones_bridget_jones <- reviews_por_peli %>%
  filter(movie_name == "Bridget Jones's Diary") %>%
  pull(emociones) %>%
  .[[1]]

barplot(colSums(prop.table(emociones_bridget_jones[,1:8])),
        main = "Emociones - Bridget Jones's Diary",
        col = "steelblue")

emociones_joe_black <- reviews_por_peli %>%
  filter(movie_name == "Meet Joe Black") %>%
  pull(emociones) %>%
  .[[1]]

barplot(colSums(prop.table(emociones_joe_black[,1:8])),
        main = "Emociones - Meet Joe Black",
        col = "steelblue")

reviews_por_peli <- reviews_por_peli %>%
  mutate(score = sapply(emociones, function(x) {
    sum(x$positive) - sum(x$negative)
  }))

reviews_por_peli %>%
  select(movie_name, score)
## # A tibble: 4 × 2
##   movie_name            score
##   <chr>                 <dbl>
## 1 American Beauty        1533
## 2 Bridget Jones's Diary   267
## 3 Meet Joe Black          421
## 4 Se7en                   124

Película con reviews más positivas - American Beauty

texto_ab <- reviews_por_peli$texto[
  reviews_por_peli$movie_name == "American Beauty"
]

corpus_ab <- Corpus(VectorSource(texto_ab))

corpus_ab <- tm_map(corpus_ab, content_transformer(tolower))
## Warning in tm_map.SimpleCorpus(corpus_ab, content_transformer(tolower)):
## transformation drops documents
corpus_ab <- tm_map(corpus_ab, removePunctuation)
## Warning in tm_map.SimpleCorpus(corpus_ab, removePunctuation): transformation
## drops documents
corpus_ab <- tm_map(corpus_ab, removeNumbers)
## Warning in tm_map.SimpleCorpus(corpus_ab, removeNumbers): transformation drops
## documents
corpus_ab <- tm_map(corpus_ab, removeWords, stopwords("english"))
## Warning in tm_map.SimpleCorpus(corpus_ab, removeWords, stopwords("english")):
## transformation drops documents
corpus_ab <- tm_map(corpus_ab, removeWords,
                    c("film", "movie", "one", "like", "reviews", "movies"))
## Warning in tm_map.SimpleCorpus(corpus_ab, removeWords, c("film", "movie", :
## transformation drops documents
tdm_ab <- TermDocumentMatrix(corpus_ab)
freq_ab <- sort(rowSums(as.matrix(tdm_ab)), decreasing = TRUE)

set.seed(123)

wordcloud(names(freq_ab),
          freq_ab,
          max.words = 100,
          colors = brewer.pal(8, "Dark2"))
## Warning in wordcloud(names(freq_ab), freq_ab, max.words = 100, colors =
## brewer.pal(8, : review could not be fit on page. It will not be plotted.
## Warning in wordcloud(names(freq_ab), freq_ab, max.words = 100, colors =
## brewer.pal(8, : lester could not be fit on page. It will not be plotted.

## Película con más palabras consideradas “negativas” - Se7en

texto_seven <- reviews_por_peli$texto[
  reviews_por_peli$movie_name == "Se7en"
]

corpus_seven <- Corpus(VectorSource(texto_seven))

corpus_seven <- tm_map(corpus_seven, content_transformer(tolower))
## Warning in tm_map.SimpleCorpus(corpus_seven, content_transformer(tolower)):
## transformation drops documents
corpus_seven <- tm_map(corpus_seven, removePunctuation)
## Warning in tm_map.SimpleCorpus(corpus_seven, removePunctuation): transformation
## drops documents
corpus_seven <- tm_map(corpus_seven, removeNumbers)
## Warning in tm_map.SimpleCorpus(corpus_seven, removeNumbers): transformation
## drops documents
corpus_seven <- tm_map(corpus_seven, removeWords, stopwords("english"))
## Warning in tm_map.SimpleCorpus(corpus_seven, removeWords,
## stopwords("english")): transformation drops documents
corpus_seven <- tm_map(corpus_seven, removeWords,
                       c("film", "movie", "one", "like", "seven", "seen", "reviews"))
## Warning in tm_map.SimpleCorpus(corpus_seven, removeWords, c("film", "movie", :
## transformation drops documents
tdm_seven <- TermDocumentMatrix(corpus_seven)
freq_seven <- sort(rowSums(as.matrix(tdm_seven)), decreasing = TRUE)

set.seed(123)

wordcloud(names(freq_seven),
          freq_seven,
          max.words = 100,
          colors = brewer.pal(8, "Dark2"))
## Warning in wordcloud(names(freq_seven), freq_seven, max.words = 100, colors =
## brewer.pal(8, : newsgroup could not be fit on page. It will not be plotted.
## Warning in wordcloud(names(freq_seven), freq_seven, max.words = 100, colors =
## brewer.pal(8, : otherwise could not be fit on page. It will not be plotted.
## Warning in wordcloud(names(freq_seven), freq_seven, max.words = 100, colors =
## brewer.pal(8, : murders could not be fit on page. It will not be plotted.
## Warning in wordcloud(names(freq_seven), freq_seven, max.words = 100, colors =
## brewer.pal(8, : david could not be fit on page. It will not be plotted.

## Conclusiones”

Con base en el análisis de sentimientos realizado a partir del léxico NRC, se obtuvo que American Beauty presentó el puntaje más alto (1533), lo que indica que en sus reseñas predominan las palabras clasificadas como positivas. En contraste, Se7en obtuvo el puntaje más bajo (124), mostrando una mayor presencia relativa de términos asociados con emociones negativas.

Sin embargo, estos resultados no deben interpretarse como una medida directa de la calidad de las películas. El análisis está influenciado por la temática y el género de cada obra. Por ejemplo, en la nube de palabras de Se7en, la palabra más frecuente es “killer”, la cual está relacionada con conceptos negativos, pero forma parte central de la trama de la película. Es decir, el uso de este tipo de vocabulario responde al contenido narrativo y no necesariamente a una mala valoración por parte de los espectadores.

De igual manera, en los gráficos de emociones se observa que Se7en presenta mayores niveles de enojo (anger) y disgusto (disgust), así como niveles más bajos de alegría (joy), en comparación con las demás películas. Esto es coherente con su tono oscuro y su enfoque en el crimen y el suspenso. Por el contrario, American Beauty muestra niveles más altos de alegría, lo que contribuye a su mayor balance positivo en el puntaje final.

En conclusión, el análisis de sentimientos permite identificar diferencias en el tono emocional de las reseñas, pero estas diferencias están relacionadas principalmente con la temática de cada película y no necesariamente con su calidad cinematográfica.