From 67209c639dc13789ac4a8d0e8f4b5e81cbccad11 Mon Sep 17 00:00:00 2001 From: 7404ea6678ce6fbf3a726e36f2bf2079 <7404ea6678ce6fbf3a726e36f2bf2079@app-learninglab.inria.fr> Date: Wed, 2 Oct 2024 11:48:36 +0000 Subject: [PATCH] =?UTF-8?q?R=C3=A9cup=C3=A9ration=20de=20la=20liste=20des?= =?UTF-8?q?=20personnages=20termin=C3=A9e?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- module3/exo3/exercice_fr.ipynb | 89 +++++++++++++++++++++------------- 1 file changed, 55 insertions(+), 34 deletions(-) diff --git a/module3/exo3/exercice_fr.ipynb b/module3/exo3/exercice_fr.ipynb index 784cdb2..bf9d4a9 100644 --- a/module3/exo3/exercice_fr.ipynb +++ b/module3/exo3/exercice_fr.ipynb @@ -46,17 +46,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ - "# from os import path as pth\n", + "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", @@ -95,7 +96,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -105,7 +106,7 @@ "# 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_lenght':[]}\n", + "avareAnalysisDict = {'author':[],'recipient':[],'act':[],'scene':[],'speech_length':[]}\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", @@ -129,7 +130,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ @@ -138,7 +139,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 6, "metadata": {}, "outputs": [ { @@ -147,7 +148,7 @@ "'ACTEURS.'" ] }, - "execution_count": 28, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } @@ -171,7 +172,7 @@ }, { "cell_type": "code", - "execution_count": 47, + "execution_count": 7, "metadata": {}, "outputs": [ { @@ -180,7 +181,7 @@ "\"Harpagon, Père de Cléante et d'Élise, et Amoureux de Mariane\"" ] }, - "execution_count": 47, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" } @@ -189,10 +190,11 @@ "# 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", + "# 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)" ] @@ -208,18 +210,7 @@ "cell_type": "code", "execution_count": 8, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'author': [], 'recipient': [], 'act': [], 'scene': [], 'speech_lenght': []}" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "def fill_perso_dict(fileToAnalyse, emptyPersoDict):\n", " currentLine = fileToAnalyse.readline()\n", @@ -231,18 +222,21 @@ " currentLine = fileToAnalyse.readline()\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 lue la ligne suivante. Nous devons maintenant lire ligne par ligne,\n", - " # la liste des personnages au format suivant:\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 = currentLine.split(',')\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", @@ -252,7 +246,7 @@ " # 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", + " 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", @@ -268,21 +262,41 @@ " # l'espace\n", " currentLink = elt[1:]\n", " persoCaracs[\"links\"].append(currentLink)\n", + " # Fin de la boucle for\n", + " \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]] = perso\n", + " emptyPersoDict[parts[0]] = persoCaracs\n", " currentLine = fileToAnalyse.readline()\n", " m = re.search('(?<=\\s–\\s)[A-ZÀ-Ÿ]{1}[a-zA-ZÀ-ÿ\\s,\\']+', currentLine)\n", - " if m is None:\n", - " isAPersoLine = False" + " if m is not None:\n", + " extractedString = m.group(0)\n", + " else:\n", + " isAPersoLine = False\n", + " \n", + " # Fin de la boucle while" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "##################################################\n", + "Contenu du dictionnaire des personnages initialisé\n", + "##################################################\n", + "\n", + "{'Harpagon': {'links': [\"Père de Cléante et d'Élise\", 'Amoureux de Mariane'], 'color': None}, 'Cléante': {'links': [\"Fils d'Harpagon\", 'Amant de Mariane'], 'color': None}, 'Élise': {'links': [\"Fille d'Harpagon\", 'Amante de Valère'], 'color': None}, 'Valère': {'links': [\"Fils d'Anselme\", \"Amant d'Élise\"], 'color': None}, 'Mariane': {'links': ['Amante de Cléante', \"aimée d'Harpagon\"], 'color': None}, 'Anselme': {'links': ['Père de Valère et de Mariane'], 'color': None}, 'Frosine': {'links': [\"Femme d'Intrigue\"], 'color': None}, 'Maitre Simon': {'links': ['Courtier'], 'color': None}, 'Maitre Jacques': {'links': [\"Cuisinier et Cocher d'Harpagon\"], 'color': None}, 'La Flèche': {'links': ['Valet de Cléante'], 'color': None}, 'Dame Claude': {'links': [\"Servante d'Harpagon\"], 'color': None}, 'Brindavoine': {'links': [\"laquais d'Harpagon\"], 'color': None}, 'La Merluche': {'links': [\"laquais d'Harpagon\"], 'color': None}, 'Le commissaire': {'links': ['son clerc'], 'color': None}}\n", + "\n", + "##################################################\n" + ] + } + ], "source": [ "# On ouvre le fichier local en lecture 'r' pour en faire l'analyse\n", "# en utilisant l'instruction with qui se chargera de fermer\n", @@ -293,9 +307,16 @@ "# le fichier, à savoir le lire de manière à ranger les données\n", "# de manière intelligente dans une structure de données facilitant\n", "# la manipulation et l'analyse. \n", - "with open(local_filename,'r') as avare_file:\n", - " # On va commencer par parser le fichier afin de définir des couleurs pour chaque personnage\n", - " pass" + "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", + " fill_perso_dict(avareFile, avarePersoDict)\n", + " print(\"##################################################\")\n", + " print(\"Contenu du dictionnaire des personnages initialisé\")\n", + " print(\"##################################################\\n\")\n", + " print(avarePersoDict)\n", + " print(\"\\n##################################################\")\n", + "\n", + " " ] }, { -- 2.18.1