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

Documents pareils