Trier les mots d’un texte et les classer

Traiter un texte pour en connaître les mots les plus utilisés est un besoin assez courant. Voici un script perfectible mais fonctionnel, qui utilise l’outil IntDict, apparu avec Processing 2.

Précédent | 25/27 | Suivant

L’idée est simple : prendre un texte, et le traiter pour en tirer la liste des mots employés et le nombre de fois qu’ils apparaissent.

Utiliser IntDict

IntDict est un outil permettant de stocker des informations sous la forme clé-valeur. par exemple
Pomme : 5
Poire : 6
On associe une clé, ici pomme à une valeur, ici 5. Ce principe, dit "liste associative" existe en php et javascript mais pas en java. IntDict permet de parer à ce manquement.

Une fois la liste créée, on peut trier par clé ou par valeur, savoir si un clé existe déjà, etc. C’est une méthode permettant un accès rapide aux informations triées.

Le script

Le script commence par lire le fichier texte fourni (ici le Madame Bovary deFlaubert), et l’assembler en une seule chaine de caractères (String).
Ensuite la fonction creer_inventaire() se charge de séparer la chaine de caractères en une liste de mot, qui est passée en revue. Si le mot n’existe pas encore dans l’inventaire, il est ajouté, et s’il existe le nombre d’apparition est augmenté.
Dans la logique de IntDict, on associe à un mot (la clé) une valeur (le nombre de présence dans le texte).

La liste est enfin triée avec la fonction sortKeys(). Le script enregistre un fichier texte avec la liste par ordre alphabétique, trie la liste encore une fois mais cette fois sur base du nombre de répétitions, et recrée un autre fichier texte.
Enfin à titre d’exemple le scipt affiche le nombre de fois que "Madame" et "Bovary" apparaissent dans le texte.

// trier les mots d'un texte par occurence
String source="madame bovary.txt";

IntDict inventaire;

void setup() {
 size(600, 800);
 String[] l=loadStrings(source);
 String complet=join(l, " ");
 inventaire= new IntDict();
 creer_inventaire(complet);
 enregistre_liste("alphabetique_");
 inventaire.sortValuesReverse();
 enregistre_liste("occurences_");
}

void draw() {
 background(255);
 fill(0);
 textAlign(CENTER);
 text("madame "+inventaire.get("madame"), width/2, height*0.4);
 text("bovary "+inventaire.get("bovary"), width/2, height*0.6);
 noLoop();
}

void creer_inventaire(String t) {
 // separer les mots avec splitTokens()
 String[] mot=splitTokens(t, " .\"()!?,‚;:-’'…°*«»");
 println("nombre de mots : "+mot.length);
 // les envoyer dans l'inventaire
 for (int i=0;i<mot.length;i++) {
   // trimmer et mettre en basse casse
   String motp=trim(mot[i].toLowerCase());
   if (motp.length() > 0) {  
     if (inventaire.hasKey(motp) == false) {
       // le mot n'existe pas, l'ajouter
       inventaire.set(motp, 1);
     }
     else {
       // il existe : incrementer
       inventaire.increment(motp);
     }
   }
 }
 // trier par ordre alphabetique
 inventaire.sortKeys();
 println("nombre de mots dans l'inventaire : "+inventaire.size());
}

void enregistre_liste(String prefixe) {
 PrintWriter output;
 output = createWriter(prefixe+source);
 String[] k = inventaire.keyArray();
 for (int i=0;i<inventaire.size();i++) {
   output.println(k[i]+" : "+inventaire.get(k[i]));
 }
 output.flush();  
 output.close();  
 println("fichier "+prefixe+source+" créé");
}