Bonjour, j'ai un dictionnaire de synonyme que je représente sous la forme d'un... dictionnaire Python. C'est à dire :

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'],
...
}
Afin de pouvoir travailler efficacement dessus, je souhaiterais transformer ce dictionnaire en :
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 :

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))
Le problème ? Avec un dictionnaire qui contient Nentries = 36 178 entrées, c'est très lent !

Avez-vous des idées pour optimiser cela ?

Merci d'avance et bonne journée

D.