2013-05-12 9 views
34

Ho un database SQLite che contiene seguente tipo di schema:Generazione di una matrice densa da una matrice sparsa in NumPy pitone

termcount(doc_num, term , count) 

Questa tabella contiene i termini con i rispettivi conteggi nel documento. come

(doc1 , term1 ,12) 
(doc1, term 22, 2) 
. 
. 
(docn,term1 , 10) 

Questa matrice può essere considerato come matrice sparsa come ogni documento contiene pochissime termini che avranno un valore diverso da zero.

Come si crea una matrice densa da questa matrice sparsa utilizzando numpy poiché devo calcolare la somiglianza tra i documenti utilizzando la somiglianza del coseno.

Questa matrice densa apparirà come una tabella che ha docid come prima colonna e tutti i termini saranno elencati come la prima riga. E le celle rimanenti conterranno i conteggi.

risposta

7

Ho risolto questo problema utilizzando Pandas. Perché vogliamo mantenere gli ID dei documenti e gli ID dei termini.

from pandas import DataFrame 

# A sparse matrix in dictionary form (can be a SQLite database). Tuples contains doc_id  and term_id. 
doc_term_dict={('d1','t1'):12, ('d2','t3'):10, ('d3','t2'):5} 

#extract all unique documents and terms ids and intialize a empty dataframe. 
rows = set([d for (d,t) in doc_term_dict.keys()]) 
cols = set([t for (d,t) in doc_term_dict.keys()]) 
df = DataFrame(index = rows, columns = cols) 
df = df.fillna(0) 

#assign all nonzero values in dataframe 
for key, value in doc_term_dict.items(): 
    df[key[1]][key[0]] = value 

print df 

uscita:

t2 t3 t1 
d2 0 10 0 
d3 5 0 0 
d1 0 0 12 
59
from scipy.sparse import csr_matrix 
A = csr_matrix([[1,0,2],[0,3,0]]) 
>>>A 
<2x3 sparse matrix of type '<type 'numpy.int64'>' 
    with 3 stored elements in Compressed Sparse Row format> 
>>> A.todense() 
    matrix([[1, 0, 2], 
      [0, 3, 0]]) 
>>> A.toarray() 
     array([[1, 0, 2], 
      [0, 3, 0]]) 

questo è un esempio di come convertire una matrice sparsa di una matrice densa presa da scipy