Nube de palabras: 2da vuelta

Autor: Jorge L. C. Musaja

Mayo 2021


1 Introducción

El presente documento tiene por objetivo brindar un resumen rápido y dinámico de los planes de gobierno de los dos partidos políticos inmmersos en la 2da vuelta electoral para la Presidencia en Perú 2021.

Para lograr el objetivo mencionado, se elaborarán nubes de palabras con el contenido de los planes de gobierno de ambos partidos políticos.

Las nubes de palabras permiten realizar una representación visual de las palabras que conforman un texto, donde las palabras que aparecen con más frecuencia vienen representadas con textos de mayor tamaño.

Empezaremos por el plan de gobierno del partido político “Fuerza Popular”.

2 Importar texto

Se importa el PDF del plan de gobierno directamente de la publicación en el diario oficial “El Peruano”

library(pdftools)

text <- pdf_text(
  "https://apisije-e.jne.gob.pe/TRAMITE/ESCRITO/1095/ARCHIVO/FIRMADO/3017.PDF")
text <- iconv(text, to="latin1")

3 Reemplazar texto

Es normal que en la redacción de los documentos se usen múltiples sinónimos que, como la definición de sinónimos indica, son palabras con el mismo contenido semántico. Por ello, conviene efectuar un reemplazo de palabras.

text <- gsub("público", "pública", text)
text <- gsub("públicas", "pública", text)
text <- gsub("políticas", "política", text)
text <- gsub("sistemas", "sistema", text)
text <- gsub("ciudadana", "ciudadano", text)
text <- gsub("ciudadanos", "ciudadano", text)
text <- gsub("gobiernos", "gobierno", text)
text <- gsub("ambientales", "ambiental", text)
text <- gsub("ambiente", "ambiental", text)
text <- gsub("cultural", "cultura", text)
text <- gsub("servicios", "servicio", text)
text <- gsub("sociales", "social", text)
text <- gsub("mejora", "mejor", text)
text <- gsub("ciudades", "ciudad", text)
text <- gsub("peruanas", "peruano", text)
text <- gsub("peruana", "peruano", text)
text <- gsub("peruanos", "peruano", text)
text <- gsub("todas", "todos", text)

4 Elaboración del corpus

library(tm)

corpus <- Corpus(VectorSource(text))
d <- corpus

d <- tm_map(d, tolower) #cambio a minúsculas
d <- tm_map(d, stripWhitespace) #eliminar espacios en blanco
d <- tm_map(d, removePunctuation) #eliminar signos de puntuación
d <- tm_map(d, removeNumbers) #eliminar números

5 Eliminación de stopwords

Los stopwords son las palabras que por sí solas no guardan un significado. Son comunmente los artículos, pronombres, preposiciones y adverbios. No significa que carezcan de importancia, pero sí es necesario eliminarlas del corpus.

lista_remover <- c('maría','ello','así','cada','hace','hacia','vez',
                   'través','sino','dentro','asimismo','mediante',
                   'además') #lista personalizada de stopwords
d <- tm_map(d, removeWords, c(stopwords("spanish"), lista_remover))

6 Matriz de términos

m <- as.matrix(TermDocumentMatrix(d))
v <- sort(rowSums(m), decreasing=TRUE)
df <- data.frame(word=names(v), freq=v)

7 Revisión de frecuencias

Este paso no es necesario, pero es útil para identificar si la frecuencia de términos es la esperada.

library(tidyverse)

df[1:20,] %>% 
  ggplot() +
  aes(freq, y=reorder(word,freq)) +
  geom_bar(stat="identity", color="white", fill="midnightblue") +
  geom_text(aes(label=freq, hjust=1.5), color="white") +
  labs(
    x = NULL,
    y = "Palabras más frecuentes"
  )

8 Nube de palabras

Una vez elaborada la nube de palabras, si el usuario posiciona el puntero del mouse encima de alguna de las palabras podrá observar que debajo de ella aparecerá un texto indicando la frecuencia de la palabra señalada con el puntero.

9 Función corpus

Es conveniente elaborar una función que facilite la tarea de elaboración de nubes de palabras, pues como se verá, en el caso de “Perú Libre”, este partido político tiene un plan de gobierno presentado de forma oficial ante el JNE y tiene un nuevo plan presentado en fecha 16/May/2021.

library(pdftools)
library(tm)
library(wordcloud2)

makeCorpus <- function(url){
  text <- pdf_text(url)
  text <- iconv(text, to="latin1")
  
  text <- gsub("público", "pública", text)
  text <- gsub("públicas", "pública", text)
  text <- gsub("políticas", "política", text)
  text <- gsub("sistemas", "sistema", text)
  text <- gsub("ciudadana", "ciudadano", text)
  text <- gsub("ciudadanos", "ciudadano", text)
  text <- gsub("gobiernos", "gobierno", text)
  text <- gsub("ambientales", "ambiental", text)
  text <- gsub("ambiente", "ambiental", text)
  text <- gsub("cultural", "cultura", text)
  text <- gsub("servicios", "servicio", text)
  text <- gsub("sociales", "social", text)
  text <- gsub("mejora", "mejor", text)
  text <- gsub("ciudades", "ciudad", text)
  text <- gsub("peruanas", "peruano", text)
  text <- gsub("peruana", "peruano", text)
  text <- gsub("peruanos", "peruano", text)
  text <- gsub("todas", "todos", text)
  
  corpus <- Corpus(VectorSource(text))
  d <- corpus
  
  d <- tm_map(d, tolower)
  d <- tm_map(d, stripWhitespace)
  d <- tm_map(d, removePunctuation)
  d <- tm_map(d, removeNumbers)
  
  lista_remover <- c('maría','ello','así','cada','hace','hacia','vez',
                   'través','sino','dentro','asimismo','mediante',
                   'además') 
  d <- tm_map(d, removeWords, c(stopwords("spanish"), lista_remover))
  
  m <- as.matrix(TermDocumentMatrix(d))
  v <- sort(rowSums(m), decreasing=TRUE)
  df <- data.frame(word=names(v), freq=v)
  
  return(df)
} 

10 Aplicación de la función makeCorpus

Aplicaremos la función creada en el paso anterior para obtener la nube de palabras de los 2 planes de gobierno del partido político “Perú Libre”.

10.1 Perú Libre

10.1.1 Perú Libre: Plan de 1ra vuelta presentado ante el JNE

df <- makeCorpus(
  "https://apisije-e.jne.gob.pe/TRAMITE/ESCRITO/2108/ARCHIVO/FIRMADO/9716.PDF")
cat(paste0("Nube de ",sum(df$freq)," palabras."))
## Nube de 9252 palabras.
wordcloud2(df, size=0.75, backgroundColor="black",
           color='random-light', shuffle=F)

10.1.2 Perú Libre: Plan de 2da vuelta presentado el 16/May/2021

df <- makeCorpus(
  "http://perulibre.pe/plan-bicentenario.pdf")
cat(paste0("Nube de ",sum(df$freq)," palabras."))
## Nube de 689 palabras.
wordcloud2(df, size=0.75, backgroundColor="black",
           color='random-light', shuffle=F)