Texto

¿De qué matriz son los "embeddings" una factorización?

Hoy, embeddings. Esto va de reducir la dimensionalidad de un espacio generado por palabras (procedentes de textos). Si a cada palabra le asignamos un vector índice (todo ceros y un uno donde le corresponde), la dimensión del espacio de palabras es excesiva.

La ocurrencia de algunos es asociar a cada palabra, $latex W_i$, un vector $latex w_i$ corto (p.e., 100) con entradas $latex w_{ij}$ a determinar de la manera que se explica a continuación.

Dónde están las letras

Inspirado en esto construí

usando como texto el Quijote y como código una versión mucho más simple y limpia que (aunque inspirado en) la del enlace original:

library(stringr)
library(plyr)
library(ggplot2)

raw <- readLines("http://www.gutenberg.org/cache/epub/2000/pg2000.txt")

# limpieza de encabezamientos
textfile <- raw[-(1:36)]
textfile <- text[1:which(text == "Fin")]

# en una única cadena
textfile <- paste(textfile, collapse= " ")

# limpieza
textfile <- str_to_lower(textfile)
textfile <- str_replace_all(textfile, "[[:punct:]]|[[:digit:]]", " ")

# selección de palabras
words <- unique(unlist(str_split(textfile, " ")))
words <- words[words != ""]

# recolección de estadísticas
res <- ldply(words, function(word){
  tmp <- str_split(word, "")[[1]]
  data.frame(word = word,
              letra = tmp,
              posicion = 1:length(tmp) / length(tmp),
              stringsAsFactors = FALSE)
})

tmp <- table(res$letra)
tmp <- names(tmp[tmp > 10])
res <- res[res$letra %in% tmp,]

ggplot(res, aes(x = posicion)) +
  geom_density(fill = "red") +
  facet_wrap( ~ letra, scales = "free_y") +
  ggtitle("Dónde aparece cada letra dentro de un texto (El Quijote)") +
  ylab("proporción de aparicion") + xlab("% de la longitud de la palabra") +
  scale_fill_brewer(palette = "Set1") + theme_minimal() +
  theme(axis.ticks = element_blank(),
        axis.text.y = element_blank(),
        axis.text.x = element_blank(),
        legend.position = "none",
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank())

Cortar una cadena por un caracter solo cuando no forme parte de una subcadena entrecomillada

R

Algunos usuarios del paquete pxR han avisado de un error de implementación. Según las especificaciones del formato de datos PC-Axis, las líneas de ese tipo de ficheros acaban en punto y coma (y no necesariamente en un salto de línea).

Así que era natural leer los ficheros íntegramente, concatenar sus líneas físicas y luego partirlas usando strsplit para obtener las líneas lógicas.

Sin embargo, ciertos ficheros contienen descripciones (entrecomilladas) que contienen puntos y comas. Y eso produce caos.