Ad verba per numeros

Desarrollo de corpora comparables, Hojas de ruta
Monday, May 28, 2007, 12:32 PM
A los que sigáis con cierta asiduidad este blog os debe sonar ya este artículo, se trata de una técnica para la creación de biléxicos (léxicos bilingües) a partir de un corpus comparable y un léxico semilla inicial.

Hasta el momento se han estudiado las bases de la técnica, fundamentalmente la determinación de co-ocurrencias y el modo de calcular la asociación entre los dos términos de una de tales co-ocurrencias.

Dichas co-ocurrencias se almacenaban en una tabla de tal modo que cada fila correspondía a un término del corpus y cada columna con un término del léxico inicial. Así, cada celda contendría el peso de la asociación entre el término del corpus y el del léxico.

Si tomamos una de tales filas tendremos un vector, en la terminología de Rapp un "vector de asociación"; si podemos determinar qué vector de asociación del idioma A se parece más a un vector de asociación del idioma B podríamos afirmar que el término correspondiente a la fila en el idioma A se corresponde con el del idioma B.

Veámoslo con un ejemplo; supongamos que el léxico semilla para el idioma A es {computer, language, programming, compiler}, el léxico semilla para el idioma B es {ordenador, lenguaje, programación, compilador}.

Supongamos ahora que un vector de asociación para el idioma A es el siguiente: assembly: {63.900.000, 71.800.000, 36.100.000, 1.280.000}

Supongamos que hemos aplicado la fórmula para transformar estos "contadores de co-ocurrencias" y obtenemos lo siguiente (¡atención! son valores ficticios): assembly: {0.88, 0.96, 0.91, 0.81}

Rapp indica, además, que los vectores deben normalizarse de tal modo que la suma de todos sus pesos sea 1, en este caso: assembly: {0.25, 0.27, 0.25, 0.23}

Ahora imaginemos que uno de los vectores del idioma B es el siguiente: ensamblador: {90.300, 240.000, 348.000, 75.800}

Al transformarlo (¡atención! nuevamente valores ficticios) obtenendríamos algo como: ensamblador: {0.66, 0.72, 0.72, 0.79}. Tras normalizarlo se tendría: ensamblador: {0.23, 0.25, 0.25, 0.27}

La cuestión entonces sería, ¿cuánto se parecen los vectores ensamblador y assembly? Para ello hay que seleccionar una medida de similitud/distancia y Rapp afirma que la que mejores resultados ofrece es la denominada city-block por lo que será esa la que habrá que implementar. En el caso del ejemplo la distancia empleando esta medida es 0.08 que es una distancia bastante pequeña.

Pero claro, esto ha sido un ejemplo "amañado", ¿qué distancia habría frente a otro término?, por ejemplo intérprete; veamos... intérprete: {363.000, 974.000, 826.000, 105.000} que tras transformarse y normalizarse quedaría en: intérprete: {0.24, 0.25, 0.25, 0.26}. La distancia en este caso sería 0.06, dicho de otro modo, podríamos obtener una lista tal que así:

assembly	intérprete	0.06
assembly ensamblador 0.08
...
Pero la asociación está mal... Lo sé, pero hay que tener en cuenta que he usado valores ficticios y, además, nadie dijo que fuese a salir perfecto; Rapp obtuvo un 65% de traducciones "perfectas" y un 72% de traducciones aceptables así que es de esperar obtener resultados análogos.

Rapp no entra en detalles sobre una implementación eficiente pero en nuestro caso una implementación trival (comparar todos los vectores del idioma A con todos los del idioma B) no parece razonable. Una idea que se me ocurre es la siguiente, puesto que deseamos obtener las listas de palabras que más se parecen (o lo que es lo mismo aquellas cuya distancia es menor) se puede limitar el número de vectores a comparar de una forma sencilla: (1) buscar en el vector de asociación del término del idioma A el peso mayor, llamemos w al peso y t al término del léxico que tiene dicho peso; (2) determinar un intervalo [w-umbral, w+umbral]; (3) determinar qué vectores del idioma B tienen para el término correspondiente a t un peso perteneciente a [w-umbral, w+umbral]; (4) calcular la distancia entre el vector del idioma A y los vectores del idioma B descubiertos en el paso 3.

En el ejemplo de assembly, el peso mayor es 0.27 que se corresponde con language, si el umbral fuese de 0.1 habría que buscar aquellos vectores que tienen un peso comprendido entre 0.17 y 0.37 para el término lenguaje.

En resumen, una vez obtenidos los pesos de asociación entre términos para ambos idiomas es necesario normalizarlos (teniendo en cuenta que los pesos pertenecen a un vector de asociación) e implementar un algoritmo que para cada término del idioma origen ofrezca una lista de términos del idioma B ordenados por distancia ascendente.



Next