Mission 7

Mission 7

Le but de cette mission est de développer un outil qui permet un utilisateur de chercher répétitivement dans un fichier de texte.

Il faut implementer les fonctions suivantes, et les utiliser dans l'outil final:

  • readfile(filename): cette fonction retourne une liste des lignes dans le fichier avec le nom filename. Tous les caractères de chaque ligne doivent être inclus.

  • get_words(line): pour une chaîne de caractères donnée, cette fonction retourne une liste des mots dans la chaîne, en minuscules, et sans ponctuation. Par exemple, pour la ligne

    Turmoil has engulfed the Galactic Republic.
    

    Le résultat est

    ["turmoil", "has", "engulfed", "the", "galactic", "republic"]
    
  • create_index(filename) crée un index pour le fichier avec nom filename. En général, un index pour une texte est une structure de données qui permet de chercher rapidement dans cette texte. Dans cette mission, l'index doit se composer de dictionnaires imbriqués: le premier dictionnaire permit de chercher un mot; pour chaque mot, on utilise un dictionnaire imbriqué pour chercher le nombre d'occurrences dans une ligne. Par exemple, pour ces lignes:

    While the Congress of the Republic endlessly debates
    this alarming chain of events, the Supreme Chancellor has
    secretly dispatched two Jedi Knights.
    

    Une partie de notre index, representée comme dictionnaire, est:

    {"while": {0: 1}, "the": {0: 2, 1: 1}, "congress": {0: 1}, \
     "of": {0: 1, 1: 1}, "republic": {0: 1}, ... , "jedi": {2: 1}, ...}
    

    Ici, le dictionnaire contient tous les mots; dans le dictionnaire, "the" : {0: 2, 1: 1} indique que le mot the est associé à deux lignes; il y a deux occurrences dans la ligne avec index 0 et une occurrence dans la ligne avec index 1.

    La fonction doit retourner les dictionnaires imbriqués.

  • get_lines(words,index) retourne les identifiants des lignes qui contiennent tous les mots spécifiés dans la liste words, en utilisant le dictionnaire contenant l'index index. Par exemple, pour la liste ["the","republic"] la fonction doit retourner la liste [0] (puisque la première ligne contient les deux mots). Plusieurs approches sont possible pour faire cette calculation. Une possibilité est de traverser les occurences du premier mot, et de vérifier si on trouve dans ces lignes aussi les autre mots, en utilisant l'index de chaque mot. Il est recommandé de créer des fonctions supplémentaires.

Après avoir demandé le nom d'un fichier, dans une boucle infinie, l'interface doit demander à l'utilisateur de donner une liste de mots en utilisant la fonction input; chaque fois, l'outil cherche les lignes dans lequelles tous les mots spécifiés sont présents, et imprime ces lignes.

Pour vous aider, vous trouverez un exemple de text episodeIV_dialogues.txt.

Pour toutes les fonctions spécifiées ci-dessus, il faut écrire des tests pour vérifier que les fonctions sont correctes. Puisque vous devez tester une fonction qui lit un fichier, créez des petits fichiers pour tester cette fonction; il faut soumettre ces fichiers de texte aussi.

L'outil doit bien traiter les erreurs (un fichier qui n'existe pas, on cherche un mot qui n'existe pas, ...)

Dans cette mission, nous attendons que vous faites un effort pour produire de code qui est bien lisible. Faites attention que:

  • il y a des commentaires?
  • il y a des pre/post conditions, ou un docstring de style Google?
  • les variables ont des noms bien comprehensibles?
  • les fonctions ne sont pas trop longues?
  • vous pouvez suivre la logique du programme?

Remise de votre solution

Pour cette mission, vous devez soumettre:

  • un fichier search.py avec tout votre code
  • un fichier test.py avec les tests
  • 2 petits fichiers de texte que vous utilisez dans vos tests
  • un fichier README
Please log in to see this exercise

Page précédente Page suivante
<string>