https://github.com/borjamome/agenda_2030
Análisis de textos con R de la Agenda 2030
https://github.com/borjamome/agenda_2030
Last synced: over 1 year ago
JSON representation
Análisis de textos con R de la Agenda 2030
- Host: GitHub
- URL: https://github.com/borjamome/agenda_2030
- Owner: BORJAMOME
- Created: 2024-05-21T10:30:09.000Z (about 2 years ago)
- Default Branch: main
- Last Pushed: 2024-05-21T11:10:54.000Z (about 2 years ago)
- Last Synced: 2025-01-31T17:48:07.734Z (over 1 year ago)
- Language: R
- Size: 8.79 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Análisis de la Agenda 2030 con R

## Análisis de Texto en R
Este proyecto realiza un análisis de texto utilizando varias librerías de R para la lectura, tokenización, visualización y análisis de sentimientos.
## Requisitos
Asegúrate de tener instaladas las siguientes librerías antes de ejecutar el código:
- `readr`: Se utiliza para leer archivos de texto, en este caso, para cargar el contenido del archivo calendar.rtf.
- `tokenizers`: Permite dividir el texto en unidades más pequeñas, como palabras, oraciones, bigramas y trigramas, facilitando el análisis.
- `tidyverse`: Un conjunto de paquetes que proporcionan herramientas para la manipulación y visualización de datos. Aquí se usa principalmente para transformar y filtrar datos.
- `stopwords`: Proporciona listas de palabras vacías (stopwords) en diferentes idiomas, que se eliminan del análisis para centrarse en las palabras más significativas.
- `ggplot2`: Utilizado para crear gráficos de alta calidad y personalizables, como gráficos de barras y grafos.
- `wordcloud2`: Genera nubes de palabras que visualizan la frecuencia de las palabras de forma atractiva.
- `tidytext`: Facilita el procesamiento y análisis de texto de manera ordenada y estructurada, integrando la manipulación de texto con las herramientas de tidyverse.
- `textdata`: Proporciona diccionarios de sentimientos y emociones, como el NRC y Bing, que se utilizan para el análisis de sentimientos.
- `syuzhet`: Utilizado para extraer y analizar emociones y sentimientos en el texto, proporcionando una visión más profunda del contenido emocional.
- `tm`: Ofrece herramientas para la minería de texto, incluyendo la creación de un corpus y la matriz término-documento.
- `textTinyR`: Proporciona funciones eficientes para la tokenización y análisis de n-gramas, especialmente útil para grandes conjuntos de datos.
- `igraph`: Permite la creación y visualización de grafos, que se utilizan para mostrar las conexiones entre palabras en bigramas y trigramas.
- `ggraph`: Extiende ggplot2 para la visualización de grafos, facilitando la creación de gráficos de red visualmente atractivos.
- `patchwork`: Permite combinar múltiples gráficos en una sola visualización de manera ordenada, útil para mostrar diferentes análisis juntos.
Puedes instalarlas con:
```r
install.packages(c("readr", "tokenizers", "tidyverse", "stopwords", "ggplot2", "wordcloud2", "tidytext", "textdata", "syuzhet", "tm", "textTinyR", "igraph", "ggraph", "patchwork"))
```
# Descripción del Proyecto
## 1. Cargar y preparar los datos
Se carga el archivo de texto y se prepara para el análisis:
```r
library(readr)
libro <- read_lines(".../Desktop/calendar.rtf")
texto_completo <- paste(libro, collapse = " ")
```
## 2. Tokenización de palabras y análisis de frecuencias
Se tokeniza el texto en palabras y se cuenta su frecuencia:
```r
library("tokenizers")
palabras <- tokenize_words(texto_completo)
count_words(texto_completo)
library("tidyverse")
tabla <- table(palabras[[1]])
(tabla <- tibble(
palabra = names(tabla),
recuento = as.numeric(tabla)
) |> arrange(desc(recuento)))
```
## 3. Tokenización de oraciones
Se tokeniza el texto en oraciones y se analiza su longitud:
```r
oraciones <- tokenize_sentences(texto_completo)
count_sentences(texto_completo)
oraciones[[1]][1:3] # primeras 3 oraciones
oraciones[[1]][count_sentences(texto_completo)] # última oración
palabras_oracion <- tokenize_words(oraciones[[1]])
longitud_o <- sapply(palabras_oracion, length)
head(longitud_o)
```
## 4. Filtrado de stopwords
Se eliminan las palabras vacías (stopwords) del análisis:
```r
library("stopwords")
tabla_stopwords <- tibble(palabra = stopwords("en"))
tabla <- tabla |> anti_join(tabla_stopwords)
knitr::kable(tabla[1:20, ], caption = "Palabras más frecuentes (sin palabras vacías)")
```
## 5. Visualización de las palabras más frecuentes
Se crea un gráfico de barras horizontales con las palabras más frecuentes:
```r
library(ggplot2)
# Establecer colores y tipografía
background_color <- "#f6f6f6"
color_barras <- "#aad59e"
lato <- "Lato"
# Filtrar las palabras más frecuentes excluyendo las stopwords
tabla_filtrada <- tabla %>% anti_join(tabla_stopwords)
# Crear un gráfico de barras horizontales
ggplot(tabla_filtrada[1:30, ], aes(x = recuento, y = reorder(palabra, recuento))) +
geom_bar(stat = "identity", fill = color_barras) +
geom_text(aes(label = recuento), hjust = -0.1, size = 3, family = lato) +
labs(title = "Most Frequent Words (Excluding Stopwords)",
x = "Count", y = "Word") +
theme_minimal() +
theme(axis.text.y = element_text(hjust = 0, family = lato),
panel.background = element_rect(fill = background_color),
plot.background = element_rect(fill = background_color),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
text = element_text(family = lato))
```

