Pour fabriquer l’archive de l’ensemble des fichiers à extraire on utilise le script suivant :

import pymongo
import re
import os
import sys,getopt
import json

# -----------------------------------------
# Connexion a la base de données
# -----------------------------------------
myclient = pymongo.MongoClient("mongodb://localhost:27087/",username="ystroppa",password="blblabla",authSource="bddictionnairique",authMechanism='SCRAM-SHA-1')
mydb = myclient["ilfo"]
mycol = mydb["eslo2"]
	
liste_mots=["création","créations","heureusement","ingénieur","ingénieurs","évidemment","difficulté","difficultés","technique","techniques"]
for mot in liste_mots:
  myquery = {"texte":{"$regex":mot}}
  myproject = { "_id":0, "enreg":1,"locuteur":2,"debut":3,"fin":4}
  mydoc = mycol.find(myquery,myproject)
  liste={}
  for x in mydoc:
      # on append dans le fichier tar
      nom_file="tar -rvf archives.tar "+" "+x["enreg"][0:-2]+"/"+x["enreg"][0:-2]+"-"+x["locuteur"]+"-"+x["debut"]+"-"+x["fin"]+".mp3"
      print(nom_file)

à Utiliser avec une redirection vers un fichier avec l’extension bash et à exécuter sur la machine cible pour construire l’archive tar que l’on, pourra ensuite déployer sur le serveur cible.

Réalisation 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és pour un enregistrements et produit la commande à l’aide de ffmpeg pour lors d’une exécution produire le fichier unitaire associé à ce groupe de souffle.

Ce script permet

# -------------------------------------------------------------------------------------------------
# Fichier de traitement des fichiers sonores pour les découper en plusieurs fragments de fichiers 
# par groupe de souffle 
# Y. Stroppa SPGoO -- pour passy 
# -------------------------------------------------------------------------------------------------
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Script d'extraction des donnees dans le cadre de la plateforme Passy
fichiers trs issus de transcriber
@author: ystroppa spgoo/CNRS
"""
import sys,getopt
import json
import pymongo
import re

# -----------------------------------------
# Connexion a la base de donnees
# -----------------------------------------
myclient = pymongo.MongoClient("mongodb://192.168.1.38:27087/",username="ystroppa",password="blablabla",authSource="bddictionnairique",authMechanism='SCRAM-SHA-1')

mydb = myclient["ilfo"]
mycol = mydb["eslo2"]

def genere_file_script(enregistrement):
   # il faut recuperer enreg, locuteur, debut et fin 
   # nom_file=enreg+"_"+locuteur+"_"+"debut"+"_"+fin+".mp3"
   critere=enregistrement+"_C"
   myquery = {"enreg":critere}
   myproject = { "_id":0, "enreg":1,"locuteur":2,"debut":3,"fin":4}
   Noutput="script_"+enregistrement+".bash"
   output = open(Noutput,"w")
   output.write("#!/bin/bash \n")
   mydoc = mycol.find(myquery,myproject)
   for x in mydoc:
      enreg=x["enreg"][0:-2]
      enregfile=x["enreg"][0:-2]+".mp3"
      locuteur=x["locuteur"]
      debut=x["debut"]
      fin=x["fin"]
      nom_file=enreg+"-"+locuteur+"-"+debut+"-"+fin+".mp3"
      commande="ffmpeg -i "+enregfile+" -vn  -ss "+debut+" -to "+fin +" "+nom_file;
      output.write(commande+"\n")
   output.close()
# lecture du fichier contenant les noms des fichiers à traiter
file = open("liste_fic.txt", encoding='utf-8')
data=file.read()
file.close()
DATA=data.splitlines()
for x in DATA:
    print(x)
    genere_file_script(x)

Constitution d’un fichier csv de l(‘ensemble de la table locuteurs de la base de données

Et importation de ce fichier dans une collection de Mongodb via le script import_locuteur_mongo.py

import  json, pymongo
import re
import csv

myclient = pymongo.MongoClient("mongodb://localhost:27087/", username='ystroppa',password='blablabla',authSource='ilfo', authMechanism='SCRAM-SHA-256')
mydb = myclient["ilfo"]
mycol = mydb["locuteurs"]

# lecture du fichier csv et chargement des structures pour les sauvegarder dans la base
# reference;sexe;etude;nomsituation;profession;anneenaissance;lieunaissance;tranche
with open('resultats_locuteurs.csv',encoding='utf-8') as csvfile:
    spamreader = csv.reader(csvfile, delimiter=';')

    for row in spamreader:
        locuteur={}
        locuteur["ref"]=row[0]
        locuteur["sexe"]=row[1]
        locuteur["etude"]=row[2]
        locuteur["nomsituation"]=row[3]
        locuteur["profession"]=row[4]
        locuteur["anneenaissance"]=row[5]
        locuteur["lieunaissance"]=row[6]
        locuteur["tranche"]=row[7]

        print(locuteur)
        # il faut insérer l'enregistrement dans la collection 
        mycol.insert_one(locuteur)

Script de constitution de la base de données MongoDB à partir des fichiers de transcription. traitement.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Script d'extraction des donnees dans le cadre de la plateforme Passy 
fichiers trs issus de transcriber 
@author: ystroppa spgoo/CNRS 
https://maelfabien.github.io/machinelearning/NLPfr/#a
https://github.com/ClaudeCoulombe/FrenchLefffLemmatizer
pip install git+https://github.com/ClaudeCoulombe/FrenchLeffLemmatizer.git
Installation de pip3 install space nklp nltk
python -m space download fr_core_news_sm

Attention a la partie getChildren de xml.etree.ElementTree n'existe plus dans cette version 
il faut directement utiliser l'instruction list(root) qui retourne les enfants

"""
import numpy as np
import sys,getopt
import spacy
nlp = spacy.load("fr_core_news_sm")

