Utilisateur:Pamputt/Bot page conjugaison
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)