将scipy.sparse.csr.csr_matrix转换为列表列表

时间:2016-11-19 16:02:09

标签: python machine-learning scipy scikit-learn tf-idf

我正在学习多标签分类并试图从scikit学习中实现tfidf教程。 我正在处理文本语料库以计算其tf-idf分数。 我正在使用模块sklearn.feature_extraction.text。使用CountVectorizer和TfidfTransformer我现在有了我的语料库vectorised和每个词汇表的tfidf。 问题是我现在有一个稀疏矩阵,如:

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

我想将此sparse.csr.csr_matrix转换为列表列表,以便我可以从上面的csr_matrix中删除文档id并获取tfidf和vocabularyId对,如

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

有没有办法转换成列表列表或任何其他方式我可以更改格式以获取tfidf-vocabularyId对?

3 个答案:

答案 0 :(得分:8)

我不知道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}

或二维数组中的列:

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()]列表列表等等。

你能从那里拿走吗?

答案 1 :(得分:1)

基于Scipy,我建议使用此方法:

ndarray = yourMatrix.toarray()
listOflist = ndarray.tolist()

答案 2 :(得分:0)

为此,正确使用scipy稀疏矩阵类型至关重要scipy.sparse。在这种情况下,scipy.sparse.lil_matrix是理想的,其“数据”属性存储一个表示列值的列表的np.array。 接下来是一个简短的脚本

arrays_of_list = matriz.tolil().data
list_of_list = arrays_of_list.tolist()