Nlp

¿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.

Preludio (de más por venir)

El preludio esto:

Que tiene el interés y la interpretación (muchas de ellas, como se podrá barruntar más abajo, de corte técnico) que cada uno quiera darle.

La cuestión es que he ocerreado todas las portadas de El País y puedo buscar en el texto (adviértase la cursiva) resultante. Creo contar con una voluntaria para construir una aplicación web similar a la de los n-gramas de Google.

Igual subo los datos a algún sitio en algún momento. En tanto, si alguien los quiere, que me los pida.

La viejunísima escuela

Leí esto. Me asaltó la pregunta obvia, la manifiesta, la fundamental, la sine qua non.

Si queréis, echadle un vistazo y podréis descubrirla por vosotros mismos. Y para evitar el spoiler de un golpe de vista involutario al párrafo siguiente, intercalo la foto de un lindo gatito.

Pues sí, el señor Escohotado afirma que:

En el año dos mil tres un profesor de Harvard, McCormick, un medievalista, digitalizó, escaneó todos los documentos medievales del siglo VI al siglo XIII, los pasó por un programa adecuado y les preguntó cosas tan sencillas como ¿cuántas veces aparece la palabra “negotiator”?

Advertencias sobre el uso de los n-gramas de Google

Dudaba en si dedicar la entrada a popularizar los n-gramas de Google en lugar de advertir sobre sus sesgos. Pero, habida cuenta de que lo primero sería llover sobre mojado (véase esto o esto), me he decantado por lo segundo.

El primer problema es el del reconocimiento de caracteres. Aunque la tecnología mejorará, aún se encuentra, p.e., cami6n en lugar de camión.

El fundamental, no obstante, es que los libros aparecen una única vez independientemente de su popularidad. Esto plantea problemas para medir el impacto cultural de determinados términos: su presencia o ausencia en los n-gramas puede no encontrar correlato en la calle.

Probando hunspell para el procesamiento de texto en español

Nlp, R

El paquete hunspell de R permite procesar texto utilizando como soporte la infraestructura proporcionada por Hunspell, el corrector ortográfico que subyace a muchas aplicaciones en R.

Existe una viñeta que ilustra el uso del paquete pero, como siempre, en inglés. En español las cosas son parecidas pero, como siempre, nunca exactamente iguales. En esta entrada, por lo tanto, voy a repasar partes de la viñeta aplicándolas a nuestra tan frecuentemente maltratada mas por ello no menos querida por algunos como yo (pausa) lengua.

¿Mis conciudadanos no tienen wifi?

R

A alguien leí el otro día que decía que en un bar de carretera habían colocado un cartel diciendo: “Hemos quitado el periódico y hemos puesto wifi”. Viene esto a cuento de

library(rvest)
library(<a href="http://inside-r.org/packages/cran/tm">tm)
library(wordcloud)

res <- sapply(1:17, function(i){
  url <- paste("https://decide.madrid.es/participatory_budget/investment_projects?geozone=all&page=",
  i, "&random_seed=0.28", sep = "")
  tmp <- html_nodes(
    read_html(url),
    xpath = "//div[starts-with(@id, 'spending_proposal')]/div/div/div[1]/div/h3/a/text()")

  as.character(tmp)
})

tmp <- unlist(res)

tmp <- Corpus(VectorSource(tmp))
tmp <- tm_map(tmp, stripWhitespace)
tmp <- tm_map(tmp, content_transformer(tolower))
tmp <- tm_map(tmp, removeWords, stopwords("spanish"))

wordcloud(tmp, scale=c(5,0.5),
  max.words=100,
  random.order=FALSE,
  rot.per=0.35, use.r.layout=FALSE,
  colors=brewer.pal(8, "Dark2"))

que hace lo que dice, es decir,

Un corpus de textos en español para NLP

Mañana doy clase de NLP en el máster de ciencia de datos de KSchool. Para lo que necesito un corpus decente. Los hay en inglés a tutiplén, pero las hordas de lingüistas hispanoparlantes que se pagan los vicios a costa de tajadas de mi IRPF han sido incapaces de colgar ninguno en español que pueda ubicar y reutilizar.

Necesito una colección de textos en español con ciertas características:

  • Tener un cierto tamaño (¿unas cuantas centenas de ellos?)
  • Que no sean demasiado grandes (¿unos cuantos párrafos?)
  • Ser medianamente homogéneos.
  • Estar bien escritos, sin faltas de ortografía, etc.

