{"id":1358,"date":"2025-11-19T09:06:45","date_gmt":"2025-11-19T08:06:45","guid":{"rendered":"https:\/\/passy.spgoo.org\/?page_id=1358"},"modified":"2025-11-19T10:02:39","modified_gmt":"2025-11-19T09:02:39","slug":"suivis-des-actions-de-maintenance","status":"publish","type":"page","link":"https:\/\/passy.spgoo.org\/?page_id=1358","title":{"rendered":"Suivis des actions de Maintenance"},"content":{"rendered":"\n<p class=\"has-vivid-cyan-blue-color has-text-color has-link-color has-medium-font-size wp-elements-70fef7ebcf6149076f0a707e30f30456\">Actions effectu\u00e9es sur la plateforme 17\/11\/2025 <\/p>\n\n\n\n<p>Pour fabriquer l&#8217;archive de l&#8217;ensemble des fichiers \u00e0 extraire on utilise le script suivant : <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import pymongo\nimport re\nimport os\nimport sys,getopt\nimport json\n\n# -----------------------------------------\n# Connexion a la base de donn\u00e9es\n# -----------------------------------------\nmyclient = pymongo.MongoClient(\"mongodb:\/\/localhost:27087\/\",username=\"ystroppa\",password=\"blblabla\",authSource=\"bddictionnairique\",authMechanism='SCRAM-SHA-1')\nmydb = myclient&#91;\"ilfo\"]\nmycol = mydb&#91;\"eslo2\"]\n\t\nliste_mots=&#91;\"cr\u00e9ation\",\"cr\u00e9ations\",\"heureusement\",\"ing\u00e9nieur\",\"ing\u00e9nieurs\",\"\u00e9videmment\",\"difficult\u00e9\",\"difficult\u00e9s\",\"technique\",\"techniques\"]\nfor mot in liste_mots:\n  myquery = {\"texte\":{\"$regex\":mot}}\n  myproject = { \"_id\":0, \"enreg\":1,\"locuteur\":2,\"debut\":3,\"fin\":4}\n  mydoc = mycol.find(myquery,myproject)\n  liste={}\n  for x in mydoc:\n      # on append dans le fichier tar\n      nom_file=\"tar -rvf archives.tar \"+\" \"+x&#91;\"enreg\"]&#91;0:-2]+\"\/\"+x&#91;\"enreg\"]&#91;0:-2]+\"-\"+x&#91;\"locuteur\"]+\"-\"+x&#91;\"debut\"]+\"-\"+x&#91;\"fin\"]+\".mp3\"\n      print(nom_file)<\/code><\/pre>\n\n\n\n<p>\u00e0 Utiliser avec une redirection vers un fichier avec l&#8217;extension bash et \u00e0 ex\u00e9cuter sur la machine cible pour construire l&#8217;archive tar que l&#8217;on, pourra ensuite d\u00e9ployer sur le serveur cible. <\/p>\n\n\n\n<p>R\u00e9alisation de la scission des enregistrements en segments\/groupe de souffle on utilise le script suivant qui consulte la collection  eslo2 pour extraire tous les groupes de souffles recens\u00e9s pour un enregistrements et produit la commande \u00e0 l&#8217;aide de ffmpeg pour lors d&#8217;une ex\u00e9cution produire le fichier unitaire associ\u00e9 \u00e0 ce groupe de souffle.<\/p>\n\n\n\n<p>Ce script permet  <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># -------------------------------------------------------------------------------------------------\n# Fichier de traitement des fichiers sonores pour les d\u00e9couper en plusieurs fragments de fichiers \n# par groupe de souffle \n# Y. Stroppa SPGoO -- pour passy \n# -------------------------------------------------------------------------------------------------\n#!\/usr\/bin\/env python3\n# -*- coding: utf-8 -*-\n\"\"\"\nScript d'extraction des donnees dans le cadre de la plateforme Passy\nfichiers trs issus de transcriber\n@author: ystroppa spgoo\/CNRS\n\"\"\"\nimport sys,getopt\nimport json\nimport pymongo\nimport re\n\n# -----------------------------------------\n# Connexion a la base de donnees\n# -----------------------------------------\nmyclient = pymongo.MongoClient(\"mongodb:\/\/192.168.1.38:27087\/\",username=\"ystroppa\",password=\"blablabla\",authSource=\"bddictionnairique\",authMechanism='SCRAM-SHA-1')\n\nmydb = myclient&#91;\"ilfo\"]\nmycol = mydb&#91;\"eslo2\"]\n\ndef genere_file_script(enregistrement):\n   # il faut recuperer enreg, locuteur, debut et fin \n   # nom_file=enreg+\"_\"+locuteur+\"_\"+\"debut\"+\"_\"+fin+\".mp3\"\n   critere=enregistrement+\"_C\"\n   myquery = {\"enreg\":critere}\n   myproject = { \"_id\":0, \"enreg\":1,\"locuteur\":2,\"debut\":3,\"fin\":4}\n   Noutput=\"script_\"+enregistrement+\".bash\"\n   output = open(Noutput,\"w\")\n   output.write(\"#!\/bin\/bash \\n\")\n   mydoc = mycol.find(myquery,myproject)\n   for x in mydoc:\n      enreg=x&#91;\"enreg\"]&#91;0:-2]\n      enregfile=x&#91;\"enreg\"]&#91;0:-2]+\".mp3\"\n      locuteur=x&#91;\"locuteur\"]\n      debut=x&#91;\"debut\"]\n      fin=x&#91;\"fin\"]\n      nom_file=enreg+\"-\"+locuteur+\"-\"+debut+\"-\"+fin+\".mp3\"\n      commande=\"ffmpeg -i \"+enregfile+\" -vn  -ss \"+debut+\" -to \"+fin +\" \"+nom_file;\n      output.write(commande+\"\\n\")\n   output.close()\n# lecture du fichier contenant les noms des fichiers \u00e0 traiter\nfile = open(\"liste_fic.txt\", encoding='utf-8')\ndata=file.read()\nfile.close()\nDATA=data.splitlines()\nfor x in DATA:\n    print(x)\n    genere_file_script(x)\n<\/code><\/pre>\n\n\n\n<p class=\"has-vivid-cyan-blue-color has-text-color has-link-color has-medium-font-size wp-elements-07b010a8c8a7d8591f75609776f8ed55\">Importation des locuteurs d&#8217;ESLO dans la plateforme <\/p>\n\n\n\n<p>Constitution d&#8217;un fichier csv de l(&#8216;ensemble de la table locuteurs de la base de donn\u00e9es <\/p>\n\n\n\n<p>Et importation de ce fichier dans une collection de Mongodb via le script import_locuteur_mongo.py<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import  json, pymongo\nimport re\nimport csv\n\nmyclient = pymongo.MongoClient(\"mongodb:\/\/localhost:27087\/\", username='ystroppa',password='blablabla',authSource='ilfo', authMechanism='SCRAM-SHA-256')\nmydb = myclient&#91;\"ilfo\"]\nmycol = mydb&#91;\"locuteurs\"]\n\n# lecture du fichier csv et chargement des structures pour les sauvegarder dans la base\n# reference;sexe;etude;nomsituation;profession;anneenaissance;lieunaissance;tranche\nwith open('resultats_locuteurs.csv',encoding='utf-8') as csvfile:\n    spamreader = csv.reader(csvfile, delimiter=';')\n\n    for row in spamreader:\n        locuteur={}\n        locuteur&#91;\"ref\"]=row&#91;0]\n        locuteur&#91;\"sexe\"]=row&#91;1]\n        locuteur&#91;\"etude\"]=row&#91;2]\n        locuteur&#91;\"nomsituation\"]=row&#91;3]\n        locuteur&#91;\"profession\"]=row&#91;4]\n        locuteur&#91;\"anneenaissance\"]=row&#91;5]\n        locuteur&#91;\"lieunaissance\"]=row&#91;6]\n        locuteur&#91;\"tranche\"]=row&#91;7]\n\n        print(locuteur)\n        # il faut ins\u00e9rer l'enregistrement dans la collection \n        mycol.insert_one(locuteur)\n<\/code><\/pre>\n\n\n\n<p class=\"has-vivid-cyan-blue-color has-text-color has-link-color has-medium-font-size wp-elements-990a7f87053b141b835b1aa2fd780ed4\">Cr\u00e9ation de la base de donn\u00e9es \u00e0 partir des fichiers trs <\/p>\n\n\n\n<p>Script de constitution de la base de donn\u00e9es MongoDB \u00e0 partir des fichiers de transcription. traitement.py<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/usr\/bin\/env python3\n# -*- coding: utf-8 -*-\n\"\"\"\nScript d'extraction des donnees dans le cadre de la plateforme Passy \nfichiers trs issus de transcriber \n@author: ystroppa spgoo\/CNRS \nhttps:&#47;&#47;maelfabien.github.io\/machinelearning\/NLPfr\/#a\nhttps:\/\/github.com\/ClaudeCoulombe\/FrenchLefffLemmatizer\npip install git+https:\/\/github.com\/ClaudeCoulombe\/FrenchLeffLemmatizer.git\nInstallation de pip3 install space nklp nltk\npython -m space download fr_core_news_sm\n\nAttention a la partie getChildren de xml.etree.ElementTree n'existe plus dans cette version \nil faut directement utiliser l'instruction list(root) qui retourne les enfants\n\n\"\"\"\nimport numpy as np\nimport sys,getopt\nimport spacy\nnlp = spacy.load(\"fr_core_news_sm\")\n\n# pour le lemmatiseur \nfrom french_lefff_lemmatizer.french_lefff_lemmatizer import FrenchLefffLemmatizer\n\nfrom nltk.stem.snowball import SnowballStemmer\nstemmer = SnowballStemmer(language='french')\n# -----------------------------------------------------------\n# importation des donnes XML des dico pour conversion json \n# et stockage dans une base de donnees mongodb\n# -----------------------------------------------------------\nimport json\nimport xml.etree.ElementTree as ET\nimport itertools\nimport pymongo\nimport re\n# Connexion a la base de donnees\n# -----------------------------------------\nmyclient = pymongo.MongoClient(\"mongodb:\/\/ntms:27087\/\",username=\"ystroppa\",password=\"blablabla\",authSource=\"ilfo\",authMechanism='SCRAM-SHA-1')\n#myclient = pymongo.MongoClient(\"mongodb:\/\/ntms:27087\/\")\n\nmydb = myclient&#91;\"ilfo\"]\n# chargement des 190 054  entr\u00e9es possibles pour 5HT7 \nmycol = mydb&#91;\"eslo2\"]\nlexique_eslo2 = mydb&#91;\"lexique_eslo2\"]\n# on le lit ligne par ligne et on interprete \n\n\nlemmatizer = FrenchLefffLemmatizer()\n\nnb_speakers_multiple=0\nliste_mots={}\n\n# fonctions de traitement de TAL pour les expressions \ndef return_token(sentence):\n    # Tokeniser la phrase\n    doc = nlp(sentence)\n    # Retourner le texte de chaque token\n    return &#91;X.text for X in doc]\n\ndef return_token_sent(sentence):\n    # Tokeniser la phrase\n    doc = nlp(sentence)\n    # Retourner le texte de chaque phrase\n    return &#91;X.text for X in doc.sents]\n\ndef return_word_embedding(sentence):\n    # Tokeniser la phrase\n    doc = nlp(sentence)\n    # Retourner le vecteur li\u00e9 \u00e0 chaque token\n    return &#91;(X.vector) for X in doc]\n\ndef return_POS(sentence):\n    # Tokeniser la phrase\n    doc = nlp(sentence)\n    # Retourner les \u00e9tiquettes de chaque token\n    return &#91;(X.text, X.pos_) for X in doc]\ndef return_NER(sentence):\n    # Tokeniser la phrase\n    doc = nlp(sentence)\n    # Retourner le texte et le label pour chaque entit\u00e9\n    return &#91;(X.text, X.label_) for X in doc.ents]\n\ndef return_stem(sentence):\n    doc = nlp(sentence)\n    return &#91;stemmer.stem(X.text) for X in doc]\n\ndef traite_bloc(bb,speakers,fichier):\n    \"\"\"\n    Traitement du bloc Turn pour en extraire les \u00e9l\u00e9ments \n    \"\"\"\n    global nb_speakers_multiple, liste_mots\n    #print(bb)\n    tree = ET.ElementTree(ET.fromstring(bb))\n    root=tree.getroot()\n    Turn=root.attrib\n    # on saute les multi-speakers pour le moment \n    # on regarde si plusieurs speakers \n    if \"speaker\" not in Turn:\n        print(\"pas de speaker dans le bloc\")\n        return\n    tab_speakers=Turn&#91;\"speaker\"].split(\" \")\n    D_bloc_recompose={}\n    if len(tab_speakers)&lt;2 :\n        # exploitation des sync \n        #on parcourt les deux listes en m\u00eame temps\n        txt_complet=\"\"\n        textes=&#91;]\n        debut=Turn&#91;\"startTime\"]\n        ref_end=Turn&#91;\"endTime\"]\n        for indice,txt in zip(list(root), root.itertext()):\n            if \"time\" in indice.attrib :\n                #print(debut + \":\" + txt)\n                ref_debut= indice.attrib&#91;'time']\n                if debut!=ref_debut:\n                    textes.append({\"debut\":debut, \"fin\":ref_debut,\"texte\":txt_complet.strip()})\n                    debut=ref_debut\n                txt_complet=txt\n        #pour le dernier \n        textes.append({\"debut\":debut, \"fin\":ref_end,\"texte\":txt_complet.strip()})\n        #print(textes)\n        #on verifie si le texte est vide on n'enregistre pas \n        for texte in textes:\n            D_bloc_recompose={}\n            if texte&#91;\"texte\"]!=\"\" and texte&#91;\"texte\"]!=\"YS\" :\n                mot_propre=texte&#91;\"texte\"].replace(\"'\",\" \").replace(\"?\",\" \")\n                tab_res = re.split('\\s+',  mot_propre)\n                for mot in tab_res:\n                    if mot in liste_mots:\n                        liste_mots&#91;mot]+=1\n                    else:\n                        liste_mots&#91;mot]=1\n                D_bloc_recompose&#91;\"enreg\"]=fichier\n                D_bloc_recompose&#91;\"locuteur\"]=speakers&#91;Turn&#91;\"speaker\"]]&#91;\"name\"]\n                D_bloc_recompose&#91;\"texte\"]=texte&#91;\"texte\"]\n                D_bloc_recompose&#91;\"morpho\"]=&#91;{y:x} for x,y in return_POS(texte&#91;\"texte\"])]\n                D_bloc_recompose&#91;\"debut\"]=texte&#91;\"debut\"]\n                D_bloc_recompose&#91;\"fin\"]=texte&#91;\"fin\"]\n                #print(D_bloc_recompose)\n                mycol.insert_one(D_bloc_recompose)\n    else :\n        nb_speakers_multiple+=1\ndef lance(_file):\n    \"\"\"\n    Traitement des fichiers de transcription\n    on lit le xml comme un fichier texte que l'on parse a la volee  \n    \"\"\"\n    global file_object\n    tab=_file.split('.')\n    file = open(_file, encoding = \"ISO-8859-1\")  #utf8\")\n    data=file.read()\n    file.close()\n    Data_lignes=data.splitlines()\n    speakers={}\n    B_tt_speakers=False\n    B_blocTurn=False\n    bloc=\"\"\n    # lecture de chaque enregistrement et on recompose le bloc de donn\u00e9es\n    for ligne in Data_lignes:\n        # chaque est une structure json\n        #recuperation des speakers \n        if \"&lt;Speakers&gt;\" in ligne:\n            # traitement et memorisation des speakers \n            B_tt_speakers=True\n            #print(ligne)\n        elif \"&lt;\/Speakers&gt;\" in ligne:\n            # fin de traitement des speakers \n            B_tt_speakers=False\n            #print(\"fin de traitrement speakers\")\n        elif B_tt_speakers:\n            #&lt;Speaker id=\"spk1\" name=\"BD343FEM\" check=\"no\" dialect=\"native\" accent=\"\" scope=\"local\"\/&gt;\n            # on charge les speakers dans la liste \n            tree = ET.ElementTree(ET.fromstring(ligne))\n            root=tree.getroot()\n            speakers&#91;root.attrib&#91;\"id\"]]=root.attrib\n            #print(ligne)\n        # traitement des grupes de soufle \n        if  not B_tt_speakers:\n            # reperer les attrib Turn\n            #&lt;Turn startTime=\"0\" endTime=\"5.505\" speaker=\"spk1\"&gt;\n            #&lt;Sync time=\"0\"\/&gt;\n            #et j'ai mis euh deux piles \u00e0 charger pendant deux jours\n            #&lt;Sync time=\"2.36\"\/&gt;\n\n            #&lt;Sync time=\"3.084\"\/&gt;\n            #et l\u00e0 je les ai remises aujourd'hui\n            #&lt;Sync time=\"4.424\"\/&gt;\n            #et y a qu'une seule barre\n            #&lt;\/Turn&gt;\n            # on charge le bloc Turn \u00e0 \/Turn et on le traite\n            #print(ligne)\n            if \"&lt;Turn\" in ligne:\n                bloc=ligne\n                B_blocTurn=True\n            elif \"&lt;\/Turn&gt;\" in ligne :\n                bloc+=ligne\n                traite_bloc(bloc,speakers,tab&#91;0])\n                B_blocTurn=False\n                bloc=\"\"\n            elif B_blocTurn:\n                #print(ligne)\n                if ligne.strip()==\"\":\n                    ligne=\"YS\"\n                bloc+=ligne\n\nfile_object = open('split_fichiers'+'.sh', 'w')\nfile_json = open('resultats.json', 'w')\nfile_anomalie = open('anomalie.txt', 'w')\n\ndef main(argv):\n    inputfile = ''\n    outputfile = ''\n    try:\n        opts, args = getopt.getopt(argv,\"hi:o:\",&#91;\"ifile=\",\"ofile=\"])\n    except getopt.GetoptError:\n        print('test.py -i &lt;inputfile&gt; -o &lt;outputfile&gt;')\n        sys.exit(2)\n    for opt, arg in opts:\n        if opt == '-h':\n            print('test.py -i &lt;inputfile&gt; -o &lt;outputfile&gt;')\n            sys.exit()\n        elif opt in (\"-i\", \"--ifile\"):\n            inputfile = arg\n        elif opt in (\"-o\", \"--ofile\"):\n            outputfile = arg\n    # fournir le fichier liste_fichiers.txt contenant l'ensemble des ficheirs \u00e0 analyser et \u00e0 extraire\n    with open(inputfile, 'r',encoding='utf-8') as myfile:\n        files = myfile.read().split(\"\\n\")\n    # on balaye l'ensemble des noms de ficheirs un \u00e0 un pour les soumettre au traitement\n    for file in files:\n        if file!=\"\":\n            print(file)\n            lance(file)\n    file_object.close()\n    print(\"Nb de bloc multiple : \" + str(nb_speakers_multiple))\n    # il faut enregistrer liste_mots dans la base \n    for mot in liste_mots:\n        if mot.strip()!=\"\":\n            MOT={\"mot\":mot,\"count\":liste_mots&#91;mot]}\n            lemmes=lemmatizer.lemmatize(mot,'all')\n            #print(lemmes)\n            #&#91;('d\u00e9finitif', 'adj'), ('d\u00e9finitive', 'nc')]\n            MOT&#91;\"lemmes\"]={}\n            for lemme in lemmes :\n                MOT&#91;\"lemmes\"]&#91;lemme&#91;1]]=lemme&#91;0]\n            #print(MOT)\n            lexique_eslo2.insert_one(MOT)\nif __name__ == \"__main__\":\n   main(sys.argv&#91;1:])\n<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Actions effectu\u00e9es sur la plateforme 17\/11\/2025 Pour fabriquer l&#8217;archive de l&#8217;ensemble des fichiers \u00e0 extraire on utilise le script suivant : \u00e0 Utiliser avec une redirection vers un fichier avec l&#8217;extension bash et \u00e0 ex\u00e9cuter sur la machine cible pour construire l&#8217;archive tar que l&#8217;on, pourra ensuite d\u00e9ployer sur le serveur cible. R\u00e9alisation de la [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-1358","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/passy.spgoo.org\/index.php?rest_route=\/wp\/v2\/pages\/1358","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/passy.spgoo.org\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/passy.spgoo.org\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/passy.spgoo.org\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/passy.spgoo.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1358"}],"version-history":[{"count":9,"href":"https:\/\/passy.spgoo.org\/index.php?rest_route=\/wp\/v2\/pages\/1358\/revisions"}],"predecessor-version":[{"id":1382,"href":"https:\/\/passy.spgoo.org\/index.php?rest_route=\/wp\/v2\/pages\/1358\/revisions\/1382"}],"wp:attachment":[{"href":"https:\/\/passy.spgoo.org\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1358"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}