Algorithme pour préparation de matrice creuse
Bonjour, j'ai un dictionnaire de synonyme que je représente sous la forme d'un... dictionnaire Python. C'est à dire :
Code:
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:
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.