|
| 1 | +--- |
| 2 | +jupytext: |
| 3 | + encoding: '# -*- coding: utf-8 -*-' |
| 4 | + main_language: python |
| 5 | + text_representation: |
| 6 | + extension: .md |
| 7 | + format_name: myst |
| 8 | +kernelspec: |
| 9 | + display_name: Python 3 (ipykernel) |
| 10 | + language: python |
| 11 | + name: python3 |
| 12 | +language_info: |
| 13 | + name: python |
| 14 | + nbconvert_exporter: python |
| 15 | + pygments_lexer: ipython3 |
| 16 | +nbhosting: |
| 17 | + show_up_down_buttons: true |
| 18 | + title: 'TP: Dr Watson' |
| 19 | +--- |
| 20 | + |
| 21 | +# Dr Watson |
| 22 | + |
| 23 | ++++ |
| 24 | + |
| 25 | +Licence CC BY-NC-ND, Thierry Parmentelat |
| 26 | + |
| 27 | ++++ |
| 28 | + |
| 29 | +````{admonition} nothing to prune |
| 30 | +:class: warning |
| 31 | +
|
| 32 | +there are no difference - apart from this very cell - between the teacher and the student version, but the notebook is duplicated in .teacher for consistency |
| 33 | +```` |
| 34 | + |
| 35 | ++++ |
| 36 | + |
| 37 | +```{admonition} commencez par télécharger le zip |
| 38 | +{download}`vous aurez besoin du zip qui se trouve ici<./ARTEFACTS-watson.zip>` |
| 39 | +``` |
| 40 | + |
| 41 | ++++ |
| 42 | + |
| 43 | +## préparatifs |
| 44 | + |
| 45 | +### `input()` |
| 46 | +voyez la fonction `input()` pour poser une question et lire la réponse dans le terminal |
| 47 | +essayez vous-même |
| 48 | + |
| 49 | +```python |
| 50 | +# pour poser la question et avoir la réponse |
| 51 | +reponse = input("une question: ") |
| 52 | + |
| 53 | +# le retour de input(), c'est directement la chaine qu'on a tapée, sans newline ni rien |
| 54 | +print(reponse) |
| 55 | +``` |
| 56 | + |
| 57 | +### notebooks |
| 58 | + |
| 59 | +si vous envisagez de faire ce TP dans un notebook, [assurez-vous de bien lire cette section](label-autoreload) |
| 60 | + |
| 61 | ++++ |
| 62 | + |
| 63 | +## v1: un coup, les mots-clé en dur |
| 64 | + |
| 65 | +on veut écrire un programme qui |
| 66 | + |
| 67 | +* pose une question, du genre `bonjour, à vous: ` |
| 68 | +* attend la réponse tapée par l'utilisateur |
| 69 | +* puis: |
| 70 | + * selon que la réponse contient **le mot `bien`** ou **le mot `mal`** |
| 71 | + on affiche un message positif ou négatif (par exemple `C'est super!` et `Ohhhh, c'est triste.`) |
| 72 | + * si la phrase est vide par contre, on affiche `Tu n'es pas bavard.` |
| 73 | + * enfin si rien de tout cela, on affiche `Je ne comprends pas` |
| 74 | +* dans tous les cas après la première réponse le programme s'arrête |
| 75 | + |
| 76 | + |
| 77 | +une session pourrait ressembler à ceci |
| 78 | + |
| 79 | +``` |
| 80 | +>>> watson() |
| 81 | +bonjour, à vous: j'ai mal dormi aujourd'hui |
| 82 | +Ohhhh, c'est triste. |
| 83 | +C'est fini, au revoir ! |
| 84 | +>>> |
| 85 | +``` |
| 86 | + |
| 87 | +```{code-cell} ipython3 |
| 88 | +# pour ceux qui travaillent dans un notebook |
| 89 | +
|
| 90 | +def watson(): |
| 91 | + ... |
| 92 | +
|
| 93 | +watson() |
| 94 | +``` |
| 95 | + |
| 96 | +### solution v1 |
| 97 | + |
| 98 | +````{admonition} ouvrez-moi |
| 99 | +:class: dropdown |
| 100 | +
|
| 101 | +une façon de faire la v1 |
| 102 | +
|
| 103 | +```{literalinclude} watson1.py |
| 104 | +``` |
| 105 | +```` |
| 106 | + |
| 107 | ++++ |
| 108 | + |
| 109 | +## v2 - les mots-clé dans une liste |
| 110 | + |
| 111 | +on change un peu le code; on veut reconnaitre les phrases positives ou négatives sur la base de plusieurs mots; par exemple |
| 112 | + |
| 113 | +``` |
| 114 | +NEGATIVE_WORDS = ["mal", "triste", "marre"] |
| 115 | +POSITIVE_WORDS = ["bien", "super", "content", "contente"] |
| 116 | +``` |
| 117 | + |
| 118 | ++++ |
| 119 | + |
| 120 | +````{admonition} indice |
| 121 | +:class: tip admonition-small |
| 122 | +
|
| 123 | +toujours pour ceux qui travaillent dans un notebook: |
| 124 | +faites descendre votre cellule de code pour qu'elle soit toujours près de la consigne; |
| 125 | +pour cela sélectionner la cellule, assurez-vous d'être en mode 'commande' et tapez `Ctrl-Shift-↓` |
| 126 | +ou encore click-drag avec la souris, dans la zone à gauche de la cellule |
| 127 | +```` |
| 128 | + |
| 129 | ++++ |
| 130 | + |
| 131 | +## v3 - meilleure idée ? |
| 132 | + |
| 133 | +est-ce que de mettre les mots-clés dans une liste c'est une bonne idée ? |
| 134 | +est-ce qu'on peut améliorer la performance du code du coup ? |
| 135 | + |
| 136 | ++++ |
| 137 | + |
| 138 | +## v4 - les mots-clé dans un fichier |
| 139 | + |
| 140 | +on veut pouvoir définir les mots-clé dans un fichier; on choisit le format suivant |
| 141 | + |
| 142 | +``` |
| 143 | +$ cat watson.txt |
| 144 | +POSITIVE bien super content contente |
| 145 | +NEGATIVE mal triste marre |
| 146 | +``` |
| 147 | + |
| 148 | +ajoutez dans votre code une fonction |
| 149 | +`init_watson(filename)` qui retourne - par exemple - un tuple de deux ensembles de mots |
| 150 | + |
| 151 | ++++ |
| 152 | + |
| 153 | +## v5 - boucle sans fin |
| 154 | + |
| 155 | +au lieu de faire le traitement une seule fois, on va le faire indéfiniment; pour que tout de même on puisse sortir de là, on rajoute une nouvelle catégorie de mots dans le fichier de config: |
| 156 | + |
| 157 | +``` |
| 158 | +$ cat watson-config.txt |
| 159 | +POSITIVE bien super content contente |
| 160 | +NEGATIVE mal triste marre |
| 161 | +EXIT bye quit exit |
| 162 | +``` |
| 163 | + |
| 164 | +et si un des mots de la phrase est contenu dans la nouvelle catégorie on arrête le programme complètement; c'est-à-dire qu'une session ressemblerait à ceci |
| 165 | + |
| 166 | +``` |
| 167 | +>>> watson() |
| 168 | +bonjour, à vous: j'ai bien dormi |
| 169 | +C'est super, mais encore... |
| 170 | +j'ai mal au dents |
| 171 | +Ohhhh, c'est triste, mais encore... |
| 172 | +c'est fini |
| 173 | +je ne comprends pas... |
| 174 | +je veux dire exit |
| 175 | +C'est fini, au revoir ! |
| 176 | +>>> |
| 177 | +``` |
| 178 | + |
| 179 | ++++ |
| 180 | + |
| 181 | +### solution v5 |
| 182 | + |
| 183 | +````{admonition} ouvrez-moi |
| 184 | +:class: dropdown |
| 185 | +
|
| 186 | +une façon de faire la v5 |
| 187 | +
|
| 188 | +```{literalinclude} watson5.py |
| 189 | +``` |
| 190 | +```` |
| 191 | + |
| 192 | ++++ |
| 193 | + |
| 194 | +## v6 - rendre la fonction réglable |
| 195 | + |
| 196 | ++++ |
| 197 | + |
| 198 | +* on veut pouvoir passerà la fonction `watson()` |
| 199 | + * un paramètre `config` (qui par défaut vaut `"watson-config.txt"`) |
| 200 | + * un paramètre `debug` (qui par défaut est `False`), et s'il est mis, on affiche un message qui montre où on a trouvé le mot |
| 201 | + |
| 202 | ++++ |
| 203 | + |
| 204 | +``` |
| 205 | +# on utilise un autre fichier de config, et en mode debug |
| 206 | +>>> watson("watson-config.en", True) |
| 207 | +sdfsdf |
| 208 | +je ne comprends pas... |
| 209 | +awesome this morning |
| 210 | +DEBUG: *awesome* this morning |
| 211 | +C'est super, mais encore... |
| 212 | +had a nice dream |
| 213 | +DEBUG: had a *NICE* dream |
| 214 | +C'est super, mais encore... |
| 215 | +exit |
| 216 | +C'est fini, au revoir ! |
| 217 | +``` |
| 218 | + |
| 219 | ++++ |
| 220 | + |
| 221 | +## v7 - refactoring |
| 222 | + |
| 223 | ++++ |
| 224 | + |
| 225 | +on décide de refactorer le code en créant des classes; par exemple |
| 226 | +* une classe `Feeling` correspondant à chacun des deux ensembles de mots |
| 227 | +* une classe `Sentence` qui sera crée pour chaque réponse |
| 228 | +* une classe `Watson` qui est l'application elle-même |
| 229 | +* ... |
| 230 | + |
| 231 | +en option, on peut aussi en faire un vrai programme Python qui se lance depuis la ligne de commande (voir pour ça la librairie `argparse`) |
| 232 | + |
| 233 | ++++ |
| 234 | + |
| 235 | +### solution v7 |
| 236 | + |
| 237 | +````{admonition} ouvrez-moi |
| 238 | +:class: dropdown |
| 239 | +
|
| 240 | +une façon de faire la v7 |
| 241 | +
|
| 242 | +```{literalinclude} watson7.py |
| 243 | +``` |
| 244 | +```` |
| 245 | + |
| 246 | ++++ |
| 247 | + |
| 248 | +## etc.. |
| 249 | + |
| 250 | +c'est toujours améliorable... par exemple: |
| 251 | +* on pourrait imaginer mettre les réponses aussi dans le fichier de config |
| 252 | + dans ce cas un autre format serait sans doute mieux adapté; que pensez-vous de yaml dans ce contexte ? |
| 253 | +* ... |
0 commit comments