Sujet 5 : Analyse des dialogues dans l’Avare de Molière
Table des matières
1. 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.
wget -O data.md http://dramacode.github.io/markdown/moliere_avare.txt
2. 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.
f = open("data.md", "r") texte = f.read() f.close() print(texte[1324:2290])
É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.
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é.
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
('HARPAGON', ['voilà', 'un', 'compliment', 'bien', 'impertinent', 'quelle', 'belle', 'confession', 'à', 'lui', 'faire'])
3. Étude statistique
Il ne reste plus qu’à compter les différents mots pour avoir le résultat attendu.
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)
Liste des personnages : ['ANSELME', 'MARIANE', 'LA FLÈCHE', 'VALÈRE', 'HARPAGON', 'BRINDAVOINE', 'MAÎTRE SIMON', 'CLÉANTE', 'LA MERLUCHE', 'LE COMMISSAIRE', 'ÉLISE', 'MAÎTRE JACQUES', 'FROSINE'] 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
4. Export graphique des résultats
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)
ANSELME MARIANE LA FLÈCHE VALÈRE HARPAGON BRINDAVOINE ... CLÉANTE LA MERLUCHE LE COMMISSAIRE ÉLISE MAÎTRE JACQUES FROSINE Scene 0 0 0 0 630 0 0 ... 0 0 0 491 0 0 Scene 1 0 0 0 0 0 0 ... 762 0 0 154 0 0 Scene 2 0 0 258 0 492 0 ... 0 0 0 0 0 0 Scene 3 0 0 0 0 1160 0 ... 216 0 0 166 0 0 Scene 4 0 0 0 710 282 0 ... 0 0 0 36 0 0 Scene 5 0 0 903 0 0 0 ... 379 0 0 0 0 0 Scene 6 0 0 12 0 171 0 ... 127 0 0 0 0 0 Scene 7 0 0 0 0 21 0 ... 0 0 0 0 0 1 Scene 8 0 0 302 0 0 0 ... 0 0 0 0 0 130 Scene 9 0 0 0 0 555 0 ... 0 0 0 0 0 1510 Scene 10 0 0 0 272 777 23 ... 76 26 0 3 794 0 Scene 11 0 0 0 109 0 0 ... 0 0 0 0 198 0 Scene 12 0 0 0 0 0 0 ... 0 0 0 0 11 19 Scene 13 0 185 0 0 0 0 ... 0 0 0 0 0 191 Scene 14 0 0 0 0 105 0 ... 0 0 0 0 0 26 Scene 15 0 35 0 0 70 0 ... 0 0 0 17 0 9 Scene 16 0 235 0 5 178 0 ... 607 0 0 0 0 41 Scene 17 0 0 0 0 23 20 ... 0 0 0 0 0 0 Scene 18 0 0 0 7 77 0 ... 40 29 0 0 0 0 Scene 19 0 236 0 0 0 0 ... 245 0 0 58 0 436 Scene 20 0 0 0 0 54 0 ... 14 0 0 3 0 0 Scene 21 0 0 0 0 393 0 ... 418 0 0 0 0 0 Scene 22 0 0 0 0 162 0 ... 170 0 0 0 318 0 Scene 23 0 0 0 0 129 0 ... 163 0 0 0 0 0 Scene 24 0 0 47 0 0 0 ... 17 0 0 0 0 0 Scene 25 0 0 0 0 429 0 ... 0 0 0 0 0 0 Scene 26 0 0 0 0 89 0 ... 0 0 109 0 0 0 Scene 27 0 0 0 0 182 0 ... 0 0 159 0 306 0 Scene 28 0 0 0 641 441 0 ... 0 0 0 0 11 0 Scene 29 0 0 0 22 124 0 ... 0 0 0 11 7 4 Scene 30 403 192 0 354 258 0 ... 0 0 0 0 7 0 Scene 31 114 36 0 0 90 0 ... 130 0 26 0 23 0 [32 rows x 13 columns]
Nous allons maintenant afficher les différents résultats avec MatPlotLib
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")
/tmp/babel-lfQl8f/python-71oYSL:11: UserWarning: FixedFormatter should only be used together with FixedLocator ax.set_xticklabels(ax.get_xticks(), rotation = 45)
Ce qui nous donne le graphique suivant. Il représente le nombre de mot en fonction de la scène des différents personnages