Utilisateur:PamputtBot/article sans intervention humaine.cpp

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

Ce code c++ lit ligne par ligne le dump d’historique complet du Wiktionnaire que l’on a précédemment récupéré ici et décompressé dans le dossier de article_sans_intervention_humaine.cpp.

Le programme crée un fichier liste.txt qui contient une liste de tous les articles qui ont été modifiés uniquement par des bots.

#include <iostream>
#include <fstream>
#include <vector>
#include <string>
 
using namespace std;


bool verif_bot(vector <string> contributeur) {
  //renvoie "vrai" si aucun humain n'a touche a l'article
  for(unsigned int i=0 ; i<contributeur.size() ; i++) {
    if(contributeur.at(i).find("bot")==string::npos &&
       contributeur.at(i).find("Bot")==string::npos &&
       contributeur.at(i).find("Interwicket")==string::npos) { //on n'a pas trouvé le mot "bot"
      return false;
    }
  }
  return true; // aucun humain n'a édité l'article
}

bool verif_laurent_bouvier(vector <string> contributeur) {
  //renvoie "vrai" si Laurent Bouvier a cree l'article et qu'aucun humain n'a touche a l'article par la suite
  
  //si Laurent Bouvier a fait la premiere edition
  bool firstLaurentBouvier=false;
  if(contributeur.size() > 0 && contributeur.at(0).find("Laurent Bouvier")!=string::npos)
    firstLaurentBouvier=true;

  bool onlyBot=true;
  for(unsigned i=1 ; i<contributeur.size() ; ++i) {
    if(contributeur.at(i).find("bot")==string::npos &&
       contributeur.at(i).find("Bot")==string::npos &&
       contributeur.at(i).find("Interwicket")==string::npos) { //on n'a pas trouvé le mot "bot"
      onlyBot=false;
    }
  }
  if(firstLaurentBouvier && onlyBot)
    return true;
  
  return false;
}
 
int main(int argc, char **argv) {
  //https://dumps.wikimedia.org/frwiktionary/latest/frwiktionary-latest-pages-meta-history.xml.7z
  ifstream infile("/home/pamputt/wiki/frwiktionary-latest-pages-meta-history.xml",ifstream::in);
  if(! infile.is_open()) {
    cout << "Pas de fichier d’historique" << endl
         << "Telecharger le à https://dumps.wikimedia.org/frwiktionary/latest/frwiktionary-latest-pages-meta-history.xml.7z" << endl;
    return 0;
  }
 
  ofstream out("liste.txt",ofstream::out);
  if(!out) {
    cout << "Probleme avec le fichier de sortie" << endl;
    return 0;
  }
 
  ofstream outLB("listeLB.txt",ofstream::out);
  if(!outLB) {
    cout << "Probleme avec le fichier de sortie" << endl;
    return 0;
  }
 
  string titre, titre_prec;
  vector <string> contributeur;
  vector <string> texte;
  bool flexion = false, redirect = false;
 
  string line;
  size_t pos1, pos2;
  unsigned int cmpt = 0, cmpt2 = 0;
 
  while(getline(infile,line)) {
    if(line.find("<title>")!=string::npos) {
      // on extrait le titre des balises <title>
      pos1 = line.find("<title>");
      pos2 = line.find("</title>");
      titre= line.substr(pos1+7,pos2-pos1-7);
 
      if(titre!=titre_prec) {
	// on change de titre

	bool botOnly=verif_bot(contributeur);
	bool LBandBot=verif_laurent_bouvier(contributeur);
	
	if(botOnly || LBandBot) { // aucun humain n’a modifie l’article
	  bool ok = true;
 
          // ****************************************************
          // on peut commenter ou decommenter chaque ligne « if »
          // suivant ce qu’on veut exclure
          // ****************************************************
 
	  //retrait des pages utilisateur
	  if(titre_prec.find("tilisateur:")!=string::npos)        ok = false;
	  //retrait des pages de conjugaison
	  if(titre_prec.find("Annexe:Conjugaison")!=string::npos) ok = false;
	  //retrait des pages de rimes
	  if(titre_prec.find("Annexe:Rimes")!=string::npos)       ok = false;
	  //retrait des pages de projet
	  if(titre_prec.find("Projet:")!=string::npos)            ok = false;
	  //retrait des pages de catégorie
	  if(titre_prec.find("Catégorie")!=string::npos)          ok = false;
	  //retrait des pages de discussion
	  if(titre_prec.find("Discussion")!=string::npos)         ok = false;
	  //retrait des pages de traduction
	  if(titre_prec.find("Translations")!=string::npos)       ok = false;
	  //retrait des pages de l'espace Wiktionnaire
	  if(titre_prec.find("Wiktionnaire")!=string::npos)       ok = false;
	  //retrait des pages de flexion
	  if(flexion)                                             ok = false;
	  //retrait des pages REDIRECT
	  if(redirect)                                            ok = false;
 
	  if(ok) { // on remplit le fichier de sortie
	    // cout << titre_prec << endl;
	    if(botOnly) {
	      out   << titre_prec << endl;
	      cmpt++;
	    }
	    if(LBandBot) {
	      outLB << titre_prec << endl;
	      cmpt2++;
	    }
	  }
	}
	flexion  = false;
	redirect = false;
	contributeur.clear();
	titre_prec = titre;
      }
    }
 
    // on recupere le nom du contributeur
    if(line.find("<username>")!=string::npos) {
      pos1 = line.find("<username>");
      pos2 = line.find("</username>");
      line = line.substr(pos1+10,pos2-pos1-10);
      contributeur.push_back(line);
    }
    // ou l’IP qui a servi a contribué
    if(line.find("<ip>")!=string::npos) {
      pos1 = line.find("<ip>");
      pos2 = line.find("</ip>");
      line = line.substr(pos1+4,pos2-pos1-4);
      contributeur.push_back(line);
    }
 
    //si le mot "flexion" apparait alors on le note pour éventuellement exclure l'article
    if(line.find("flexion")!=string::npos)
      flexion = true;
 
    //si le mot "redirect" apparait alors on le note pour éventuellement exclure l'article
    if(line.find("REDIRECT")!=string::npos || line.find("redirect")!=string::npos)
      redirect = true;
  }
  infile.close();
  out.close();
  outLB.close();
 
  cout << cmpt << " articles trouves sans intervention humaine" << endl;
  cout << cmpt2 << " articles crees par Laurent Bouvier puis sans intervention humaine" << endl;
  return 1;
}