NOTAS PREVIAS AL SCRIPT:

El siguiente documento difiere del código semilla visto en clase. Al ser una gran cantidad de información y a pesar de intentar en 3 diferentes computadoras de miembros del equipo, el código no logró correr en ninguna de las computadoras. Para la elaboración de este código se tomaron en cuenta los conceptos vistos en clase (procesamiento de datos no estructurados, text mining, análisis de sentimiento y visualizaciones como el wordcloud).

Se mantuvieron la mayoría de las librerías originales. EL principal cambio de enfoque debido al reto de la capacidad de procesamiento de las computadoras con las que estabamos trabajando fue: tabular la información en dos columnas (pagina y texto), permitiendo al código por chunks un poco más naturales que todo el texto de una. Se eliminaron los stopwords por medio de un antijoin y se filtraron los caracteres sueltos como parte del preprocesamiento de los datos junto a la tokenización. Finalmente, las visualizaciones son similares a las vistas en clase.

Carga de librerías:

library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.2.0     ✔ readr     2.1.6
## ✔ forcats   1.0.1     ✔ stringr   1.6.0
## ✔ ggplot2   4.0.2     ✔ tibble    3.3.1
## ✔ lubridate 1.9.5     ✔ tidyr     1.3.2
## ✔ purrr     1.2.1     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(pdftools)
## Using poppler version 25.10.0
library(tidytext)
library(syuzhet)
library(wordcloud)
## Cargando paquete requerido: RColorBrewer
library(RColorBrewer)
library(tm)
## Cargando paquete requerido: NLP
## 
## Adjuntando el paquete: 'NLP'
## 
## The following object is masked from 'package:ggplot2':
## 
##     annotate

Carga y preprocesamiento de la información:

pdf_text_raw <- pdf_text("C:/Users/qs_di/Documents/Proyecto R/CONCENTRACION/movie_reviews.csv_compressed (1).pdf")

df_pages <- tibble(
  page = seq_along(pdf_text_raw),
  text = pdf_text_raw
)
data(stop_words)

tokens <- df_pages %>%
  unnest_tokens(word, text) %>%
  filter(str_detect(word, "^[a-z]+$")) %>%
  anti_join(stop_words, by = "word")

Análisis de sentimiento

texto <- df_pages$text

emociones <- get_nrc_sentiment(texto, language = "english")

# Emociones principales
emociones_resumen <- colSums(emociones[,1:8])

barplot(
  emociones_resumen,
  col = brewer.pal(8, "Set2"),
  main = "Distribución de Emociones (NRC)",
  las = 2
)

Word Cloud:

word_freq <- tokens %>%
  count(word, sort = TRUE)

set.seed(123)

wordcloud(
  words = word_freq$word,
  freq = word_freq$n,
  min.freq = 20,
  max.words = 150,
  random.order = FALSE,
  colors = brewer.pal(8, "Dark2")
)

Conclusiones:

  • La emoción más reconocida en el dataset es “trust” o canfianza. Con esto podemos inferir que la mayoría de los que opinaron hablaron de un sentimiento de confianza en sus reseñas.
  • Otros patrones de sentimiento relevantes hablaban de anticipación o emoción previa a la película, miedo, felicidad, tristeza y enojo.
  • La palabra más mencionada fue “male”, esto podría tener varios motivos, desde que en la selección de películas incluidas en el dataset sean hombres o inclusive una preferencia generalizada por protagonistas masculinos en la muestra del dataset.
  • Otras palabras relevantes fueron: comedy, movie, film, drama, action, female y nombres como michael, john y david.