#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

  1. PATRÓN - Final de un string
  1. PATRÓN - Cualquier caracter sencillo
  1. PATRÓN - punto literal, gorrito o signo de pesos
  1. PATRÓN - atrapar todas las letras en mayúsculas
  1. PATRÓN - signos de puntuación (puntos, coma, signos de pregunta, paréntesis)
  1. PATRÓN - PUNTO
  1. PATRÓN - atrapar un valor exacto o una palabra extacta
  1. PATRÓN - agrupar distintos signos que quiero atrapar
  1. Patrón o este patrón (varios en uno), por ejemplo que atrape CDMX y Ciudad de México.
  1. PATRÓN - opcional - cuando puede o puede no aparecer cierto elemento del texto y de esta forma atrapa la cosa opciones que podría aparecer.
  1. PATRÓN - CERO O MÁS. Cuando algo aparece cero o más de una vez
  1. PATRÓN - UNA O MÁS - cuando te atrapa todas las veces que se repite ese patrón
  1. PATRÓN - Entre n y m veces
  1. CHAR_CLASS
  1. PIPA REBUS %R% – sirve para concatenar objetos rebus, para poder armar patrones compuestos. Es el pegamento que te va a permitir pegar los distintos componentes del patrón

Ejemplo 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

  1. PROBAR INTENTOS

Hay que tener cuidado con los siguiente símbolos cuando estamos generando expresiones regulares

  1. Paréntesis ()
  2. Corchetes
  3. Gorritos
  4. Símbolos de moneda $
  5. Guiones _, -
  6. Símbolo de Más +
  7. Símbolo de interrogación ?

Ejemplos

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)