Обратная сортировка и 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()