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

fig.svg

Date: 9 octobre

Auteur: Émile Siboulet

Created: 2023-10-09 lun. 19:49