library(knitr)
library(readr)
library(plotly)

AnƔlisis de palabras en espaƱol para Wordle

El objetivo de este documento es mejorar en Wordle con mis amiguis.

Carga del diccionario empleado

# Carga de los datos 
# Importado de https://github.com/javierarce/palabras/blob/master/listado-general.txt
palabras <- read_csv("listado-general.txt", 
    col_names = FALSE)

Desarrollo de prototipos

Generación de una muestra para probar las funciones

# Creo un suconjunto de palabras
set.seed(1925)
n <- 100
ix <- sample(dim(palabras)[1],size=n)
subconjunto_palabras <- palabras[ix,1]

Filtrado de las palabras de cinco letras

Conteo de letras:

# Conteo de sĆ­labas:
longitud <- sapply(subconjunto_palabras$X1,FUN=nchar)

Filtrado de las palabras de cinco caracteres:

# Filtrado de palabras de cinco letras
k <- 5
palabras_k_letras <- subconjunto_palabras$X1[longitud==k]

Separación de la palabra en letras

A continuación se separan las palabras de \(k\) letras en las letras que la componen. La idea es representar la palabra como un vector de cinco componentes:

# Palabras con ciertas vocales
romper_palabra <- function(palabra){
  palabra_rota <- (strsplit(palabra, NULL)[[1]])
  return(palabra_rota)
}

# Prueba de escritorio
romper_palabra(palabras_k_letras[1])
## [1] "i" "r" "a" "n" "Ć­"

Ahora, el procedimiento anterior se aplica a todas las palabras de la muestra y se genera un dataframe que tiene \(k\) columnas (variables):

# Convierto las palabras de cinco letras en vectores de 
# cinco componentes
ruptura_palabras <- Map(romper_palabra,palabras_k_letras)

# Guardo los vectores en un dataframe
palabras_en_letras <- data.frame(t(sapply(ruptura_palabras,c)))

Generación de frecuencias

Ahora se analiza la distribución de frecuencias para cada posición de las palabras de \(k\) letras:

# AnƔlisis de frecuencias
frecuencias <- apply(palabras_en_letras,2,table)

AnƔlisis de frecuencias para las palabras de cinco letras

A continuación se analizan las frecuencias de las distintas letras en cada una de las posiciones de las palabras de cinco letras:

Remplazo de caracteres especiales:

limpieza_caracteres_especiales <- function(palabra){
  palabra <- gsub("Ć”","a",palabra)
  palabra <- gsub("Ć©","e",palabra)
  palabra <- gsub("Ć«","e",palabra)
  palabra <- gsub("Ć­","i",palabra)
  palabra <- gsub("ó","o",palabra)
  palabra <- gsub("Ćŗ","u",palabra)
  palabra <- gsub("ü","u",palabra)
  # palabra <- gsub(".","",palabra)
  return(palabra)
}

Frecuencia de letras por posición

# Cambio de mayĆŗsculas por minĆŗsculas:
palabras_minusculas <- sapply(palabras$X1,tolower)

# Conteo de letras de cada palabra:
longitud_todas <- sapply(palabras_minusculas,FUN=nchar)

# Filtrado de las palabras que tienen k letras:
palabras_k_letras <- palabras_minusculas[longitud_todas==k]

# Reemplazo de vocales con acentos por vocales sin acentos:
#
palabras_sin_caracteres_especiales <- vector(mode = "character",length = length(palabras_k_letras))
for (i in 1:length(palabras_k_letras)){
  palabras_sin_caracteres_especiales[i] <- limpieza_caracteres_especiales(palabras_k_letras[i])
}
palabras_sin_caracteres_especiales <- unique(palabras_sin_caracteres_especiales)
#

# Conversión de palabras en vectores de k componentes (una letra, un componeente):
ruptura_todas_palabras_k_letras <- Map(romper_palabra,palabras_sin_caracteres_especiales)

# Almacenamiento de las palabras en un dataframe de k variables
# donde cada palabra es una fila:
palabras_en_letras <- data.frame(t(sapply(ruptura_todas_palabras_k_letras,c)))

# CÔlculo de las frecuencias de aparición de cada letra en cada posición:
frecuencias <- apply(palabras_en_letras,2,table)

# Ordenamiento de las frecuencias de cada posición de mayor a menor:
frecuencias_ordenadas <- lapply(frecuencias,sort.list,decreasing=TRUE)

Primera posición:

