2
1

Me gustaría que me ayudáseis a ganar al juego del ahorcado. Con R, por supuesto.

La primera pregunta es: ¿con qué letras debería comenzar? (Dicho de otra manera, ¿qué letras son las más frecuentes en español?).

La segunda pregunta tiene que ver con el hecho de que, casi seguro, las letras con las que comenzar dependen del número de letras total de la palabra que tengo que acertar. Por ejemplo, si la palabra oculta tiene 7 letras, ¿con cuáles debería comenzar? ¿Y para cada número de letras entre, p.e., 3 y 15? (Dicho de otra manera, ¿qué letras son las más frecuentes en español dentro de aquellas palabras de longitud n?).

Nota: Usad el texto del Quijote como diccionario.

preguntado 19 Jun '12, 19:52

gilbellosta's gravatar image

gilbellosta ♦♦
2.2k112
accept rate: 37%

Complicaillo

(19 Jun '12, 20:52) joscani

Pues he tenido que buscar un poco, (utilizando rseek) .Se puede hacer con la función iconv

letras <- iconv(letras, to="ASCII//TRANSLIT") 
(tabla <- table(letras))
    <<     >>             -      ,      ;      :      !      ?      /      .      ' 
    57    290 355901   7109  40321   4802   2067    691   2601     26   8429    712 
     "      (      )      [      ]      @      $      *      #      %      0      1 
   188     81     81      1      2      2      2     28      1      1     35     66 
     2      3      4      5      6      7      8      9      A      B      C      D 
    16     13     11     13     11      8     11     12 201514  24427  60044  87776 
     E      F      G      H      I      J      K      L      M      N      O      P 
231036   7967  17639  20436  91198  10627    133  89630  45024 113731 163862  35914 
     Q      R      S      T      U      V      W      X      Y      Z 
 32501 102124 126489  63281  80083  17975    272    407  25443   6493
enlace permanente

respondido 20 Jun '12, 21:07

joscani's gravatar image

joscani
3386
accept rate: 15%

editó 20 Jun '12, 21:46

Yo no me habría complicado tanto la vida: sobre letras, habría hecho cosas del tipo letras[ letras == "Á" ] <- "A", etc. y luego contar con table. ¿Lo ves más sencillo así?

(21 Jun '12, 13:13) gilbellosta ♦♦

Buenas, pues es muy parecido al del quijote, he añadido alguna mejora más, pero la ídea básica es la misma.

Mejoras:

  • He añadido la "ñ" para controlarla
  • Quito los acentos porque para jugar al ahorcado no me hacen falta

He creado una función que me lista en orden decreciente las letras, así que la primera es la más probable.

Mis resultados para distintas longitudes (me asusta el resultado para 1):

> orderdic(21)

n e i a t b c d m o 
5 4 3 2 2 1 1 1 1 1 
> orderdic(10)

   e    a    o    r    n    i    s    d    c    l    t    m    u    b    p    g 
9799 9468 6339 6174 5990 5835 5800 4194 4019 3674 3587 2191 1679 1543 1322 1002 
   v    f    h    j    z    q    ñ    x    y    w 
 698  606  488  291  287  208   92   49   49    6 
> orderdic(1)

    y     a     o     e     f     s     b     g     r     c     u     x     d 
18189  9882  1213    97    12    12    11     8     8     7     3     3     2 
    i     l     v     z     j 
    2     2     2     2     1

El código:

quijote <- readLines( "http://www.gutenberg.org/cache/epub/2000/pg2000.txt", encoding = "UTF-8" )

completequijote <- tolower(paste(quijote,collapse=" "))

textonlywords <- gsub("([^a-záéíóúñ]+)([a-záéíóúñ]+)"," \\2",completequijote)
textonlywords <- gsub("[^a-záéíóúñ]+$","",textonlywords)

textonlywordsnoaccents <- gsub("á","a",textonlywords)
textonlywordsnoaccents <- gsub("é","e",textonlywordsnoaccents)
textonlywordsnoaccents <- gsub("í","i",textonlywordsnoaccents)
textonlywordsnoaccents <- gsub("ó","o",textonlywordsnoaccents)
textonlywordsnoaccents <- gsub("ú","u",textonlywordsnoaccents)

listwordsnoaccent <-strsplit (textonlywordsnoaccents," ")

orderdic<-function(len) 
{
palabraslen<-listwordsnoaccent[[1]][which(nchar(listwordsnoaccent[[1]])==len)]
tablepalabraslen<-table(strsplit((paste(palabraslen,collapse="",sep="")),NULL)[[1]])
ordertable<-tablepalabraslen[order(tablepalabraslen,decreasing=T)]
return (ordertable)
}
enlace permanente

respondido 04 Jul '12, 19:49

alvarord's gravatar image

alvarord
423
accept rate: 0%

Ahí va. Seguro que se puede hacer mejor, pero no se me ha ocurrido otra forma.

#Letras más frecuentes en quijote
quijote <- readLines( "http://www.gutenberg.org/cache/epub/2000/pg2000.txt", encoding = "UTF-8" )
letras <- strsplit(quijote,"") # 
letras <- unlist(letras)
letras <- data.frame(letras)
names(letras) <- c("V1")

letras$V1 <- gsub("[[:space:]]","",letras$V1)
letras$V1 <- gsub("[[:digit:]]","",letras$V1)
letras$V1 <- gsub("[[:punct:]]","",letras$V1)
letras$V1 <- toupper(letras$V1)
tabla <- table(letras$V1)
tabla[order(tabla,decreasing=T)[1:5]]
         E      A      O      S 
423589 223827 194365 154709 126489

Y ahora por tamaño de palabra.

quijote.tmp <- strsplit(quijote," ")
quijote.tmp <- unlist(quijote.tmp)

quijote <- data.frame(quijote.tmp)
names(quijote) <- c("V1")

quijote$V1 <- gsub("[[:space:]]","",quijote$V1)
quijote$V1 <- gsub("[[:digit:]]","",quijote$V1)
quijote$V1 <- gsub("[[:punct:]]","",quijote$V1)

quijote$V1 <- toupper(quijote$V1)
quijote$largo <- nchar(as.character(quijote$V1)) # tamaño de palabra

# con tapply hago una tabla para cada tamaño de palabra 
agrupado <- tapply(quijote$V1,as.factor(quijote$largo),table)
agrupado <- as.list(agrupado)
(max.una.letra <- which.max(agrupado[[2]]))
agrupado.masdeuna <- agrupado[-c(1,2)]        
Y 
14

letra <- character()
prueba <- agrupado.masdeuna

for (i in 1:length(prueba)){
  x <- strsplit(names(prueba[i][[1]]),"") # para cada tabla divido las palabras en letras
  xx <- rep(x,prueba[i][[1]]) # repito cada letra según la frecuencia de cada palabra
  xxx <- table(unlist(xx)) # tabla de frecuencias de cada letra para cada i
  letra[i] <- names(which.max(xxx)) # almaceno la letra más comun
}
letras.comunes <- c(names(max.una.letra),letra)
tam.letra <- c(1,names(agrupado.masdeuna))
resultado <- data.frame(tam.letra,letras.comunes)
resultado
   tam.letra letras.comunes
1          1              Y
2          2              E
3          3              E
4          4              O
5          5              A
6          6              A
7          7              A
8          8              A
9          9              E
10        10              E
11        11              E
12        12              E
13        13              E
14        14              E
15        15              E
16        16              E
17        17              E
18        18              A
19        19              E
20        21              N
21        23              T

Me acabo de dar cuenta de que en el for he repetido cada letra según la frecuencia de cada palabra en el quijote. Estaría bien si las palabras se tomaran "aleatoriamente" del libro.. ¿cómo se podría corregir y convertirlo todo en una función?

enlace permanente

respondido 19 Jun '12, 22:28

joscani's gravatar image

joscani
3386
accept rate: 15%

1

Comentarios a la primera parte:

  1. ¿Realmente necesitas convertir "letras" en un df? Creo que es más simple mantenerlo como vector.

  2. Nada más crear "letras" (como una sucesión de caracteres), prueba a hacerle un table. ¿Qué ves?

  3. ¿Puedes filtrar las cosas que no quieres ver en "letras" sin pasar por expresiones regulares? (Realmente no necesitas gsub).

(20 Jun '12, 18:13) gilbellosta ♦♦
  1. Cierto, si después de letras <- unlist(letras) hago un 'table' me sale la tabla de frecuencias ,dónde en primer lugar me salen los espacios y signos de puntuación. ¿Cómo puedo hacer para que tome igual A que Á ?
(20 Jun '12, 19:28) joscani

¡Justo ahí te quería llevar!

(20 Jun '12, 19:32) gilbellosta ♦♦

pues ahí me pillas.. no caigo.. le doy una pensada

(20 Jun '12, 19:35) joscani

Pues he tenido que buscar un poco, (utilizando rseek) .Se puede hacer con la función iconv

letras <- iconv(letras, to="ASCII//TRANSLIT") (tabla <- table(letras)[-c(1:12)])

(20 Jun '12, 21:05) joscani
Tu respuesta
Activar/desactivar vista previa

Seguir esta pregunta

Por Email:

Una vez que entres podrás suscribirte desde aquí para recibir actualizaciones

Por RSS:

Respuestas

Respuestas y Comentarios

Trucos del editor

  • *cursiva* o _cursiva_
  • **negrita** o __negrita__
  • enlace:[texto](http://url.com/ "Pregunta")
  • imagen?![alt texto](/path/img.jpg "Pregunta")
  • lista numerada: 1. Foo 2. Bar
  • Para añadir un salto de línea simplemente añade dos espacios donde desearías que estuviera el salto de línea.
  • se permite código HTML básico

Etiquetas de la pregunta:

×30
×21
×6
×1

pregunta realizada: 19 Jun '12, 19:52

pregunta vista: 469 veces

última modificación: 04 Jul '12, 19:49

powered by OSQA