Utilisateur:PamputtBot/creer conj verbes auto.cpp

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

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"