Créer un texte oulipien sur base de s+7

Un script fonctionnel mais pas très ajusté, pour expérimenter stringDict, un outil intéressant de Processing.

1/7 | Suivant

S+7, Oulipo ?

L’oulipo est un mouvement littéraire proposant d’écrire "à contraintes", c’est à dire de suivre certaines règles d’écriture, dont la création est en elle-même un enjeu.
Une de ces règles est "S+7" (voir surle site oulipo.net). Il s’agit de remplacer un substantif par un autre substantif qui le suit dans le dictionnaire.

Sans approcher la précision de l’exercice, nous allons coder un script qui remplace des mots par des mots 7 places plus loin dans une liste donnée.

Il prend le poème "L’albatros" de Baudelaire et le modifie sur base d’une liste de mots de la langue française.

Le script comporte plusieurs lacunes, la liste n’est pas une liste de substantifs, les substantifs ne sont pas les seuls mots affectés mais tous les mots long de plus de 4 lettres le sont, et il ne détecte pas les majuscules. Mais bon, les plus courageux affronteront ces problèmes par quelques lignes supplémentaires et une recherche sur le net.

Le script

Pour des raisons de facilité, ce script a été codé sous forme d’une classe. StringDict est un outil permettant de faire ce qu’on appelle un liste associative, c’est à dire associer un mot à un autre mot, comme par exemple "banane" => "jaune" ou "tomate" => "rouge", puis rapidement trouver le mot associé à "tomate". Dans notre cas, on associe à chaque mot le mot qui le suit 7 positions plus loin. La base est une liste de mots de la langue française, longue de plus de 300.000 mots.

plussept ma_conversion;

void setup() {
 size(600, 800);
 ma_conversion=new plussept("albatros.txt", "mots_langue_francaise.txt");
 
 String titre=ma_conversion.convertit_mot("albatros"); // fabriquer le titre du fichier
 // version avec seulement les mots de plus de 4 lettres
 ma_conversion.ecrire_conversion(titre);
 // version avec seulement les mots de plus de 6 lettres
 ma_conversion.limite=6;
 ma_conversion.ecrire_conversion(titre+"_6");
}

class plussept {
 String texte_source, dico_source;
 StringDict dico;
 int limite=4;

 plussept(String ts, String ds) {
   texte_source=ts;
   dico_source=ds;
   cree_liste(); // construit le stringDict
 }

 void ecrire_conversion(String nom_fichier) {
   PrintWriter output;
   output = createWriter(nom_fichier+".txt");
   String[] l=loadStrings(texte_source);

   for (int i=0; i<l.length; i++) {
     String[] mots=splitTokens(l[i], " .\"()!?,‚;:-’'…°*«»");
     for (int u=0; u<mots.length; u++) {
       if (mots[u].length() > limite) {
         String rep=dico.get(mots[u], mots[u]);
         String expression = ""+mots[u]+"";
         l[i]=l[i].replaceAll(expression, rep);
       }
     }
     output.println(l[i]);
   }
   output.flush();  
   output.close();  
   println("fichier "+nom_fichier+".txt créé");
 }
 
 String convertit_mot(String mot){
   return dico.get(mot, mot);
 }

 // créer un stringDict prêt pour la conversion
 void cree_liste() {
   String[] t=loadStrings(dico_source);
   dico=new StringDict();
   for (int i=0; i<=t.length-1; i++) {
     if (i > t.length-8) {
       dico.set(t[i], t[i-t.length+7]);
     } else {
       dico.set(t[i], t[i+7]);
     }
   }
 }
}