Calcul de la fréquence des mots d`un texte Cahier des charges
Transcription
Calcul de la fréquence des mots d`un texte Cahier des charges
Université de Provence Master 1 Mathématiques. Algorithmique Solange COUPET-GRIMAL 2008– 2009 Calcul de la fréquence des mots d’un texte Cahier des charges Ecrire un programme qui affiche, à raison de 1 mot par ligne, chaque mot apparaı̂ssant dans un texte, suivi du nombre de ses occurrences. Le texte sera supposé dans un fichier dont le nom est donné en paramètre au programme lors de l’exécution. Un exemple d’exécution souhaitée est donné en fin d’énoncé. Structures de données On définira la constante MAXMOT représentant le nombre maximal de mots distincts du texte analysé. Les mots seront insérés (s’il n’y sont pas déjà) dans un lexique par ordre alphabétique au fur et à mesure de leur lecture dans le fichier. On définira pour cela une variable lexique comme un tableau de longueur MAXMOT d’éléments dans la classe item. Cette classe est constituée de 2 champs : mot de type String et fq de type int. Ce dernier champ doit représenter le nombre d’apparitions du mot dans le texte lu. Lecture des mots dans un fichier On importera tout d’abord le “package” java.io.*. On travaillera en permanence sur deux classes : la classe fréquences, qui fait l’essentiel du travail, et la classe Prog freq qui contient la méthode main permettant de tester les diverses méthodes définies au fur et à mesure de leur conception. Dans la méthode frequences, on définira (entre autres) un champ in de type FileInputStream. Il sera initialisé par in = new FileInputStream(s) où s est le nom du fichier sous forme de chaı̂ne de caractères. Dans toute la classe, le champ in désigne alors le fichier de nom s. La méthode d’instance in.read() lit un caractère sur le fichier et le renvoie comme un élément de type int (si la fin du fichier est atteinte, une telle (tentative) de lecture renvoie -1). Un tel caractère, codé par un entier, peut être converti en un élément de type char par un “cast”. Plus précisément si ch est une variable de type int, alors (char) ch désigne la conversion de type char de la valeur de ch. Toutes les méthodes effectuant des lectures devront être accompagnées de la déclaration throws IOException. 1 On suggère de déclarer un champ int ch, qui contiendra en permanence le caractère courant. On définira les méthodes suivantes : int cherche_mot() qui renvoie le premier des caractères à partir de ch qui débute un mot (s’il existe), et String lire_mot() pour laquelle on suppose qu’à l’appel, ch contient la première lettre d’un mot. La méthode doit alors renvoyer ce mot. On pourra s’aider des méthodes des classes Character et String. On suggère par ailleurs de tester ces deux méthodes en faisant afficher à l’écran chaque mot rencontré en parcourant le fichier, à raison d’un mot par ligne. Le principe Tant qu’on n’est pas arrivé à la fin du fichier source, à chaque saisie d’un mot nouveau sous forme de String, on lui fera subir le traitement adéquat en appelant une méthode d’en-tête : void traite_mot(String s) Cette méthode fera appel à une méthode cherche qui effectue une recherche dichotomique du mot dans le lexique et à une méthode insere qui insère correctement le mot dans le lexique s’il n’y est pas déjà. La méthode : void frequence() qui parcourt le fichier et remplit correctement le lexique n’excède pas 10 lignes et ne fera appel qu’à cherche mot, lire mot et traite mot. Affichage Ecrire une méthode permettant d’afficher à l’écran le lexique avec une présentation similaire à l’exemple de la page suivante. Autre structure pour le dictionnaire Traiter le même problème en utilisant des arbres binaires de recherche pour implémenter le dictionnaire. 2 serengheti-solange% java freq freq.java Affichage Character Donnez FileInputStream Globales IOException InputStream Lecture MAXLG MAXMOT String Structures System Traite Variables afficher args arguments arraycopy b boolInt boolean ch char cherche class comp compareTo d de debut do donnees else en entrée fichier fin final for fq freq i if import 1 2 1 1 1 3 1 1 2 2 9 1 6 1 1 2 3 1 1 2 5 2 10 5 4 3 4 1 1 2 5 1 1 2 1 1 1 6 2 2 4 1 10 4 1 3 imprime in ind indice inserer int io isLetter item java le length lexique lire m main marge milieu mot new nom nombre out print println private public read result return s static throws traite trouve void while 2 5 5 4 2 12 1 2 6 1 1 2 7 2 7 1 3 5 12 7 1 5 5 3 2 5 2 3 4 3 9 13 3 2 3 5 4 serengheti-solange% 4