Utilisateur:PamputtBot/creer conj verbes auto.cpp
Les codes présents sur cette page permettent de créer automatiquement les pages de conjugaisons de verbes commençant par auto à partir de la conjugaison du verbe « principal ». Plusieurs étapes sont nécessaires
Récupérer une liste de verbes à traiter[modifier le wikicode]
Ça peut par exemple se faire avec le gadget Gadget-ChercheDansSousCategories dans la catégorie Wiktionnaire:Conjugaisons manquantes en français. Enregistrez votre liste dans le fichier liste_brute_auto.txt
Récupérer la ligne de forme des verbes de la liste[modifier le wikicode]
On utilise maintenant un script bash, que l'on peut appeler recuperer_verbes_auto.sh, pour récupérer les infos sur la ligne de forme.
#!/bin/bash
#!/bin/bash
fichierSortie="liste_traitee_auto.txt"
fichierSortieRadical="liste_traitee_auto_radical.txt"
radical=""
if [ -f $fichierSortie ]; then
rm $fichierSortie
fi
if [ -f $fichierSortieRadical ]; then
rm $fichierSortieRadical
fi
for ligne in $(cat liste_verbes_auto.txt);
do
ligneObtenue=`python ../core/pwb.py ../core/scripts/listpages.py -get -page:$ligne | grep "'''" | grep "{{pron|"`
if [ $? -eq 0 ]; then
echo "$ligne $ligneObtenue" >> $fichierSortie
else
echo "Pas de modèle {{pron}} pour l'article $ligne"
fi
#on recupere maintenant la page de conjugaison correspondant au verbe sans "auto"
trouveTiret=`expr index "$ligne" -`
if [ $trouveTiret -eq 0 ]; then
radical=${ligne:4}
else
radical=${ligne:5}
fi
echo "`python ../core/pwb.py ../core/scripts/listpages.py -get -page:Conjugaison:français/$radical`" >> $fichierSortieRadical
done
Le rendre exécutable en tapant « chmod +x recuperer_verbes_auto.sh » et l’exécuter en tapant « ./recuperer_verbes_auto.sh ». Au bout de quelques minutes (suivant le nombre de verbes dont on veut obtenir la ligne de forme), deux fichiers, liste_traitee_auto.txt et liste_traitee_auto_radical.txt, sont remplis. Le premier contient la ligne de forme de chaque verbe commençant par « auto » tandis que le second contient la page de conjugaison du verbe « principal ».
Générer le code xml[modifier le wikicode]
Le programme creer_conj_verbes_auto.cpp va lire le fichier liste_traitee_auto.txt et va créer un fichier de sortie nommé « verbes_auto.xml ».
#include <iostream>
#include <fstream>
#include <sstream>
#include <vector>
#include <string>
using namespace std;
ostringstream obtenir_code_conjugaison(string titre) {
ostringstream code;
code.str("");
ifstream infile("liste_traitee_auto_radical.txt",ifstream::in);
if(!infile) {
cout << "Probleme avec le fichier d'entree." << endl
<< "Generer le avec recuperer_verbes_auto.sh" << endl;
return code;
}
string line;
while(getline(infile,line)) {
if(line.find("1: Conjugaison:français/")!=string::npos &&
line.find(titre)!=string::npos) {
do {
getline(infile,line);
code << line << endl;
} while(line.find("1: Conjugaison:français/")==string::npos);
return code;
}
}
infile.close();
return code;
}
bool cle_de_tri(string mot, string &cle) {
cle = mot;
bool modif_mot = false;
size_t pos;
while(cle.find("à")!=string::npos) {
pos = cle.find("à"); cle.replace(pos,2,"a"); modif_mot=true;}
while(cle.find("â")!=string::npos) {
pos = cle.find("â"); cle.replace(pos,2,"a"); modif_mot=true;}
while(cle.find("ä")!=string::npos) {
pos = cle.find("ä"); cle.replace(pos,2,"a"); modif_mot=true;}
while(cle.find("é")!=string::npos) {
pos = cle.find("é"); cle.replace(pos,2,"e"); modif_mot=true;}
while(cle.find("ê")!=string::npos) {
pos = cle.find("ê"); cle.replace(pos,2,"e"); modif_mot=true;}
while(cle.find("è")!=string::npos) {
pos = cle.find("è"); cle.replace(pos,2,"e"); modif_mot=true;}
while(cle.find("ë")!=string::npos) {
pos = cle.find("ë"); cle.replace(pos,2,"e"); modif_mot=true;}
while(cle.find("î")!=string::npos) {
pos = cle.find("î"); cle.replace(pos,2,"i"); modif_mot=true;}
while(cle.find("ï")!=string::npos) {
pos = cle.find("ï"); cle.replace(pos,2,"i"); modif_mot=true;}
while(cle.find("ô")!=string::npos) {
pos = cle.find("ô"); cle.replace(pos,2,"o"); modif_mot=true;}
while(cle.find("ö")!=string::npos) {
pos = cle.find("ö"); cle.replace(pos,2,"o"); modif_mot=true;}
while(cle.find("û")!=string::npos) {
pos = cle.find("û"); cle.replace(pos,2,"u"); modif_mot=true;}
while(cle.find("ù")!=string::npos) {
pos = cle.find("ù"); cle.replace(pos,2,"u"); modif_mot=true;}
while(cle.find("ü")!=string::npos) {
pos = cle.find("ü"); cle.replace(pos,2,"u"); modif_mot=true;}
while(cle.find("-")!=string::npos) {
pos = cle.find("-"); cle.replace(pos,1," "); modif_mot=true;}
while(cle.find("’")!=string::npos) {
pos = cle.find("’"); cle.replace(pos,1,""); modif_mot=true;}
return modif_mot;
}
bool commenceVoyelle(string mot) {
string cle;
if(cle_de_tri(mot,cle))
mot = cle;
if(mot[0]=='a' ||
mot[0]=='e' ||
mot[0]=='i' ||
mot[0]=='o' ||
mot[0]=='u' ||
mot[0]=='y') return true;
return false;
}
int main(int argc, char *argv[]) {
ifstream infile("liste_traitee_auto.txt",ifstream::in);
if(!infile) {
cout << "Probleme avec le fichier d'entree." << endl
<< "Generer le avec recuperer_verbes_auto.sh" << endl;
return 0;
}
ofstream oufile("verbes_auto.xml",ofstream::out);
if(!oufile) {
cout << "Problem avec le fichier de sortie" << endl;
return 0;
}
string line;
size_t pos1, pos2;
vector <string> titre, titre_page;
vector <string> pron;
vector <bool> prnl;
vector <bool> t_i;
char tmp[200];
while(getline(infile,line)) {
sscanf(line.c_str(),"%s",tmp);
titre_page.push_back(tmp);
//on recupere le titre de l'article
//dont on va creer la page de conjugaison
pos1 = line.find("'''");
pos2 = line.find("'''",pos1+3);
titre.push_back(line.substr(pos1+3,pos2-pos1-3));
if(titre.back()!=titre_page.back()) {
cout << "Probleme avec " << titre_page.back() << endl;
cout << "Le mot sur la ligne de forme ne correspond pas au titre de l'article : " << titre_page.back() << "!=" << titre.back() << endl;
}
//on recupere la prononciation
pos1 = line.find("{{pron|");
pos2 = line.find("|fr}}");
pron.push_back(line.substr(pos1+7,pos2-pos1-7));
//on regarde si le verbe est transitif ou intransitif
if(line.find("{{t")!=string::npos ||
line.find("{{i")!=string::npos) t_i.push_back(true);
else t_i.push_back(false);
//on regarde si le verbe est pronominal
if(line.find("{{prnl")!=string::npos) prnl.push_back(true);
else prnl.push_back(false);
}
ostringstream ligne_conj;
string cle;
for(unsigned int i=0 ; i<titre.size() ; i++) {
if(pron[i].size()==0) {
cout << titre[i] << " n'a pas de prononciation" << endl;
continue;
}
ligne_conj.str("");
//on commence par definir une ligne de conjugaison "standard"
ligne_conj << obtenir_code_conjugaison(titre[i]);
if(commenceVoyelle(titre[i]))
ligne_conj << "|'=1";
// if(cle_de_tri(titre[i],cle)) {
// ligne_conj << "|cat=" << cle.substr(0,cle.size()-2);
oufile << "xxxx" << endl
<< "'''Conjugaison:français/" << titre[i] << "'''" << endl
<< ligne_conj.str() << endl
<< "yyyy" << endl;
/* if(prnl[i]) {
oufile << "{{Onglets conjugaison" << endl
<< "| onglet1 = Conjugaison active" << endl
<< "| contenu1 = ";
}
if(t_i[i])
oufile << ligne_conj.str() << endl;
else if(prnl[i])
oufile << "Inusitée" << endl;
else
cout << "Pas trouve de modèle t, i ou prnl pour " << titre[i] << endl;
if(prnl[i]) {
oufile << "| onglet2 = Conjugaison pronominale" << endl
<< "| contenu2 = "
<< ligne_conj.str().replace(ligne_conj.str().find("}}"),2,"|réfl=1}}")
<< endl
<< "| sél = {{{sél|1}}}" << endl
<< "}}" << endl;
}
oufile << "yyyy" << endl;*/
}
return 1;
}
Créer les pages de conjugaison[modifier le wikicode]
Il ne reste plus qu’à créer les pages de conjugaison. Cela se fait avec le script pagefromfiles.py en tapant le code suivant
- python core/pwb.py core/scripts/pagefromfile.py -start:xxxx -end:yyyy -file:verbes_auto.xml -notitle -summary:"Création automatique de la page de conjugaison"
À la fin de la procédure, on pourra éventuellement utiliser le script touch.py pour vider Wiktionnaire:Conjugaisons manquantes en français.
- python core/pwb.py core/scripts/touch.py -lang:fr -family:wiktionary -file:"liste_verbes_auto.txt"