output: html_document: toc: TRUE toc_float: TRUE code_download: TRUE theme: yeti —
La minería de texto (TM) es el proceso de extraer información útil, patrones o conocimiento de textos no estructurados.
library(tidyverse)
library(syuzhet)
library(tm)
library(wordcloud)
library(RColorBrewer)
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
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…
reviews_por_peli$tokens <- lapply(reviews_por_peli$texto, get_tokens)
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
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.