# pour le lemmatiseur 
from french_lefff_lemmatizer.french_lefff_lemmatizer import FrenchLefffLemmatizer

from nltk.stem.snowball import SnowballStemmer
stemmer = SnowballStemmer(language='french')
# -----------------------------------------------------------
# importation des donnes XML des dico pour conversion json 
# et stockage dans une base de donnees mongodb
# -----------------------------------------------------------
import json
import xml.etree.ElementTree as ET
import itertools
import pymongo
import re
# Connexion a la base de donnees
# -----------------------------------------
myclient = pymongo.MongoClient("mongodb://ntms:27087/",username="ystroppa",password="blablabla",authSource="ilfo",authMechanism='SCRAM-SHA-1')
#myclient = pymongo.MongoClient("mongodb://ntms:27087/")

mydb = myclient["ilfo"]
# chargement des 190 054  entrées possibles pour 5HT7 
mycol = mydb["eslo2"]
lexique_eslo2 = mydb["lexique_eslo2"]
# on le lit ligne par ligne et on interprete 


lemmatizer = FrenchLefffLemmatizer()

nb_speakers_multiple=0
liste_mots={}

# fonctions de traitement de TAL pour les expressions 
def return_token(sentence):
    # Tokeniser la phrase
    doc = nlp(sentence)
    # Retourner le texte de chaque token
    return [X.text for X in doc]

def return_token_sent(sentence):
    # Tokeniser la phrase
    doc = nlp(sentence)
    # Retourner le texte de chaque phrase
    return [X.text for X in doc.sents]

def return_word_embedding(sentence):
    # Tokeniser la phrase
    doc = nlp(sentence)
    # Retourner le vecteur lié à chaque token
    return [(X.vector) for X in doc]

def return_POS(sentence):
    # Tokeniser la phrase
    doc = nlp(sentence)
    # Retourner les étiquettes de chaque token
    return [(X.text, X.pos_) for X in doc]
def return_NER(sentence):
    # Tokeniser la phrase
    doc = nlp(sentence)
    # Retourner le texte et le label pour chaque entité
    return [(X.text, X.label_) for X in doc.ents]

def return_stem(sentence):
    doc = nlp(sentence)
    return [stemmer.stem(X.text) for X in doc]

def traite_bloc(bb,speakers,fichier):
    """
    Traitement du bloc Turn pour en extraire les éléments 
    """
    global nb_speakers_multiple, liste_mots
    #print(bb)
    tree = ET.ElementTree(ET.fromstring(bb))
    root=tree.getroot()
    Turn=root.attrib
    # on saute les multi-speakers pour le moment 
    # on regarde si plusieurs speakers 
    if "speaker" not in Turn:
        print("pas de speaker dans le bloc")
        return
    tab_speakers=Turn["speaker"].split(" ")
    D_bloc_recompose={}
    if len(tab_speakers)<2 :
        # exploitation des sync 
        #on parcourt les deux listes en même temps
        txt_complet=""
        textes=[]
        debut=Turn["startTime"]
        ref_end=Turn["endTime"]
        for indice,txt in zip(list(root), root.itertext()):
            if "time" in indice.attrib :
                #print(debut + ":" + txt)
                ref_debut= indice.attrib['time']
                if debut!=ref_debut:
                    textes.append({"debut":debut, "fin":ref_debut,"texte":txt_complet.strip()})
                    debut=ref_debut
                txt_complet=txt
        #pour le dernier 
        textes.append({"debut":debut, "fin":ref_end,"texte":txt_complet.strip()})
        #print(textes)
        #on verifie si le texte est vide on n'enregistre pas 
        for texte in textes:
            D_bloc_recompose={}
            if texte["texte"]!="" and texte["texte"]!="YS" :
                mot_propre=texte["texte"].replace("'"," ").replace("?"," ")
                tab_res = re.split('\s+',  mot_propre)
                for mot in tab_res:
                    if mot in liste_mots:
                        liste_mots[mot]+=1
                    else:
                        liste_mots[mot]=1
                D_bloc_recompose["enreg"]=fichier
                D_bloc_recompose["locuteur"]=speakers[Turn["speaker"]]["name"]
                D_bloc_recompose["texte"]=texte["texte"]
                D_bloc_recompose["morpho"]=[{y:x} for x,y in return_POS(texte["texte"])]
                D_bloc_recompose["debut"]=texte["debut"]
                D_bloc_recompose["fin"]=texte["fin"]
                #print(D_bloc_recompose)
                mycol.insert_one(D_bloc_recompose)
    else :
        nb_speakers_multiple+=1
