Обратная сортировка и сортировка в python - PullRequest
14 голосов
/ 09 декабря 2011

Я пытаюсь написать функцию на Python (все еще нуб!), Которая возвращает индексы и оценки документов, упорядоченных по внутренним произведениям их оценок tfidf. Процедура:

  • Вычислить вектор внутренних продуктов между документом 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 Ответ

9 голосов
/ 09 декабря 2011

Я не думаю, что есть реальная необходимость пропустить toarray.Массив v будет иметь длину n_docs, что в практических ситуациях будет меньше размера матрицы n_docs × n_terms tf-idf.Кроме того, он будет довольно плотным, поскольку любой термин, разделяемый двумя документами, даст им ненулевое сходство.Разреженные матричные представления окупаются только тогда, когда сохраняемая вами матрица очень разреженная (я видел> 80% показателей для Matlab и предполагаю, что Scipy будет похожим, хотя у меня нет точной цифры).

Двойную сортировку можно пропустить, выполнив

v = v.toarray()
vi = np.argsort(v, axis=0)[::-1]
vs = v[vi]

Кстати, использование np.inner на разреженных матрицах не будет работать с последними версиями NumPy;безопасный способ взять внутреннее произведение двух разреженных матриц -

v = (tfidf * tfidf[idx, :]).transpose()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...