Skip to content

Commit a019c20

Browse files
committed
normalize watson
1 parent d08db45 commit a019c20

File tree

2 files changed

+270
-5
lines changed

2 files changed

+270
-5
lines changed
Lines changed: 253 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,253 @@
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+
* ...

notebooks/tps/watson/README-watson-nb.md

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,7 @@
11
---
22
jupytext:
3-
cell_metadata_filter: all,-hidden,-heading_collapsed,-run_control,-trusted
43
encoding: '# -*- coding: utf-8 -*-'
54
main_language: python
6-
notebook_metadata_filter: all, -jupytext.text_representation.jupytext_version, -jupytext.text_representation.format_version,
7-
-language_info.version, -language_info.codemirror_mode.version, -language_info.codemirror_mode,
8-
-language_info.file_extension, -language_info.mimetype, -toc
95
text_representation:
106
extension: .md
117
format_name: myst
@@ -24,7 +20,23 @@ nbhosting:
2420

2521
# Dr Watson
2622

27-
si nécessaire: {download}`télécharger le zip<./ARTEFACTS-watson.zip>`
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+
```
2840

2941
+++
3042

0 commit comments

Comments
 (0)