plot_ly(
  x = names(frecuencias[[1]][frecuencias_ordenadas[[1]]]),
  y = frecuencias[[1]][frecuencias_ordenadas[[1]]],
  name = "Frecuencia primera posición",
  type = "bar"
) |>
  layout(xaxis = list(categoryorder = "total descending"),
         title = "Frecuencias primera posición") -> fig1

fig1

Segunda posición:

plot_ly(
  x = names(frecuencias[[2]][frecuencias_ordenadas[[2]]]),
  y = frecuencias[[2]][frecuencias_ordenadas[[2]]],
  name = "Frecuencia segunda posición",
  type = "bar"
) |>
  layout(xaxis = list(categoryorder = "total descending"),
         title = "Frecuencias segunda posición") -> fig2

fig2

Tercera posición:

plot_ly(
  x = names(frecuencias[[3]][frecuencias_ordenadas[[3]]]),
  y = frecuencias[[3]][frecuencias_ordenadas[[3]]],
  name = "Frecuencia tercera posición",
  type = "bar"
) |>
  layout(xaxis = list(categoryorder = "total descending"),
         title = "Frecuencias tercera posición") -> fig3

fig3

Cuarta posición:

plot_ly(
  x = names(frecuencias[[4]][frecuencias_ordenadas[[4]]]),
  y = frecuencias[[4]][frecuencias_ordenadas[[4]]],
  name = "Frecuencia cuarta posición",
  type = "bar"
) |>
  layout(xaxis = list(categoryorder = "total descending"),
         title = "Frecuencias cuarta posición") -> fig4

fig4

Quinta posición:

plot_ly(
  x = names(frecuencias[[5]][frecuencias_ordenadas[[5]]]),
  y = frecuencias[[5]][frecuencias_ordenadas[[5]]],
  name = "Frecuencia quinta posición",
  type = "bar"
) |>
  layout(xaxis = list(categoryorder = "total descending"),
         title = "Frecuencias quinta posición") -> fig5

fig5

Palabras con mƔs vocales

# Conteo de vocales en las palabras
conteo_vocales <- function(palabra){
  cant_vocales <- sum(palabra %in% c("a","e","i","o","u"))
  return(cant_vocales)
}

# Conteo de vocales Ćŗnicas en las palabras
conteo_vocales_unicas <- function(palabra){
  cant_vocales <- sum(unique(palabra) %in% c("a","e","i","o","u"))
  return(cant_vocales)
}

Frecuencia de la cantidad de vocales en las palabras:

cantidad_vocales <- apply(palabras_en_letras,1,FUN=conteo_vocales)
print(table(cantidad_vocales))
## cantidad_vocales
##    0    1    2    3    4 
##    1   32 3204 1505   13

Frecuencia de la cantidad de vocales Ćŗnicas en las palabras:

cantidad_vocales_unicas <- apply(palabras_en_letras,1,FUN=conteo_vocales_unicas)
print(table(cantidad_vocales_unicas))
## cantidad_vocales_unicas
##    0    1    2    3    4 
##    1  836 3070  842    6

Palabras con cuatro vocales Ćŗnicas:

row.names(palabras_en_letras[cantidad_vocales_unicas==4,])
## [1] "aguio" "aireo" "aqueo" "audio" "acueo" "aureo"

Con este listado se puede maximizar la probabilidad de encontrar cuƔles vocales hacen parte de la palabra del dƭa.

Prueba

La prueba se harĆ” con la palabra del 15 de febrero de 2022.

Se prueba con la palabra ā€œAIREOā€:

imagen de prueba

condicion <- palabras_en_letras[,2]=="i" &
  !(palabras_en_letras[,1] %in% c("a","r")) & 
  !(palabras_en_letras[,3] %in% c("a","r")) & 
  !(palabras_en_letras[,4] %in% c("a","r","e")) & 
  !(palabras_en_letras[,5] %in% c("a","r","o")) &
  ("o" == palabras_en_letras[,1] |  "o" == palabras_en_letras[,3] | "o" == palabras_en_letras[,4]) &
  ("e" == palabras_en_letras[,1] |  "e" == palabras_en_letras[,3] | "e" == palabras_en_letras[,5])
palabras_filtradas <- palabras_en_letras[condicion,]

Palabras obtenidas:

print(palabras_filtradas)
##       X1 X2 X3 X4 X5
## jiote  j  i  o  t  e
## miope  m  i  o  p  e
## oible  o  i  b  l  e

imagen de resultado

Fin