Bonjour, j'ai un dictionnaire de synonyme que je représente sous la forme d'un... dictionnaire Python. C'est à dire :
Afin de pouvoir travailler efficacement dessus, je souhaiterais transformer ce dictionnaire en :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 d {'abasourdi' : ['étonné', 'hébété'], 'abondant' : ['riche', 'copieux', 'luxuriant'], ... }
1- un tuple ordonné d'entrées, donc ici quelque chose comme names = ('abasourdi', 'abondant', etc...)
2- une matrice creuse où M(i,j) == 1 si et seulement si le mot names[j] apparaît dans la liste des synonymes du mot names[i]
J'ai donc tenté de construire les trois listes I,J,V qui représentent cette matrice au format COO; c'est donc les indices de valeurs non nulle de ma matrice au format (row, column, value) avec value=1
Voici le bout de code qui effectue cette tâche :
Le problème ? Avec un dictionnaire qui contient Nentries = 36 178 entrées, c'est très lent !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 keys = tuple(sorted(d.keys())) Nentries = len(keys) indices = range(Nentries) # Construction of I,J,V vectors in COO format I = []; J = []; V = []; for (name, syno_list) in d.items(): rank_key = keys.index(name) rank_values = [keys.index(n) for n in syno_list] if len(rank_values)>0: # This should always be the case, but we check I.append(rank_key*len(rank_values)) J.append(rank_values) V.append([1]*len(rank_values))
Avez-vous des idées pour optimiser cela ?
Merci d'avance et bonne journée
D.
Partager