Update exercice_python_fr.org

parent a2f9389b
#+TITLE: Votre titre #+TITLE: Sujet 5 : Analyse des dialogues dans l'Avare de Molière
#+AUTHOR: Votre nom #+AUTHOR: Émile Siboulet
#+DATE: La date du jour #+DATE: 9 octobre
#+LANGUAGE: fr #+LANGUAGE: fr
# #+PROPERTY: header-args :eval never-export # #+PROPERTY: header-args :eval never-export
...@@ -11,83 +11,171 @@ ...@@ -11,83 +11,171 @@
#+HTML_HEAD: <script type="text/javascript" src="http://www.pirilampo.org/styles/lib/js/jquery.stickytableheaders.js"></script> #+HTML_HEAD: <script type="text/javascript" src="http://www.pirilampo.org/styles/lib/js/jquery.stickytableheaders.js"></script>
#+HTML_HEAD: <script type="text/javascript" src="http://www.pirilampo.org/styles/readtheorg/js/readtheorg.js"></script> #+HTML_HEAD: <script type="text/javascript" src="http://www.pirilampo.org/styles/readtheorg/js/readtheorg.js"></script>
* 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 #+RESULTS:
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/.
Lorsque vous utiliserez le raccourci =C-c C-e h o=, ce document sera * Découpage du text entre les différents personnages
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.
Comme nous vous l'avons montré dans la vidéo, on inclue du code Dans un premier temps, on va ouvrir le fichier télécharger. Cela va nous permettre de vérifier l'intégrité des informations.
python de la façon suivante (et on l'exécute en faisant ~C-c C-c~):
#+begin_src python :results output :exports both #+begin_src python :results output :session :exports both
print("Hello world!") f = open("data.md", "r")
texte = f.read()
f.close()
print(texte[1324:2290])
#+end_src #+end_src
#+RESULTS: #+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 VALÈRE.
persistance d'un bloc à l'autre (et on l'exécute toujours en faisant 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.
~C-c C-c~). #+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 #+begin_src python :results output :session :exports both
import numpy import re # librarie standard d'analyse regex
x=numpy.linspace(-15,15) texte = texte.replace(" ", "@") # Pour remplacer les tabulation par des @ pour simplifier le parçage
print(x)
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 #+end_src
#+RESULTS: #+RESULTS:
#+begin_example #+begin_example
[-15. -14.3877551 -13.7755102 -13.16326531 -12.55102041 LA FLÈCHE ANSELME FROSINE HARPAGON ÉLISE MAÎTRE JACQUES LA MERLUCHE LE COMMISSAIRE CLÉANTE MARIANE BRINDAVOINE VALÈRE MAÎTRE SIMON
-11.93877551 -11.32653061 -10.71428571 -10.10204082 -9.48979592 Scene 0 0 0 0 0 491 0 0 0 0 0 0 630 0
-8.87755102 -8.26530612 -7.65306122 -7.04081633 -6.42857143 Scene 1 0 0 0 0 154 0 0 0 762 0 0 0 0
-5.81632653 -5.20408163 -4.59183673 -3.97959184 -3.36734694 Scene 2 258 0 0 492 0 0 0 0 0 0 0 0 0
-2.75510204 -2.14285714 -1.53061224 -0.91836735 -0.30612245 Scene 3 0 0 0 1160 166 0 0 0 216 0 0 0 0
0.30612245 0.91836735 1.53061224 2.14285714 2.75510204 Scene 4 0 0 0 282 36 0 0 0 0 0 0 710 0
3.36734694 3.97959184 4.59183673 5.20408163 5.81632653 Scene 5 903 0 0 0 0 0 0 0 379 0 0 0 0
6.42857143 7.04081633 7.65306122 8.26530612 8.87755102 Scene 6 12 0 0 171 0 0 0 0 127 0 0 0 197
9.48979592 10.10204082 10.71428571 11.32653061 11.93877551 Scene 7 0 0 1 21 0 0 0 0 0 0 0 0 0
12.55102041 13.16326531 13.7755102 14.3877551 15. ] 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 #+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)) Nous allons maintenant afficher les différents résultats avec MatPlotLib
plt.plot(x,numpy.cos(x)/x)
plt.tight_layout()
plt.savefig(matplot_lib_filename) #+begin_src python :session
print(matplot_lib_filename) 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 #+end_src
#+RESULTS: #+RESULTS:
[[file:./cosxsx.png]] : None
Vous remarquerez le paramètre ~:exports results~ qui indique que le code [[file:./fig.svg]]
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 ~<p~, ~<P~ ou ~<PP~ suivi de ~Tab~).
Maintenant, à vous de jouer! Vous pouvez effacer toutes ces
informations et les remplacer par votre document computationnel.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment