corrections test exercice 1
This commit is contained in:
parent
c8569e54d3
commit
b2b8d26b4f
3 changed files with 85 additions and 36 deletions
4
.gitignore
vendored
4
.gitignore
vendored
|
@ -1,3 +1,5 @@
|
|||
.idea/
|
||||
data/
|
||||
t1_results.txt
|
||||
*.txt
|
||||
*.pdf
|
||||
|
||||
|
|
60
rapport.md
60
rapport.md
|
@ -23,42 +23,60 @@ Toutes ces règles sont enchainées les unes à la suite des autres. Comme la co
|
|||
Les motifs suivent cet ordre. Sauf indication contraire, le groupe affirmatif à convertir est situé 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.
|
||||
2. Mot-question **qu'est-ce qu'**
|
||||
3. 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.
|
||||
4. 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.
|
||||
5. 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
|
||||
6. Mot-question **quel** suivi du verbe être (forme générique du motif précédent)
|
||||
7. Mot question **quand** ou groupe **en quelle année**
|
||||
8. Mot question **pourquoi**
|
||||
9. Mot question **combien** suivi de **de**.
|
||||
10. 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**.
|
||||
11. 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 doubles espaces
|
||||
1. Retrait des espaces au début de la phrase
|
||||
1. Retrait des espaces après les apostrophes
|
||||
12. Suppression des inversions *-il*, *-elle*, *-t-il*, *-t-elle*
|
||||
13. Inversion du pronom *vous*
|
||||
14. Retrait des doubles espaces
|
||||
15. Retrait des espaces au début de la phrase
|
||||
16. Retrait des espaces après les apostrophes
|
||||
|
||||
### Résultats
|
||||
|
||||
#### Fichier d'entrainement
|
||||
|
||||
Sur l'ensemble des questions à convertir, quatre réponses ne correspondent pas à celles dans le fichier d'entrainement :
|
||||
Sur l'ensemble des questions à convertir, quatre réponses ne correspondaient pas à celles dans le fichier d'entrainement, avant d'avoir effectué les améliorations suite à la connaissance du fichier de test :
|
||||
|
||||
1. `Q : Qui était Galileo?`
|
||||
Situation 1. `Q : Qui était Galileo?`
|
||||
- Comme cette question correspond au motif 1, 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?`
|
||||
Situation 2. `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?`
|
||||
Situation 3. `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.
|
||||
Situation 4. `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.
|
||||
|
||||
#### Fichier de test
|
||||
|
||||
Sans apporter aucune modification au code d'origine, j'obtiens 10 erreurs avec le fichier de questions de test.
|
||||
|
||||
J'apporte les modifications suivantes pour diminuer le nombre d'erreurs:
|
||||
|
||||
- Ajout du mot `profondeur` à la règle 5: enlève une erreur
|
||||
- J'ajoute un groupe de capture optionnel `est né` à la règle 7, enlève une erreur.
|
||||
- Séparation de la règle 1 pour le **qui** en deux expression pour gérer les temps de verbe présent et participe passé. La réponse n'est pas au même endroit dans la phrase pour ces deux situations: enlève trois erreurs
|
||||
- Ajout d'une expression régulière pour gérer "quel est le nom du chef" après celles qui gère le mot-question **qui**: enlève une erreur.
|
||||
- Je sépare la règle 4 pour gérer `capitale` et `emplacement` séparément. J'enlève deux erreurs dans le fichier de test mais j'ajoute une erreur dans le fichier d'entrainement à la question `Quelle est la capitale de la Yougoslavie?`, car il y a un `à` de trop dans la réponse.
|
||||
|
||||
|
||||
J'élimine donc 8 erreurs à l'aide de 3 nouvelles expressions régulières et en améliorant une expression existante. Il subsiste 2 erreurs:
|
||||
|
||||
Situation 1. `Q : À quelle vitesse est le son?`
|
||||
- Même erreur que la situation 2 dans le fichier d'entrainement
|
||||
Situation 2. `Q : Combien de cœurs a une pieuvre?`
|
||||
- Même erreur que la situation 3 dans le fichier d'entrainement
|
||||
|
||||
## Origine du nom de famille
|
||||
|
||||
Dans cette section, nous allons créer des modèles pour les noms de famille provenant de plusieurs origines. Nous disposons de jeux d'entrainement et de test étiquetés, ce qui nous permettra d'analyser la performance de nos différents modèles d'origine.
|
||||
|
|
|
@ -4,6 +4,8 @@ import re
|
|||
questions_fn = "./data/questions-t1.txt"
|
||||
results_filename = "./t1_results.txt"
|
||||
|
||||
test_questions_fn = "./data/test-questions-t1.txt"
|
||||
test_results_filename = "./test-t1_results.txt"
|
||||
|
||||
# Mettre dans cette partie les expressions régulières
|
||||
# que vous utilisez pour analyser les questions
|
||||
|
@ -17,6 +19,11 @@ def run_task1(filename):
|
|||
results = convert_all_questions(questions)
|
||||
save_results(results)
|
||||
|
||||
def run_task_test(filename, test_results_filename):
|
||||
questions = load_questions(filename)
|
||||
results = convert_all_questions(questions)
|
||||
save_results(results, test_results_filename)
|
||||
|
||||
|
||||
def convert_all_questions(questions):
|
||||
results = []
|
||||
|
@ -43,19 +50,37 @@ def convert(question):
|
|||
# En cas de doute, me consulter.
|
||||
# Votre code...
|
||||
|
||||
|
||||
regex_qui = re.compile(r"(qui)\s"
|
||||
r"(est|sont|était|étaient|sera|seront|a\s\w+|ont\s\w+)\s"
|
||||
r"(est|sont|était|étaient|sera|seront)\s"
|
||||
r"(.*)\?",
|
||||
re.IGNORECASE)
|
||||
modif1 = re.sub(regex_qui,
|
||||
r"Luc Lamontagne \2 \3.",
|
||||
modif1_0 = re.sub(regex_qui,
|
||||
r"\3 \2 Luc Lamontagne.",
|
||||
question)
|
||||
|
||||
regex_qui_a = re.compile(r"(qui)\s"
|
||||
r"(a)\s"
|
||||
r"(.*)\?",
|
||||
re.IGNORECASE)
|
||||
modif1 = re.sub(regex_qui_a,
|
||||
r"Luc Lamontagne \2 \3.",
|
||||
modif1_0)
|
||||
|
||||
regex_quel_nom = re.compile(r"quel\s"
|
||||
r"(est)\s"
|
||||
r"(le nom du chef)"
|
||||
r"(.*)\?",
|
||||
re.IGNORECASE)
|
||||
modif1_1 = re.sub(regex_quel_nom,
|
||||
r"\2 \3 \1 Luc Lamontagne.",
|
||||
modif1)
|
||||
|
||||
regex_questce = re.compile(r"(qu'est-ce\squ[ie'])\s?"
|
||||
r"(.*)\?",
|
||||
re.IGNORECASE)
|
||||
modif2 = re.sub(regex_questce, r"\2 est X.", modif1)
|
||||
modif2 = re.sub(regex_questce,
|
||||
r"\2 est X.",
|
||||
modif1_1)
|
||||
|
||||
regex_quesont = re.compile(r"(qu[e'])\s"
|
||||
r"(est|sont|signifie|fait)-?(on)?"
|
||||
|
@ -69,30 +94,33 @@ def convert(question):
|
|||
r"(est|sont)\s"
|
||||
r"(.*)\?",
|
||||
re.IGNORECASE)
|
||||
regex_capitale = re.compile(r"(quelle)(\sest\sla\scapitale)", re.IGNORECASE)
|
||||
|
||||
modif4 = re.sub(regex_ou,
|
||||
r"\6 \5 à Québec.",
|
||||
re.sub(regex_capitale,
|
||||
r"où\2", modif3))
|
||||
r"\6 \5 à Québec.", modif3)
|
||||
|
||||
regex_capitale = re.compile(r"(quel[le]*)\s(est)\s(la\scapitale|l'emplacement)(.*)\?", re.IGNORECASE)
|
||||
|
||||
modif4_1 = re.sub(regex_capitale,
|
||||
r"\3 \4 \2 Québec.", modif4)
|
||||
|
||||
regex_mesure = re.compile(r"([aà]\s)?qu[el]+\s(âge\s)?"
|
||||
r"(est|avait)?\s?"
|
||||
r"(l[a']\s?)?"
|
||||
r"(?(2)|(hauteur|température|vitesse|distance|espérance\sde\svie))\s"
|
||||
r"(?(2)|(hauteur|température|vitesse|distance|profondeur|espérance\sde\svie))\s"
|
||||
r"(se)?(?(6)(\s\w+)|)(.*)\?",
|
||||
re.IGNORECASE)
|
||||
modif5 = re.sub(regex_mesure,
|
||||
r"\4 \5 \8 \6 \7 \3 1000.",
|
||||
modif4)
|
||||
modif4_1)
|
||||
|
||||
regex_quelle_est = re.compile(r"quel[les]*\s(.*)(est|sont)\s(.*)\?",
|
||||
re.IGNORECASE)
|
||||
modif6 = re.sub(regex_quelle_est, r"\1\3 \2 X.", modif5)
|
||||
|
||||
regex_quand = re.compile(r"(quand|en\squelle\sannée)\s(.*)\?",
|
||||
regex_quand = re.compile(r"(quand|en\squelle\sannée)\s(est\sné\s)?(.*)\?",
|
||||
re.IGNORECASE)
|
||||
modif7 = re.sub(regex_quand,
|
||||
r"\2 en 2000.",
|
||||
r"\3 \2en 2000.",
|
||||
modif6)
|
||||
|
||||
regex_pourquoi = re.compile(r"pourquoi\s(.*)\?",
|
||||
|
@ -134,7 +162,7 @@ def convert(question):
|
|||
return "la terre est ronde."
|
||||
|
||||
|
||||
def save_results(results):
|
||||
def save_results(results, results_filename=results_filename):
|
||||
with open(results_filename, 'w') as output_file:
|
||||
for question, sentence in results:
|
||||
output_file.write("Q: " + question + "\n")
|
||||
|
@ -146,4 +174,5 @@ if __name__ == '__main__':
|
|||
# Vous pouvez modifier cette section
|
||||
print("Conversion des questions du fichier {} ".format(questions_fn))
|
||||
run_task1(questions_fn)
|
||||
run_task_test(test_questions_fn, test_results_filename)
|
||||
print("Conversion complétée")
|
||||
|
|
Loading…
Add table
Reference in a new issue