2016-11-19 215 views
2

我正在學習多標籤分類並嘗試從scikit學習實現tfidf教程。 我正在處理一個文本語料庫來計算其tf-idf分數。 我使用模塊sklearn.feature_extraction.text爲目的。使用CountVectorizer和TfidfTransformer我現在已經爲每個詞彙表使用了我的語料庫vectorised和tfidf。 的問題是,我有一個稀疏矩陣現在,像:將scipy.sparse.csr.csr_matrix轉換爲列表清單

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

我想這個sparse.csr.csr_matrix轉換成一個列表的列表,這樣我可以從上面去掉文檔ID csr_matrix並獲得TFIDF和vocabularyId對像

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

有什麼辦法轉換成一個列表的列表或者,我可以改變來獲得TFIDF-vocabularyId對格式的任何其他方式?

回答

4

我不知道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()]列表等列表

C你從那裏拿走它?

+0

謝謝。 正是我所需要的。 – Saurabh

+0

我想強調詞典理解'{k:v for k,v in zip(Mc.col,Mc.data)}''。這是保持數據稀疏的一種極好的方式,同時還具有人類可讀的標籤。 – ClimbsRocks

+0

這很好。但所有的零都從tfidf矩陣中消失。所以他們現在都會有不同的維度 – Isbister