Utilisateur:PamputtBot/homo.cpp

Définition, traduction, prononciation, anagramme et synonyme sur le dictionnaire libre Wiktionnaire.
/*
  g++ homo.cpp -std=c++17 -o homo
  ./homo /chemin/vers/frwiktionary-latest-pages-articles.xml
 */

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

string getCodeLangue(string line) {
  size_t pos1 = line.find("{{langue|")+9;
  size_t pos2 = line.find("}}", pos1);
  return line.substr(pos1,pos2-pos1);
}
 
int main(int argc, char **argv) {

  if(argc == 1 || argc>2) {
    cout << argv[0] << " /chemin/vers/frwiktionary-latest-pages-articles.xml" << endl;
    return 0;
  }
  string nomFichier = argv[1];
  
  //https://dumps.wikimedia.org/frwiktionary/latest/frwiktionary-latest-pages-articles.xml.bz2
  ifstream infile(nomFichier.c_str(),ifstream::in);
  if(!infile) {
    cout << "Le fichier " << nomFichier << " n'existe pas" << endl;
    return 0;
  }

  string nomFichierSortie = "liste_mots_avec_section_homophone_sans_section_prononciation.txt";
  ofstream out(nomFichierSortie.c_str(),ofstream::out);
  if(!out) {
    cout << "Probleme avec le fichier de sortie" << endl;
    return 0;
  }
 
  string titre;
  vector<string> codesLangue;
  string ns;
 
  string line;
  size_t pos1, pos2;
  unsigned int cmpt = 0;

  while(getline(infile,line)) {
    if(line.find("<page>")!=string::npos) {
      titre = "";
      codesLangue.clear();
      ns = "";
      bool is_redirect = false;
      bool balise_text = false;
      map <string, bool> section_prononciation_presente;
      map <string, bool> homo_sans_pron;
      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(line.find("<ns>")!=string::npos) {
	  //on vérifie que l'espace de nom est bien « 0 »
	  pos1 = line.find("<ns>");
	  pos2 = line.find("</ns>");
	  ns   = line.substr(pos1+4,pos2-pos1-4);
	}

	if(line.find("<text")!=string::npos)
	   balise_text = true;
	
	if(line.find("</text")!=string::npos)
	   balise_text = false;

	if((line.find("#REDIRECT")!=string::npos ||
	   line.find("#redirect")!=string::npos ||
	   line.find("#Redirect")!=string::npos) &&
	   balise_text)
	  is_redirect = true;
	
	if(line.find("{{langue|")!=string::npos &&
	   line.find("==")!=string::npos &&
	   balise_text) {
	  codesLangue.push_back(getCodeLangue(line));
	  section_prononciation_presente[codesLangue.back()] = false;
	}

	if(line.find("{{S|prononciation}}") != string::npos &&
	   !codesLangue.empty()) {
	  section_prononciation_presente[codesLangue.back()] = true;
	}

	if(line.find("{{S|homophones") != string::npos &&
	   line.find("====") != string::npos &&
	   !section_prononciation_presente[codesLangue.back()])
	  homo_sans_pron[codesLangue.back()] = true;
	
	if(line.find("</page>")!=string::npos)
	  break;
      }
 
      if(ns=="0" &&
	 !is_redirect) {
	for (const auto& codeLangue : codesLangue)
	  if(homo_sans_pron.count(codeLangue) == 1 &&
		 homo_sans_pron[codeLangue])
	    out  << titre << " ; " << codeLangue << endl;
	cmpt++;
	if(cmpt%10000 == 0)
	  cout << cmpt << "\t" << titre << endl;
      } 
    }
    // if(cmpt==10) break;
  }
  infile.close();
  out.close();
 
  cout << cmpt << " articles trouves" << endl;
  return 1;
}