def lance(_file):
    """
    Traitement des fichiers de transcription
    on lit le xml comme un fichier texte que l'on parse a la volee  
    """
    global file_object
    tab=_file.split('.')
    file = open(_file, encoding = "ISO-8859-1")  #utf8")
    data=file.read()
    file.close()
    Data_lignes=data.splitlines()
    speakers={}
    B_tt_speakers=False
    B_blocTurn=False
    bloc=""
    # lecture de chaque enregistrement et on recompose le bloc de données
    for ligne in Data_lignes:
        # chaque est une structure json
        #recuperation des speakers 
        if "<Speakers>" in ligne:
            # traitement et memorisation des speakers 
            B_tt_speakers=True
            #print(ligne)
        elif "</Speakers>" in ligne:
            # fin de traitement des speakers 
            B_tt_speakers=False
            #print("fin de traitrement speakers")
        elif B_tt_speakers:
            #<Speaker id="spk1" name="BD343FEM" check="no" dialect="native" accent="" scope="local"/>
            # on charge les speakers dans la liste 
            tree = ET.ElementTree(ET.fromstring(ligne))
            root=tree.getroot()
            speakers[root.attrib["id"]]=root.attrib
            #print(ligne)
        # traitement des grupes de soufle 
        if  not B_tt_speakers:
            # reperer les attrib Turn
            #<Turn startTime="0" endTime="5.505" speaker="spk1">
            #<Sync time="0"/>
            #et j'ai mis euh deux piles à charger pendant deux jours
            #<Sync time="2.36"/>

            #<Sync time="3.084"/>
            #et là je les ai remises aujourd'hui
            #<Sync time="4.424"/>
            #et y a qu'une seule barre
            #</Turn>
            # on charge le bloc Turn à /Turn et on le traite
            #print(ligne)
            if "<Turn" in ligne:
                bloc=ligne
                B_blocTurn=True
            elif "</Turn>" in ligne :
                bloc+=ligne
                traite_bloc(bloc,speakers,tab[0])
                B_blocTurn=False
                bloc=""
            elif B_blocTurn:
                #print(ligne)
                if ligne.strip()=="":
                    ligne="YS"
                bloc+=ligne

file_object = open('split_fichiers'+'.sh', 'w')
file_json = open('resultats.json', 'w')
file_anomalie = open('anomalie.txt', 'w')

def main(argv):
    inputfile = ''
    outputfile = ''
    try:
        opts, args = getopt.getopt(argv,"hi:o:",["ifile=","ofile="])
    except getopt.GetoptError:
        print('test.py -i <inputfile> -o <outputfile>')
        sys.exit(2)
    for opt, arg in opts:
        if opt == '-h':
            print('test.py -i <inputfile> -o <outputfile>')
            sys.exit()
        elif opt in ("-i", "--ifile"):
            inputfile = arg
        elif opt in ("-o", "--ofile"):
            outputfile = arg
    # fournir le fichier liste_fichiers.txt contenant l'ensemble des ficheirs à analyser et à extraire
    with open(inputfile, 'r',encoding='utf-8') as myfile:
        files = myfile.read().split("\n")
    # on balaye l'ensemble des noms de ficheirs un à un pour les soumettre au traitement
    for file in files:
        if file!="":
            print(file)
            lance(file)
    file_object.close()
    print("Nb de bloc multiple : " + str(nb_speakers_multiple))
    # il faut enregistrer liste_mots dans la base 
    for mot in liste_mots:
        if mot.strip()!="":
            MOT={"mot":mot,"count":liste_mots[mot]}
            lemmes=lemmatizer.lemmatize(mot,'all')
            #print(lemmes)
            #[('définitif', 'adj'), ('définitive', 'nc')]
            MOT["lemmes"]={}
            for lemme in lemmes :
                MOT["lemmes"][lemme[1]]=lemme[0]
            #print(MOT)
            lexique_eslo2.insert_one(MOT)
if __name__ == "__main__":
   main(sys.argv[1:])