2013-05-12 23 views
34

Mam SQLite bazę danych zawierającą następujące rodzaje schematu:Generowanie gęstej matrycy z rozrzedzony matrycy w python numpy

termcount(doc_num, term , count) 

Tabela ta zawiera terminy z ich liczbą w dokumencie. jak

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

Macierz ta może być uznana za rzadkie matrycy jak każdy dokumenty zawiera bardzo mało terminy, które mają niezerową wartość.

Jak utworzyć gęstą matrycę z tej rzadkiej macierzy za pomocą numpy, ponieważ muszę obliczyć podobieństwo między dokumentami przy użyciu podobieństwa cosinusów.

Ta gęsta matryca będzie wyglądać jak tabela, która ma docid jako pierwsza kolumna, a wszystkie terminy będą wymienione jako pierwszy wiersz. Pozostałe komórki będą zawierać liczby.

Odpowiedz

7

, że rozwiązać ten problem za pomocą Pandy. Ponieważ chcemy zachować identyfikatory dokumentów i identyfikatory terminów.

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 

wyjściowa:

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]]) 

jest to przykład sposobu konwersji rzadki macierz gęstej matrycy pobranej od scipy