{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Sujet 5 : Analyse des dialogues dans l'Avare de Molière"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"__Rappel du contexte du sujet__ :\n",
"\n",
"L’Observatoire de la vie littéraire ([OBVIL](http://obvil.sorbonne-universite.site/obvil/presentation)) promeut une approche de l'analyse des textes littéraires fondée sur le numérique. \n",
"Dans le cadre du [Projet Molière](http://obvil.sorbonne-universite.site/projets/projet-moliere), des pièces de cet auteur ont été numérisées et sont accessibles librement dans différents formats utilisables par un programme informatique. \n",
"\n",
"Grâce à ces numérisations, il est possible d'écrire des programmes pour réaliser des analyses syntaxiques et sémantiques. Ce sujet se propose de reproduire une étude réalisée par l'OBVIL sur les dialogues de l'Avare de Molière.\n",
"\n",
"__Rappel des objectifs de ce sujet__ :\n",
"\n",
"1. Classez les personnages selon la quantité de parole grâce à une analyse syntaxique du texte (scènes / répliques / mots). En particulier, quel est celui qui parle le plus ? Quel est celui qui ne parle pas du tout ? Attention, les noms des personnages ne sont pas forcément homogènes (casse et accents par exemple).\n",
"2. Réalisez un graphique qui montrera le nombre de mots que chaque acteur prononce dans chaque scène. Pour cela, vous pouvez vous inspirer de l'[étude de l'Avare de Molière réalisée par l'OBVIL](https://obvil.sorbonne-universite.fr/corpus/moliere/moliere_avare) (graphe de gauche). Dans ce graphique, les lignes sont de longueur égale et la hauteur représente le nombre de mots prononcés au total dans la scène. La largeur de chaque rectangle indique le pourcentage de la scène qu’un acteur occupe. \n",
"3. Facultatif : Construisez un graphe d’interlocution permettant de visualiser les échanges entre les personnages. Pour cela, vous pouvez vous inspirer de l'[étude de l'Avare de Molière réalisée par l'OBVIL](https://obvil.sorbonne-universite.fr/corpus/moliere/moliere_avare) (graphe de droite).\n",
"\n",
"La version numérisée que l'on se propose d'utiliser est le fichier texte au format markdown disponible ici [moliere_avare](http://dramacode.github.io/markdown/moliere_avare.txt)."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"data_url = \"http://dramacode.github.io/markdown/moliere_avare.txt\""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"On va s'assurer qu'un fichier texte en local au format markdown contienne la pièce. Si le fichier \"moliere_avare.md\" existe on considère que c'est bon et s'il n'existe pas nous allons télécharger le contenu disponible à l'URL renseignée ci-dessus et l'écrire dans ce fichier local \"moliere_avare.md\". "
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"from os import path as pth\n",
"import requests\n",
"\n",
"local_filename = \"moliere_avare.md\"\n",
"# Si le fichier csv des données d'incidence existe en local\n",
"# il n'est pas nécessaire de le télécharger par l'URL\n",
"if not pth.exists(local_filename):\n",
" print(\"Le fichier local contenant la pièce de théâtre n'existe pas.\")\n",
" # Si le fichier n'existe pas en local dans le dossier courant\n",
" # nous téléchargons les données et les écrivons\n",
" # dans un fichier en local\n",
" # Téléchargement des données\n",
" response = requests.get(data_url)\n",
" # Ecriture des données téléchargées dans le fichier local\n",
" with open(local_filename, \"wb\") as f:\n",
" f.write(response.content)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Maintenant que nous sommes assurés d'avoir un fichier en local contenant le texte de l'Avare dont on va faire l'analyse, on va donc l'ouvrir, parcourir son contenu et le traiter au fur et à mesure.\n",
"\n",
"Ce que l'on sait déjà c'est que l'on va devoir créer une structure de données pour l'analyse.\n",
"On va passer par la bibliothèque Pandas et la création d'un dataframe, permettant de différencier les différents personnages et de qualifier leur \"activité\" au travers des différents actes et scènes. Néanmoins, après avoir parcouru le web, il est recommandé de passer par une structure intermédiaire pour la création du dataframe pandas. Nous allons choisir la structure de données native de python des dictionnaires en tant que structure de données intermédiaire. \n",
"\n",
"Il y a plusieurs choses auxquelles il est déjà nécessaire de penser vis-à-vis de la problématique posée et des représentations graphiques demandées, notamment celle relative à la question facultative.\n",
"\n",
"Pour commencer, afin d'obtenir une bonne lisibilité des graphiques, il sera intéressant d'associer à chaque personnage une couleur différente.\n",
"\n",
"Ensuite, la question facultative demande de déterminer à qui s'adresse chaque réplique afin d'avoir le graphe directionnel des interactions entre les personnages de la pièce. La structure de données devra donc permettre de savoir pour chaque réplique l'auteur mais aussi le destinataire de cette dernière. Ce sont des informations assez simples à obtenir mais à prendre en compte dans la manière de \"parser\" le fichier texte."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"# On va d'ores et déjà utiliser une instruction afin que les graphiques s'affichent directement au sein du notebook\n",
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"# On déclare l'utilisation de la bibliothèque pandas et on crée également le dictionnaire\n",
"# qui va nous servir d'intermédiaire avant la création du dataframe pandas\n",
"import pandas as pd\n",
"# Le dictionnaire établi une structure en tableau à 5 colonnes permettant d'enregistrer\n",
"# l'auteur, le destinataire, l'acte, la scène, ainsi que la longueur en termes de mots \n",
"# pour chaque réplique de la pièce\n",
"avareAnalysisDict = {'author':[],'recipient':[],'act':[],'scene':[],'speech_length':[]}\n",
"textDataSynthesisTableDf = None\n",
"\n",
"# Nous créons également d'ores et déjà un dictionnaire des personnages de la scène\n",
"# permettant d'enregistrer les informations de liens avec les autres personnages\n",
"# de définir une couleur de représentation.\n",
"\n",
"# Ce dictionnaire est initialisé vide car il sera rempli en utilisant le nom de chaque personnage\n",
"# comme clés associées à des valeurs qui seront des dictionnaires à deux entrées\n",
"# 'links' donnant les liens avec les autres personnages sous la forme d'une liste\n",
"# 'color' permettant de régler une couleur de représentation\n",
"avarePersoDict = {}"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Afin de parser le fichier en s'appuyant notamment sur les symboles de titres utilisés par le format Markdown,\n",
"il nous faut avoir recours à l'utilisation d'un outil d'analyse des expressions régulières (cf. [Wikipedia_Expression_régulière](https://fr.wikipedia.org/wiki/Expression_r%C3%A9guli%C3%A8re)). La bibliothèque\n",
"[re](https://docs.python.org/3/library/re.html) disponible nativement dans python permet de faire ce travail.\n",
"Un rapide parcours du fichier montre que:\n",
"- les actes sont indiqués par des titres header 2, par une ligne commençant par ##\n",
"- les scènes sont indiquées par des titres header 3, par une ligne commençant par ###\n",
"- que les personnages d'une scène sont donnés sur la ligne suivant l'indication de la scène\n",
"- que la ligne précédant chaque réplique contient le \"nom\" de son auteur en majuscule\n",
"\n",
"Voici un extrait illustrant ces propos:\\\n",
"\"\\\n",
"_\\##_ _Acte_ _Premier_.\n",
"\n",
"\n",
"_\\### Scène Première.\\\n",
"Valère, Élise_\n",
"\n",
"\n",
" VALÈRE.\n",
"_Hé quoi, charmante Élise, vous devenez mélancolique, après les obligeantes assurances que vous avez eu la bonté de me donner de votre foi ?Je vous vois soupirer, hélas, au milieu de ma joie !Est-ce du regret, dites-moi, de m'avoir fait heureux ? et vous repentez-vous de cet engagement où mes feux ont pu vous contraindre ?_\n",
"\n",
" ÉLISE.\n",
"_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._\n",
"\\\n",
"\""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"*Nota Bene*:\n",
"En continuant à travailler sur le sujet et en approfdondissant le parcours du texte, on peut se rendre compte qu'il y a parfois quelques indications de mise en scène qui viennent perturber ce schéma. Différente options s'offrent à nous:\n",
"- modifier le texte afin d'utiliser les mécanismes du markdown et mettre ces indications en italiques ou en gras --> utilisations de balises permettant de reconnaître facilement ces éléments\n",
"- ou bien repérer les numéros de ces lignes car il n'y en pas beaucoup afin de les ignorer (il nous faudra alors un moyen de connaître dans les fonctions d'analyse le numéro de la ligne du fichier en cours d'analyse.)\n",
"- pour être plus générique, l'idéal serait d'avoir un traitement intelligent, un réseaux de neurones par exemple spécialisé dans l'analyse du langage pour identifier ces éléments de mis en scène.\n",
"\n",
"De plus les lignes indiquant la fin des actes sont également à ignorer en tant que réplique. Il y a au moins une scène ne donnant pas la liste des personnages, Harpagon étant le seul protagoniste, il faudra prendre en compte ce cas. Pour finir, deux lignes du fichier texte posent encore un problème:\n",
"- une ligne du fichier texte possède à sa fin, une déclaration de fin d'acte, ce qui tranche avec le schéma global,\n",
"- la dernière ligne du texte comprend la balise indiquant la fin de la pièce.\n",
"\n",
"On traitera ces deux cas particulier dans la fonction de comptage des mots d'une ligne de texte."
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"# Déclaration des numéros de lignes à ignorer\n",
"playInstructionsLineNumbersList = [201, 204, 213, 251, 272, 384, 623, 782, 815, 1280, 1283,\\\n",
" 1342, 1369, 1411, 1527, 1610, 1633, 1665, 1866, 1874, 1970, \\\n",
" 2299, 2319, 2327, 2357, 2521, 2524]"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"import re\n",
"import copy"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'ACTEURS.'"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Chaîne de caractère indiquant le début d'analyse et de récupération des personnages\n",
"persoCaptureStartLine = \"# ACTEURS.\"\n",
"# L'expression régulière suivante permet de valider qu'une chaîne de caractère\n",
"# contenue dans une ligne lue correspond à la ligne précédant la définition\n",
"# de la liste des personnages\n",
"m = re.search('(?<=# )ACTEURS\\.$', persoCaptureStartLine)\n",
"m.group(0)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"En effet, le résultats obtenus n'est pas un objet null, à savoir une valeur None en python"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"\"Harpagon, Père de Cléante et d'Élise, et Amoureux de Mariane\""
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Exemple d'une ligne de la liste des personnages\n",
"persoLineExample = \" – Harpagon, Père de Cléante et d'Élise, et Amoureux de Mariane.\"\n",
"# L'expression régulière proposée est la suivante\n",
"# On cherche une chaîne de caractères commencant par une majuscule --> [A-ZÀ-Ÿ]{1}\n",
"# potentiellement accentuée et ensuite composées de lettres potentiellement\n",
"# accentuées elles aussi, contenant des espaces, des virgules, des apostrophes --> [a-zA-ZÀ-ÿ\\s,\\']+\n",
"# et précédée d'un espace suivi d'un tiret suivi d'un espace (ce n'est pas le tiret du 6) --> (?<=\\s–\\s)\n",
"# , chaîne de caractères qui ne sera pas capturée\n",
"m1 = re.search('(?<=\\s–\\s)[A-ZÀ-Ÿ]{1}[a-zA-ZÀ-ÿ\\s,\\']+',persoLineExample)\n",
"m1.group(0)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Voici un lien vers un site de test en ligne d'expressions régulières python \\([regexp_test](https://pythex.org/)\\) qui a aidé à mettre en place l'expression régulière précédente."
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"# Fonction qui permet d'extraire la liste des personnages\n",
"# de la stocker dans un dictionnaire en parcourant ligne par ligne\n",
"# un fichier texte passé en entrée.\n",
"def fill_perso_dict(fileToAnalyse, emptyPersoDict):\n",
" \"\"\"\n",
" Fonction remplissant un dictionnaire d'entrée avec la liste\n",
" des personnages de la pièce de théâtre lue dans le fichier\n",
" passé en entrée. On considère que le fichier en entrée est lu\n",
" à partir du début, de sa première ligne.\n",
" \n",
" :param fileToAnalyse: pointeur obtenu par ouverture d'un fichier\n",
" :param emptyPersoDict: dictionnaire à remplir par la fonction\n",
" :return: numéro de la dernière ligne lue\n",
" \"\"\"\n",
" lineNum = 0\n",
" currentLine = fileToAnalyse.readline()\n",
" lineNum += 1\n",
" isStartPersoListLine = False\n",
" while (currentLine and not isStartPersoListLine):\n",
" m = re.search('(?<=# )ACTEURS\\.$', currentLine)\n",
" if m is not None:\n",
" isStartPersoListLine = True\n",
" currentLine = fileToAnalyse.readline()\n",
" lineNum += 1\n",
" \n",
" # La lecture s'est arrêtée car la ligne de début de définition de la liste des personnages a été rencontrée.\n",
" # Nous avons néanmoins lu la ligne suivante qui est obligatoirement un personnage.\n",
" # Nous devons maintenant lire ligne par ligne, la liste des personnages au format suivant:\n",
" # \"- NomPersonnage, lien, lien, ...\"\n",
" # Ainsi dès que la ligne ne commence plus par un tiret nous pouvons arrêter la lecture et le remplissage\n",
" # du dictionnaire.\n",
" isAPersoLine = True\n",
" # On extrait la chaîne de caractères qui nous intéresse\n",
" m = re.search('(?<=\\s–\\s)[A-ZÀ-Ÿ]{1}[a-zA-ZÀ-ÿ\\s,\\']+', persoLineExample)\n",
" extractedString = m.group(0)\n",
" while (currentLine and isAPersoLine):\n",
" # Traitement de la ligne courante qui est obligatoirement\n",
" # une ligne listant un personnage de la pièce.\n",
" # Comme le montre l'exemple au-dessus, le nom ainsi que\n",
" # les différents types de liens sont séparés par une virgule.\n",
" parts = extractedString.split(',')\n",
" # La ligne au-dessus crée une liste dont chaque élément\n",
" # est séparé par des virgules\n",
" # typiquement \"tata, titi, toto\".split(',') --> ['tata', ' titi', ' toto']\n",
" # Création d'un dictionnaire vide temporaire pour enregistrer les liens\n",
" # ainsi que la couleur à paramétrer\n",
" persoCaracs = {\"links\":[],\"color\":None}\n",
" # On va traiter la ligne particulière qui introduit\n",
" # le commissaire ainsi que son clerc\n",
" m = re.match(\"le commissaire\", parts[0], re.IGNORECASE)\n",
" if not m:\n",
" # Ce n'est pas la ligne du commissaire\n",
" # Le premier élément donne le nom du personnage, indice 0 de la liste\n",
" # Les éléments suivants donnent les liens avec les autres personnages\n",
" # On parcours le reste de ces derniers\n",
" for elt in parts[1:]:\n",
" # En regardant cette partie dans le fichier,\n",
" # on voit que soit les parties commencent\n",
" # par un espace et une lettre,\n",
" # soit un espace et un \"et\" que l'on ne\n",
" # souhaite pas capturer\n",
" # On vérifie si l'élément commence par \" et \" ou non\n",
" if elt.startswith(\" et \"):\n",
" # L'élément commence bien par \" et \"\n",
" # on enlève cette partie\n",
" currentLink = elt[4:]\n",
" else:\n",
" # Ce n'est pas le cas, on enlève juste\n",
" # l'espace\n",
" currentLink = elt[1:]\n",
" persoCaracs[\"links\"].append(currentLink)\n",
" # Fin de la boucle for\n",
" # On enregistre le dictionnaire temporaire des caractéristiques\n",
" # du personnage courant rempli, dans le dictionnaire\n",
" # global des personnages\n",
" emptyPersoDict[parts[0]] = persoCaracs\n",
" else:\n",
" # C'est la ligne du commissaire,\n",
" # la seconde partie définit le personnage du clerc\n",
" # et commence par \" et \" \n",
" emptyPersoDict[parts[0]] = persoCaracs\n",
" # On fait une copie profonde pour ne pas\n",
" # que l'objet partage la même adresse mémoire\n",
" clercCaracs = copy.deepcopy(persoCaracs)\n",
" clercCaracs[\"links\"].append(\"assistant du commissaire\")\n",
" emptyPersoDict[parts[1][4:]] = clercCaracs\n",
" \n",
" currentLine = fileToAnalyse.readline()\n",
" lineNum += 1\n",
" m = re.search('(?<=\\s–\\s)[A-ZÀ-Ÿ]{1}[a-zA-ZÀ-ÿ\\s,\\']+', currentLine)\n",
" if m is not None:\n",
" extractedString = m.group(0)\n",
" else:\n",
" isAPersoLine = False\n",
" \n",
" # Fin de la boucle while\n",
" \n",
" return lineNum"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Définition de la fonction permettant de compter le nombre de mots d'une ligne constituant une réplique. Pour implémenter celle-ci nous nous sommes apuuyer sur des informations glannées au travers de la consultation de plusieurs pages internet et notamment la suivante [geeksforgeeks_comptage_de_mots_dans_une_phrase](https://www.geeksforgeeks.org/python-program-to-count-words-in-a-sentence/). Nous nous sommes également appuyer sur le site de test des expressions régulières et avons également fait des tests dans la ligne de commande python.\n",
"Pour traiter plus facilement le comptage des mots, nous allons nous servir du module natif string de python et allons donc importer celui-ci, pour utiliser l'atribut punctuation."
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
"import string"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [],
"source": [
"def count_words(speechLine):\n",
" \"\"\"\n",
" Fonction qui compte le nombre de mots contenus dans une ligne de texte.\n",
" \n",
" :param speechLine: ligne de texte en entrée dont il faut compter le nombre de mots\n",
" :return: nombre de mots contenu dans la chaîne de caractère analysée\n",
" \"\"\"\n",
" # Création d'une variable temporaire contenant la chaîne de caractère à traiter\n",
" strToProcess = speechLine\n",
" # Définition de l'expression régulière permettant d'exclure la déclaration de fin d'acte\n",
" # à la fin de la ligne dans le cas particulier, on cherche un enchaînement de n'importe\n",
" # quels caractères suivi d'un texte de la forme \"Fin du nième Acte\"\n",
" patternExcludingActEndDeclaration = re.compile('(.+)(?=Fin du [a-zA-ZÀ-ÿ]+ Acte)')\n",
" # Définition de l'expression régulière permettant d'exclure la déclaration de fin de la pièce\n",
" # sur le même principe que la précédente\n",
" patternExcludingPieceEndDeclaration = re.compile('(.+)(?=< Fin >)')\n",
" # Réalisons le matching du premier pattern\n",
" m = patternExcludingActEndDeclaration.match(speechLine)\n",
" # Si le résultat n'est pas vide c'est que nous sommes dans le cas particulier\n",
" # et qu'il faut travailler sur la chaîne résultat de la fonction match.\n",
" if m:\n",
" strToProcess = m.group(0)\n",
" \n",
" # Maintenant réalisons le matching du second pattern\n",
" m1 = patternExcludingPieceEndDeclaration.match(speechLine)\n",
" if m1:\n",
" strToProcess = m1.group(0)\n",
" # Maintenant, grâce au module string, contruisons une expression régulière qui va chercher toute suite\n",
" # de plus de 1 caractère excluant les espaces et signes de ponctuations \n",
" wordsPattern = re.compile(\"[^{}\\s]+\".format(string.punctuation))\n",
" # Traitons la chaîne de caractères avec la fonction de regexp findall\n",
" # qui va extraire toutes les occurances du pattern recherché.\n",
" # Cela va nous donner en sortie la liste des mots de la chaîne traitée\n",
" # en considérant par exemple l'article \"l'\", la contraction du pronom je en \"j'\"\n",
" # comme des mots.\n",
" speechPartWordsList = re.findall(wordsPattern,strToProcess)\n",
" # Le nombre de mots est donc la taille de cette liste,\n",
" # retournons la en sortie.\n",
" return len(speechPartWordsList)\n",
" "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Définition de la fonction principale d'analyse du fichier texte générant un tableau de données de synthèse.\n",
"Pour la création d'un dataframe pandas à partir d'un dictionnaire cf. [DataFrame.from_dict](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.from_dict.html)."
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"def generate_text_synthesis_data_table(fileToAnalyse, persoDict, emptyAnalysisDict, lineNum):\n",
" \"\"\"\n",
" Fonction principale d'analyse du texte générant un dataframe pandas\n",
" de synthèse des informations permettant l'analyse globale.\n",
" \n",
" :param fileToAnalyse: pointeur obtenu par ouverture d'un fichier\n",
" :param persoDict: dictionnaire donnant la liste des personnages de la pièce\n",
" :param emptyAnalysisDict: dictionnaire à remplir par la fonction\n",
" :param lineNum: numéro de le ligne à partir de laquelle nous commencons la lecture\n",
" :return: dataframe pandas dont le template est donné par le dictionnaire\n",
" \"\"\"\n",
" currentLine = fileToAnalyse.readline()\n",
" lineNum += 1\n",
" # Expression régulière de détection de déclaration des actes\n",
" # Ligne qui commence par exactement 2 #, ni plus ni moins, donc tout autre caractère qu'un #\n",
" actLinePattern = re.compile('^#{2}[^#]')\n",
" # Expression régulière de détection de déclaration des scènes\n",
" # Ligne qui commence par exactement 3 #, ni plus ni moins, donc tout autre caractère qu'un #\n",
" sceneLinePattern = re.compile('^#{3}[^#]')\n",
" # Variable pour enregistrer le numéro de l'acte courant\n",
" actNum = 0\n",
" # Variable pour enregistrer le numéro de la scène courante\n",
" sceneNum = 0\n",
" # Variable indiquant si la ligne précédente déclare une scène\n",
" previousLineIsScene = False\n",
" # Variable contenant l'auteur courant de la réplique analysée\n",
" # Nous l'initialisons à la valeur vide None\n",
" currentAuthor = None\n",
" # Variable donnant le nombre de mots de la réplique courante\n",
" # analysée. On l'initialise à 0.\n",
" currentSpeechLen = 0\n",
" \n",
" # Boucle principale de parcours du fichier texte\n",
" while (currentLine):\n",
" if actLinePattern.match(currentLine):\n",
" # Déclaration d'un acte de la pièce\n",
" # On incrémente le numéro d'acte\n",
" actNum += 1\n",
" # Si ce n'est pas le premier acte,\n",
" # il faut traiter le cas de la dernière réplique de\n",
" # de la dernière scène de l'acte précédent.\n",
" # On considère que l'auteur courant s'adresse forcément\n",
" # au dernier auteur enregistré.\n",
" if actNum > 1:\n",
" # Récupération du dernier élément de la colonne des auteurs\n",
" # qui est l'auteur de la réplique précédente\n",
" previousAuthor = emptyAnalysisDict['author'][-1]\n",
" if len(scenePersoList)==1:\n",
" # Si la liste des personnages ne contient qu'un\n",
" # seul protagoniste, c'est la scène qui fait exception\n",
" # avec Harpagon.\n",
" previousAuthor = 'Harpagon'\n",
" emptyAnalysisDict['author'].append(currentAuthor)\n",
" emptyAnalysisDict['recipient'].append(previousAuthor)\n",
" # On a incrémenté le numéro d'acte, il faut donc \n",
" # le décrémenté pour obtenir celui concerné\n",
" # par la réplique considérée ici.\n",
" emptyAnalysisDict['act'].append(actNum-1)\n",
" emptyAnalysisDict['scene'].append(sceneNum)\n",
" emptyAnalysisDict['speech_length'].append(currentSpeechLen)\n",
" # On remet à zéro le numéro de la scène\n",
" sceneNum = 0\n",
" elif sceneLinePattern.match(currentLine):\n",
" # Déclaration d'une scène de la pièce\n",
" # On incrémente le numéro de scène\n",
" sceneNum += 1\n",
" # Si ce n'est pas la première scène de l'acte,\n",
" # il faut traiter le cas de la dernière réplique.\n",
" # On considère que l'auteur courant s'adresse forcément\n",
" # au dernier auteur enregistré.\n",
" if (sceneNum > 1):\n",
" # Récupération du dernier élément de la colonne des auteurs\n",
" # qui est l'auteur de la réplique précédente\n",
" previousAuthor = emptyAnalysisDict['author'][-1]\n",
" emptyAnalysisDict['author'].append(currentAuthor)\n",
" emptyAnalysisDict['recipient'].append(previousAuthor)\n",
" emptyAnalysisDict['act'].append(actNum)\n",
" emptyAnalysisDict['scene'].append(sceneNum-1)\n",
" emptyAnalysisDict['speech_length'].append(currentSpeechLen)\n",
" \n",
" # On met temporairement la variable\n",
" # previousLineIsScene à vrai pour indiquer\n",
" # que l'on a détecté le début d'une scène\n",
" previousLineIsScene = True\n",
" # On déclare la liste des protagonistes de la scène courante\n",
" scenePersoList = []\n",
" # On réinitialise les autres variables de l'auteur et de la taille d'une réplique\n",
" currentAuthor = None\n",
" currentSpeechLen = 0\n",
" else:\n",
" # La ligne courante est une ligne autre,\n",
" # comme on a pu le voir dans l'exemple un peu plus haut\n",
" # elle peut être:\n",
" # - vide\n",
" # - une déclaration des personnages de la scène\n",
" # - une identification de l'auteur de la réplique qui va suivre\n",
" # - une ligne composant une réplique\n",
" # - une ligne donnant des indications sur la mise en scène\n",
" # - une ligne indiquant la fin d'un acte\n",
" if not previousLineIsScene:\n",
" # La ligne courante ne contient forcément pas la liste des protagonistes de la scène\n",
" # Testons si la ligne est vide auquel cas on peut quasiment passer directement à la suivante.\n",
" # Notons qu'une chaîne de caractères vide est interprêtées par python comme une valeur booléénne fausse\n",
" if currentLine:\n",
" # La ligne n'est pas vide, c'est soit la déclaration de l'auteur d'une réplique,\n",
" # soit une ligne constituant une réplique.\n",
" # On va donc traiter cette ligne soit de manière à identifier l'auteur qui,\n",
" # il faut le noter est le destinataire de la réplique de l'auteur précédent,\n",
" # soit de manière à compter le nombre de mots total d'une réplique afin\n",
" # de remplir avec toutes les informations glannées à cette étape\n",
" # de synthèse des données de la pièce.\n",
" # On peut noter également que l'on peut facilement différencier les lignes de répliques\n",
" # des lignes donnant l'auteur d'une réplique. En effet, les lignes de répliques commencent\n",
" # par une lettre majuscule tandis que les lignes donnant l'auteur d'une réplique\n",
" # commencent par des espaces.\n",
" if currentLine.startswith(\" \"):\n",
" # La ligne commence avec un espace, elle déclare donc l'auteur d'une réplique\n",
" # on va parcourir la liste des protagonistes de la scène et identifier l'auteur\n",
" for perso in scenePersoList:\n",
" # On fait une recherche ignorant si les lettres sont en majuscules ou minuscules\n",
" # grâce à l'option passée à la fonction de recherche d'expression régulière\n",
" # re.IGNORECASE. On traite également du problèe posé par les maitre/maîtres\n",
" # car les valeurs utilisées dans scenePersoList sont celles issues du dictionnaire\n",
" # des personnages créé à partir de la liste en début de pièce.\n",
" persoRegex = perso\n",
" if perso.startswith(\"Maitre\"):\n",
" persoRegex = persoRegex.replace('Maitre','Maître')\n",
" m = re.search(persoRegex, currentLine, re.IGNORECASE)\n",
" if m:\n",
" # le résultats de la recherche n'est pas vide, l'auteur est trouvé.\n",
" # Vérifions si quelqu'un a déjà parlé dans la scène auquel cas l'auteur\n",
" # courant est le destinataire de l'auteur précédent.\n",
" if currentAuthor is not None:\n",
" # Il y avait déjà un auteur d'une réplique, currentAuthor\n",
" # le nouvel auteur est donc le destinataire de la réplique précédente.\n",
" # On peut maintenant remplir le dictionnaire pour la réplique précédente,\n",
" # car nous avons toutes les informations nécessaires sur celles-ci.\n",
" # Pour rappel, la structure du dictionnaire,\n",
" # {'author':[],'recipient':[],'act':[],'scene':[],'speech_length':[]}\n",
" emptyAnalysisDict['author'].append(currentAuthor)\n",
" emptyAnalysisDict['recipient'].append(perso)\n",
" emptyAnalysisDict['act'].append(actNum)\n",
" emptyAnalysisDict['scene'].append(sceneNum)\n",
" emptyAnalysisDict['speech_length'].append(currentSpeechLen)\n",
" # On réinitialise la variable mesurant le nombre de mot d'une réplique\n",
" currentSpeechLen = 0\n",
" # Fin du si sur le test de savoir si il y a un auteur d'une réplique\n",
" # précédent \n",
" # Dans tous les cas l'auteur courant est donné par la valeur \"perso\"\n",
" # qui a été trouvée dans la ligne.\n",
" currentAuthor = perso\n",
" # Le break permet d'arrêter la boucle for car l'auteur courant a été identifié\n",
" break\n",
" \n",
" else:\n",
" isNotActEndDeclarationLine = not currentLine.startswith(\"Fin du\")\n",
" isNotPlayInstructionRoleLine = lineNum not in playInstructionsLineNumbersList\n",
" # Si nous ne sommes pas dans le cas d'une ligne de déclaration de fin d'acte\n",
" # ou bien d'une ligne d'instructions de mise en scène, nous sommes\n",
" # dans le cas d'une ligne qui constitue une réplique.\n",
" # Dans ce cas, comptons le nombre de mots de celle-ci et ajoutons le au nombre de mots\n",
" # déjà comptabilisé pour la réplique en cours.\n",
" # Nous faison appel ici à une fonction spécialisée dans le comptage des mots d'une ligne.\n",
" if isNotActEndDeclarationLine and isNotPlayInstructionRoleLine:\n",
" # Afin d'illustrer le traitement et vérifier que tout se passe bien\n",
" # nous allons afficher les sorties pour la première scène de l'acte premier\n",
" nbWords = count_words(currentLine)\n",
" #if actNum==1 and sceneNum==1:\n",
" # print(\"Ligne de dialogue : {}\".format(currentLine))\n",
" # print(\"Nombre de mots comptés : {:d}\".format(nbWords))\n",
" currentSpeechLen += nbWords\n",
" # Il faut tester si c'est la dernière ligne de la pièce\n",
" # et mettre à jour le dictionnaire dans ce seul cas\n",
" patternExcludingPieceEndDeclaration = re.compile('(.+)(?=< Fin >)')\n",
" m = patternExcludingPieceEndDeclaration.match(currentLine)\n",
" if m:\n",
" # C'est la dernière ligne de texte de la pièce\n",
" previousAuthor = emptyAnalysisDict['author'][-1]\n",
" emptyAnalysisDict['author'].append(currentAuthor)\n",
" emptyAnalysisDict['recipient'].append(previousAuthor)\n",
" emptyAnalysisDict['act'].append(actNum)\n",
" emptyAnalysisDict['scene'].append(sceneNum)\n",
" emptyAnalysisDict['speech_length'].append(currentSpeechLen)\n",
" \n",
" else:\n",
" # La ligne courante présente forcément les personnages de la scène\n",
" # car c'est la ligne qui suit la déclaration de scène,\n",
" # à l'exception d'une seule scène, la 7 de l'acte 4\n",
" # On peut donc réduire l'analyse du texte à ces seuls\n",
" # protagonistes.\n",
" # Boucle sur les clés du dictionnaire de personnage\n",
" # qui sont leur nom.\n",
"\n",
" # Si la ligne contient autre chose que des caractères \"blancs\"\n",
" # espaces, tabulations, retour ligne etc...\n",
" # ce n'est pas l'exception.\n",
" if not re.match('^[\\s]+$',currentLine):\n",
" # La ligne n'est pas vide, ce n'est pas l'exception\n",
" for namePerso in persoDict:\n",
" # On vérifie si namePerso fait partie des protagonistes\n",
" # Pour prendre en compte le problème avec les maitres/maîtres\n",
" # il faut adapter name Perso pour être une expression régulière\n",
" persoRegex = namePerso\n",
" if namePerso.startswith(\"Maitre\"):\n",
" persoRegex = persoRegex.replace('Maitre','Maître')\n",
" \n",
" m = re.search(persoRegex, currentLine, re.IGNORECASE)\n",
" if m is not None:\n",
" # Le résultat de la recherche n'est pas vide,\n",
" # le personnage fait partie des protagonistes\n",
" # on l'ajoute à la liste des personnages de la scène\n",
" # On met le nom tel qu'il est écrit dans le dictionnaire\n",
" # créé à partir de la liste en début de pièce.\n",
" #scenePersoList.append(m.group(0))\n",
" scenePersoList.append(namePerso)\n",
" #print(\"scenePersoList : {}\".format(scenePersoList))\n",
" \n",
" else:\n",
" # La ligne est vide on sait que c'est le cas particulier\n",
" # le seul protagoniste est Harpagon\n",
" scenePersoList.append('Harpagon')\n",
" #print(\"*********************************\")\n",
" #print(\"Liste des personnages de la scène\")\n",
" #print(\"*********************************\")\n",
" #print(scenePersoList)\n",
" #print(\"*********************************\")\n",
" # La ligne précédente n'est désormais plus une déclaration\n",
" # de début de scène\n",
" previousLineIsScene = False\n",
" \n",
" currentLine = fileToAnalyse.readline()\n",
" # On lit une ligne on incrémente donc le numéro de la ligne courante dans le fichier\n",
" lineNum += 1\n",
" \n",
" return pd.DataFrame.from_dict(emptyAnalysisDict)\n"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
act
\n",
"
author
\n",
"
recipient
\n",
"
scene
\n",
"
speech_length
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
1
\n",
"
Valère
\n",
"
Élise
\n",
"
1
\n",
"
58
\n",
"
\n",
"
\n",
"
1
\n",
"
1
\n",
"
Élise
\n",
"
Valère
\n",
"
1
\n",
"
68
\n",
"
\n",
"
\n",
"
2
\n",
"
1
\n",
"
Valère
\n",
"
Élise
\n",
"
1
\n",
"
14
\n",
"
\n",
"
\n",
"
3
\n",
"
1
\n",
"
Élise
\n",
"
Valère
\n",
"
1
\n",
"
51
\n",
"
\n",
"
\n",
"
4
\n",
"
1
\n",
"
Valère
\n",
"
Élise
\n",
"
1
\n",
"
45
\n",
"
\n",
"
\n",
"
5
\n",
"
1
\n",
"
Élise
\n",
"
Valère
\n",
"
1
\n",
"
26
\n",
"
\n",
"
\n",
"
6
\n",
"
1
\n",
"
Valère
\n",
"
Élise
\n",
"
1
\n",
"
70
\n",
"
\n",
"
\n",
"
7
\n",
"
1
\n",
"
Élise
\n",
"
Valère
\n",
"
1
\n",
"
63
\n",
"
\n",
"
\n",
"
8
\n",
"
1
\n",
"
Valère
\n",
"
Élise
\n",
"
1
\n",
"
4
\n",
"
\n",
"
\n",
"
9
\n",
"
1
\n",
"
Élise
\n",
"
Valère
\n",
"
1
\n",
"
224
\n",
"
\n",
"
\n",
"
10
\n",
"
1
\n",
"
Valère
\n",
"
Élise
\n",
"
1
\n",
"
138
\n",
"
\n",
"
\n",
"
11
\n",
"
1
\n",
"
Élise
\n",
"
Valère
\n",
"
1
\n",
"
22
\n",
"
\n",
"
\n",
"
12
\n",
"
1
\n",
"
Valère
\n",
"
Élise
\n",
"
1
\n",
"
215
\n",
"
\n",
"
\n",
"
13
\n",
"
1
\n",
"
Élise
\n",
"
Valère
\n",
"
1
\n",
"
24
\n",
"
\n",
"
\n",
"
14
\n",
"
1
\n",
"
Valère
\n",
"
Élise
\n",
"
1
\n",
"
86
\n",
"
\n",
"
\n",
"
15
\n",
"
1
\n",
"
Élise
\n",
"
Valère
\n",
"
1
\n",
"
13
\n",
"
\n",
"
\n",
"
16
\n",
"
1
\n",
"
Cléante
\n",
"
Élise
\n",
"
2
\n",
"
24
\n",
"
\n",
"
\n",
"
17
\n",
"
1
\n",
"
Élise
\n",
"
Cléante
\n",
"
2
\n",
"
14
\n",
"
\n",
"
\n",
"
18
\n",
"
1
\n",
"
Cléante
\n",
"
Élise
\n",
"
2
\n",
"
10
\n",
"
\n",
"
\n",
"
19
\n",
"
1
\n",
"
Élise
\n",
"
Cléante
\n",
"
2
\n",
"
2
\n",
"
\n",
"
\n",
"
20
\n",
"
1
\n",
"
Cléante
\n",
"
Élise
\n",
"
2
\n",
"
173
\n",
"
\n",
"
\n",
"
21
\n",
"
1
\n",
"
Élise
\n",
"
Cléante
\n",
"
2
\n",
"
11
\n",
"
\n",
"
\n",
"
22
\n",
"
1
\n",
"
Cléante
\n",
"
Élise
\n",
"
2
\n",
"
24
\n",
"
\n",
"
\n",
"
23
\n",
"
1
\n",
"
Élise
\n",
"
Cléante
\n",
"
2
\n",
"
8
\n",
"
\n",
"
\n",
"
24
\n",
"
1
\n",
"
Cléante
\n",
"
Élise
\n",
"
2
\n",
"
26
\n",
"
\n",
"
\n",
"
25
\n",
"
1
\n",
"
Élise
\n",
"
Cléante
\n",
"
2
\n",
"
43
\n",
"
\n",
"
\n",
"
26
\n",
"
1
\n",
"
Cléante
\n",
"
Élise
\n",
"
2
\n",
"
10
\n",
"
\n",
"
\n",
"
27
\n",
"
1
\n",
"
Élise
\n",
"
Cléante
\n",
"
2
\n",
"
13
\n",
"
\n",
"
\n",
"
28
\n",
"
1
\n",
"
Cléante
\n",
"
Élise
\n",
"
2
\n",
"
150
\n",
"
\n",
"
\n",
"
29
\n",
"
1
\n",
"
Élise
\n",
"
Cléante
\n",
"
2
\n",
"
27
\n",
"
\n",
"
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
\n",
"
\n",
"
927
\n",
"
5
\n",
"
Harpagon
\n",
"
Valère
\n",
"
5
\n",
"
2
\n",
"
\n",
"
\n",
"
928
\n",
"
5
\n",
"
Valère
\n",
"
Maitre Jacques
\n",
"
5
\n",
"
6
\n",
"
\n",
"
\n",
"
929
\n",
"
5
\n",
"
Maitre Jacques
\n",
"
Harpagon
\n",
"
5
\n",
"
7
\n",
"
\n",
"
\n",
"
930
\n",
"
5
\n",
"
Harpagon
\n",
"
Valère
\n",
"
5
\n",
"
10
\n",
"
\n",
"
\n",
"
931
\n",
"
5
\n",
"
Valère
\n",
"
Harpagon
\n",
"
5
\n",
"
10
\n",
"
\n",
"
\n",
"
932
\n",
"
5
\n",
"
Harpagon
\n",
"
Valère
\n",
"
5
\n",
"
9
\n",
"
\n",
"
\n",
"
933
\n",
"
5
\n",
"
Cléante
\n",
"
Harpagon
\n",
"
6
\n",
"
41
\n",
"
\n",
"
\n",
"
934
\n",
"
5
\n",
"
Harpagon
\n",
"
Cléante
\n",
"
6
\n",
"
3
\n",
"
\n",
"
\n",
"
935
\n",
"
5
\n",
"
Cléante
\n",
"
Harpagon
\n",
"
6
\n",
"
47
\n",
"
\n",
"
\n",
"
936
\n",
"
5
\n",
"
Harpagon
\n",
"
Cléante
\n",
"
6
\n",
"
7
\n",
"
\n",
"
\n",
"
937
\n",
"
5
\n",
"
Cléante
\n",
"
Mariane
\n",
"
6
\n",
"
36
\n",
"
\n",
"
\n",
"
938
\n",
"
5
\n",
"
Mariane
\n",
"
Anselme
\n",
"
6
\n",
"
36
\n",
"
\n",
"
\n",
"
939
\n",
"
5
\n",
"
Anselme
\n",
"
Harpagon
\n",
"
6
\n",
"
61
\n",
"
\n",
"
\n",
"
940
\n",
"
5
\n",
"
Harpagon
\n",
"
Cléante
\n",
"
6
\n",
"
11
\n",
"
\n",
"
\n",
"
941
\n",
"
5
\n",
"
Cléante
\n",
"
Harpagon
\n",
"
6
\n",
"
6
\n",
"
\n",
"
\n",
"
942
\n",
"
5
\n",
"
Harpagon
\n",
"
Anselme
\n",
"
6
\n",
"
13
\n",
"
\n",
"
\n",
"
943
\n",
"
5
\n",
"
Anselme
\n",
"
Harpagon
\n",
"
6
\n",
"
13
\n",
"
\n",
"
\n",
"
944
\n",
"
5
\n",
"
Harpagon
\n",
"
Anselme
\n",
"
6
\n",
"
12
\n",
"
\n",
"
\n",
"
945
\n",
"
5
\n",
"
Anselme
\n",
"
Harpagon
\n",
"
6
\n",
"
8
\n",
"
\n",
"
\n",
"
946
\n",
"
5
\n",
"
Harpagon
\n",
"
Anselme
\n",
"
6
\n",
"
12
\n",
"
\n",
"
\n",
"
947
\n",
"
5
\n",
"
Anselme
\n",
"
Le commissaire
\n",
"
6
\n",
"
13
\n",
"
\n",
"
\n",
"
948
\n",
"
5
\n",
"
Le commissaire
\n",
"
Harpagon
\n",
"
6
\n",
"
14
\n",
"
\n",
"
\n",
"
949
\n",
"
5
\n",
"
Harpagon
\n",
"
Le commissaire
\n",
"
6
\n",
"
8
\n",
"
\n",
"
\n",
"
950
\n",
"
5
\n",
"
Le commissaire
\n",
"
Harpagon
\n",
"
6
\n",
"
12
\n",
"
\n",
"
\n",
"
951
\n",
"
5
\n",
"
Harpagon
\n",
"
Maitre Jacques
\n",
"
6
\n",
"
12
\n",
"
\n",
"
\n",
"
952
\n",
"
5
\n",
"
Maitre Jacques
\n",
"
Anselme
\n",
"
6
\n",
"
23
\n",
"
\n",
"
\n",
"
953
\n",
"
5
\n",
"
Anselme
\n",
"
Harpagon
\n",
"
6
\n",
"
8
\n",
"
\n",
"
\n",
"
954
\n",
"
5
\n",
"
Harpagon
\n",
"
Anselme
\n",
"
6
\n",
"
5
\n",
"
\n",
"
\n",
"
955
\n",
"
5
\n",
"
Anselme
\n",
"
Harpagon
\n",
"
6
\n",
"
11
\n",
"
\n",
"
\n",
"
956
\n",
"
5
\n",
"
Harpagon
\n",
"
Anselme
\n",
"
6
\n",
"
6
\n",
"
\n",
" \n",
"
\n",
"
957 rows × 5 columns
\n",
"
"
],
"text/plain": [
" act author recipient scene speech_length\n",
"0 1 Valère Élise 1 58\n",
"1 1 Élise Valère 1 68\n",
"2 1 Valère Élise 1 14\n",
"3 1 Élise Valère 1 51\n",
"4 1 Valère Élise 1 45\n",
"5 1 Élise Valère 1 26\n",
"6 1 Valère Élise 1 70\n",
"7 1 Élise Valère 1 63\n",
"8 1 Valère Élise 1 4\n",
"9 1 Élise Valère 1 224\n",
"10 1 Valère Élise 1 138\n",
"11 1 Élise Valère 1 22\n",
"12 1 Valère Élise 1 215\n",
"13 1 Élise Valère 1 24\n",
"14 1 Valère Élise 1 86\n",
"15 1 Élise Valère 1 13\n",
"16 1 Cléante Élise 2 24\n",
"17 1 Élise Cléante 2 14\n",
"18 1 Cléante Élise 2 10\n",
"19 1 Élise Cléante 2 2\n",
"20 1 Cléante Élise 2 173\n",
"21 1 Élise Cléante 2 11\n",
"22 1 Cléante Élise 2 24\n",
"23 1 Élise Cléante 2 8\n",
"24 1 Cléante Élise 2 26\n",
"25 1 Élise Cléante 2 43\n",
"26 1 Cléante Élise 2 10\n",
"27 1 Élise Cléante 2 13\n",
"28 1 Cléante Élise 2 150\n",
"29 1 Élise Cléante 2 27\n",
".. ... ... ... ... ...\n",
"927 5 Harpagon Valère 5 2\n",
"928 5 Valère Maitre Jacques 5 6\n",
"929 5 Maitre Jacques Harpagon 5 7\n",
"930 5 Harpagon Valère 5 10\n",
"931 5 Valère Harpagon 5 10\n",
"932 5 Harpagon Valère 5 9\n",
"933 5 Cléante Harpagon 6 41\n",
"934 5 Harpagon Cléante 6 3\n",
"935 5 Cléante Harpagon 6 47\n",
"936 5 Harpagon Cléante 6 7\n",
"937 5 Cléante Mariane 6 36\n",
"938 5 Mariane Anselme 6 36\n",
"939 5 Anselme Harpagon 6 61\n",
"940 5 Harpagon Cléante 6 11\n",
"941 5 Cléante Harpagon 6 6\n",
"942 5 Harpagon Anselme 6 13\n",
"943 5 Anselme Harpagon 6 13\n",
"944 5 Harpagon Anselme 6 12\n",
"945 5 Anselme Harpagon 6 8\n",
"946 5 Harpagon Anselme 6 12\n",
"947 5 Anselme Le commissaire 6 13\n",
"948 5 Le commissaire Harpagon 6 14\n",
"949 5 Harpagon Le commissaire 6 8\n",
"950 5 Le commissaire Harpagon 6 12\n",
"951 5 Harpagon Maitre Jacques 6 12\n",
"952 5 Maitre Jacques Anselme 6 23\n",
"953 5 Anselme Harpagon 6 8\n",
"954 5 Harpagon Anselme 6 5\n",
"955 5 Anselme Harpagon 6 11\n",
"956 5 Harpagon Anselme 6 6\n",
"\n",
"[957 rows x 5 columns]"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# On ouvre le fichier local en lecture 'r' pour en faire l'analyse en utilisant l'instruction with qui se chargera de fermer\n",
"# le fichier une fois sortie de l'instruction (pas d'erreur possible par oubli d'appel à l'instruction close).\n",
"# Un rapide coup d'oeil au fichier texte nous montre une organisation, des symboles en début de ligne etc, que l'on va utiliser\n",
"# pour \"parser\" le fichier, à savoir le lire de manière à ranger les données de manière intelligente dans une structure de\n",
"# données facilitant la manipulation et l'analyse.\n",
"with open(local_filename,'r') as avareFile:\n",
" # On va commencer par parser le fichier afin de récupérer la liste des personnages\n",
" lineNum = fill_perso_dict(avareFile, avarePersoDict)\n",
" \n",
" #print(\"##################################################\")\n",
" #print(\"Contenu du dictionnaire des personnages initialisé\")\n",
" #print(\"##################################################\\n\")\n",
" #print(avarePersoDict)\n",
" #print(\"\\n##################################################\")\n",
" \n",
" textDataSynthesisTableDf = generate_text_synthesis_data_table(avareFile, avarePersoDict, avareAnalysisDict, lineNum)\n",
"\n",
"# Le tableau de données récapitulatif est maintenant prêt à être utilisé\n",
"# Affichons celui-ci\n",
"textDataSynthesisTableDf\n",
" "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Y-a-t-il des éléments à NaN ou null dans le tableau construit?"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
"
],
"text/plain": [
"Empty DataFrame\n",
"Columns: [act, author, recipient, scene, speech_length]\n",
"Index: []"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
" textDataSynthesisTableDf[textDataSynthesisTableDf.isna().any(axis=1)]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Réponse à la première question\n",
"Maintenant, nous pouvons répondre à la première question."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"L'observation d'un premier résultat intermédiaire nous a paru suspect. Ce résultat était le suivant:\n",
"```\n",
"Harpagon a prononcé 6992 mots dans oute la pièce.\n",
"Cléante a prononcé 3555 mots dans oute la pièce.\n",
"Élise a prononcé 1067 mots dans oute la pièce.\n",
"Valère a prononcé 3016 mots dans oute la pièce.\n",
"Mariane a prononcé 910 mots dans oute la pièce.\n",
"Anselme a prononcé 517 mots dans oute la pièce.\n",
"Frosine a prononcé 2381 mots dans oute la pièce.\n",
"Maitre Simon a prononcé 0 mots dans oute la pièce.\n",
"Maitre Jacques a prononcé 0 mots dans oute la pièce.\n",
"La Flèche a prononcé 1520 mots dans oute la pièce.\n",
"Dame Claude a prononcé 0 mots dans oute la pièce.\n",
"Brindavoine a prononcé 43 mots dans oute la pièce.\n",
"La Merluche a prononcé 47 mots dans oute la pièce.\n",
"Le commissaire a prononcé 0 mots dans oute la pièce.\n",
"```\n",
"En effet, de trop nombreux personnages semblaient ne prononcer aucun mot de toutes la pièce. En regardant, de plus près, nous avons pu faire deux constatations:\n",
"- le commissaire est accompagné par un clerc qui n'a pas été enregistré dans la liste des personnages, il faut donc corriger l'analyse de la liste des personnages au début de la pièce pour prendre en compte ce cas,\n",
"- certains nom de personnage peuvent différer d'un caractère par exemple entre la liste au début et celui utiliser pour annoncer les auteurs de réplique, typiquement Maitre Simon de la liste de début devient MAÎTRE SIMON (non seulement, il est en majuscule mais il prend un ^), Le commissaire devient Le Commissaire dans les protagonistes des scènes\n",
"Nous avons donc corriger le code pour prendre en compte ces deux problèmes."
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
perso
\n",
"
\n",
"
\n",
"
speech_length
\n",
"
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
Dame Claude
\n",
"
\n",
"
\n",
"
0
\n",
"
son clerc
\n",
"
\n",
"
\n",
"
43
\n",
"
Brindavoine
\n",
"
\n",
"
\n",
"
47
\n",
"
La Merluche
\n",
"
\n",
"
\n",
"
197
\n",
"
Maitre Simon
\n",
"
\n",
"
\n",
"
294
\n",
"
Le commissaire
\n",
"
\n",
"
\n",
"
517
\n",
"
Anselme
\n",
"
\n",
"
\n",
"
923
\n",
"
Mariane
\n",
"
\n",
"
\n",
"
1067
\n",
"
Élise
\n",
"
\n",
"
\n",
"
1520
\n",
"
La Flèche
\n",
"
\n",
"
\n",
"
1668
\n",
"
Maitre Jacques
\n",
"
\n",
"
\n",
"
2349
\n",
"
Frosine
\n",
"
\n",
"
\n",
"
2740
\n",
"
Valère
\n",
"
\n",
"
\n",
"
3339
\n",
"
Cléante
\n",
"
\n",
"
\n",
"
6160
\n",
"
Harpagon
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" perso\n",
"speech_length \n",
"0 Dame Claude\n",
"0 son clerc\n",
"43 Brindavoine\n",
"47 La Merluche\n",
"197 Maitre Simon\n",
"294 Le commissaire\n",
"517 Anselme\n",
"923 Mariane\n",
"1067 Élise\n",
"1520 La Flèche\n",
"1668 Maitre Jacques\n",
"2349 Frosine\n",
"2740 Valère\n",
"3339 Cléante\n",
"6160 Harpagon"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# On va parcourir le dictionnaire des personnages\n",
"# et compter le nombre total de mots prononcés\n",
"# pour chacun.\n",
"import numpy as np\n",
"persoList = []\n",
"persoNbWords = np.zeros(len(avarePersoDict),dtype=int)\n",
"#print(textDataSynthesisTableDf.shape)\n",
"for index, perso in enumerate(avarePersoDict):\n",
" m = textDataSynthesisTableDf['author'].str.match(perso, case=False, na=False)\n",
" tmpDf = textDataSynthesisTableDf[m].copy()\n",
" persoList.append(perso)\n",
" persoNbWords[index] = tmpDf['speech_length'].sum()\n",
"\n",
"data = pd.DataFrame({\"perso\":persoList, \"speech_length\":persoNbWords})\n",
" \n",
"sortedData = data.set_index('speech_length').sort_index()\n",
"sortedData\n",
" \n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Nous pouvons désormais finir de répondre à la premiè question posée. Le personnage s'exprimant le plus dans la pièce de _L'Avare_ de Molière et qui est donc le protagoniste principal, n'est autre qu'**Harpagon**. Quant aux personnages ne s'exprimant pas, nous en avons deux, le **clerc** du commissaire ainsi que **Dame Claude** qui est la servante d'Harpagon."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Réponse à la seconde question"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"On voulais utiliser le classement pour associer à chaque personnage de la pièce une couleur unique qui reflète son temps de paroles au travers de toute la pièce notamment avec des couleurs plus chaudes, par exemple le rouge pour le personnage avec le nombre de mots le plus élevés, ensuite du orange, puis du jaune etc en allant vers le violet. Néanmoins, le nombre de personnages au total fait qu'une colormap à laquelle nous pensions et qui est illustrée en dessous ne convient pas pour l'affectation des couleurs aux personnages de sorte que l'on puisse les distinguer facilement dans les graphiques.\n",
"\n",
"On va donc reprendre le dictionnaire des personnages et régler la propriété de couleur, mais sans s'occuper d'associer des couleurs en fonction de l'importance des personnages mais surtout de manière à les différencier correctement."
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"from matplotlib import pyplot as plt\n",
"from matplotlib import cm\n",
"\n",
"# On affiche une sélection automatique de couleur dans une colormap\n",
"# matplotlib\n",
"nbPersos = len(persoList)\n",
"color = iter(cm.gist_rainbow(np.linspace(0, 1, nbPersos)))\n",
"for i in range(nbPersos):\n",
" c = next(color)\n",
" plt.plot(i, i, 'o', c=c)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Comme expliqué au-dessus, cette sélection ne convient pas car certaines couleurs sont trop proches les unes de autres. Essayons d'autres colormaps."
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# On affiche une sélection automatique de couleur dans une colormap\n",
"# matplotlib\n",
"color = iter(cm.tab20(np.linspace(0, 1, nbPersos)))\n",
"for i in range(nbPersos):\n",
" c = next(color)\n",
" plt.plot(i, i, 'o', c=c)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Cette dernière semble convenir."
]
},
{
"cell_type": "code",
"execution_count": 45,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[0.12156863 0.46666667 0.70588235 1. ]\n",
"[0.68235294 0.78039216 0.90980392 1. ]\n",
"[1. 0.49803922 0.05490196 1. ]\n",
"[0.17254902 0.62745098 0.17254902 1. ]\n",
"[0.59607843 0.8745098 0.54117647 1. ]\n",
"[1. 0.59607843 0.58823529 1. ]\n",
"[0.58039216 0.40392157 0.74117647 1. ]\n",
"[0.54901961 0.3372549 0.29411765 1. ]\n",
"[0.76862745 0.61176471 0.58039216 1. ]\n",
"[0.89019608 0.46666667 0.76078431 1. ]\n",
"[0.49803922 0.49803922 0.49803922 1. ]\n",
"[0.78039216 0.78039216 0.78039216 1. ]\n",
"[0.85882353 0.85882353 0.55294118 1. ]\n",
"[0.09019608 0.74509804 0.81176471 1. ]\n",
"[0.61960784 0.85490196 0.89803922 1. ]\n"
]
},
{
"data": {
"text/plain": [
"{'Harpagon': {'links': [\"Père de Cléante et d'Élise\", 'Amoureux de Mariane'],\n",
" 'color': array([0.61960784, 0.85490196, 0.89803922, 1. ])},\n",
" 'Cléante': {'links': [\"Fils d'Harpagon\", 'Amant de Mariane'],\n",
" 'color': array([0.09019608, 0.74509804, 0.81176471, 1. ])},\n",
" 'Élise': {'links': [\"Fille d'Harpagon\", 'Amante de Valère'],\n",
" 'color': array([0.76862745, 0.61176471, 0.58039216, 1. ])},\n",
" 'Valère': {'links': [\"Fils d'Anselme\", \"Amant d'Élise\"],\n",
" 'color': array([0.85882353, 0.85882353, 0.55294118, 1. ])},\n",
" 'Mariane': {'links': ['Amante de Cléante', \"aimée d'Harpagon\"],\n",
" 'color': array([0.54901961, 0.3372549 , 0.29411765, 1. ])},\n",
" 'Anselme': {'links': ['Père de Valère et de Mariane'],\n",
" 'color': array([0.58039216, 0.40392157, 0.74117647, 1. ])},\n",
" 'Frosine': {'links': [\"Femme d'Intrigue\"],\n",
" 'color': array([0.78039216, 0.78039216, 0.78039216, 1. ])},\n",
" 'Maitre Simon': {'links': ['Courtier'],\n",
" 'color': array([0.59607843, 0.8745098 , 0.54117647, 1. ])},\n",
" 'Maitre Jacques': {'links': [\"Cuisinier et Cocher d'Harpagon\"],\n",
" 'color': array([0.49803922, 0.49803922, 0.49803922, 1. ])},\n",
" 'La Flèche': {'links': ['Valet de Cléante'],\n",
" 'color': array([0.89019608, 0.46666667, 0.76078431, 1. ])},\n",
" 'Dame Claude': {'links': [\"Servante d'Harpagon\"],\n",
" 'color': array([0.12156863, 0.46666667, 0.70588235, 1. ])},\n",
" 'Brindavoine': {'links': [\"laquais d'Harpagon\"],\n",
" 'color': array([1. , 0.49803922, 0.05490196, 1. ])},\n",
" 'La Merluche': {'links': [\"laquais d'Harpagon\"],\n",
" 'color': array([0.17254902, 0.62745098, 0.17254902, 1. ])},\n",
" 'Le commissaire': {'links': [],\n",
" 'color': array([1. , 0.59607843, 0.58823529, 1. ])},\n",
" 'son clerc': {'links': ['assistant du commissaire'],\n",
" 'color': array([0.68235294, 0.78039216, 0.90980392, 1. ])}}"
]
},
"execution_count": 45,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"color = iter(cm.tab20(np.linspace(0, 1, nbPersos)))\n",
"for i in range(nbPersos):\n",
" c = next(color)\n",
" print(c)\n",
" perso = sortedData[\"perso\"].iloc[i]\n",
" #print(perso)\n",
" avarePersoDict[perso][\"color\"] = c\n",
"\n",
"avarePersoDict"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"On constate ci-dessus que le dictionnaire des personnages de la pièce a bien été complété comme voulu."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"En nous appuyant sur une page internet trouvée sur exemple d'affichage similaire à ce qui est fait dans l'étude \\(à savoir un affichage par Acte, sous forme de barres horizontales pour chaque scène le composant donnant la répartition de la paroles entre les différents protagonistes de chaque scène\\), on va pouvoir répondre à la seconde question. Voici un lien vers celle-ci: [geeksforgeeks_stacked-percentage-bar-plot](https://www.geeksforgeeks.org/stacked-percentage-bar-plot-in-matplotlib/)."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Pour l'écriture du nombre de mots au sein des graphiques, il a fallu passer par des sorties intermédiaires pour voir comment fonctionnait matplotlib, dans quel sens il parcours les éléments de son graphiques par rapport au dataframe d'entrée que l'on veut représenter. Une sortie intermédiaire obtenue via des prints (un print du dataframe `percentDf` et de `bar` dans la boucle `for i, bar in enumerate(ax.patches):` du code de tracé du graphique un peu plus bas), nous à donner ce qui suit:\n",
"\n",
"```\n",
" Cléante Harpagon La Flèche Valère scene Élise\n",
"0 0.000000 0.000000 0.000000 0.561998 1 0.438002\n",
"1 0.831694 0.000000 0.000000 0.000000 2 0.168306\n",
"2 0.000000 0.644044 0.355956 0.000000 3 0.000000\n",
"3 0.141361 0.752618 0.000000 0.000000 4 0.106021\n",
"4 0.000000 0.268701 0.000000 0.695866 5 0.035433\n",
"\n",
"Rectangle(xy=(0, -0.25), width=0, height=0.5, angle=0)\n",
"Rectangle(xy=(0, 0.75), width=0.831694, height=0.5, angle=0)\n",
"Rectangle(xy=(0, 1.75), width=0, height=0.5, angle=0)\n",
"Rectangle(xy=(0, 2.75), width=0.141361, height=0.5, angle=0)\n",
"Rectangle(xy=(0, 3.75), width=0, height=0.5, angle=0)\n",
"Rectangle(xy=(0, -0.25), width=0, height=0.5, angle=0)\n",
"Rectangle(xy=(0, 0.75), width=0, height=0.5, angle=0)\n",
"Rectangle(xy=(0, 1.75), width=0.644044, height=0.5, angle=0)\n",
"Rectangle(xy=(0.141361, 2.75), width=0.752618, height=0.5, angle=0)\n",
"Rectangle(xy=(0, 3.75), width=0.268701, height=0.5, angle=0)\n",
"Rectangle(xy=(0, -0.25), width=0, height=0.5, angle=0)\n",
"Rectangle(xy=(0, 0.75), width=0, height=0.5, angle=0)\n",
"Rectangle(xy=(0.644044, 1.75), width=0.355956, height=0.5, angle=0)\n",
"Rectangle(xy=(0, 2.75), width=0, height=0.5, angle=0)\n",
"Rectangle(xy=(0, 3.75), width=0, height=0.5, angle=0)\n",
"Rectangle(xy=(0, -0.25), width=0.561998, height=0.5, angle=0)\n",
"Rectangle(xy=(0, 0.75), width=0, height=0.5, angle=0)\n",
"Rectangle(xy=(0, 1.75), width=0, height=0.5, angle=0)\n",
"Rectangle(xy=(0, 2.75), width=0, height=0.5, angle=0)\n",
"Rectangle(xy=(0.268701, 3.75), width=0.695866, height=0.5, angle=0)\n",
"Rectangle(xy=(0.561998, -0.25), width=0.438002, height=0.5, angle=0)\n",
"Rectangle(xy=(0.831694, 0.75), width=0.168306, height=0.5, angle=0)\n",
"Rectangle(xy=(0, 1.75), width=0, height=0.5, angle=0)\n",
"Rectangle(xy=(0.893979, 2.75), width=0.106021, height=0.5, angle=0)\n",
"Rectangle(xy=(0.964567, 3.75), width=0.0354331, height=0.5, angle=0)\n",
"```\n",
"\n",
"On voit qu'il y a 25 éléments, qui correspondent à 5 scène x 5 personnages pour l'acte 1.\n",
"En regardant de près les valeurs de largeur des rectangles `width`, on voit que les 5 premiers rectangles correspondent au premier personnage (cela correspond aux valeurs de pourcentage de paroles pour les 5 scènes de l'acte) = la première colonne du dataframe qui est affiché juste au dessus, les 5 rectangles suivants correspondent au second personnage et ainsi de suite. Il va falloir calculer les positions des textes en conséquences. "
]
},
{
"cell_type": "code",
"execution_count": 43,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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e1YzePDg0MjIyOjIyMjon3/+2QEAzGYzxo0b1zYsLCymV69e4RUVFeJy2zl8+LDttdTDMCYiomZj8ODBFUeOHEk7fvx46l133VU0b94838stl5iY6FjXTf3UU0/9aZkHH3yw7Ycffph97Nix4/Pnzz83ffr0IKBmmsQ+ffqUp6enpx47diy1S5cuVQCQnZ1tO2vWrLyMjIxjLi4u5sWLF7sBwJQpU+q388Ybb9Rv52qxm5qIiJqNK02d+FtX6qYuLS1VJSUlOTz44IPBdc+VlZWpAWD37t1O33///WkA0Gg08PDwMBcUFKj9/f0NPXv21ANA586dK7OysnSlpaWqw4cPO44ZMya0bjvV1dXXNCCMYUxERM3Go48+GvTYY4/ljh8/vnTdunVO8+bNa3O12zCbzXB0dDTv378/vaHr2NjY1E/koFarpV6vV5nNZjg5OZl+O+fytWI3NRERNRtXM3XiX3F3d7cEBARU102HaDabsWvXLjsA6NWrV/kbb7zhBQAmkwlFRUV/mZN12/nss8/cAMBisWDPnj1211ITw5iIiJqkqqoqlY+PT8e6nxdffNGnburE+Pj4SA8PD9O1bnvp0qWnvvzyS8/IyMjoiIiImFWrVrkCNdMkbt++3SkiIiI6NjY2+tChQ1cM16VLl576/PPPPSMjI6PDw8NjVqxY4Xot9XAKRSKiZoxTKDYfnEKRiIioCWMYExERKYxhTEREpDCGMRERkcIYxkRERApjGBMRUYuzdetW+/Xr1zsqXUdDNak7cCWVV8J36xGlyyCiJmrFqV1Kl9Doej34iNIlNEndunWLfOqpp3JGjx5dVvfcvHnzvE+cOGG7ZMmS7MutY29v37mysvIwAPTp06fygQceCNLpdHLQoEGXblTd16pJhTERETVNGRlvN+oUimFhc644heKYMWMKly5d6v7bMF6xYoX7/PnzzzVk+xqNBosXL75saAM1d8uSUkKtVje8aCtiNzURETU59913X/GWLVtc9Hq9AID09HSbvLw87U033VTZo0ePiOjo6PYRERHRS5Ysuewdr/71r3/5xMbGto+IiIiePXt2m7pthISExEyYMCEoJiYmOjMz02blypXOnTp1ioqOjm4/bNiwkNLSUkVykWFMRERNjq+vrzkuLu7SihUrXADgyy+/dB8+fHixo6OjZf369RmpqanHt2/ffuLZ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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAfQAAAD7CAYAAACc92brAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvIxREBQAAIABJREFUeJzt3Xl8jNf+B/DPmZnsiexCNiF7ggixC6V2aktVtUoVRW9vF0r9ervq7S1XW632tldLq0q1pZQqVyliKxpLSGQRJBESIpF9Mpnl/P6YJNdVS4LJJOPzfr3mJTPzLN8nknzmnOc8zxFSShAREVHTpjB3AURERHT3GOhEREQWgIFORERkARjoREREFoCBTkREZAEY6ERERBaAgU5ERGQBGOh0XxBC7BZCXBVC2NRx+QAhhBRCqO5wfyFCiI1CiHwhRKEQYpsQIvROtkVEVBcMdLJ4QogAALEAJIARDbRbFwCbAIQC8AJwGMDGBto3Ed2HGOh0P5gI4CCAFQAmXfuGEMJOCPG+ECJLCFEshNgnhLADsKd6kSIhRJkQonv18k8JIVKqW/vbhBCtbrRDKeVhKeVyKWWhlFILYDGAUCGEu6kOkojubwx0uh9MBLC6+jFICOF1zXvvAegEoAcANwBzARgA9K5+30VK6Sil/F0IMQrAKwDGAPAEsBfAmjrW0BtAnpSy4G4PhojoRgTv5U6WTAjRC8AuAC2llFeEEKkAlkopFwshFADKAXSTUiZet14AgHMArKSUuurXtgJYJ6VcXv1cAaAMQLiUMusWNfgCOATgJSllXT8AEBHVC1voZOkmAfhVSnml+vm3+G+3uwcAWwBn6ritVgA+EkIUCSGKABQCEAB8braCEMITwK8APmWYE5Ep3dEIXqKmoPpc+CMAlEKIvOqXbQC4CCGiAJwEUAkgEEDidavfqOvqPIB3pJSr67h/VxjDfJOU8p07OAQiojpjC50s2SgAegARADpUP8JhPPc9UUppAPAlgA+EEN5CCKUQonv1pW35MJ5Lb3PN9v4N4P+EEJEAIIRwFkKMvdGOhRDNAGwDsF9KOc80h0dE9F8MdLJkkwB8JaXMllLm1TwAfALg8eprzF+CsaX+B4xd6AsBKKSUFQDeAbC/uou9m5RyQ/X73wkhSgAkARhyk32PBtAZwOTqUfI1D39THjAR3b84KI6IiMgCsIVORERkARjoREREFoCBTkREZAEY6ERERBaAgU5ERGQBGtWNZTw8PGRAQIC5yyAiajKOHDlyRUrpae46yPwaVaAHBAQgISHB3GUQETUZQoibziNA9xd2uRMREVkABjoREZEFYKATERFZgEZ1Dp2IiBqHI0eONFepVMsAtAUbf42BAUCSTqeb2qlTp8s3WoCBTkREf6JSqZa1aNEi3NPT86pCoeCkH2ZmMBhEfn5+RF5e3jIAI260DD91ERHRjbT19PQsYZg3DgqFQnp6ehbD2GNy42UasB4iImo6FE0tzD/77DO306dPW5u7DlOp/v+4aW4z0ImIqNHKzs5WDR8+vI2fn1/bwMDAyD59+gSdOHHCJjg4OPLa5RYvXuyRn5+vCg4OrrrTfS1ZssQ9MzPT6u6rNg+eQyciottqset4p3u5vby+HY7cbhmDwYARI0YEPfbYYwWbN28+CwAHDhywu3jx4p9C98UXX7xytzWtWrXKo0OHDuqAgADt3W7LHBpVoCeWVqDFruPmLuO+k7Ct1NwlEN23fBfEmruERmvz5s1OKpVKzp07N7/mtR49eqjT0tJqu9V1Oh3+8pe/+O7fv9+pqqpKTJs27fKcOXOuFBcXKwYPHhxUXFys1Ol04vXXX784YcKEorS0NOshQ4YEd+nSpSwhIcHRy8uratu2bRlr1651SUpKsp84cWIbW1tbQ0JCQsqxY8fsZs2a5VdRUaFwdXXVrV69OrNVq1aNNuzZ5U5ERI3SiRMn7KKioiputcyHH37o4ezsrE9KSkpJTExM+frrrz1TU1Ot7e3tDb/88kvGqVOnUuLj49NfeeUVX4PBAADIzs62fe655y5nZGQkOzs761euXOk6efLkq23btq1YuXLl2dTU1FNWVlZ47rnn/Ddu3HgmOTk5ZdKkSVdeeuklnwY58DvUqFroRERE9bFjx45mqamp9ps2bXIFgNLSUuWpU6dsW7durX3hhRd8Dx486KhQKHD58mXrnJwcFQD4+PhoevTooQaA6OjoiszMTJvrt3vixAmb06dP2/Xr1y8EMHb/e3p6NtrWOcBAJyKiRqpdu3bqn376yfVWy0gpxfvvv58dFxdXcu3rS5YscS8oKFCdPHkyxcbGRvr4+LRTq9UKALC2tq4dva9UKmXN69dvNygoSH38+PHUe3U8psYu93tIarWo+GU9rs6ZAfWvP8NQxnPT1HAqqtT47sQvePz72ViesBaXywrMXRLRXXnooYdKq6qqxPvvv+9R81p8fLx9RkZG7Tn0AQMGFH/22WeeGo1GAMaWdUlJiaK4uFjp4eGhtbGxkT///LPTxYsXb3s5m6Ojo764uFgJAO3bt68sLCxU7dixwwEANBqNSEhIsL33R3nvMNDvAampBABUrF8DzYF4OEyaAd2ZdJR/vRRSNqnLOKmJulJ+FbO3LMDus4fwdJdxSL6Ugdd3fAQAMEiDmasjujMKhQKbNm0689tvvzXz8/NrGxQUFPnGG294+/v713Z9v/jii1fCwsIq27VrFx4cHBw5bdq0VlqtVkydOrUwMTHRoW3btuGrVq1ya926deXt9jdx4sQrf/3rX1uFhYVF6HQ6fPfdd2fmzZvnGxoaGhEZGRkRHx/vaNojvjuiMQWOVWiEdP/3t+Yuo0606adQuWMLKuN3wOHRJ2E/+lGULFkA67YdYNtvMPR5F1H01hw4TXse1h27mLvcW+Io96ZDSgkhBI7npuCnUzvQxbcdBgXHQqlQoriyFM62TgCAPef+wI/J2/DR8FfNXDHdzt2OchdCHJFSxtyjcmolJiZmRkVF3fWlYHRvJSYmekRFRQXc6D2TtdCFEF8KIS4LIZJMtQ9z0OddROGsaSj97APA2gbW7TtC4ekFqdMCUtZ2sytbeEOq1ahKOsaud7onDNIAIQQOnj+Ol7YsgK3KGvuyjuLtXZ8CAJxtnVCqKcffd32KJ9e9jNaufsguumjmqomooZhyUNwKAJ8AWGnCfZicVKuh3rkVVYf2w7pDJ9g+OATNXngFKv/WAIDCF6ZAqFQQKivYdOmJyt+2ojgpEYaSq1AFBsNwJR8QwsxHQU2VVq/D6uMb8ceFJPRq1QmPth+Gk3npmBA9Ek92HIOiylI8uuYF/J59DN39o1Gl16KTdyTGPzUc2zP24597luEfg2ahmU2j7ikkonvAZIEupdwjhAgw1fYbglSrcfWl6VC29IHd8DGoWL8GskoLh0cnQer1EEollC19oDubDptusbDp3huq0AhUHdoHq8goKFv6omD6eAirJnsnQTKzb479hD9yTuKJ6JFYcXQ9nG0dsTfzDwwNfQAA4GLrhIHBPfHVkR/R3T8aLrZOGBLaBwDQwskDQ1ZMRXFlKQOd6D7Ay9ZuQdjZwWXhv6BwNJ6X1GWdhSwpNr6nVEKq1VC4ukPhWjsAE0o3D9gNGQUA0KYmwzqqE6DnoCS6M3szEzCu/TD0aNURQgjsyDgAKYHNqbvwaPthAIDHO4zAkBVTAQBKhbJ2XZ1Bj1YuPtAZ9GapnYgaltlHuQshnhZCJAghEgzFReYu508Ujk4wlJeheOHrqPh+JaSUkGo1AGPga0+dgKgOfACQeh2qThzF1dnTUbLoTVi17QBhZ2eu8qkJ0+p16OAdjuO5KQCAIPdWOHIhCQGuPjhyIQkFFcbfFy9HD4R7BiIh5yTUWg22nd6LaRv+hjGrn0WPVtEIcGnUN7cionvE7C10KeXnAD4HjKPczVzODSkcHGEV1haOE6ej/IeVKP9+BWz7DoKqVRuoAgKhO5MOxPaDNBgglCoIGxvY9B0Eu4HDIawtdiY/MjErpQqDgmPx4i/voEKrRmr+WbRrEQo/55YIdg/AV0d+xEuxU3BVXQLvZs3h7+INnUGHq+oS9A/siVEP9YeNij9/RPcLswd6U2E/8hHjvyPGonz1cki1GlKrBfR6KJxdAABCYezwsAqNhFVo5E23RVRXYZ5t8NnI+TiccwITo0ehUqfBiiPrsXjYK1iduAmT181Dbmk+IpoHobmjOwDUdsUTNXVKpbJTcHCwuub5xo0bM0JDQ+94elQA6NOnT9CPP/54zsPDw+LORZks0IUQawA8AMBDCJED4A0p5XJT7a+hCEcnGIqLoGzpDWFlBetOXWHd4Z5fAkpUK8DVBwGuxm7zxNxUlFVVoLWbL17v9yw2JP+KYI8AtPUKMXOVZOkOHjx4T6dP7dat222nT7WxsTGkpqaeutn7Wq0WVvUcdBwfH59RrxWaEFOOch9vqm03NENZKaqOHkblzq3QZZ2F3bA4CAfjqGHbBwaauTq6H/x6eh++O/EL0q6cwzsDZkEhjL1BoyP580f3lyVLlrhv3brVWaPRKCoqKhQHDhxInzlzpu/OnTudhRByzpw5udOmTbualZVlFRcX16asrEyp1+vFxx9/nDV48OAyHx+fdgkJCSklJSWKG02j6ujoKJOTk21mzJjhX1hYqLK1tTUsW7YsKzo6+rZ3mjM3drnXgbCzg6HwCqw794DzK+9AWP9pYh4ikxJCYGBQT3w68k3YqvjzR/cHjUajCAsLiwAAPz8/zfbt288AwNGjRx1PnDiR7OXlpV+xYoXLyZMn7VJSUpJzc3NVXbp0CR84cGDZl19+6fbggw8WL1y4ME+n06G0tPRPg8Czs7NtV61adbZHjx5ZQ4cObbNy5UrXZ555pnDq1KmtPv/886x27dppdu7c6TBz5kz/gwcPpjf08dcXA70OhFIF+1HjzF0G3ccGBPU0dwlEDe5mXe6xsbElXl5eegDYu3ev0yOPPFKoUqng5+en69q1a9m+ffvsu3XrVj59+vQArVarePjhh6/WTJd6rRtNo1pcXKw4duyY49ixYwNrlquqqmoSdwcz+2VrRERE9WFvb197c4+bzUcyZMiQsj179qT5+PhUPfnkk60/+eQT9+uXuX4aVZ1OJ/R6PZycnHSpqamnah5nz55NNsmB3GMMdCIiarL69OlTum7dOjedToeLFy+qDh8+7BgbG1uenp5u7ePjo509e/aVCRMmXDl69Kh9Xbbn5uZm8PX1rfryyy9dAcBgMOD3339vEjcTYZc7ERE1WU888UTRgQMHHMPDwyOFEPKtt97K8ff313388cfuS5YsaaFSqaS9vb1+9erV5+q6zTVr1pydNm1aq4ULF7bU6XRi9OjRhd27d/9Tl31j06imT42JiZEJCQnmLoOIqMng9Kn3F7NMn0pEREQNh4FORERkARjoREREFoCBTkREZAEY6ERERBaAgU5ERGQBGOhERNQo2dvbR1/7fMmSJe4TJ070N1c9jR1vLENERLf11emL93T61MnB3redPvVu3cn0qk0ZA52IiJqcb7/91nnBggUttVqtwtXVVff999+f9fPz082aNcs7NzfXKjs729rNzU03YMCAko0bN7pUVVUpzp8/bxMXF1fw/vvv5wJA//79A3Nzc601Go1ixowZl1566aUrALB48WKPjz76qEXz5s21bdq0qbS2tpYrV67MTk9Pt540aVJAQUGByt3dXbdy5crM4ODgqri4uAAnJyd9YmKiQ35+vtXbb7+dM3ny5KsN/T1hlzsRETVKNdOn1jzeffdd75r3BgwYUHb8+PHUlJSUUw8//HDh/PnzW9S8d+LECftt27Zl/Pzzz+eqnzusXbv2bFJSUvKmTZvc9uzZYw8Aq1evzkxOTk45fvz4qaVLl3rl5eUpMzMzrd57772Whw4dStm7d2/66dOnbWu2O2PGDP/HHnusID09/dS4ceMKZs6c6Vfz3qVLl6wSEhJSN27cePqNN97waZjv0P9iC52IiBql66dPXbJkiXtCQoIDAJw7d8561KhRvvn5+VZVVVUKPz8/Tc1ygwcPLnJ0dKy9r3mvXr1KWrRooQeAYcOGXd29e7dj7969KxYuXOj1yy+/uABAXl6eVXJysu3FixetunbtWlozPevo0aOvpqen2wLAsWPHHLZu3XoGAGbOnFn41ltv+dbsY8SIEUVKpRKdOnWqLCgoMEs/P1voRETU5Dz77LP+zzzzzOX09PRTn3zySZZGo6nNMwcHB8O1ywrxv9OZCyGwefNmp/j4eKeEhITUtLS0U+Hh4Wq1Wq240/lNbG1ta1c01xwpDHQiImpySktLlf7+/loAWLFixZ/mOr/Wvn37ml26dElZVlYmtmzZ4tKnT5+yoqIipbOzs97Jyclw7Ngx28TERAcAiI2NLT906JBTfn6+UqvVYuPGja4124mOji5ftmyZKwAsXbrULSYmpsyUx1hf7HInIqIm529/+9vF8ePHB3p5eVXFxMSUZ2dn29xs2ZiYmLJx48a1zszMtI2Liyvo3bt3hVqtVn/++eeeISEhEYGBgZVRUVHlANC6dWvtiy++mNu5c+fw5s2ba0NCQtTOzs56APjss8+yJ02aFPDRRx+1qBkU10CHWyecPpWIqAnj9Km3VnPefeXKldl1Xae4uFjh7Oxs0Gq1GDRoUNCTTz55ZeLEiUWmrLOuOH0qERFRHc2ZM8c7LCwsIiQkJNLf318zYcKERhHmt8MudyIisljPPfdcAYCC+qzz+eef55ioHJNiC52IiMgCMNCJiIgsAAOdiIjIAjDQiYjovqPVarFgwQLPyspKcfulm4ZGNSgusbQCLXYdN3cZTdK7vs3NXQLVw4DlZ275/i8zDjZQJWRu0wPmmLuERsve3j66oqLiWH3X27x5s9P48eMDfXx8qgDAzc1Nd+DAgfRZs2Z5Ozo66ufPn3/JysoK3bt3L3/qqaf8v/nmmyylUnnT7aWlpVkPHz48+PTp08l3cTgm16gCnYiIGqeceXvv6fSpvgtiTTp9akxMTNmuXbsybrVMnz59Kvr06ZNlyjoaErvciYioyfj222+d27dvHxYeHh7Ro0ePkPPnz99RwzQ5OdkmNjY2ODIyMrxTp06hR48etQWA8+fPqwYMGBAYGhoaERoaGrF9+3YHANDr9Xj00UdbBQUFRfbs2TO4rKxM3Gg7x44ds73Vfk2JgU5ERE3GraZNvVZCQoJjzbSrL7/88p+WmTJlSqtPP/00Ozk5OWXhwoU5M2fO9AeMU6TGxsaWpqWlnUpOTj7VsWPHSgDIzs62fe655y5nZGQkOzs761euXOkKAFOnTq3dzqJFi2q3Yw7scr9L0mCAUPBzEZGpGAwGKPg7RtVuNW3qtW7V5V5cXKxITEx0mDJlSkDNayUlJUoAOHDggNO6devOAYBKpYK7u7v+ypUrSh8fH02PHj3UABAdHV2RmZlpU1xcrDh27Jjj2LFjA2u2U1VVZbZBdgz0OyDValTGb0fFhu/gOOUvsOnS09wlWbzK8nLkpJ1Cm6iOUNxi8EpTlZp/FvZWtvB38TZ3KY2CpqIKR7acwO6v92PkS4MR2SfU3CVRI/Hss8/6P//883mPP/548ebNm53mz59f718avV4PR0dH/eHDh9Pquo61tXXtxCdKpVKq1WqFXq+Hk5OT7to5282JH3vrQV94BSUfvYuCZx6HNjUJUl0B3VnjB0BpMNxmbbpT275cihe6t8eaf7yFjGPGcTSNaVKhOyGlhEZXhdXHN2HwV1Mwd+s/sWjvMqw9udXcpZlVcX4p1ry2Ae+OXILMxPPQlGtwITUXgLGlTlSfaVNvxs3NzeDr61tVMxWqXq/H/v377QCgZ8+epYsWLfIEAJ1Oh8LCwpvmZM12vvzyS1fA+DP6+++/291JTfeCyQJdCOEnhNglhEgRQiQLIZ431b5MSXcuA7oL541PpIRNz75wX7oGzV54BXYPPQyojJ0c7Ha/d7JOJWHVW3/Doc0bAQCtItth2qKP0XXYCJw5ZpyNT4imeemopqICGUf/gBACFdpKZF69gH8OmYtNE/+NISG9sSPjAHJL881dZoPKOXURl84aj1kaDIgaGIm/bX4ej709GrGPd4PSytgjw273+09lZaXCy8urfc3jzTff9KqZNrVTp06h7u7uujvd9po1a85+/fXXHqGhoREhISGRGzZscAGMU6TGx8c7hYSERLRt2zbi6NGjtwzoNWvWnP3qq688QkNDI4KDgyN//PFHlzut6W6ZsstdB2C2lPKoEMIJwBEhxHYpZaPomrgZKSWg1UL9689Qb1oLYWUNpbcvrDt3h93Ah6B096xdtirhd2Oo010xGAzQVlZi5+oVSNy1AzptFaoqK+Hu7QMACInpCqFQ4OCm9Th95DDKiq7C0cXVvEXfgc2fLcGOlcuh02rx8MSv4enghgnRI9Gqupu9pVNz2FvbwSDvj5ZodlIOVv9tPRQKBfzb+qBNp1boOqojXLyca5c5tScdvR/vZsYqqYapLzO7EYPBcMN93m72s+HDh5cOHz689PrXP/jgg4s1X4eFhVXt3bv39PXL+Pn56X777bc/3Sji2mvQ58+ff+l22zEHk33klVLmSimPVn9dCiAFgI+p9ne3pFqNqqTjEEJAVqqhv3AezV56HW7/Wgmb2H7QHIiHPv+ycVmtFgCgcHGF7my68TV2B9ZbTWtVoVBAo66AXqfDY6+9jVfXbkZA2/bwCa4+byoEhBBo0SYICqUKGdWt9KbWBRvUMQazv1qDTgOHYlPKbwBQG+YAcFVdjCvlV+HTzMtcJZqUpqIKZ48aL/nVa/VI2p2G3o91w8sbnkX/qb0Rv+p3XDxt/Dup1Rh/x5zcHdnlTlRHDdKHJYQIABAN4FBD7K++ylcvx5UJw1H0ynPQFxZA0cwZdg89DKuQCACA0rMFhJ09YNADAISVFaReB1Wr1oAwfgvZ5V4/mz9bgpcf7I4Pn56EkoIraObugeEzn4N/eCQAoLK8DJnJJwD898OSp58/XL1a4Ez1efSm1gUbEtMVfmERiOwZi22n99W+XjMeYNvpfRgW2sdc5ZnU1n/txKu9F+CTyV+iOL8USisljm9Lgr2zsTfTw98NBp0B+74z/olQKBXQ6/RoGdQcovp3rKn9fxM1NJP/hgghHAH8COAFKWXJDd5/WgiRIIRIMBSbZw55q8gouPzzM9j0fhCaXdsAACpv39r3DSVFMFwtgNKrZe1rQqmC9kw6VD5+AJr+IK2Gdm1r9dAvxnPlOq0WBoMBBr0efuGRtefJldXjFBxdXBEY3QlajQbnU08h9+wtbwLV6NSMzo/oEYtSTRnSr2QCMI4HuFByCUXqEoyKHAAAKLlSBsByfq7adGqF57+ZhujBbXFow1EAQMeh7bHzq33Izy7AyZ0p8GrjiRPbjWfklCollColclJy4RlgHPdkKd8LIlMxaaALIaxgDPPVUsr1N1pGSvm5lDJGShmjcDbPWAKrdtGwCgyBTaduqNy/69raAACafbtgE/vgf1/XGbsDhVIFbUpSwxZrIa5trR7bbhzZrbKygkKhgEKpxIW0VHi1al27vF5nHPuScTQBhzb/hPljhuD3Teth0OvNUv/dcHR1Q7R3JH5M+k/ta79nH8P5kjz8cHIrxqz6C35bvgdA0x38d73gzq3hG94S4bHBOPmbMbT7Te6FLiOj8d3rPyH+m98xcPoDcPNxQXbyhdr1FEoFzh3PNlfZRE2KKUe5CwDLAaRIKT8w1X7uBVHdcrLu2BWyrAy6TON4CCEE9JdyYSgtht2AYQAAfWEBhMoKUqeFTZ/+sOn5QO2yVHfXtlYrSktxIcM4FkFXVQUAsLazw/nqSzsNej2UKhVy0lLwx9afMWbWPHx6PB1jXpjbZK9JfzzqIRy5mAytXoeU/DNYcXQ9KrWVyCnOxdsDXsDol4eau8R7SqE0/qkJ6xmMynINLqbnwdrWCrGPdcO0f03AX1dMgWtLZ7j5uMLRxR6A8Zx5x6HtETXAeBqGv2NEt2bKFnpPAE8A6CeEOF79aNR/pRTOLrCKaAf1r5trX6tKTIA+7yLUWzei8LnJqFi3CgAgVFaw7dkX1h1izFWuRXB0dUNgh444sGEdAEBlbQ0A8PRvVTsuoSa0fUPD8dam7YiNGwcraxvzFHyPZBRk4/D5EwhfPBjHL6bgHwNnY+fUb/DKAzMR6RVs7vJMxtHVAa2jW9V2uwOAtZ0VruYW4ZclO+DoYg83H+MVDAqFAh0GRiK0W+DNNkdE1zDlKPd9UkohpWwvpexQ/dhiqv3dK3bD46A9dQJSp4X27GlUbPgeUlMJ/aVcOD03D05PN8nL6Ru1Po88jjPHj0BXVYXsFOOVIZVl5Qjv1tMiz5ueTz2FdUn/wT8Hz0HSC79gfNRwtG9x/9wJLXZ8V5w9mgW9Vo+clFwc/PEIls78BppyDfpN7mXu8qgREUJ0GjVqVO25N61WC1dX16i+ffsG3Wq9PXv22D/55JN+gHEq1ZoJVu6UXq/Hk08+6RccHBxZfX16eGpqqjUA9OnTJ+jKlSuNoquQt369jj77HLQnj+HysF5weu5lNHvxldrR7mQauWfP4HTCIfy1SyQeeuYF+IaGY+ycV8xdlsn4hUXgm0cWmbsMs8k7cxkZf2TihfavY/TcIeg4tB16jO1s7rLoNpZmLrqn06dOD5hz2+va7ezsDGlpaXZlZWXC0dFRbtiwoZmXl5f2duv17t27onfv3hUAsHPnTidHR0f9gAEDyq9fTqvVwsrK6ra1Llu2zC0vL88qNTU1WalU4syZM1bNmjUzAEB8fHyjGZ3L60CuoT2TDvWvP6PZ7NfQ/Oc9sB82hmFuYudTT2H/hrWY9PdFWHLoJIY+/RdenmTBalrkE96NwwfH30S/yb3+50YyRNd78MEHi9euXesCAGvWrHGLi4srrHlv165d9tHR0WHh4eER0dHRYYmJiTaAsVXet2/foLS0NOuVK1d6/vvf//YKCwuL+M9//uMYFxcXMHXqVN+uXbuGPPPMM74lJSWKsWPHBrRt2zY8PDw8YtWqVX8anZ2bm2vl5eWlVVaf/gsMDNR6enrqAcDHx6ddbm6uKi1zxf3SAAAYDUlEQVQtzbp169aR48aNaxUcHBw5YsSI1j/99JNTx44dw1q1atV2165d9gBw6dIlZf/+/QNDQkIioqKiwg4dOmQHALNmzfIeO3ZsQJcuXUJ9fX3b/f3vf29e3+8V/3JewyowBK4L/gW7oaMhmvg52qbCLywCs5avQu+x42FlY7ZphKmB+Ia3xF9XTEHPcV1gZXP7lhHRE088Ufj999+7VlRUiJSUFPvu3bvXtrSjoqIqDx8+nJqSknLqjTfeuDB37lzfa9cNDQ2tmjhxYv6MGTMupaamnho8eHAZAJw5c8Z2//796V988UXOK6+80rJv374lSUlJKXv37k179dVXfUtKShTX17Bjxw6XsLCwiGnTpvnW3Pf9eufPn7edPXv25dTU1OQzZ87Yrl692j0hISH1nXfeyXnnnXdaAsDcuXO9o6KiKtLT00+9/fbbFyZNmlR7SiEjI8M2Pj4+/Y8//kh57733vDUaTb1GgjLQiYio0eratas6JyfH5osvvnDr379/8bXvFRYWKocOHRoYHBwcOXfuXL/09PQ6tQrGjBlzVVV9f4vdu3c3W7x4ccuwsLCIXr16hWo0GpGRkWF97fKBgYHajIyMpPnz5+coFAoMHTo0dOPGjU7Xb9fHx0fTpUsXtVKpREhIiLpfv34lCoUCHTt2rMjJybEBgMOHDztNmTKlAABGjBhRWlRUpCooKFACwMCBA4vs7Oxky5YtdW5ubtqcnJx6nRbnOXQiImrUBg8eXPTGG2/4/frrr2mXL1+uza2XX37Zp0+fPqXbt28/k5aWZt2vX786jS51dHSsvY+wlBLr1q3LiIqKuuG86jXs7OzkI488UvLII4+UeHl5adevX+8ycuTI/7lf/LVTrCoUCtja2koAUCqV0Ov1omZ/1xNCSACwsbG5dopW6HQ6ttCJiMhyzJw588rs2bMvdunSRX3t6yUlJUpfX98qAFi6dKnHjdZ1cnLSl5aW3nQUet++fUvef/99r5q5Am7Unb5v3z77zMxMK8A44v3kyZN2rVq1qrqTY+nWrVvpV1995Q4Yz/W7urrq3Nzc7slEBY2qhR7lZI+Evh3MXQaR6S3wvuXb0xHbQIUQNX6BgYHa11577fL1r7/88st5U6dObb1kyZIWsbGxf7q1OADExcUVPfzww4Fbt251+fDDD/9028EFCxZcfPrpp/3DwsIipJTC19dXs2vXrv8ZuZ6Xl6eaPn16q6qqKgUAdOjQoXzevHl/qqcuFi5cePGxxx4LCAkJibCzszOsWLHi3J1s50ZEY7rONyYmRiYkJJi7DCKiJkMIcURKec/vcJWYmJgZFRV15V5vl+5OYmKiR1RUVMCN3mOXOxERkQVgoBMREVkABjoREZEFYKATEdGNGAwGA6e4a0Sq/z9uOiKegU5ERDeSlJ+f78xQbxwMBoPIz893BpB0s2Ua1WVrRETUOOh0uql5eXnL8vLy2oKNv8bAACBJp9NNvdkCDHQiIvqTTp06XQYwwtx1UN3xUxcREZEFYKATERFZAAY6ERGRBWCgExERWQAGOhERkQVgoBMREVkABjoREZEFYKATERFZAAY6ERGRBWCgExERWQAGOhERkQVgoBMREVmAOgW6EMJLCLFcCLG1+nmEEGKKaUsjIiKiuqrrbGsrAHwF4G/Vz9MBfA9g+b0spry8HAcPHqz3einu/veyDCKiBjM52NvcJZCFqGuXu4eU8gcY52OFlFIHQG+yqoiIiKhe6hro5UIIdwASAIQQ3QAUm6wqIiIiqpe6drnPArAJQKAQYj8ATwAPm6wqIiIiqpc6BbqU8qgQog+AUAACQJqUUmvSyoiIiKjO6tpCB4AuAAKq1+kohICUcqVJqiJqRE4f+QOlhQXo8OBAKBS80pOIGqc6BboQ4hsAgQCO47+D4SQAkwa6Wq1GRkYG2rVrB4PBwD+m1KB0VVXYuuxTbP7sYzT3b4WAdu3h1oIjkomocaprCz0GQISUUtZ1w0IIWwB7ANhU72edlPKNuq6/YsUK/PDDD9DpdPjuu+/g5uYGKSWEEHXdBFG9aNRqHPhpLdIOH0Rkz97o9tAohHfvhQcenYivX5uLnLRUBjoRNVp1bfImAWhRz21rAPSTUkYB6ABgcPXo+Dpp3749lixZggceeADbt28HABgMhnqWQFQ3xfmX8dH0iUg79Dt6jHoYu79bhX3rf0DLNkFwcnODb2g4Th3Yi6pKtblLJSK6oTpfhw7glBBimxBiU83jVitIo7Lqp1bVjzq38KOiohAUFIQuXbpgz549AAClUlnX1Ynqxc7JCXGz/w8zPvwM7fv0Q/+JTyHjaAIcnF0AADGDhiInLQVXL+WZuVIiohura6C/CWAUgH8AeP+axy0JIZRCiOMALgPYLqU8VNfCasK7c+fOKCsrw7lz5wCwlU6mYWVjizbto1FzVsknKAT557Nq3/cNDYe1nR3OJh4zV4lERLdUp0CXUsYDyARgVf31HwCO1mE9vZSyAwBfAF2EEG2vX0YI8bQQIkEIkVBUVPSnbTg7O6Nt27bYunWrsWAOjCMTEEL8z/iMX1d8ga7DRwMAdFrjFZrdR4xBxtEEJO2Lx6HNGwEA9RhWQkRkUnWdnGUagHUAlla/5APgp7ruREpZBGA3gME3eO9zKWWMlDLGxcXlhuuPHDkSJ0+ehFarRUZGBlvpZDJCCBTmXUTxlXy0690XAKCysoK2SoOkvfHYvWYlvl8wH+XFV2uXJyJqDOo6yv0vMF6HfggApJSnhRDNb7WCEMITgFZKWSSEsAPQH8DCOykyKysLiYmJGDRoEJ566in4+fnBxsbmTjZFdFvZp5LgGxIGd28f7PnhW7i19IbSygoOzs54ff1WtIpsZ+4SiYj+pK6BrpFSVtW0RoQQKtx+gFtLAF8LIZQw9gT8IKXcXN8CMzIysGXLFsybNw+DBg1ikJPJbfn8X8g/n42Mo3/A2dMLo1+YA5/gUIR362nu0oiIbqqugR4vhHgFgJ0QYgCAZwD8fKsVpJQnAETfZX0ICgrC4sWL73YzRHWi02oR1rUHesU9iu4jx8DKmh8giahpqGugzwMwBcBJANMBbAGwzFRFEZmLysoKY1582dxlEBHVW10D3Q7Al1LKLwDj5WjVr1WYqjAiIiKqu7peA/YbjAFeww7AjntfDhEREd2Juga67TV3fUP11/amKYmIiIjqq66BXi6E6FjzRAgRA4A3tSYiImok6noO/XkAa4UQF2G8XM0bwLh7XYyDgwO6davz/C216r8GERGRZalroLeG8RI0fwCjYcxQ3vOSiIiokahrl/trUsoSAC4ABgD4HMBnJquKiIiI6qWuga6v/ncYgH9LKTcCsDZNSURERFRfdQ30C0KIpQAeAbBFCGFTj3WJiIjIxOoayo8A2AZgcPXMaW4A5pisKiIiIqqXOg2Kk1JWAFh/zfNcALmmKoqIiIjqh93mREREFoCBTkREZAEY6ERERBaAgU5ERGQBGOhEREQWgIFORERkARjoREREFoCBTkREZAEY6ERERBaAgU5ERGQBGOhEREQWgIFORERkARjoREREFoCBTkREZAEY6ERERBagTvOhN5Ty8nIcPHjQ3GXct3x/0pq7BKL7ju+CWHOXQBaCLXQiIiILwEAnIiKyAAx0IiIiC8BAN4GKigps2rQJ6enp0Ov1AAAppZmrovuBWqvBiqPr8dGBr1FeVWHucoioATWqQXGWICMjAwsXLkSzZs2wf/9+hIWFYfLkyRBCmLs0ug+8v285tqbvQZhnGxzOOYm+bbrCIA1QCH52J7J0/C2/S+np6Th79mzt86SkJPj7++P999/H5MmTceLECSQnJ5uxQrI0Nb09x3NT8OZvH2NL2m5U6Y1XKDzZcQxWjV2Env4dcfziKQBgmBPdJ0zeQhdCKAEkALggpRxu6v2ZmpQSWq0WW7Zswc8//wwACAwMRJs2bfDoo49CqVSiZcuW0Ol0CAsLQ0BAAE6ePImAgAA4ODiYuXpq6vQGPZQKJX7PPo5Xty/GgKAe2Jd1FIdzTuLNB/8KX+cWAIDkyxlIu3IOuaX5aOnkCSkle4mILFxDfHR/HkBKA+zHpNRqNU6cOAEhBDQaDQwGA+bMmYPly5cjNjYWR48ehUajgUajgRAChYWFAID27dsjJycHxcXFZj4CaqoqqtRYk7gZT294FcsS1qJUU47kS+l4Inok5vWZjrm9p+Fg9nH8nn28dp1Ad3/Yqqxx+PwJAIAEx3AQWTqTBroQwhfAMADLTLkfU1uxYgXi4uLw0ksvobCwEE5OThgzZgzCwsIAAAcPHkRkZCRsbGwQEhKCy5cv48KFCwCAdu3a4cyZM7C1tTXnIVATVVGlxqPfvYj9WUcxPuoh7Dn3B7akxSMxL7W2K93F1gkDg3viqyPratfzdmoO72ZeSMk/A4Dd7kT3A1P/ln8IYC4Ag4n3Y1Lt27fHkiVL8MADD2D79u21r+fl5eHVV19FRkYGsrKysGbNGrRv3x6urq74448/AAAeHh7QaDS1LXai+rC3tsM3jyzCJyNeR982XdEroBPKqyrQr003rD25tXa5xzuMQMKFpNrnzrZO6ObXAXml+Xh9x0dYn/yrOconogZkskAXQgwHcFlKeeQ2yz0thEgQQiQUFRWZqpy7EhUVhaCgIHTp0gV79uypfb1FixZ4/fXXsXTpUjz77LPYuXMnkpOT8cQTTyAzMxMLFizAiy++iICAAPj7+5vxCKgpc7Z1QqmmHC/+8g98fvh7FKqL0T+oJzKvXkB+ufGDopejB8I9A3E4x9jFfrbwPGZteRfx5w7jXGEOfJp5mfMQiKgBmLKF3hPACCFEJoDvAPQTQqy6fiEp5edSyhgpZYyLi4sJy7lzSqUSANC5c2eUlZXh3LlzAACDwQBra2sAgJubG/z9/ZGbmwsHBwfMmjULISEh6N27N+bNm1e7HNGdcLJxQIeW4dj4xGfILy/E5tRdCHTzw+rjmyClxFV1CbybNYe3U3MAgK3KGk9Ej8TBmWvxzSOL0NUvysxHQESmJhrihidCiAcAvHS7Ue7h4eHyq6++Mnk9d2PRokVwcHDAM888A8A4WK6iogLr1q3D2bNnMX/+fNjY2Ji5yjvDyVmahuRLp7Hq+CZ08olERkEW0vKNo9kjmgfhg2H/Z+7yqJ7udnIWIcQRKWXMPSqHmjDeWKaeRo4cicWLF0On0yEzMxNr165Feno6oqKiMHPmzCYb5tR0uNo1Q1bRBcztPRUPtx2M9cm/IsQjAG29QsxdGhGZUYMEupRyN4DdDbEvU8vKykJiYiIefPBBPP/88xg/fjwCAgLMXRZZuBJNGfZnHsFPp3bgdEEmHot6CI7WxvsajIkcaObqiKgxYAu9HjIyMrBlyxbMmzcPgwYNYmucGoy9lS0ulRfggTZd8dFDr8JWxZ89IvpfDPR6CAoKwuLFi81dBt2HVAoVnuw4xtxlEFEjxrtNEBERWQAGOhERkQVgoBMREVkABjoREZEFaFSD4hwcHNCtWzdzl3H/4reeiKjJYgudiIjIAjDQiYiILAADnYiIyAIw0ImIiCwAA52IiMgCMNCJiIgsAAOdiIjIAjDQiYiILAADnYiIyAIw0ImIiCwAA52IiMgCMNCJiIgsAAOdiIjIAjDQiYiILAADnYiIyAIw0ImIiCwAA52IiMgCMNCJiIgsAAOdiIjIAjDQiYiILAADnYiIyAKozF3AtcrLy3Hw4EFzl0FEN5Di7m/uEizS5GBvc5dAFoItdCIiIgvAQCezqaqqMncJREQWo1F1uZPlklJCCIHMzEysXLkSBQUFePrppxEZGWnu0ug+UV5cBAdnF3OXQWQyDHRqEEII6HQ6fPHFFwgICMD06dPh5uZWG/REpqCpqMDhLZuQ8J9f4Ojigglvvgs7R0dzl0VkEgx0Mgm1Wo3ffvsN4eHhaN26NRQKBY4ePQp3d3dMmzYNAKDRaCCEYKjTPVfzM/X+U+OhLi3FpLcXIqhjZ3OXRWRSDHS65/bs2YMVK1bA29sbx44dQ+vWrTFhwgQUFBTg/PnzyMzMxAcffABvb28MGDAAnTp1MnfJZAHOnUzE3rXfwtbBEYOnPYNmbu6IGTwcl7Mya8PcoNdDoVSauVIi0zBpoAshMgGUAtAD0EkpY0y5PzKP9PR0FBQUoHv37gCA06dPY8CAARg/fjzOnTuHDz/8ED179kSPHj2wdOlSrF27Fk888QRKS0uxfPlyCCHQsWNHttSp3irLy6FUKfH1ay8j7fDv6PvYJHQbMRrN3NwBAB36DcTCCXHQajTIO3cG4d17odPAIfALizBz5UT3XkOMcu8rpezAMLdMxcXF+Pvf/44lS5YAACoqKlBUVAQPDw8AQOvWrXH+/Hns3LkTDg4O8PHxQWVlJTp37ox+/fqhU6dOiI+PN+chUBOjUauxf/0P+OfEsfjqldmwsrGFs2dzDJvxVwx9+i9wa+ENg8EAAGju3wrtevdDM3d3TFu0BFpNJX766D1UlBSb+SiI7j12uVOdqdVqZGRkoF27dtDr9VAqlVCpVPDx8cGZM2dw+vRpBAcHo3Xr1ti1axeqqqpQXl4OX19flJSUAABGjx6NVatW/c82o6OjAYCtc7otnVaL14b1hU9wKIZMfQbtevcFAPiGhOHcyUSse+9dFF+5jOCOnRHRIxYevn547NW3YG1rBwAY8ZcXMX/MEKjLymDfzNmch0J0z5m6hS4B/CqEOCKEeNrE+yITWrFiBeLi4jB79mwUFhZCWX0ectu2bRg2bBh69eqFTZs2AQCGDBmCMWPG4MiRIygoKMCMGTNw8uRJ6HQ69O/fHzExMXj33XcxZcoUnD59GhER7P6kulFZWcE/vC26DBtZG+YAENK5G0qu5CP/fBYie/XBhYw0fP36ywBQG+YAoNVUwsPXH3qdrsFrJzI1U7fQe0opLwohmgPYLoRIlVLuuXaB6qB/GgBatGhh4nLoTrVv3x69evXCDz/8gO3bt2PcuHEAAIPBgOLiYowbNw5z5syBVquFlZUVYmJiEBPz37MszZo1w9WrV9GyZUs8++yzOHbsGBwdHREcHGyuQ6ImqtfD4/D9u28hK/kksk+dREjn7uj9yHiMm/c6XFu0BADEDBqGD6Y8hqR98Wjbqw9O7tmF3d+twqXMs+gVNw6efryNLVkek7bQpZQXq/+9DGADgC43WOZzKWWMlDLGxYU3fWisoqKiEBQUhC5dumDPHuNnMq1Wi3PnzqFXr14oKCjApUuX0L9/fyQnJ0Ov16OiogLbt2/H7Nmz0aFDB7Rs2RJSSgBAdHQ0w5zuSIe+A+Dh6w9HF1dM/edHuJx1DttXLENVpbp2mfKiq3Br4Q23Ft7QqNUoK7qKDv0G4I2f/oPBU2bw9A5ZJJO10IUQDgAUUsrS6q8HAphvqv2RadV0sXfu3BnffPMNMjIyEBQUhJSUFIwZMwbBwcFo27Yt7OzsEBUVBQA4fvw41q5di5EjR2LQoEEAeJ6c7o1n/7UcNnbGrvSh05/Fls//hYqSEmSnJCNx9w6c2P0b/MMj4R1k/NDYfcQYc5ZL1CBM2eXuBWBD9R9wFYBvpZT/MeH+qAE4OzsjMjISv/76K4KCgjBr1iw4OjoiICAAFRUViIuLQ1lZGRwdHdG9e3f06NHD3CWTBaoJcwCwdXBEyZV8tAwMxubPlkCv02LCG/9Aq4i2ZqyQqOGZLNCllGcBRJlq+2Q+o0aNwuLFi6HVamvD3GAwwN7eHl988QUcq2+tydY4mYq2SoOkPbtxYOM6XDydjj7jHoetgwMefun/zF0akdnwsjWqt6ysLCQmJmLQoEF46qmn0KJFC9ja2kJKCV9fX3OXR/cBK2sbFF+5jLa9HsDT730MKxtbc5dEZHYMdKqXjIwMbNmyBfPmzcOgQYNgY2NT+x5b5NSQHnj0CXOXQNSoMNCpXoKCgrB48WJzl0FERNdpiFu/EhERkYkx0ImIiCxAo+pyd3BwQLdu3cxdBhHdAH8ziRo3ttCJiIgsAAOdiIjIAjDQiYiILAADnYiIyAIw0ImIiCwAA52IiMgCMNCJiIgsAAOdiIjIAjDQiYiILAADnYiIyAIIKaW5a6glhMgHkGXuOoiImpBWUkpPcxdB5teoAp2IiIjuDLvciYiILAADnYiIyAIw0ImIiCwAA52IiMgCMNCJiIgsAAOdiIjIAjDQiYiILAADnYiIyAIw0ImIiCzA/wOb0Jz5227ztQAAAABJRU5ErkJggg==\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"data": {
"image/png": "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QogGyG6388orrzQpLS1tEN25tapl3yXAl+RBXT0dhhBCXJwoKVdbk04vcVtdc+fODbj99tsjwsLCygBCQkIca9asyXr44Ydb+vv7O1944YUjZrOZPn36FN99992tP//8871Go/Gs+8vMzPQaMWJE1I4dO1Iv4XQ8qlYleyGEELXTgSkra7TEbatXktxa4jYxMbFo6dKlO8+1zsCBA0sGDhy4151x1BbSjS+EEKLO+PLLLwM7d+4c26FDh7i+fftG79+//6IarampqZakpKSo+Pj4DgkJCTGbNm3yBti/f79p6NChETExMXExMTFxixcv9gNwOp3cdtttbSIjI+P79esXVVRUpM60n82bN9fKq3El2QshhKgzzlXa9lTJycn+laVxn3jiid+tc88997R5991396Wmpqa/+uqrByZOnNgaysvYJiUlFWZmZqalpqamde/evRRg37593pMnTz66c+fO1MDAQOeMGTOCAcaPH1+1n9dee61qP7WNdOMLIYSoM/bs2eM1atSoVseOHTOXlZUZwsPDz1hd6Fzd+Pn5+YaUlBS/e+65p23lcwUFBUaANWvWBHz77bd7AEwmE6Ghoc7jx48bw8LCbH379rUCdOvWrSQ7O9uSn59v2Lx5s//NN98cUbmfsrKyWnnBnyR7IYQQdca5SttWl9PpxN/f37lhw4bM6m7j5eVVVUjGaDRqq9VqcDqdBAQEODIyMjxWur26pBtfCCFEnXEhpW3PJiQkxNWqVauyynK1TqeT1atX+wD069ev8LXXXmsC4HA4yMvLO2uerNzPxx9/HAzgcrlYu3ZtrbwfsiR7IYQQtVJpaamhWbNmnSt/nn/++WYXUtr2XGbNmrX7s88+axwTExMXHR0dP2fOnCAoL2O7fPnygOjo6LiOHTvGbdq06ZzJe9asWbs/+eSTxjExMXFRUVHx3333XdDFxuRObi9xeyESExN1cnKyp8MQQog6Q0rcilOdrcSttOyFEEKIek6SvRBCCFHPSbIXQggh6jlJ9kIIIUQ9J8leCCGEqOck2QshhBD1nCR7IYQQtZJSKmHUqFHtKh/b7XaCg4O7DBo0KPJc261YscL3rrvuCofycreVxWwuVmZmpldUVFT8pezD02rV7XJTCktovnSLp8Ood7TdjjKbPR1GnfNyq6aeDkE0AH+MuuC7vXrE888/X6Mlbp9//vnz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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"from matplotlib import colors\n",
"# Il va nous falloir compter le nombre d'actes de la pièce\n",
"# et faire une boucle sur ces derniers pour construire \n",
"# un dataframe par acte à partir du dataframe global\n",
"# que dont on va caler la structure en fonction de\n",
"# l'exemple disponible sur la page.\n",
"# Le dataframe doit contenir une ligne par scène de l'acte\n",
"# courant et une colonne par protagoniste de la scène\n",
"actNums = pd.unique(textDataSynthesisTableDf[\"act\"])\n",
"nbActs = actNums.size\n",
"\n",
"for actNum in actNums:\n",
" actDf = textDataSynthesisTableDf[textDataSynthesisTableDf[\"act\"]==float(actNum)].copy()\n",
" #actDf\n",
" sceneNums = pd.unique(actDf[\"scene\"])\n",
" actPersos = pd.unique(actDf[\"author\"])\n",
" #print(\"act {0:} persos {1:}\".format(actNum,actPersos))\n",
" actDict = {\"scene\":[]}\n",
" for perso in actPersos:\n",
" # Création d'une colonne par personnage de l'acte\n",
" actDict[perso] = []\n",
" \n",
" for sceneNum in sceneNums:\n",
" actDict[\"scene\"].append(sceneNum)\n",
" sceneDf = actDf[actDf[\"scene\"]==float(sceneNum)].copy()\n",
" scenePersos = pd.unique(sceneDf[\"scene\"])\n",
" for perso in actPersos:\n",
" tmpDf = sceneDf[sceneDf[\"author\"]==perso].copy()\n",
" if not tmpDf.empty:\n",
" currentPersoNbWordsInScene = tmpDf[\"speech_length\"].sum()\n",
" #print(currentPersoNbWordsInScene)\n",
" actDict[perso].append(currentPersoNbWordsInScene)\n",
" else:\n",
" actDict[perso].append(0)\n",
" \n",
" # Il faut ensuite transformer le dictionnaire d'acte en dataframe\n",
" # on va en faire une version en pourcentage de paroles par scène.\n",
" # Il faudra récupérer les valeurs du nombre de mots afin d'afficher\n",
" # sur les graphiques.\n",
" #print(actDict)\n",
" actSceneSynthesisGraphDf = pd.DataFrame.from_dict(actDict)\n",
" #print(actSceneSynthesisGraphDf)\n",
" # On va créer une version en pourcentage du dataframe\n",
" # de synthèse par scène d'un acte.\n",
" percentDf = actSceneSynthesisGraphDf.copy()\n",
" # On utilise actPersos en indice pour ne traiter que les colonnes de personnages\n",
" # et ignorer la colonne donnant le numéro de scène\n",
" percentDf[actPersos] = percentDf[actPersos].div(percentDf[actPersos].sum(axis=1), axis=0)\n",
" percentDf = percentDf.sort_index(axis=1)\n",
" #print(percentDf)\n",
" #colors = {perso:colors.rgb2hex(avarePersoDict[perso]['color']) for perso in actPersos}\n",
" sortedPersos = np.sort(actPersos)\n",
" colors = []\n",
" for perso in sortedPersos:\n",
" colors.append(avarePersoDict[perso]['color'])\n",
"\n",
" # Rappel: Pour l'affichage en barres empilées à l'horizonatal, une recherche nous à permis de tomber\n",
" # sur la page suivante qui nous a aidé afin de faire le tracer souhaité:\n",
" # --> https://www.geeksforgeeks.org/stacked-percentage-bar-plot-in-matplotlib/\n",
" \n",
" percentDf.plot(\\\n",
" x = 'scene', \\\n",
" kind = 'barh', \\\n",
" color=colors, \\\n",
" stacked = True, \\\n",
" title = \"Acte {}\".format(actNum), \\\n",
" mark_right = True)\n",
" ax = plt.gca()\n",
" ax.invert_yaxis()\n",
" sceneCount = len(sceneNums)\n",
" for i, bar in enumerate(ax.patches):\n",
" #print(bar)\n",
" # On calcul l'index du personnage dans la liste des personnages de l'acte\n",
" # en prenant la partie entière de la division de i par le nombre de scènes\n",
" # de l'acte. En effet, comme on a pu le montrer un peu plus haut,\n",
" # les données sont parcourues de la manière suivante, les barres du graphique, les rectangles\n",
" # représentant les pourcentage de paroles, sont données pour toutes les scènes pour chaque\n",
" # personnage du dataframe.\n",
" # Pour le premier acte i va aller de 0 à 24 et le résultat de floor(i/sceneCount) va \n",
" # valloir 0 0 0 0 0 1 1 1 1 1 2 2 2 2 2 ... 4 4 4 4 4 où 4 est l'indice du dernier personnage (il y en a 5)\n",
" # On s'assure que persoIdx est un entier pour l'utiliser comme élément d'indiçage de l'array numpy des noms\n",
" # des personnages de l'acte courant trié sortedPersos.\n",
" persoIdx = int(np.floor(i/sceneCount))\n",
" #print(persoIdx)\n",
" # On calcul la ligne de la donnée\n",
" # On récupère le nom du personnage\n",
" persoName = sortedPersos[persoIdx]\n",
" #print(persoName)\n",
" # Ensuite, on va calculer le \"numéro\" de scène auquel correspond la barre courante\n",
" # en utilisant le reste de la division euclidienne de i par le nombre de scènes\n",
" # Pour le premier acte i va aller de 0 à 24 et le résultat de i % sceneCount va \n",
" # valloir 0 1 2 3 4 ... autant de fois qu'il y a de personnages dans l'acte courant\n",
" # et où 0 1 2 3 4 donne le numéro de ligne dans le dataframe\n",
" dataLineIdx = i % sceneCount\n",
" if bar.get_width() != 0:\n",
" # Si la largeur de la barre en cours est différente de 0, l'auteur associé a prononcé un certain nombres de mots\n",
" # que l'on va récupérer dans le dataframe qui n'a pas été mis en pourcentage et on va l'afficher au milieu du rectangle\n",
" # correspondant.\n",
" #print(actSceneSynthesisGraphDf[persoName])\n",
" nbWords = actSceneSynthesisGraphDf[persoName].iloc[dataLineIdx]\n",
" ax.text(bar.get_x()+bar.get_width()/2, \\\n",
" bar.get_y()+bar.get_height()/2, \\\n",
" \"{:d}\".format(nbWords), \\\n",
" rotation=20, \\\n",
" ha = 'center', \\\n",
" va = 'center')\n",
" # cf. (https://stackoverflow.com/questions/66837088/how-to-write-text-inside-the-bar-in-a-horizontal-bar-graph-matplotlib) \n",
" # ax.text(0.1, bar.get_y()+bar.get_height()/2, disease, color = 'white', ha = 'left', va = 'center') --> on comprend\n",
" # que les premiers paramètres donne la position du texte dans la barre notamment grâce à bar.get_y()+bar.get_height()/2\n",
" # qui met la coordonnée en y à la coordonnée de début de la barre + la moitié de sa hauteur. Ensuite, en ayant observé\n",
" # quelques comportements en modifiant les paramètres ha et va on comprend que cela règle l'ancrage du texte, i.e. \n",
" # cela précise à quoi font référence les coordonnées renseignées ha (alignement horizontal) et va (alignement vertical)\n",
" # center indique que la coordonnées renseignée représente le centre de la boîte de texte pour l'axe considéré,\n",
" # center, center --> indique que le centre de la boîte de texte se trouve aux coordonnées passées en entrée.\n",
" \n",
" # Positionnement de la légende en haut à droite en dehors du plot\n",
" # cf. (https://www.geeksforgeeks.org/how-to-place-legend-outside-of-the-plot-in-matplotlib/)\n",
" plt.legend(bbox_to_anchor=(1.05, 1.0), loc='upper left')\n",
" # Hide ticks of x axis on figures\n",
" plt.tick_params(axis='x', \\\n",
" which='both', \\\n",
" bottom=False, \\\n",
" top=False, \\\n",
" labelbottom=False) \n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Réponse à la question facultative"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Introduction\n",
"\n",
"Un nouveau regard sur le texte de la pièce nous montre que la manière dont nous avons géré auteurs et destinataires des répliques est \"naïf\". Cela n'a pas d'impact sur les réponses aux deux premières questions mais sur la dernière question oui.\n",
"Voici un commentaire de notre code:\n",
"```\n",
" # Il y avait déjà un auteur d'une réplique, currentAuthor\n",
" # le nouvel auteur est donc le destinataire de la réplique précédente.\n",
"```\n",
"\n",
"renseignant sur notre approche et qui montre la manière dont nous identifions auteurs et destinataires. Cette approche fonctionne parfaitement lorrsqu'il n'y a que deux personnages dans une scène mais n'est plus qu'une approximation lorsqu'il y a plus de deux personnages. En effet, cela peut être plus compliqué comme le montre quelques extraits ci-dessous:\n",
"\n",
"#### Extrait 1\n",
"\n",
"```\n",
"______________________________________________________________________________________________________________________\n",
"### Scène IV. (Acte 5)\n",
"Élise, Mariane, Frosine, Harpagon, Valère, Maître Jacques, le Commissaire, son Clerc\n",
"\n",
"\n",
" HARPAGON.\n",
"Ah ! fille scélérate ! Fille indigne d'un Père comme moi ! C'est ainsi que tu pratiques les Leçons que je t'ai données ! Tu te laisses prendre d'amour pour un Voleur infâme, et tu lui engages ta foi sans mon consentement ? Mais vous serez trompés l'un et l'autre. Quatre bonnes murailles me répondront de ta conduite ; et une bonne Potence me fera raison de ton audace.\n",
"\n",
" VALÈRE.\n",
"Ce ne sera point votre passion qui jugera l'affaire ; et l'on m'écoutera, au moins, avant que de me condamner.\n",
"\n",
" HARPAGON.\n",
"Je me suis abusé de dire une Potence ; et tu seras roué tout vif.\n",
"\n",
" ÉLISE, *à genoux devant son père*.\n",
"Ah ! mon père, prenez des sentiments un peu plus humains, je vous prie, et n'allez point pousser les choses dans les dernières violences du pouvoir paternel : Ne vous laissez point entraîner aux premiers mouvements de votre passion, et donnez-vous le temps de considérer ce que vous voulez faire.Prenez la peine de mieux voir celui dont vous vous offensez : il est tout autre que vos yeux ne le jugent ; et vous trouverez moins étrange que je me sois donnée à lui, lorsque vous saurez que sans lui vous ne m'auriez plus il y a longtemps. Oui, mon Père, c'est celui qui me sauva de ce grand péril que vous savez que je courus dans l'eau, et à qui vous devez la vie de cette même fille, dont…\n",
"______________________________________________________________________________________________________________________\n",
"```\n",
"\n",
"Ci-dessus, la première réplique d'Harpagon s'adresse à sa fille Elise et non à Valère.\n",
"\n",
"\n",
"#### Extrait 2\n",
"\n",
"```\n",
"______________________________________________________________________________________________________________________\n",
"### Scène V. (Acte 5)\n",
"Anselme, Harpagon, Élise, Mariane, Frosine, Valère, Maître Jacques, le Commissaire, son Clerc\n",
"\n",
"\n",
" ANSELME.\n",
"Qu'est-ce, Seigneur Harpagon, je vous vois tout ému.\n",
"\n",
" HARPAGON.\n",
"Ah ! Seigneur Anselme, vous me voyez le plus infortuné de tous les hommes ; et voici bien du trouble et du désordre au Contrat que vous venez faire ?On m'assassine dans le bien, on m'assassine dans l'honneur ; et voilà un traître, un scélérat, qui a violé tous les droits les plus saints ; qui s'est coulé chez moi sous le titre de Domestique, pour me dérober mon argent, et pour me suborner ma Fille.\n",
"\n",
" VALÈRE.\n",
"Qui songe à votre argent, dont vous me faites un galimatias ?\n",
"\n",
" HARPAGON.\n",
"Oui, ils se sont donné l'un et l'autre une Promesse de mariage. Cet affront vous regarde, Seigneur Anselme ; et c'est vous qui devez vous rendre partie contre lui, et faire toutes les poursuites de la Justice, pour vous venger de son insolence.\n",
"______________________________________________________________________________________________________________________\n",
"```\n",
"\n",
"Ici la première réplique d'Harpagon n'est pas adressée à Valère mais à Anselme, il lui répond.\n",
"\n",
"\n",
"#### Extrait 3\n",
"\n",
"Dans la scène 2 de l'acte 5:\n",
"```\n",
"______________________________________________________________________________________________________________________\n",
" MAÎTRE JACQUES, *à part*.\n",
"Voici justement ce qu'il me faut pour me venger de notre Intendant : depuis qu'il est entré céans, il est le favori, on n'écoute que ses conseils ; et j'ai aussi sur le cœur les coups de bâton de tantôt.\n",
"______________________________________________________________________________________________________________________\n",
"```\n",
"Maître Jacques se parle ici à lui-même.\n",
"\n",
"#### Bilan\n",
"\n",
"Afin d'avoir une graphique exact des échanges, il faudrait donc une analyse du texte bien plus poussée et intelligente que celle mise en place. Néanmoins, cette approche permet d'avoir une bonne approximation des échanges entre les personnages.\\\n",
"Partons donc du tableau de données produites afin de générer le graphe des échanges entre personnages même si l'on sait qu'il ne sera qu'approximatif. "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Création du graphe des échanges entre personnages"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Resources:\n",
"page officielle de la docuementation de networkx sur les types de graphes implémentés [lien](https://networkx.org/documentation/stable/reference/classes/index.html)\\\n",
"--> pour notre besoin, il nous faudra utiliser les graphes `MultiDiGraph`\n",
"\n",
"lien vers le tutorial de la bibliothqe networkx\\\n",
"[tutorial_networkx](https://networkx.org/documentation/stable/tutorial.html)\n",
"\n",
"lien stack overflow vers un code de customisation de graphes de la bibliothèque python networkx\\\n",
"[customisation_graphe](https://stackoverflow.com/questions/25639169/networkx-change-color-width-according-to-edge-attributes-inconsistent-result)\n",
"\n",
"lien github vers un morceau de code ajoutant de la couleur et le réglage de l'épaisseur des arêtes sur un graphe\\\n",
"[couleur_epaisseur_arêtes_graphe](https://gist.github.com/AruniRC/2c53fe7680eeb578593ec816bbfb1653)\n",
"\n",
"En première étape, il va nous falloir construire la matrice d'adjacence du graphe des échanges entre personnages afin d'instancier/créer l'objet graphe voulu de la bibliothèque networkx. La matrice d'adjacence sera un dataframe pandas."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.4"
}
},
"nbformat": 4,
"nbformat_minor": 2
}