Tri inverse et argsort en python
Je suis en train d'écrire une fonction en Python (encore un noob!) qui retourne les indices et scores des documents commandés par l'intérieure des produits de leur tfidf scores. La procédure est la suivante:
- De calcul de vecteur de l'intérieur des produits entre doc
idx
et tous les autres documents - Trier dans l'ordre décroissant
- Retour les "scores" et les indices de la seconde à la fin (c'est à dire pas en lui-même)
Le code que j'ai en ce moment est:
import h5py
import numpy as np
def get_related(tfidf, idx) :
''' return the top documents '''
# calculate inner product
v = np.inner(tfidf, tfidf[idx].transpose())
# sort
vs = np.sort(v.toarray(), axis=0)[::-1]
scores = vs[1:,]
# sort indices
vi = np.argsort(v.toarray(), axis=0)[::-1]
idxs = vi[1:,]
return (scores, idxs)
où tfidf
est un sparse matrix of type '<type 'numpy.float64'>'
.
Cela semble inefficace, comme le tri est effectué en deux fois (sort()
puis argsort()
), et les résultats doivent ensuite être inversé.
- Cela peut-il être fait de manière plus efficace?
- Cela peut-il être fait sans la conversion de la matrice creuse à l'aide de
toarray()
?
source d'informationauteur tdc
Vous devez vous connecter pour publier un commentaire.
Je ne pense pas qu'il y a un réel besoin de sauter le
toarray
. Lev
tableau sera seulementn_docs
de long, ce qui est peu en comparaison de la taille de lan_docs
×n_terms
tf-idf de la matrice dans des situations concrètes. Aussi, il sera assez dense depuis n'importe quel terme partagée par les deux documents leur donner une valeur non nulle de la similitude. Sparse matrix représentations seulement payer lorsque la matrice que vous voulez enregistrer est très clairsemée (je l'ai vu >80% chiffres pour Matlab et supposons que Scipy sera similaire, bien que je n'ai pas de chiffre exact).Le double tri peut être sauté en faisant
Btw., votre utilisation de
np.inner
sur les matrices creuses n'est pas d'aller travailler avec les dernières versions de NumPy; la manière la plus sûre de prendre intérieure d'un produit de deux matrices creuses est