===== 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);
%>
Complete the sentence with verb to be
<%= pronoun %> ________ <%= name %>
|
^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. ((No es necesario incluir esta importación, ya que todo el paquete ''siette.util.corpus'' se importa por defecto)). 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 [[es:manual:temas#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
{{ es:manual:items:item_generativo_diccionario_1.png?400 }}
==== 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''.