Así que he decidido poner en valor otra de esas onerosas reliquias de la cultura analógica y de letras que es el Museo Thyssen; en particular, las descripciones que constan en las fichas de los cuadros. De hecho, corriendo esto:

90 millones de euros en tecnologías del lenguaje

El gobierno español ha anunciado (ya hace un tiempo) un plan de impulso a las tecnologías del lenguaje con una dotación de 90 millones de euros (lo que costó el fichaje de Ronaldo).

Veremos en unos años qué ha dado de sí la cosa. En particular, si habrá permitido que los usuarios de R dispongamos de herramientas libres (porque de momento, ya están cobrándonoslas vía Agencia Tributaria) para hacer nuestros cacharreos.

O si, por contra, unos espabiladillos habrán sabido ordeñar la vaca con la excusa de desarrollar proyectos que acaben en una memoria que presentar en el ministerio de turno para justificar la subvención y unos zips en los discos duros de los ordenadores del fondo. Esas herramientas y proyectos, vamos, hechos a desgana y que, una vez cortado el chorro de la subvención, caen en el olvido.

La primera víctima será la sintaxis

No seré yo quien condene el contar palabras en textos para inferir por dónde van los tiros. Lo he hecho y lo hago con frecuencia.

Pero lo cuestiono en algunas ocasiones. La principal, esos análisis sumarísimos de los programas electorales —p.e., en la campaña que acabamos de cerrar— que los comparan en términos del número de veces que se mencionan diversos términos o el número de páginas que dedican a diversos temas.

Para los que buscáis proyectos de análisis / visualización de datos

Igual hay alguien que busca un proyecto interesante de análisis / visualización de datos. Tengo uno en mente para el que ando sin tiempo. Así que lo sugiero aquí por si alguien quiere hincarle el diente.

Consiste en:

  • Bajarse el BOE hasta cuando hay texto en formatos decentes (principios de los 90, si no recuerdo mal)
  • Extraer los 1,2,3,¿4?-gramas
  • Construir algo parecido a esto
  • Ponerme en la letra chiquita de los créditos y pagarme una cerveza

¿O no es interesante?

Una curiosa trasposición legal (hecha, manifiestamente, a malagana)

Nlp, R

El parlamento de la Unión Europea aprueba directivas. Los parlamentos nacionales las trasponen, es decir, las convierten en leyes nacionales (véase el enlace anterior).

No sé hasta qué punto la trasposición tiene que ser literal. La única experiencia seria que tengo es con esta y sus trasposiciones nacionales a España y el RU. Y era notorio cómo cada país, aprovechando las ambigüedades del texto original, arrimaba el ascua a su sardina.

He perdido el rato comparando la ley de reutilización de datos del sector público con la directiva que traspone (los enlaces, debajo). Que se parecen, por cierto, como un huevo a una castaña. En particular, la ley española añade provisiones que no aparecen en la directiva para asegurarse de que las administraciones públicas no se obligan ni comprometen a nada. Por lo que si en lugar de haber ley, no la hubiera, las cosas no cambiarían en absoluto. Pero esa es otra historia.

¿Dónde están aquellos caballeros andantes?

Pues precedidos del mi favorito de todos ellos, Felixmarte de Hircania, el del desnudo brazo, en

felixmarte

dentro del texto del Quijote. El código para obtener el gráfico anterior es

library(qdap)

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

# es posible que necesites esto en Windows:
quijote <- iconv(quijote.raw, from = "utf8", to = "latin1")

quijote <- quijote[-(1:36)]
quijote <- quijote[-(37453:length(quijote))]

dispersion_plot(quijote, c("felixmarte", "amadís",
    "leandís", "bencimarte", "palmerín",
    "olivante", "tirante", "belianís",
    "gironcilio", "lisuarte", "esplandián",
    "roldán", "rodamonte", "florimorte", "platir",                            "tablante"))

Tenéis permiso mío para buscar otros términos en otros textos y ver qué pinta tiene la distribución.

"Lengua y Markov" en MartinaCocina este sábado

Hija de la improvisación de hace un ratico, habrá mañana sábado día 4 (de 2014), a las 19:00 una reunión de gente poco cabal en MartinaCocina para discutir asuntos relacionados con el análisis de textos (y en una vertiente más lúdica, la generación de textos) usando cadenas de Markov.

Nos juntaremos, entre otros, los autores del Escritor Exemplar (uno de los cuales es quien suscribe) y el de Markov Desencadenado.

markov_desencadenado