QuizBot

El projecte QuizBot per GEI-LP (edició tardor 2019).

L’objectiu general de la pràctica consisteix en desenvolupar un chatbot que permeti recollir les dades d’enquestes definides mitjançant un compilador a través de telegram i consultar gràfiques simples i informes sobre les dades recollides.

Compilador

Cal fer un compilador per interpretar un llenguatge Enquestes de definició d’enquestes. El llenguatge permet definir preguntes i respostes. Una enquesta és un conjunt de preguntes i respostes estructurades en seqüència o alternativa. El següent exemple mostra el llenguatge:

P1: PREGUNTA                         // Pregunta amb identificador P1
Quants adults viuen a casa teva?
P2: PREGUNTA                         // Altra pregunta
Quants menors vien a casa teva?
R1: RESPOSTA                         // Resposta amb identificador R1
0: zero ;                            // Primera opció de resposta
1: un ;
2: dos ;
3: més de dos ;
I1: ITEM                             // Item: enllaça una pregunta amb
P1 -> R1                             // la seva resposta
I2: ITEM
P2 -> R1
P3: PREGUNTA
Com vas a la feina majoritàriament?
R3: RESPOSTA
1: caminant ;
2: en cotxe ;
3: en transport públic ;
I3: ITEM
P3 -> R3
P4: PREGUNTA
Utilitzes car sharing?
R4: RESPOSTA
1: Sı́ ;
2: No ;
I4: ITEM
P4 -> R4
P5: PREGUNTA
Quin mitja de transport utilitzes majoritàriament?
R5: RESPOSTA
1: Tren ;
2: Bus ;
3: Metro ;
4: Altres
I5: ITEM
P5 -> R5
A1: ALTERNATIVA                      // La resposta a I3 pot implicar una
I3 [(2,I4),(3,I5)]                   // altra pregunta
E: ENQUESTA                          // La llista de preguntes de l’enquesta
I1 I2 I3
END

Gramàtica

Definiu la part lèxica (tokens) i sintàctica (gramàtica). Feu la gramàtica per a que ANTLR4 pugui reconèixer-la. La regla inicial de la gramàtica és:

grammar Enquestes;
...

AST a graf

Feu un script python3 que:

  1. recorri l’AST mitjançant un visitor,
  2. guardi l’estructura en un graf,
  3. guardi el graf en un arxiu tipus pickle, i
  4. generi una imatge amb la representació del graf.

A continuació teniu un exemple de com quedaria l’exemple anterior utilitzant la llibreria networkx:

A la gràfica les arestes negres corresponen a la seqüència de preguntes de l’enquesta, les verdes a les alternatives i les blaves als items.

Telegram

La vostra tasca consisteix en implementar un Bot de Telegram que constesti textualment i gràficament a preguntes relacionades amb les enquestes descrites a la secció anterior, així com recullir les dades d’enquestes.

Comandes del bot

El vostre Bot ha d’entendre i contestar correctament les comandes següents:

Intèrpret

Feu un intèrpret que interactui amb l’usuari, a partir de les dades de graf, en ser activada la comanda quiz. A continuació teniu un exemple d’interacció:

E> Quants adults viuen a casa teva?
0: zero
1: un
2: dos
3: més de dos
>> 2
E> Quants menors vien a casa teva?
0: zero
1: un
2: dos
3: més de dos
>> 1
E> Com vas a la feina majoritàriament?
1: caminant
2: en cotxe
3: en transport públic
>> 3
E> Quin mitja de transport utilitzes majoritàriament?
1: Tren
2: Bus
3: Metro
4: Altres
>> 4
E> Gràcies pel teu temps!

A telegram tindria el format següent:

Les respostes s’han de guardar en una estructura python3 que heu de dis- senyar vosaltres. Utilitzeu el pickle de python per a que aquesta estructura estigui sempre actualitzada en les múltiples execucions del bot.

Gràfiques

Si tenim per a la pregunta P3 les dades:

valor comptats
1 5
2 1
3 6

La comanda /pie P3 ens donarà quelcom com:

Fixeu-vos en que cada porció del formatget conté percentatges.

La comanda /bar P3 ens donarà quelcom com:

Fixeu-vos en que cada barra conté el nombre d’enquestes que l’han votat.

Report

La comanda /report ens ha de mostrar el nombre d’enquestes que han votat a cada valor de cada producte. A continuació teniu un exemple de com es veuria a telegram:

Llibreries

Utilitzeu les llibreries de Python següents:

Podeu utilitzar lliurament altres llibreries estàndards de Python, però si no són estàndards, heu de demanar permís als vostres professors (que segurament no us el donaran).

Referències

Lliurament

Heu de lliurar la vostra pràctica al Racó. Només heu de lliurar un fitxer ZIP que, al descomprimir-se generi:

Els vostres fitxers de codi en Python han de seguir les regles d’estı́l PEP8, tot i que podeu oblidar les restriccions sobre la llargada màxima de les lı́nies. Podeu utilitzar el paquet pep8 o http://pep8online.com/ per assegurar-vos que seguiu aquestes regles d’estı́l. L’ús de tabuladors en el codi queda prohibit (zero directe).

El termini de lliurament és el dijous 9 de gener a les 23:59.