## 6. Wordcloud
Se crea una nube de palabras con una paleta de colores pastel:
```r
library(wordcloud2)
background_color <- "#f6f6f6"
colores_pastel <- c("#FFD700", "#FF69B4", "#ADD8E6", "#98FB98", "#FF6347")
wordcloud2(tabla, color = colores_pastel, backgroundColor = background_color)
```

## 7. Análisis de sentimientos y detección de emociones
Se analizan los sentimientos y emociones del texto:
```r
library("tidytext")
library("textdata")
library("kableExtra")
# Tokenizar el texto completo
tabla <- table(tokenize_words(texto_completo)[[1]])
# Crear tibble con recuento de palabras
tabla <- tibble(
word = names(tabla),
recuento = as.numeric(tabla)
)
# Filtrar stopwords y ordenar por recuento
tabla <- tabla |> anti_join(tibble(word = stopwords("en"))) |> arrange(desc(recuento))
# Filtrar palabras positivas según sentimientos "bing"
pos <- get_sentiments("bing") |> filter(sentiment == "positive")
pos_EN <- tabla |> semi_join(pos)
# Mostrar tabla de palabras positivas
kable(pos_EN) %>%
kable_styling(bootstrap_options = c("striped", "hover"))
# Obtener sentimientos "nrc" y visualizar con ggplot
emo <- get_sentiments("nrc")
emo |> ggplot(aes(sentiment)) +
geom_bar(aes(fill = sentiment), show.legend = FALSE) +
scale_fill_manual(values = c("#FFD1DC", "#D3D3D3", "#FFD700", "#98FB98", "#ADD8E6", "#FFA07A", "#E6E6FA", "#FFF8DC", "#FFDEAD", "#BDB2FF"))
# Realizar operaciones con la tabla de sentimientos
emo_tab <- tabla |> inner_join(emo)
head(emo_tab, n = 7)
# Crear el gráfico con la paleta de colores pastel
emo_tab |>
count(sentiment) |>
ggplot(aes(x = sentiment, y = n)) +
geom_bar(stat = "identity", aes(fill = sentiment), show.legend = FALSE) +
geom_text(aes(label = n), vjust = -0.25) +
scale_fill_manual(values = c("#FFD1DC", "#D3D3D3", "#FFD700", "#98FB98", "#ADD8E6", "#FFA07A", "#E6E6FA", "#FFF8DC", "#FFDEAD", "#BDB2FF")) +
labs(title = "Sentiment Count") +
theme_minimal() +
theme(
plot.background = element_rect(fill = background_color),
panel.background = element_rect(fill = background_color),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank()
)
```
## Gráfico de barras con la frecuencia de emociones del léxico NRC.

## Frecuencia de emociones en la Declaración utilizando NRC.

## Wordcloud de la Declaración para tres emociones seleccionadas del NRC.

## 9. Visualización de bigramas con grafos
Se crean grafos para visualizar las conexiones entre bigramas:
``` r
library("igraph")
library("ggraph")
library("patchwork")
set.seed(1)
pastel_palette <- c("#f6c3ae", "#aad59e", "black")
background_color <- "#f6f6f6"
create_graph_plot <- function(graf, title, subtitle) {
g <- ggraph(graf, layout = "fr") +
geom_edge_link(arrow = arrow(length = unit(1, "mm")), color = pastel_palette[1]) +
geom_node_point(size = 4, color = pastel_palette[2]) +
geom_node_text(aes(label = name), color = pastel_palette[3], size = 4, family = "Lato") +
theme_void() +
theme(
plot.background = element_rect(fill = background_color),
plot.title = element_text(size = 14, family = "Lato"),
plot.subtitle = element_text(size = 10, family = "Lato")
) +
labs(title = title, subtitle = subtitle)
return(g)
}
bigram_graph <- bigramas_limpios %>%
filter(n > 2) %>%
graph_from_data_frame()
bigram_plot <- create_graph_plot(bigram_graph, "Bigram Network", "Connections between bigrams")
no_graph <- bigramas_no %>%
filter(n > 2) %>%
graph_from_data_frame()
no_plot <- create_graph_plot(no_graph, 'Bigram Network of "no"', "Connections with 'no' as the first word")
bigram_plot + no_plot
```

## Conclusión
En este proyecto, hemos llevado a cabo un análisis exhaustivo de un texto en R, utilizando una variedad de librerías para la tokenización, filtrado, visualización y análisis de sentimientos. Los principales puntos de interés incluyen:
**- Tokenización y Frecuencia:** Identificamos las palabras más frecuentes y analizamos la longitud de las oraciones.
**- Stopwords:** Eliminamos palabras vacías para obtener una representación más precisa del contenido significativo.
**- Visualización:** Utilizamos gráficos de barras y nubes de palabras para visualizar las palabras más frecuentes.
**- Análisis de Sentimientos:** Detectamos y visualizamos los sentimientos y emociones presentes en el texto.
**- N-gramas:** Exploramos las conexiones entre palabras mediante la tokenización en bigramas y trigramas y visualizamos estas conexiones mediante grafos.
Este análisis proporciona una comprensión más profunda del texto y destaca cómo R puede ser una herramienta poderosa para el análisis de texto. Las visualizaciones y el análisis de sentimientos, en particular, ofrecen valiosos insights sobre el contenido y la estructura emocional del texto.
El uso de librerías como tidyverse, ggplot2, wordcloud2, y igraph facilita la manipulación y visualización de datos, permitiendo una exploración más rica y detallada del texto.
¡Gracias por revisar este proyecto! Espero que encuentres útil y aplicable este enfoque para tus propios análisis de texto.