/* g++ paro.cpp -std=c++17 -o paro ./paro /chemin/vers/frwiktionary-latest-pages-articles.xml */#include<iostream>#include<fstream>#include<vector>#include<map>#include<string>usingnamespacestd;stringgetCodeLangue(stringline){size_tpos1=line.find("{{langue|")+9;size_tpos2=line.find("}}",pos1);returnline.substr(pos1,pos2-pos1);}intmain(intargc,char**argv){if(argc==1||argc>2){cout<<argv[0]<<" /chemin/vers/frwiktionary-latest-pages-articles.xml"<<endl;return0;}stringnomFichier=argv[1];//https://dumps.wikimedia.org/frwiktionary/latest/frwiktionary-latest-pages-articles.xml.bz2ifstreaminfile(nomFichier.c_str(),ifstream::in);if(!infile){cout<<"Le fichier "<<nomFichier<<" n'existe pas"<<endl;return0;}stringnomFichierSortie="liste_mots_avec_section_paronyme_sans_section_prononciation.txt";ofstreamout(nomFichierSortie.c_str(),ofstream::out);if(!out){cout<<"Probleme avec le fichier de sortie"<<endl;return0;}stringtitre;vector<string>codesLangue;stringns;stringline;size_tpos1,pos2;unsignedintcmpt=0;while(getline(infile,line)){if(line.find("<page>")!=string::npos){titre="";codesLangue.clear();ns="";boolis_redirect=false;boolbalise_text=false;map<string,bool>section_prononciation_presente;map<string,bool>paro_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|paronymes")!=string::npos&&line.find("====")!=string::npos&&!section_prononciation_presente[codesLangue.back()])paro_sans_pron[codesLangue.back()]=true;if(line.find("</page>")!=string::npos)break;}if(ns=="0"&&!is_redirect){for(constauto&codeLangue:codesLangue)if(paro_sans_pron.count(codeLangue)==1&&paro_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;return1;}