преобразование scipy.sparse.csr.csr_matrix в список списков

Я изучаю классификацию с несколькими метками и пытаюсь реализовать учебник tfidf из обучения scikit. Я имею дело с текстовым корпусом для расчета его оценки tf-idf. Для этой цели я использую модуль sklearn.feature_extraction.text. Используя CountVectorizer и TfidfTransformer, теперь мой корпус векторизован и tfidf для каждого словаря. Проблема в том, что теперь у меня разреженная матрица, например:

(0, 47) 0.104275891915
(0, 383)    0.084129133023
.
.
.
.
(4, 308)    0.0285015996586
(4, 199)    0.0285015996586

Я хочу преобразовать этот sparse.csr.csr_matrix в список списков, чтобы я мог избавиться от идентификатора документа из приведенного выше csr_matrix и получить пару tfidf и dictionaryId, например

47:0.104275891915 383:0.084129133023
.
.
.
.
308:0.0285015996586 
199:0.0285015996586

Есть ли способ преобразовать в список списков или любой другой способ, с помощью которого я могу изменить формат, чтобы получить пару tfidf-vocabularyId?


person Saurabh    schedule 19.11.2016    source источник


Ответы (3)


Я не знаю, чего tf-idf ожидает, но, возможно, я смогу помочь с редким концом.

Сделайте разреженную матрицу:

In [526]: M=sparse.random(4,10,.1)
In [527]: M
Out[527]: 
<4x10 sparse matrix of type '<class 'numpy.float64'>'
    with 4 stored elements in COOrdinate format>
In [528]: print(M)
  (3, 1)    0.281301619779
  (2, 6)    0.830780358032
  (1, 1)    0.242503399296
  (2, 2)    0.190933579917

Теперь преобразуйте его в формат coo. Это уже то (я мог бы указать random параметр формата). В любом случае значения в формате coo хранятся в 3-х массивах:

In [529]: Mc=M.tocoo()
In [530]: Mc.data
Out[530]: array([ 0.28130162,  0.83078036,  0.2425034 ,  0.19093358])
In [532]: Mc.row
Out[532]: array([3, 2, 1, 2], dtype=int32)
In [533]: Mc.col
Out[533]: array([1, 6, 1, 2], dtype=int32)

Похоже, вы хотите игнорировать Mc.row и как-то присоединиться к остальным.

Например, как словарь:

In [534]: {k:v for k,v in zip(Mc.col, Mc.data)}
Out[534]: {1: 0.24250339929583264, 2: 0.19093357991697379, 6: 0.83078035803205375}

или столбцы в массиве 2d:

In [535]: np.column_stack((Mc.col, Mc.data))
Out[535]: 
array([[ 1.        ,  0.28130162],
       [ 6.        ,  0.83078036],
       [ 1.        ,  0.2425034 ],
       [ 2.        ,  0.19093358]])

(Также np.array((Mc.col, Mc.data)).T)

Или просто список массивов [Mc.col, Mc.data], или [Mc.col.tolist(), Mc.data.tolist()] список списков и т. Д.

Вы можете взять это оттуда?

person hpaulj    schedule 19.11.2016
comment
Спасибо. Это именно то, что мне было нужно. - person Saurabh; 22.11.2016
comment
Хочу выделить понимание dict {k:v for k,v in zip(Mc.col, Mc.data)}. Это фантастический способ сохранить разреженность данных, а также иметь удобочитаемые метки. - person ClimbsRocks; 20.04.2017
comment
Это хорошо. Но все нули исчезают из матрицы tfidf .. Так что теперь все они будут иметь разные размеры. - person Isbister; 19.12.2017
comment
«col» больше не действует. Теперь это индексы - person David Nogueira; 16.10.2019
comment
@DavidNogueira. Атрибуты coo fromat включают col. В формате csr они заменяются на indices. Каждый формат хранит свои данные в уникальном наборе атрибутов. - person hpaulj; 16.10.2019

На основе Scipy Предлагаю воспользоваться этим методом:

ndarray = yourMatrix.toarray()
listOflist = ndarray.tolist()
person pooria taghizadeh    schedule 17.01.2020