diff --git a/rapport.md b/rapport.md new file mode 100644 index 0000000..456267f --- /dev/null +++ b/rapport.md @@ -0,0 +1,52 @@ +# Travail pratique 1 + +IFT7022 - Traitement automatique de la langue naturelle + +Remis par François Pelletier + +Étudiant # 908144032 + +## Conversion de questions + +L'objectif de ce problème est de convertir un ensemble de questions en affirmations à l'aide d'expressions régulières et règles de subsitution. + +Comme il est important de garder une forme la plus générale possible pour ces expressions, il est attendu à ce qu'un certain nombre de questions ne soient pas converties adéquatement. Sinon, il aurait été facile d'y aller avec une solution triviale qui associe une expression différente pour chaque question. + +### Approche utilisée + +L'approche utilisée a été d'identifier d'abord les mots questions, ensuite d'identifier la structure générale de la phrase, dont le verbe principal et les noms à remplacer, le cas échéant. Puis, j'ai dentifié les différents types de réponses requises, et lorsqu'un même motif de question nécessitait deux types de réponses différentes, j'ai séparé en deux expressions consécutives. Ensuite, j'ai construit quelques règles qui appliquent des corrections mineures au niveau des signes et de la ponctuation. + +Toutes ces règles sont enchaînées les unes à la suite des autres. Comme la conversion élimine le point d'interrogation à la fin de la phrase, les motifs subséquents au premier qui a donné une correspondance sont ainsi ignorés. Il n'y a donc aucun traitement conditionnel en dehors de ceux inclus dans les expressions régulières. + +### Description des motifs utilisés + +Les motifs suivent cet ordre. Sauf indication contraire, le groupe affirmatif à convertir est située après le motif recherché: + +1. Mot-question **qui**, suivi d'un verbe auxiliaire, sous forme d'énumération partielle +1. Mot-question **qu'est-ce qu'** +1. Mot-question **que** suivi d'un verbe d'état ou d'action. J'ai ici utilisé une énumération partielle pour identifier les verbes présents dans les questions en échantillon. +1. Mot-question **où** ou de la forme **dans quelle** suivi d'une catégorie géographique, sous forme d'énumération partielle. J'ai aussi capturé la forme particulière **quelle est la capitale** où je remplace le mot **quelle** par où, afin de correspondre au motif précédent. Ceci me permet d'éviter une règle additionnelle. +1. Mot-question **quel** suivi soit du mot âge et du verbe avoir, soit du verbe auxiliaire et d'un nom représentant une quantité, sous forme d'énumération +1. Mot-question **quel** suivi du verbe être (forme générique du motif précédent) +1. Mot question **quand** ou groupe **en quelle année** +1. Mot question **pourquoi** +1. Mot question **combien** suivi de **de**. +1. Mot question **combien** suivi de **y a-t-il**. La différence ici est que la réponse conserve l'ordre de la question et qu'il faut transformer **y a-t-il** en **il y a**. +1. Mot-question **quel** à la fin de la question. Ce motif sert à attraper une forme moins fréquente de questions où la question est posée après le groupe affirmatif. + +Quelques modifications au niveau de la phrase viennent ensuite *nettoyer* la résultante: + +1. Suppression des inversions *-il*, *-elle*, *-t-il*, *-t-elle* +1. Inversion du pronom *vous* +1. Retrait des double espaces +1. Retrait des espaces au début de la phrase +1. Retrait des espaces après les apostrophes + +### Résultats + +Sur l'ensemble des questions à convertir, quatre réponses ne correspondent pas à celles dans le fichier d'entrainement: + +1. *Q: Qui était Galileo?* Comme cette question correspond au motif *qui*, la réponse que le module produit est **Luc Lamontagne était Galileo.**, alors qu'elle aurait du tomber dans la catégorie *autre*. Pour ce faire, cela aurait nécessité une analyse syntaxique. +1. *Q: A quelle distance se trouve la ligne de service du net au tennis?* Il me reste le mot distance au début de l'affirmation, que je n'arrive pas à enlever sans devoir faire une expression trop spécifique. +1. *Q: Combien de litres dans un gallon?* C'est la seule question de cette forme où la réponse donnée est au début et non à la fin. Ma réponse est équivalente. +1. *Q: Que fait-on avec des drapeaux usés ou périmés?* Encore une fois, c'est la seule version où la réponse est au début et non à la fin. Ma réponse est équivalente. \ No newline at end of file diff --git a/t1_conversion_questions.py b/t1_conversion_questions.py index 1c90c82..a2c02dd 100644 --- a/t1_conversion_questions.py +++ b/t1_conversion_questions.py @@ -75,14 +75,14 @@ def convert(question): re.sub(regex_capitale, r"où\2", modif3)) - regex_mesure = re.compile(r"([aà]\s)?quelle\s" - r"(est\s)?" + regex_mesure = re.compile(r"([aà]\s)?qu[el]+\s(âge\s)?" + r"(est|avait)?\s?" r"(l[a']\s?)?" - r"(hauteur|température|vitesse|distance|espérance\sde\svie)\s" - r"(.*)\?", + r"(?(2)|(hauteur|température|vitesse|distance|espérance\sde\svie))\s" + r"(se)?(?(6)(\s\w+)|)(.*)\?", re.IGNORECASE) modif5 = re.sub(regex_mesure, - r"\3 \4 \5 \2 1000.", + r"\4 \5 \8 \6 \7 \3 1000.", modif4) regex_quelle_est = re.compile(r"quel[les]*\s(.*)(est|sont)\s(.*)\?",