#Rebus
Notas_iniciales * regex sirve para la detección de patrones de expresiones regulares * Las regex o expresiones regulares son secuencias de caracteres (cadenas de texto) para definir un patrón de búsqueda * patrones que van a haecer que cualquier información que entre se identifique con el patrón y se puedan clasificar. * Van a formar el molde y luego cacha y clasifica. * En R el paquete rebus permite manejar las cadenas de texto de manera más sencilla
Comandos básicos 1. PATRÓN - Inicio de un string o cadena de texto * Expresión regular ^ * Objeto rebus START
char_class("aouhgt") - así le metes
todo a la bolsa de lo que quieras atraparEjemplo
START %R% WRD %R% DGT %R% capture(one_or_more(SPC)) %R% END
Esto de arriba quiere decir: Al inicio del renglón + una letra + luego atrapa un dígito + uno o varios espacios + final del string
Hay que tener cuidado con los siguiente símbolos cuando estamos generando expresiones regulares
\\(" Con esto tu quieres buscar un
texto que empiece con paréntesis.library(rebus)
library(stringr)
library(tidyverse)
library(readxl)
library(htmltools)
#generamos un string
x <- c("cat", "scotland", "camion")
#quiero detectar un patrón
str_view(x, pattern = START %R% "c")
#Como se puede observar, lo que hice fue decirle busca el inicio de la línea + y después remarca las palabras que comiencen con la letra "c"
## Including Plots
str_view(x, pattern = "at" %R% END)
#Como se puede ver aquí, lo que pasó es que me muestra la palabra que termina con "at"
str_view(x, pattern = ANY_CHAR %R% "t") #cualquier caracter y la letra "t"
str_view(x, pattern = ANY_CHAR %R% ANY_CHAR %R% ANY_CHAR %R% END) #selecciona los primeros 3 caracteres
Ejercicios
# Nombres ----
str1 <- "Helios y Carlos y Ramiro y Juvenal son mis amigos"
# 1. Genera, con Rebus, una expresión regular para extraer los nombres de los programadores.
exp_1 <- or1(c("Helios", "Carlos" , "Ramiro")) #para detectar los nombres
exp_1 <- UPPER %R% one_or_more(WRD) #captura todas las mayúsculas y después captura todas las letras de esas palabras
str_view_all(str1, exp_1)
# Numeros ---
# Dada la siguiente tabla:
numeros <- tribble(~Ladas, #tribble sirve para generar tablas o tibbles, la "~" nos da el nombre de la columna que voy a usar
"(595)",
"735",
"555-7771234",
"891",
"lada: 443"
)
# 1. Genere una regex en rebus que capture la palabra "lada:"
pat <- "lada:"
str_view(numeros$Ladas, pattern = pat)
# 2. Genere una regex que capture todos los numeros contenidos entre paréntesis.
pat <- "\\(" %R% one_or_more(DGT) %R% "\\)" #recuerda escaparlos con las rayitas
str_view(numeros$Ladas, pattern = pat)
# 3. Genere una regex que capture los tres primeros digitos de cada string (si no inicia con digitos, no la captures).
pat <- START %R% DGT %R% DGT %R% DGT #DGT es un objeto que almacena todos los numeros que van del 0 al 9
pat <- START %R% repeated(DGT, 3) # Alternativa, esto es más eficiente
str_view(numeros$Ladas, pattern = pat)
# 4. Genere una rebus que capture el guión y los todos los numeros que van a la derecha del guión.
pat <- "\\-" %R% one_or_more(DGT)
str_view(numeros$Ladas, pattern = pat)
# Titulos ----
nombres <- tribble(~Diputados, #Nota: estos nombres son inventados
"Diputado Helios García",
"Diputado Pancho López",
"Diputada Laura Juárez",
"Diputada Aracely Segura",
"Diputade Ío Salvatore")
# Genere una regex en rebus que capture la palabra "Diputad"
pat <- "Diputad"
str_view(nombres$Diputados, pattern = pat)
# Complemente el regex para que capture todas las palabras que inician con "Diputad" + una letra
pat <- "Diputad" %R% WRD
str_view(nombres$Diputados, pattern = pat)
# Genere una regex que capture el apellido de todos los diputados. Coloquelo en una columna llamada "Apellidos" usando str_extract()
pat <- one_or_more(WRD) %R% END #captura todas las letras que van pegadas al final
str_view(nombres$Diputados, pattern = pat)
str_extract(nombres$Diputados, pattern = pat) #extraes un vector con todos los apellidos
## [1] "García" "López" "Juárez" "Segura" "Salvatore"
nombres$Apellidos <- str_extract(nombres$Diputados, pattern = pat)
# Genere una regex que capture el nombre de todos los diputados. Guarde los nombres en una columna llamada "Nombres", usando str_extract()
pat <- SPC %R% one_or_more(WRD) %R% SPC #no te puedes anclar del inicio ni del final, entontes te vas a anclar del espacio SPC. Busca donde hay un espacio, donde hay palabra y luego espacio
str_view(nombres$Diputados, pattern = pat)
str_extract(nombres$Diputados, pattern = pat)
## [1] " Helios " " Pancho " " Laura " " Aracely " " Ío "
# Mas sofisticado
str_extract(nombres$Diputados, pattern = pat) %>%
str_remove_all(pattern = SPC) #Extraje los nombres que están en medio y después limpialo quitando los espacios
## [1] "Helios" "Pancho" "Laura" "Aracely" "Ío"
# Fechas ----
fechas <- tribble(~Fechas,
"01-01-2001",
"Primero de Enero del 2001",
"01/01/2001",
"01 01 2001",
"01@01@2001",
"01_01_2001",
"01-Ene-2001")
# 1. Genere un regex en rebus que detecte las palabras de y del, y los espacios que tienen a la derecha y a la izquierda...
pat <- SPC %R% or1(c("de", "del")) %R% SPC #busca un espacio, luego busca la palabra de o del y luego busca otro espacio.
str_view_all(fechas$Fechas,
pattern = pat)
fechas$Fechas <- str_replace_all(fechas$Fechas,
pattern = pat,
replacement = "-")
# 2. Genere un regex en rebus que detecte tanto guiones, cono diagonales, como espacios en Blanco y las arrobas.
pat <- or1(c(char_class("-/@_"), SPC))
str_view_all(fechas$Fechas,
pattern = pat)
fechas$Fechas <- str_replace_all(fechas$Fechas,
pattern = pat,
replacement = "-") #quieres que todos los símbolos se remplacen por un guion
fechas$Fechas
## [1] "01-01-2001" "Primero-Enero-2001" "01-01-2001"
## [4] "01-01-2001" "01-01-2001" "01-01-2001"
## [7] "01-Ene-2001"
# 3. Iguale todas las fechas al formato %dd-%mm-%YYYY.
str_replace_all(fechas$Fechas, c("Primero" = "01", #primer argumento es la palabra que quiero que sustituya, la segunda es la que quiero que ponga
"Enero" = "01",
"Ene" = "01")) #o sea debes seguir el orden en el que va la cadena de texto,como primero está "Primero", por eso lo cambias antes
## [1] "01-01-2001" "01-01-2001" "01-01-2001" "01-01-2001" "01-01-2001"
## [6] "01-01-2001" "01-01-2001"
# Recuerden que el orden importa! Cambia el orden de las ultimas dos para que veas que pasa!
#con as.date ya lo pones con el formato de fecha
# Estados ----
edos <- c("Mexico",
"Ciudad de Mexico",
"Coahuila De Zaragoza",
"Veracruz De Ignacio De La Llave")
# Genere una regex en rebus que Capture la primera Palabra (Para practicar)
pat <- START %R% one_or_more(WRD) #si solo pones WRD es para letras, no tanto para palabras. Entonces si solo pones WRD solo te agarra la primera letra
str_view(edos, pattern = pat)
# Genere una regex en rebus que Capture la palabra "De"
pat <- "De"
# ¿Cual es la diferencia entre estas dos?
str_view(edos, pattern = pat)
str_view_all(edos, pattern = pat)
edos <- str_replace_all(edos, pattern = pat, replacement = "de")
edos
## [1] "Mexico" "Ciudad de Mexico"
## [3] "Coahuila de Zaragoza" "Veracruz de Ignacio de La Llave"
# Genere una regex en rebus que Capture la palabra "La"
pat <- "La"
edos <- str_replace(edos, pattern = pat, replacement = "la")
edos
## [1] "Mexico" "Ciudad de Mexico"
## [3] "Coahuila de Zaragoza" "Veracruz de Ignacio de la Llave"
# Genere una regex en rebus que Capture exactamente la palabra "Mexico"
pat_2 <- exactly("Mexico")
str_view(edos, pattern = pat_2)
edos <- str_replace_all(edos, pattern = pat_2,
replacement = "Estado de México")
# Reemplace los nombres de los estados por un nombre más adecuado....
diccionario_de_reemplazo <- c("Coahuila de Zaragoza" = "Coahuila",
"Veracruz de Ignacio de la Llave" = "Veracruz",
"Ciudad de Mexico" = "Ciudad de México")
edos <- str_replace_all(edos, diccionario_de_reemplazo)
edos
## [1] "Estado de México" "Ciudad de México" "Coahuila" "Veracruz"
# Tweets ----
library(readxl)
bd_tweets <- readxl::read_xlsx("tweets_santa_lucia.xlsx")
# Quien ha tuiteado mas?
bd_tweets %>%
group_by(screen_name) %>%
count() %>%
arrange(-n) %>%
print(n = 30)
## # A tibble: 8,214 × 2
## # Groups: screen_name [8,214]
## screen_name n
## <chr> <int>
## 1 Santa_lucia_305 647
## 2 institutoclima 124
## 3 MCorrecta 57
## 4 Reforma 33
## 5 SantaLuciaDigit 33
## 6 arturot15641801 28
## 7 AlejandroAsat 26
## 8 skr_moru1335 22
## 9 jose_ville1 21
## 10 lopezdoriga 21
## 11 netoro5 19
## 12 ZTSAnalytics 19
## 13 JaimeDiablo_ 18
## 14 Milenio 18
## 15 TabascoHOY 18
## 16 alCsarloqueesd1 16
## 17 michellealex205 16
## 18 Reporte_Indigo 16
## 19 politicomx 14
## 20 RicardoAlemanMx 14
## 21 ___koara__o 13
## 22 AMXNoticias 13
## 23 atlazolpacity 13
## 24 lado_mx 13
## 25 Morelosjai_alai 13
## 26 QuintanaRooHoy1 13
## 27 247_hika 12
## 28 aoyui__ 12
## 29 AXL__tw 12
## 30 CoapaToon 12
## # … with 8,184 more rows
# Convierte el texto dentro de la columna "text" a minusculas
bd_tweets$text <- str_to_lower(bd_tweets$text)
# Genera un regex en rebus que capture la palabra "amlo" y "lopezobrador"
regex_presidente <- or1(c("amlo", "lopezobrador"))
tweets_presidente <- bd_tweets %>%
mutate(mencion.presidente =
str_detect(text, pattern = regex_presidente)) %>%
filter(mencion.presidente == TRUE) %>%
select(screen_name, text)
# Genera un regex en rebus que capture los hashtags
regex_hashtag <- "\\#" %R% one_or_more(WRD)
str_view_all(bd_tweets$text,
pattern = regex_hashtag,
match = TRUE)
# Genera un regex en rebus que detecte cuando un
# usuario tenga en su nombre más de un número o más de un sìmbolo de guion bajo.
regex_bot <- or1(c(repeated("_", 4),repeated(DGT, 4) )) #se va a dejar con 4 números, esto tu lo defines
str_view_all(bd_tweets$screen_name,
pattern = regex_bot,
match = TRUE)
# Genere una regex en rebus que detecte las siguientes dos
# palabras después de "aeropuerto de santa lucía"
regex_aeropuerto <- "aeropuerto de santa lucía" %R%
SPC %R% repeated(capture(one_or_more(WRD) %R%
optional(PUNCT) %R%
SPC), 5) #el cinco es cuantas veces quieres repetirlo
# Este lo modifique de la clase :P
# Checamos los tweets
str_view_all(bd_tweets$text,
pattern = regex_aeropuerto,
match = TRUE)
# Extraigo las 5 palabras
cinco_palabras <- bd_tweets %>%
transmute(cinco_palabras = str_extract(text, regex_aeropuerto)) %>%
filter(!is.na(cinco_palabras)) %>%
mutate(cinco_palabras = str_squish(cinco_palabras)) %>%
mutate(cinco_palabras = str_remove_all(cinco_palabras, pattern = PUNCT)) %>%
mutate(cinco_palabras = str_replace(string = cinco_palabras,
pattern = "aeropuerto de santa lucía",
replacement = "aeropuerto_de_santa_lucía")) %>%
tidyr::separate(col = cinco_palabras, #hace una columna por palabra
into = c("Santa Lucía",
"Palabra_1",
"Palabra_2",
"Palabra_3",
"Palabra_4",
"Palabra_5"),
sep = SPC)