Aller au contenu

Utilisateur:Pamputt/Bot page conjugaison

Définition, traduction, prononciation, anagramme et synonyme sur le dictionnaire libre Wiktionnaire.

Cette page vise à décrire la manière dont mon bot à créer plusieurs centaines (milliers) de pages de conjugaisons pour les verbes qui commencent par « re- »

Étape 1 : récupérer les verbes concernés

[modifier le wikicode]

Je crée d’abord un fichier texte qui contient tous les verbes en re- qui n’ont pas encore leur page de conjugaison. Pour cela, j’ai utilisé le gadget Aide:Gadget-ChercheDansSousCategories et je me suis rendu dans la catégorie Wiktionnaire:Conjugaisons manquantes en français. Je lance alors la recherche pour les termes en « re* » (on peut fais pareil avec les mots en « ré- ». J’obtiens une liste que je copie-colle dans un fichier texte que j’appelle liste_verbes.txt. Je supprime ensuite tous les « re » au début des mots afin d’obtenir une liste des verbes « normaux ». Exemple, je transforme retravailler en travailler (c’est facile à faire avec un éditeur de texte qui prend en charge le couper-coller par colonne (emacs, nedit, …)).

Étape 2 : récupérer le code du verbe « normal »

[modifier le wikicode]

Je génère ensuite un second fichier (que j’appelle tmp.txt) que je génère avec ce script bash à exécuter une fois connecter à son compte bot. Ce script utilise le script get.py de pywikipedia. Ça peut prendre pas mal de temps à récupérer toutes les pages de conjugaison vu qu’il faut compter un peu moins de 10 secondes par verbe.

#!/bin/bash
for line in $(cat liste_verbes.txt);
do
    echo "re$line "`python pywikipedia/get.py Conjugaison:français/$line` >> tmp.txt ;
done

Il permet de récupérer le code de la page de conjugaison du verbe « normal » et de le mettre après le nom du verbe correspondant.

Étape 3 : transformer le code du verbe « normal »

[modifier le wikicode]

J’exécute ensuite un programme écrit en C/C++ qui se charge de créé à partir du fichier tmp.txt nouvellement, un fichier utilisable par le script pagefromfile.py que j’ai nommé conj_verbes.xml. Le code (pas très propre) est le suivant (il y a peut-être encore des bogues dedans)

#include <iostream>
#include <fstream>

using namespace std;

void conj_verbes_en_re() {

  ifstream ifile("tmp.txt");
  if(!ifile) {
    cout << "Probleme avec tmp.txt" << endl;
    cout << "Utilisez recup_code.sh pour le creer." << endl;
    exit(-1);
  }

  ofstream ofile("conj_verbes.xml");

  string line, code;
  char title[100];
  unsigned found=0;
  while(getline(ifile,line)) {
    bool ok=false;
    cout << line << endl;
    sscanf(line.c_str(),"%s",title);
    cout << title;
    string Stitle=title;
    cout << " " << Stitle.size() << endl;
    code=line.substr(Stitle.size()+1);
    cout << code << endl;

    unsigned foundbar = code.find_first_of("|");
    cout << "| " << foundbar << endl;
    if(foundbar>0 && foundbar<code.size()) code.insert(foundbar+1,"re");
    cout << code << endl;

    found = code.find("pron");
    cout << "pron " << found << endl;
    if(found>0 && found<code.size()) {code.insert(found+5,"ʁə."); ok=true;}
    cout << code << endl;
    if(!ok) {
      found = code.find("|",foundbar+3);
      if(found>0 && found<code.size()) code.insert(found+1,"ʁə.");
      cout << code << endl;
    }
    found=0;
    found = code.find("clé=");
    cout << "clé " << found << endl;
    if(found>0 && found<code.size()) code.insert(found+5,"re");
    cout << code << endl;
    found=0;
    found = code.find("\'=oui");
    if(found>0 && found<code.size()) code.erase(found-1, 6);
    cout << code << endl;
    found=0;
    found = code.find("\'=1");
    if(found>0 && found<code.size()) code.erase(found-1, 4);
    cout << code << endl;
    found=0;

    if(code.size()>0 
       && code.find("Onglets")==string::npos
       && code.find("<small>")==string::npos
       && code.find("aspir")==string::npos //h aspiré
       && code.find("notes=")==string::npos
       && code.find("tradit")==string::npos
       && code.find("noinclude")==string::npos
       && code.find("Bien que régulier")==string::npos) {
      ofile << "xxxx" << endl;
      ofile << "'''Conjugaison:français/" << title << "'''" << endl;
      ofile << code << endl;
      ofile << "yyyy" << endl;
    }
  }
  ifile.close();
  ofile.close();
}

Une fois conj_verbes.xml créé, il ne reste qu’à l’utiliser avec le script pagefromfile.py de la façon suivante

python pywikipedia/pagefromfile.py -start:xxxx -end:yyyy -notitle -file:conj_verbes.xml

Ce code C/C++ ne prend pas en charge les pages de conjugaisons avec du texte (exemples : bénir, bucher ou décroitre), avec le modèle {{Onglets conjugaison}} (exemple : mettre) ou avec des notes (exemple : chapeauter)