#+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
#+HTML_HEAD:
#+HTML_HEAD:
#+HTML_HEAD:
#+HTML_HEAD:
#+HTML_HEAD:
#+HTML_HEAD:
* 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
#+RESULTS:
* Découpage du text entre les différents personnages
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 :session :exports both
f = open("data.md", "r")
texte = f.read()
f.close()
print(texte[1324:2290])
#+end_src
#+RESULTS:
#+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.
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 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
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
Nous allons maintenant afficher les différents résultats avec MatPlotLib
#+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:
: None
[[file:./fig.svg]]