lunes, 5 de diciembre de 2016

Modelos de lenguaje y R


A fin de seguir avanzando, en OpenTranslation estamos poniendo a punto nuestros sistemas para comenzar a utilizar modelos del lenguaje. Estos modelos del lenguaje han sido ampliamente utilizados en el procesamiento del lenguaje natural y creo que la mejor manera de entender sus aplicaciones es mediante un ejemplo:

Imaginemos que estamos creando un sistema de reconocimiento de voz y nuestro sistema es incapaz de distinguir entre las siguientes dos opciones:

wreck a nice beach
recognise speech

Aunque a primera vista tal vez no lo parezca, ambas opciones se pronuncian de manera muy similar en inglés. Es evidente que, en caso de que se le plantee la duda (y es posible, pensemos por ejemplo si escucha estas palabras en un ambiente muy ruidoso), un humano no tiene problemas en darse cuenta de que la opción correcta es la segunda «recognise speech» (reconocer la voz), ya que la primera «wreck a nice beach» (destrozar una bonita playa), no tiene mucho sentido.

El problema está en que los ordenadores no vienen de serie con el sentido común incluido, así que tenemos que encontrar una manera de que elijan entre una y otra opción.

Un método muy interesante es crear un modelo del lenguaje, analizando una gran cantidad de texto y expresándolo en forma de un conjunto de bigramas (pares de palabras) y sus respectivas frecuencias. Por ejemplo:

de la    891
lo que    610
en el    540
de que    528
a la    455
en la    449
[...]

Lo interesante de este modelo es que, con estos datos, podemos calcular la probabilidad de que una determinada cadena de texto se dé en el idioma o no. En el caso anterior, es obvio que «recognise speech» que es un término muy frecuente, tendrá una probabilidad muy superior a «wreck a nice beach», que es una combinación un tanto extraña. Por tanto, el sistema podrá distinguir cuál es la opción correcta.

Este método no solo puede aplicarse al reconocimiento de voz, sino también a cualquier situación en la que la probabilidad de una determinada secuencia de palabras nos ayude a elegir una opción sobre otra como, por ejemplo, ocurre también en la corrección ortográfica de palabras.

Dado que este método nos obliga a calcular la colección de palabras y sus frecuencias, estamos añadiendo a petraREV una función que, dado un texto, nos permite crear un modelo del lenguaje utilizado en él.

Para ilustrar su utilidad, hemos pensado que sería interesante comparar los modelos obtenidos a partir de diversos libros famosos y, para crear rápidamente los gráficos, hemos decidido utilizar R. Para que podáis repetir este proceso con cualquier otros datos, vamos a ver brevemente los comandos que hay que utilizar.

Para empezar, hay que instalar R, lo que puede hacerse fácilmente utilizando el Centro de Software de Ubuntu.

Una vez instalado, basta con que abramos la consola y escribamos:

R

¡Ojo! Es imprescindible escribir esta R en mayúsculas, si la escribimos en minúsculas nos aparecerá un mensaje de error.

A continuación, le indicamos a R la carpeta donde están nuestros datos:

> setwd('/media/.../Corpus')

Y ya podemos leer los datos:
> data=read.table('corpus.txt')

Para ver que los datos se han cargado correctamente, basta con escribir:

> data

En nuestro caso, son los siguientes:

García_Marquez,_Gabriel_-_Del_amor_y_otros_demonios    21608    48527
Asensi,_Matilde_-_El_origen_perdido    65321    188696
Montero,_Rosa_-_Bella_y_oscura    26877    64046
Sloan,_Robin_-_El_Sr_Penumbra_y_su_libreria_24_horas_abierta    33938    93863
Meyer,_Stephanie_-_Eclipse    57804    192167

La primera columna indica el título de libros, la segunda el número de bigramas y la última el número de tokens, así que definiremos estas variables:

> name=data[,1]
> bigrams=data[,2]
> tokens=data[,2]

¡Y ya podemos crear un gráfico con estos datos! Basta con escribir:

> plot(tokens,bigrams)

¡Realmente fácil! ¿Verdad?

El único problema es que no sabemos a qué libro corresponde cada punto. Afortunadamente es muy fácil solucionar este problema. Para ello, necesitaremos el paquete calibrate, así que si no lo tenemos, podemos instalarlo con:

> install.packages("calibrate")

Ahora calibramos los datos:

> library(calibrate)

Y por último indicamos que queremos que en cada punto nos aparezca el nombre del libro al que corresponde.

> textxy(tokens,bigrams,name)

Como necesito este formato en formato .png escribo los siguientes comandos:

> png('grafico.png')
> plot(tokens,bigrams)
> textxy(tokens,bigrams,name)
> dev.off()

Y ahora sí que sí, tenemos este bonito gráfico:

Sin duda es interesante pero, dado que estamos comparando libros con un número de palabras muy diferente, no es fácil obtener conclusiones. Próximamente, veremos cómo resolver este problema.