From 370df9fa5c33cdf6a0555dba2ce1b8334ef71b03 Mon Sep 17 00:00:00 2001 From: 3ed90ae106c3f95a8baa60891e6cb40f <3ed90ae106c3f95a8baa60891e6cb40f@app-learninglab.inria.fr> Date: Mon, 9 Oct 2023 17:34:48 +0000 Subject: [PATCH] Update exercice_python_fr.org --- module3/exo3/exercice_python_fr.org | 214 ++++++++++++++++++++-------- 1 file changed, 151 insertions(+), 63 deletions(-) diff --git a/module3/exo3/exercice_python_fr.org b/module3/exo3/exercice_python_fr.org index c7157ba..a5b4215 100644 --- a/module3/exo3/exercice_python_fr.org +++ b/module3/exo3/exercice_python_fr.org @@ -1,6 +1,6 @@ -#+TITLE: Votre titre -#+AUTHOR: Votre nom -#+DATE: La date du jour +#+TITLE: Sujet 5 : Analyse des dialogues dans l'Avare de Molière +#+AUTHOR: Émile Siboulet +#+DATE: 9 octobre #+LANGUAGE: fr # #+PROPERTY: header-args :eval never-export @@ -11,83 +11,171 @@ #+HTML_HEAD: #+HTML_HEAD: -* Quelques explications +* Acquisition des données +Dans un premier temps, nous allons télécharger les paroles de Molière. Nous choisissons de prendre le fichier markdown qui suffit à notre étude et qui ne comporte pas de données inutiles à nos analyses. +#+begin_src shell + wget -O data.md http://dramacode.github.io/markdown/moliere_avare.txt +#+end_src -Ceci est un document org-mode avec quelques exemples de code -python. Une fois ouvert dans emacs, ce document peut aisément être -exporté au format HTML, PDF, et Office. Pour plus de détails sur -org-mode vous pouvez consulter https://orgmode.org/guide/. +#+RESULTS: -Lorsque vous utiliserez le raccourci =C-c C-e h o=, ce document sera -compilé en html. Tout le code contenu sera ré-exécuté, les résultats -récupérés et inclus dans un document final. Si vous ne souhaitez pas -ré-exécuter tout le code à chaque fois, il vous suffit de supprimer -le # et l'espace qui sont devant le ~#+PROPERTY:~ au début de ce -document. +* Découpage du text entre les différents personnages -Comme nous vous l'avons montré dans la vidéo, on inclue du code -python de la façon suivante (et on l'exécute en faisant ~C-c C-c~): +Dans un premier temps, on va ouvrir le fichier télécharger. Cela va nous permettre de vérifier l'intégrité des informations. -#+begin_src python :results output :exports both -print("Hello world!") +#+begin_src python :results output :session :exports both +f = open("data.md", "r") +texte = f.read() +f.close() +print(texte[1324:2290]) #+end_src #+RESULTS: -: Hello world! +#+begin_example + ÉLISE. +Non, Valère, je ne puis pas me repentir de tout ce que je fais pour vous. Je m'y sens entraîner par une trop douce puissance, et je n'ai pas même la force de souhaiter que les choses ne fussent pas. Mais, à vous dire vrai, le succès me donne de l'inquiétude ; et je crains fort de vous aimer un peu plus que je ne devrais. + + VALÈRE. +Hé que pouvez-vous craindre, Élise, dans les bontés que vous avez pour moi ? + + ÉLISE. +Hélas ! cent choses à la fois : L'emportement d'un Père ; les reproches d'une Famille ; les censures du monde ; mais plus que tout, Valère, le changement de votre cœur ; et cette froideur criminelle dont ceux de votre Sexe payent le plus souvent les témoignages trop ardents d'une innocente amour. -Voici la même chose, mais avec une session python, donc une -persistance d'un bloc à l'autre (et on l'exécute toujours en faisant -~C-c C-c~). + VALÈRE. +Ah ! ne me faites pas ce tort, de juger de moi par les autres.Soupçonnez-moi de tout, Élise, plutôt que de manquer à ce que je vous dois.Je vous aime trop pour cela ; et mon amour pour vous, durera autant que ma vie. +#+end_example + +Dans un second temps, on va stocker les données dans une liste qui contient les différentes scènes. Dans chacun des éléments de cette liste est contenu la liste des tuples (Personnage, Liste de mots) des différentes répliques. + +Les différentes expressions régulières permettent le découpage du texte comme souhaité. #+begin_src python :results output :session :exports both -import numpy -x=numpy.linspace(-15,15) -print(x) +import re # librarie standard d'analyse regex +texte = texte.replace(" ", "@") # Pour remplacer les tabulation par des @ pour simplifier le parçage + +f = open("data2.md", "w") +f.write(texte) +f.close() +reScene = re.compile(r'\#\#\#[^\.]+([^\#]+)') +reReplique = re.compile(r'@([^\.^\,^\*]+)(\.| \*[^\.]+)([^\@]+)') +reMot = re.compile(r'\w+') + +Scenes = [] + +for scene in reScene.finditer(texte) : + Repliques = [] + for replique in reReplique.finditer(scene.group(1)) : + Mots = [] + for mot in reMot.finditer(replique.group(3)) : + Mots.append(mot.group().lower()) + Repliques.append((replique.group(1), Mots)) + Scenes.append(Repliques) +print(Scenes[16][3]) # vérification visuel des données +#+end_src + +#+RESULTS: +: ('HARPAGON', ['voilà', 'un', 'compliment', 'bien', 'impertinent', 'quelle', 'belle', 'confession', 'à', 'lui', 'faire']) + +Il ne reste plus qu'à compter les différents mots pour avoir le résultat attendu. + +#+begin_src python :results output :session :exports both +CompteurSceneMots = [] +set_nom = set() +for scene in Scenes : + CompteurMots = {} + for replique in scene : + nom, n_mots = replique[0], len(replique[1]) + if nom == "HARPAGO" : + print(replique[1]) + if nom not in CompteurMots.keys() : + CompteurMots[nom] = n_mots + set_nom.add(nom) + else : + CompteurMots[nom] += n_mots + CompteurMots = [(key, value) for key, value in CompteurMots.items()] + CompteurMots.sort(key=lambda x: x[1], reverse=True) + CompteurSceneMots.append(CompteurMots) + +ListePersonnages = list(set_nom) +ListeScenes = [f"Scene {i}" for i in range(len(CompteurSceneMots))] + +print("\nListe des personnages :", ListePersonnages) +print('\nListe des scenes :', ListeScenes) +#+end_src +#+RESULTS: +: +: Liste des personnages : ['LA FLÈCHE', 'ANSELME', 'FROSINE', 'HARPAGON', 'ÉLISE', 'MAÎTRE JACQUES', 'LA MERLUCHE', 'LE COMMISSAIRE', 'CLÉANTE', 'MARIANE', 'BRINDAVOINE', 'VALÈRE', 'MAÎTRE SIMON'] +: +: Liste des scenes : ['Scene 0', 'Scene 1', 'Scene 2', 'Scene 3', 'Scene 4', 'Scene 5', 'Scene 6', 'Scene 7', 'Scene 8', 'Scene 9', 'Scene 10', 'Scene 11', 'Scene 12', 'Scene 13', 'Scene 14', 'Scene 15', 'Scene 16', 'Scene 17', 'Scene 18', 'Scene 19', 'Scene 20', 'Scene 21', 'Scene 22', 'Scene 23', 'Scene 24', 'Scene 25', 'Scene 26', 'Scene 27', 'Scene 28', 'Scene 29', 'Scene 30', 'Scene 31'] +Nous allons maintenant placer ces différentes informations dans un tableau pandas + +#+begin_src python :results output :session :exports both +import pandas as pd +df = pd.DataFrame(columns=ListePersonnages, index=ListeScenes).fillna(0) +for i, scene in enumerate(CompteurSceneMots) : + for personnage, n_mots in scene : + df[personnage][f"Scene {i}"] = float(n_mots) +print(df) + #+end_src #+RESULTS: #+begin_example -[-15. -14.3877551 -13.7755102 -13.16326531 -12.55102041 - -11.93877551 -11.32653061 -10.71428571 -10.10204082 -9.48979592 - -8.87755102 -8.26530612 -7.65306122 -7.04081633 -6.42857143 - -5.81632653 -5.20408163 -4.59183673 -3.97959184 -3.36734694 - -2.75510204 -2.14285714 -1.53061224 -0.91836735 -0.30612245 - 0.30612245 0.91836735 1.53061224 2.14285714 2.75510204 - 3.36734694 3.97959184 4.59183673 5.20408163 5.81632653 - 6.42857143 7.04081633 7.65306122 8.26530612 8.87755102 - 9.48979592 10.10204082 10.71428571 11.32653061 11.93877551 - 12.55102041 13.16326531 13.7755102 14.3877551 15. ] + LA FLÈCHE ANSELME FROSINE HARPAGON ÉLISE MAÎTRE JACQUES LA MERLUCHE LE COMMISSAIRE CLÉANTE MARIANE BRINDAVOINE VALÈRE MAÎTRE SIMON +Scene 0 0 0 0 0 491 0 0 0 0 0 0 630 0 +Scene 1 0 0 0 0 154 0 0 0 762 0 0 0 0 +Scene 2 258 0 0 492 0 0 0 0 0 0 0 0 0 +Scene 3 0 0 0 1160 166 0 0 0 216 0 0 0 0 +Scene 4 0 0 0 282 36 0 0 0 0 0 0 710 0 +Scene 5 903 0 0 0 0 0 0 0 379 0 0 0 0 +Scene 6 12 0 0 171 0 0 0 0 127 0 0 0 197 +Scene 7 0 0 1 21 0 0 0 0 0 0 0 0 0 +Scene 8 302 0 130 0 0 0 0 0 0 0 0 0 0 +Scene 9 0 0 1510 555 0 0 0 0 0 0 0 0 0 +Scene 10 0 0 0 777 3 794 26 0 76 0 23 272 0 +Scene 11 0 0 0 0 0 198 0 0 0 0 0 109 0 +Scene 12 0 0 19 0 0 11 0 0 0 0 0 0 0 +Scene 13 0 0 191 0 0 0 0 0 0 185 0 0 0 +Scene 14 0 0 26 105 0 0 0 0 0 0 0 0 0 +Scene 15 0 0 9 70 17 0 0 0 0 35 0 0 0 +Scene 16 0 0 41 178 0 0 0 0 607 235 0 5 0 +Scene 17 0 0 0 23 0 0 0 0 0 0 20 0 0 +Scene 18 0 0 0 77 0 0 29 0 40 0 0 7 0 +Scene 19 0 0 436 0 58 0 0 0 245 236 0 0 0 +Scene 20 0 0 0 54 3 0 0 0 14 0 0 0 0 +Scene 21 0 0 0 393 0 0 0 0 418 0 0 0 0 +Scene 22 0 0 0 162 0 318 0 0 170 0 0 0 0 +Scene 23 0 0 0 129 0 0 0 0 163 0 0 0 0 +Scene 24 47 0 0 0 0 0 0 0 17 0 0 0 0 +Scene 25 0 0 0 429 0 0 0 0 0 0 0 0 0 +Scene 26 0 0 0 89 0 0 0 109 0 0 0 0 0 +Scene 27 0 0 0 182 0 306 0 159 0 0 0 0 0 +Scene 28 0 0 0 441 0 11 0 0 0 0 0 641 0 +Scene 29 0 0 4 124 11 7 0 0 0 0 0 22 0 +Scene 30 0 403 0 258 0 7 0 0 0 192 0 354 0 +Scene 31 0 114 0 90 0 23 0 26 130 36 0 0 0 #+end_example -Et enfin, voici un exemple de sortie graphique: -#+begin_src python :results output file :session :var matplot_lib_filename="./cosxsx.png" :exports results -import matplotlib.pyplot as plt -plt.figure(figsize=(10,5)) -plt.plot(x,numpy.cos(x)/x) -plt.tight_layout() +Nous allons maintenant afficher les différents résultats avec MatPlotLib -plt.savefig(matplot_lib_filename) -print(matplot_lib_filename) +#+begin_src python :session +import matplotlib.pyplot as plt +import numpy as np + +fig, ax = plt.subplots() +bottom = np.zeros(len(ListeScenes)) +for personnage in ListePersonnages : + p = ax.bar(ListeScenes, df[personnage].values, 0.7, label=personnage, bottom=bottom) + bottom += np.array(df[personnage].values) + +figure = plt.gcf() +ax.set_xticklabels(ax.get_xticks(), rotation = 45) +figure.set_size_inches(20, 10) +plt.legend() +plt.savefig("fig.svg") #+end_src #+RESULTS: -[[file:./cosxsx.png]] - -Vous remarquerez le paramètre ~:exports results~ qui indique que le code -ne doit pas apparaître dans la version finale du document. Nous vous -recommandons dans le cadre de ce MOOC de ne pas changer ce paramètre -(indiquer ~both~) car l'objectif est que vos analyses de données soient -parfaitement transparentes pour être reproductibles. - -Attention, la figure ainsi générée n'est pas stockée dans le document -org. C'est un fichier ordinaire, ici nommé ~cosxsx.png~. N'oubliez pas -de le committer si vous voulez que votre analyse soit lisible et -compréhensible sur GitLab. - -Enfin, n'oubliez pas que nous vous fournissons dans les ressources de -ce MOOC une configuration avec un certain nombre de raccourcis -claviers permettant de créer rapidement les blocs de code python (en -faisant ~