Charla: un lematizador probabilístico con R

El jueves 16 de mayo hablaré en el Grupo de Interés Local de Madrid de R sobre lematizadores probabilísticos.

Hablaré sobre el proceso de lematización y trataré de mostrar su importancia dentro del mundo del llamado procesamiento del lenguaje natural (NLP). La lematización es un proceso humilde dentro del NLP del que apenas nadie habla: su ejercicio solo ha hecho famoso a Martin Porter. Lo eclipsan otras aplicaciones más vistosas, como el siempre sobrevalorado análisis del sentimiento. Sin embargo, es una pieza fundamental que subyace (o debería subyacer) en cualquier aplicación seria que analice textos.

Más sobre la ley de Benford (III): la "mágica" propiedad de los logaritmos decimales

Esta entrada tiene como prerrequisito las dos que la preceden: esta y esta.

Si $x_1, \dots, x_n$ es una muestra de una distribución de probabilidad $X$ regular y extendida, entonces $\log_{10}x_1, \dots, \log_{10}x_n$ es una muestra de $\log_{10}X$, que es otra distribución de probabilidad

  • regular (porque el logaritmo es una función creciente) y
  • extendida (aunque hay que convenir que menos: el logaritmo achica los números grandes).

Por lo tanto, cabe esperar que también la parte decimal de $\log_{10}x_1, \dots, \log_{10}x_n$ tenga una distribución uniforme sobre el intervalo [0,1). Luego cumple la Ley de Benford (véase la condición suficiente). Esto se debe a esa (¿contraintuitiva?) propiedad del logaritmo decimal: convertir el dígito más significativo de un número, el primero, en la parte menos significativa de su logaritmo, la que sigue a la coma.

data.table (II): agregaciones

Sigo con mi lacónica serie sobre data.table.

La protagonista:

frases[sample(1:nrow(frases), 3),]
#pos.es pos.en length.es length.en en        es frase          tfe      qjilm          num
#1:     15     43        72        72  i        de  2632 4.881416e-02 0.01369863 6.686871e-04
#2:     33     48        46        48  X    países  5321 2.726146e-06 0.02040816 5.563563e-08
#3:      2     35        53        66 in preguntar  4582 2.424379e-08 0.01492537 3.618476e-10
dim(frases)
#[1] 6340091      10

El tiempo:

system.time({
    setkey(frases, "frase", "es")
    denominadores <- frases[, sum(num), by = key(frases)]
    setnames(denominadores, c("frase", "es", "den") )
    frases <- merge(frases, denominadores)
    frases$delta <- frases$num / frases$den
})
#user  system elapsed
#5.628   0.208   5.841

En particular,

Dependencias funcionales en R con foodweb

El otro día tropecé con un problema de rendimiento con R y al utilizar Rprof() encontré muchas llamadas a funciones que yo no hacía directamente.

La principal sospechosa era la función daply (del paquete plyr) que parecía depender de bastantes otras. Uno puede navegar el código de las funciones para identificar esas dependencias, pero, mirad qué maravilla:

library(mvbutils)
library(plyr)
foodweb(find.funs("package:plyr"), prune = "laply")

genera

Ahí se ve la dependencia de daply con respecto a laply. Y uno adquiere, además, una visión panorámica del paquete plyr.

Mi primera aplicación en Shiny: un detector de idiomas

R

Motivado por los experimentos de Gregorio Serrano con shiny e ilustrado por la charla que dio en el Grupo de Usuarios de R de Madrid, decidí colgar el otro día un entretenimiento que ocupó la mañana de un domingo —y las mañanas de mis domingos son proverbialmente breves— en la red.

Se trata de una aplicación que distingue el idioma en que está escrito un texto dentro de una selección de ellos: español, italiano, latín, francés, portugués y catalán.

Más sobre la ley de Benford (II): la distribución de la parte fraccionaria

Continuamos hoy nuestra serie sobre la llamada ley de Benford discutiendo la distribución de la parte fraccionaria de las muestras de una distribución.

La parte fraccionaria de un número es, para entendernos, lo que va detrás de la coma. Técnicamente, x - floor(x). ¿Le sorprendería a alguien la parte fraccionaria de una secuencia aleatoria de números no tenga una distribución uniforme sobre [0,1)?

Obviamente, si los números son enteros no. ¿Pero si siguen la distribución normal? Se puede probar, de hecho, que si la serie sigue una distribución de probabilidad que sea

data.table (I): cruces

Los protagonistas (tres tablas grandecitas):

dim(qjilm)
# [1] 3218575 5
dim(tf)
# [1] 6340091 7
dim(tfe)
#[1] 1493772 3

head(qjilm, 2)
#pos.es length.en length.es pos.en qjilm
#1 1 2 1 1 0.8890203
#2 1 2 1 2 0.1109797

head(tf, 2)
#frase es pos.es length.es en pos.en length.en
#1 996 ! 42 42 ! 43 44
#2 1231 ! 37 37 ! 37 38

head(tfe, 2)
#en es tfe
#1 ! ! 4.364360e-01
#2 ! !" 4.945229e-24

El objetivo (cruzarlas por los campos comunes):

Por qué no deberías compartir tu código: diez motivos

Fresco aún en nuestro recuerdo el fiasco de Excel del que nos ocupamos hace unos días, los partidarios de la reproducibilidad, el software subversivo y gratuito, los detractores de las herramientas propietarias y otras estirpes han agudizado su campaña en pro de lo que denominan una mayor transparencia en el proceso de creación científica.

Como contrapeso a tanto despropósito, traigo a la consideración de mis lectores una visión alternativa que desnuda los desatinos de la caterva y recoge diez motivos incontestables por los que compartir código es una sinrazón. Es obra de Randall J. LeVeque que puede ser consultada como artículo o, para los impacientes, como presentación.

El casco y las bicis: no porque no

Vaya por delante que:

  • monto y me traslado en bici por Madrid siempre que razonablemente puedo (que son las menos de las veces)
  • simpre uso casco (más que por la improbable protección que pueda darme, por poder reforzar el alegato, en caso de incidente, de que soy un ciudadano responsable)
  • tengo en el cuerpo dos cicatrices de más y otros tantos dientes de menos a resultas de diversos accidentes
  • no tengo tiempo de discurrir cuál sería mi postura sobre la prohibición de circular en bici sin casco: es asunto que no me afecta en absoluto por lo arriba indicado.

Sentado lo cual, entro en materia. Y es la del aburridor y artificial debate que se crea siempre que

Todo lo que Vd. siempre quiso saber sobre la EPA (etc.)

¿A quién considera la EPA con trabajo?

Esencialmente, a aquellas _personas que durante la semana de referencia hayan trabajado, incluso de forma esporádica u ocasional, al menos una hora a cambio de un sueldo, salario u otra forma de retribución conexa, en metálico o en especie. _

También se suman a la lista aquellas personas que, aunque no hayan trabajado durante esa semana, mantengan un estrecho vínculo con su puesto de trabajo (por ejemplo, porque están de vacaciones o disfrutan de una baja médica).