Una forma de crear preguntas generativas con facilidad es recurrir al uso de tablas con información sobre distintos elementos y el valor de ciertos atributos. Seleccionando al azar uno cualquiera de estos elementos, y combinando los atributos se pueden obtener una amplia variedad de preguntas.
Las tablas, al igual que los diccionarios pueden leerse a partir de un fichero de texto, pero también a partir de hojas de cálculo en formato XLS (Excel antiguo) o XLSX (Excel, Calc de OpenOffice). Las tablas en formato de texto son ficheros CSV en los que cada fila corresponde a un elemento, y cada columna contiene el valor de un atributo. La primera fila, opcionalmente, contendrá los nombres de los atributos. Véase la clase siette.util.corpus.Table para una descripción completa de los métodos disponibles.
A continuación se muestran varios ejemplos del uso de tablas:
El siguiente fichero de texto contiene una tabla de los elementos químicos. En este fichero las columnas estan separadas por tabuladores:
NUMERO_ATOMICO VALENCIA SIMBOLO NOMBRE DENSIDAD 1 1 H Hidrógeno 0.0899 2 0 He Helio 0.126 3 1 Li Litio 0.53 4 2 Be Berilio 1.85 5 3 B Boro 2.34 6 2|4 C Carbono 2.26 7 -3|1|2|3|4|5 N Nitrógeno 0.81 8 -2 O Oxígeno 1.14 9 -1 F Flúor 1.11 10 0 Ne Neón 1.2 11 1 Na Sodio 0.97 12 2 Mg Magnesio 1.74 13 3 Al Aluminio 2.7 14 4 Si Silicio 2.33 15 -3|3|5 P Fósforo 1.82 16 -2|2|4|6 S Azufre 2.07 17 -1|1|3|5|7 Cl Cloro 1.56 18 0 Ar Argón 1.4 19 1 K Potasio 0.86 20 2 Ca Calcio 1.55 ....
A partie de esta tabla, 1) se pueden construir preguntas como:
Enunciado | %@page import="siette.util.corpus.Table"%> <% Table table = new Table("demo/tabla_periodica.txt", true, Table.DEFAULT_SEPARATOR, "x-MacRoman", true); String[] elemento = table.select(); String nombre = table.get( elemento, "NOMBRE" ); String simbolo = table.get( elemento, "SIMBOLO" ); %> ¿Cuál es el símbolo quimico del "<i><%= nombre %></i>"? |
---|---|
Patrón | <%= simbolo %> |
que puede dar lugar a instancias como esta:
Esta plantilla hace uso de la clase siette.util.corpus.Table que representa una tabla de elementos con atributos. El constructor de la clase contiene varios parámetros. El primero de ellos es la localización del fichero que contiene la tabla. Este fichero debe estar localizado en el contexto auxiliar de la asignatura. El segundo parámetro indica si la tabla tiene o no una fila de cabecera. En este caso la tiene. Son los nombres de los atributos. El siguiente parámetro define el separador que se usa entre los elementos de la tabla. En esta caso es el separador por defecto, que es el caracter tabulador, aunque puede emplearse cualquier otro. El cuarto parámetro indica el sistema de codificación de los caracteres del fichero. Si no se especifica nada se considera UTF-8
. Finalmente el último parámetro indica si se deben filtrar o no los caracteres HTML, es decir, si se transformaran los caracteres del fichero por encima del caracter 127 en sus correspondientes entidades HTML.
La programación en este caso es muy sencilla. La sentencia:
String[] elemento = table.select();
selecciona un elemento cualquiera al azar, y devuelve todos los valores de las columnas (valor de los atributos) en el array elemento
. La sentencia:
String nombre = table.get( elemento, "NOMBRE" );
selecciona de entre todos los atributos del elemento, (todas las columnas), el valor correspondiente a la columna etiquetada como NOMBRE
, es decir la cuarta columna. El mismo efecto se habria obenido con la sentencia:
String nombre = table.get( elemento, 3 );
teniendo en cuenta que, como es habitual en programación JAVA, los valores comienzan siempre contanto por el elemento 0.
De forma similar, a esta plantilla puede construirse otra que muestre el símbolo
y pregunta el nombre
y con un poco mas de programación se pueden generar preguntas que comparen unos elementos con otros, como la siguiente:
En estos casos es muy conveniente utilizar el método setExclusive()
que hace que una vez que se ha seleccionado una fila de la tabla, no pueda volver a elegirse la misma fila.
Los atributos son cadenas de caracteres cualesquiera, lo que ofrece multiples posibilidades. Una de ellas es que los atributos contengan la URI de una imagen, ya sea local, del directorio auxiliar de la asignatura, o externa, por ejemplo de una fuente libre como Wikipedia. La siguiente plantilla explota esta facilidad presentando tres imagenes de tres personajes de la historia de EE.UU. seleccionados al azar
Enunciado | <%@page import="siette.SIETTE"%> <% Table table = new Table("demo/historia/personajes_historicos_usa.xls"); table.setExclusive(); table.setExactMatch(); String[] person1 = table.select(); String historical_character = table.get( person1, "Historical_character" ); String image1 = table.get( person1, "Image" ); String sex = table.get( person1, "Sex" ); String[] person2 = table.select("Sex",sex); String image2 = table.get( person2, "Image" ); String[] person3 = table.select("Sex",sex); String image3 = table.get( person3, "Image" ); %> ¿Quién es <%= historical_character %>? |
---|---|
Respuesta correcta | <img src="<%= image1 %>" height="250"> |
Alternativa 1 | <img src="<%= image2 %>" height="250"> |
Alternativa 2 | <img src="<%= image3 %>" height="250"> |
Que produce instancias como esta:
El código de esta plantilla crea una tabla a partir de un fichero XLS que contiene varias columnas, al menos una que se titula Historical_character
que contiene un nombre, otra Sex
que adjundica un género, y otra Image
que contiene la URI a una imagen del personaje. El método table.setExclusive();
indica que no se deben seleccionar dos veces el mismo reguistro. El método table.setExactMatch();
indica que en las busquedas que se realicen en los atributos los valores deben encajar completamente (a diferencia del método setPartialMatch
que indica que al buscar un elemento pueden considerarse coincidencias parciales).
A continuación se obtiene un personaje seleccionando un registro (fila) al azar en la variable person1
, y una vez seleccionado se obtiene el valor de los atributos Image
y Sex
.
A continuación se seleccionan dos registros (filas) más, en las variables person2
y person3
. La opción setExclusive
garantiza que ambos serán diferentes del primero. En este caso no se selecciona un elemento cualquiera, sino que se indica al hacer la selección que el atributo Sex
debe tener el valor igual al obtenido anteriormente. Esto garantiza que las imagenes que se muestran serán todas del mismo género, ya que si no el nombre podría daría inidcaciones de cuál es la imagen correcta.
Al igual que en el caso de otras plantillas, las preguntas basadas en atblas pueden aplicarse a preguntas compuestas. Por ejemplo, utilizando una tabla con los tiempos verbales de los verbos irregulares en ingés pueden obtenerse preguntas como:
Este ejemplo es simialr al anterior pero con imagenes de instrumentos musicales:
En este caso para obtener el conjunto de familias de instrumentos y poder mostrar las opciones de la segunda subpregunta se ha utilizado el método getAlternatives(“FAMILIA”)
que devuelve todos los posibles valores del atributo FAMILIA
.
... String familia = table.get( fila, "FAMILIA" ); String[] familias = table.getAlternatives("FAMILIA"); for(int i=1;i<familias.length; i++) { if (familias[i].equals(familia)) { familias[i] = familias[0]; familias[0] = familia; } } ...
Una vez obtenidos los atributos se recorre la lista de manera que la respuesta correcta se coloque en primera posición, a fin de saber cuál es y definirla como respuesta correcta. Siette desordena las respuestas cuando plantea la pregunta por lo que la respuesta correcta aparecerá en cualquier posición.
La tabla también contiene un atributo cuyo valor es un patrón Siette de respuesta para cada registro, de manera que por ejemplo en el caso de la imagen acepte como respuesta cualquier cadena que encaje con el patrón Saxo{fón} {alto}
.