Tabla de Contenidos

Preguntas generadas a partir de diccionarios

Para facilitar la creación de preguntas generativas en lenguaje natural se ha implementado la clase siette.util.corpus.Dictionary que es capaz de manejar ficheros de texto en un formato al que llamamos Diccionario. La sintaxis es muy simple y consiste en una lista de palabras o términos separados del resto de la línea por el caracter dos puntos, y un conjunto de atributos que se lista a continuación separados por espacios en blanco. Cada línea del diccionario corresponde a una palabra o frase.

Ejemplo 1

El siguiente diccionario contiene un vocabulario básico para construir frases simples en ingles con el verbo to be

I:                 pronoun 1p m f s
you:               pronoun 2p m f s p
he:                pronoun 3p m s
she:               pronoun 3p f s
we:                pronoun 1p m f p
they:              pronoun 3p m f p
am:                verb 1p s
is:                verb 3p s
are:               verb 2p s p
are:               verb 1p p
are:               verb 3p p
John:              name m s
Peter:             name m s
Mary:              name f s
Molly:             name f s
John and Mary:     name m f p
Peter and Molly:   name m f p
Susan and Peggy:   name f p

En este diccionario se dice por ejemplo que she es un pronombre femenino de tercera persona del singular, o que Susan and Peggy funcionan como un nombre femenino plural.

A partir de este diccionario se pueden crear multiples preguntas como esta:

Enunciado
<%@page import="siette.util.corpus.Dictionary"%>
<%
   Dictionary d = new Dictionary();
   d.setDictionary("demo/dictionary.txt");
 
   String genero = Random.select( new String[] { "m","f" } );
   String numero = Random.select( new String[] { "s","p" } );
   String persona = Random.select( new String[] { "1p","2p","3p" } );
 
   String[] attPronoun = { "pronoun", persona, genero, numero };
   String[] attVerb = { "verb", persona, numero };
   String[] attName = { "name", genero, numero };
 
   String pronoun = d.select(attPronoun);
          pronoun = d.cap(pronoun);
   String verb = d.select(attVerb);
   String name = d.select(attName);
 
%>
<i>Complete the sentence with verb to be </i><br/>
<br/>
<center>
<%= pronoun %> ________ <%= name %> 
</center>
Patrón
<%= verb %>

La primera línea incluye la clase siette.util.corpus.Dictionary a través de la cuál se implementa la plantilla. 1). Se crea un objeto d de esta clase incluyendo el fichero de texto con el diccionario que se ha mostrado anteriormente. Este fichero debe estar previamente cargado en el directorio auxiliar de la asignatura. Las tres líneas siguientes lo que hacen es simplemente elegir al azar mediante la clase siette.util.Random un genero (entre las opciones m que representa masculino y f, femenino), un numero (singular o plural y una persona (primera, segunda o tercera). Por ejemplo, supongamos que se ha eligido f, s, 3p respectivamente.

La variable attPronoun busca en el diccionario todas las palabras que cumplen tienen como atributo pronoum, y que ademas tienen f, s, y 3p; es decir, busca los pronombres femeninos de tercera persona del singular. La siguiente variable attVerb busca los términos que tengan los atributos verb, 3p y s, es decir verbos de tercera persona del singular. Finalmente la variable attName busca todos los nombres femeninos singulares.

Finalmente, se vuelve a elegir al azar uno cualquiera de los elementos de estos arrays. En el ejemplo solo hay un pronombre femenino singular she, y solo un tiempo verbal is, pero sin embargo hay varios nombres que cumplen la condición, todos ellos estarán en el array attName, y de entre ellos la funcion select elige uno.

La funcion cap pone en mayúscula la primera latra, es decir she pasa a ser She. La pregunta hace uso de la respuesta alineada con el texto. El resultado de esta instanciación se muestra en la siguiente imagen

Sintaxis de los diccionarios

La sintaxis de los diccionarios es simple, cada línea no vacía representa una elemento del diccionario. El elemento puede ser una única palabra o una frase completa, que termina cuando se encuentran los dos puntos. A partir de ahí se indican los atributos de esa palabra, que desde el punto de vista léxico on palabras, separadas por espacios en blanco o por comas. Puede utilizarse cualquier etiqueta para representar un atributo.

Si una entrada del diccionario no tiene atributos, (o no se encuentra el símbolo : (dos puntos), se considera que sus atributos son los mismos que los de la siguiente palabra.

John:              name m s
Peter:             name m s
Mary:              
Peggy:
Molly:             name f s
John and Mary     
Peter and Molly:   name m f p
Susan and Peggy:   name f p

En ele ejemplo anterior, Mary, Peggy y Molly tienen todas ellas los atributos name f y s.

1)
No es necesario incluir esta importación, ya que todo el paquete siette.util.corpus se importa por defecto