Обратная сортировка и argsort в python
Я пытаюсь написать функцию в Python (все еще noob!) который возвращает индексы и оценки документов, упорядоченных внутренними продуктами их баллов tfidf. Процедура такова:
- вычислить вектор внутренних продуктов между doc
idx
и - Сортировать по убыванию
- верните "баллы" и индексы со второго до конца (т. е. не себя)
код, который у меня есть на данный момент есть:
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)
здесь tfidf
это sparse matrix of type '<type 'numpy.float64'>'
.
это кажется неэффективным, так как сортировка производится дважды (sort()
затем argsort()
), и результаты должны быть отменены.
- можно ли это сделать более эффективно?
- можно ли это сделать без преобразования разреженной матрицы с помощью
toarray()
?
1 ответов
Я не думаю, что есть реальная необходимость пропустить toarray
. The v
массив будет только n_docs
длинный, который карлик по размеру n_docs
× n_terms
матрица tf-idf в практических ситуациях. Кроме того, он будет довольно плотным, поскольку любой термин, разделяемый двумя документами, даст им ненулевое сходство. Разреженные матричные представления окупаются только тогда, когда матрица, которую вы храните,очень sparse (я видел > 80% цифры для Matlab и предполагаю, что Scipy будет похож, хотя у меня нет точной цифры).
двойную сортировку можно пропустить, выполнив
v = v.toarray()
vi = np.argsort(v, axis=0)[::-1]
vs = v[vi]
кстати. использование np.inner
на разреженных матрицах не будет работать с последними версиями NumPy; безопасный способ взять внутреннее произведение двух разреженных матриц -
v = (tfidf * tfidf[idx, :]).transpose()