Without the vectorize I can recreate the matrix, more or less, with this sequence of operations:
In [703]: documents = ( "The sky is blue", "The sun is bright", "The sun in the sky is bright", "We can see the shining sun the bright sun" )
get a list of lists of the words (all lower case):
In [704]: alist = [l.lower().split() for l in documents]
get a sorted list of the words (unique):
In [705]: aset = set()
In [706]: [aset.update(l) for l in alist]
Out[706]: [None, None, None, None]
In [707]: unq = sorted(list(aset))
In [708]: unq
Out[708]:
['blue',
'bright',
'can',
'in',
'is',
'see',
'shining',
'sky',
'sun',
'the',
'we']
Go through the alist and collect word counts. rows will be the sentence number, cols will be the unique word index
In [709]: rows, cols, data = [],[],[]
In [710]: for i,row in enumerate(alist):
...: for c in row:
...: rows.append(i)
...: cols.append(unq.index(c))
...: data.append(1)
...:
Make a sparse matrix from this data:
In [711]: M = sparse.csr_matrix((data,(rows,cols)))
In [712]: M
Out[712]:
<4x11 sparse matrix of type '<class 'numpy.int32'>'
with 21 stored elements in Compressed Sparse Row format>
In [713]: print(M)
(0, 0) 1
(0, 4) 1
(0, 7) 1
(0, 9) 1
(1, 1) 1
....
(3, 9) 2
(3, 10) 1
In [714]: M.A # viewed as 2d array
Out[714]:
array([[1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0],
[0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0],
[0, 1, 0, 1, 1, 0, 0, 1, 1, 2, 0],
[0, 1, 1, 0, 0, 1, 1, 0, 2, 2, 1]], dtype=int32)
Since this is using sklearn, I can reproduce your matrix with:
In [717]: from sklearn import feature_extraction
In [718]: tf = feature_extraction.text.TfidfVectorizer()
In [719]: tfM = tf.fit_transform(documents)
In [720]: tfM
Out[720]:
<4x11 sparse matrix of type '<class 'numpy.float64'>'
with 21 stored elements in Compressed Sparse Row format>
In [721]: print(tfM)
(0, 9) 0.34399327143
(0, 7) 0.519713848879
(0, 4) 0.420753151645
....
(3, 5) 0.374599471224
(3, 6) 0.374599471224
In [722]: tfM.A
Out[722]:
array([[ 0.65919112, 0. , 0. , 0. , 0.42075315,
0. , 0. , 0.51971385, 0. , 0.34399327,
0. ],....
[ 0. , 0.23910199, 0.37459947, 0. , 0. ,
0.37459947, 0.37459947, 0. , 0.47820398, 0.39096309,
0.37459947]])
The actual data is stored as 3 attribute arrays:
In [723]: tfM.indices
Out[723]:
array([ 9, 7, 4, 0, 9, 4, 8, 1, 9, 7, 4, 8, 1, 3, 9, 8, 1,
10, 2, 5, 6], dtype=int32)
In [724]: tfM.data
Out[724]:
array([ 0.34399327, 0.51971385, 0.42075315, 0.65919112, 0.42685801,
...
0.37459947])
In [725]: tfM.indptr
Out[725]: array([ 0, 4, 8, 14, 21], dtype=int32)
The indices values for individual rows tell us which words occur in that sentence:
In [726]: np.array(unq)[M[0,].indices]
Out[726]:
array(['blue', 'is', 'sky', 'the'],
dtype='<U7')
In [727]: np.array(unq)[M[3,].indices]
Out[727]:
array(['bright', 'can', 'see', 'shining', 'sun', 'the', 'we'],
dtype='<U7')
tfidt_matrix.Ashould display this in a conventional matrix form. - hpaulj