2017-08-23 4 views
1

Ich habe ein Szenario, wo ich ein Dataframe und Vokabeldatei, die ich versuche, um die Datenrahmen String-Spalten passen. Ich benutze scikit learn countVectorizer, das eine spärliche Matrix erzeugt. Ich muss die Ausgabe der Sparse-Matrix nehmen und sie mit dem Datenrahmen für die entsprechende Zeile im Datenrahmen zusammenführen.Iterate über Sparse-Matrix und Verkettung von Daten und Indizes für jede Zeile

Code: -

from sklearn.feature_extraction.text import CountVectorizer 
docs = ["You can catch more flies with honey than you can with vinegar.", 
     "You can lead a horse to water, but you can't make him drink.", 
     "search not cleaning up on hard delete", 
     "updating firmware version failed", 
     "increase not service topology s memory", 
     "Nothing Matching Here" 
     ] 
vocabulary = ["catch more","lead a horse", "increase service", "updating" , "search", "vinegar", "drink", "failed", "not"] 

vectorizer = CountVectorizer(analyzer=u'word', vocabulary=vocabulary,lowercase=True,ngram_range=(0,19)) 

SpraseMatrix = vectorizer.fit_transform(docs) 

Below is sparse matrix output - 
    (0, 0) 1 
    (0, 5) 1 
    (1, 6) 1 
    (2, 4) 1 
    (2, 8) 1 
    (3, 3) 1 
    (3, 7) 1 
    (4, 8) 1 

Nun, was ich bin auf der Suche zu tun, ist eine Zeichenfolge für jede Zeile von Sparse Matrix aufzubauen und es zu dem entsprechenden Dokument hinzuzufügen.

Bsp .: - für doc 3 ("Aktualisieren der Firmware-Version fehlgeschlagen"), ich suche "3: 1 7: 1" von Sparse-Matrix (dh Aktualisierung & fehlgeschlagen Spalte Index und ihre Häufigkeit) und fügen Sie dies zu docs Datenframe Zeile 3.

Ich habe versucht, unten, und es produziert flache Ausgabe wo ich bin, um die Submatrix basierend auf dem Zeilenindex zu erhalten, Schleife durch sie und erstellen Sie eine Zeichenfolge für jede Zeile wie "3: 1 7: 1 ", und schließlich fügen Sie diese Zeichenfolge als neue Spalte zum Datenrahmen für jede entsprechende Zeile hinzu.

cx = SpraseMatrix .tocoo() 
for i,j,v in zip(cx.row, cx.col, cx.data): 
     print((i,j,v)) 

(0, 0, 1) 
(0, 5, 1) 
(1, 6, 1) 
(2, 4, 1) 
(2, 8, 1) 
(3, 3, 1) 
(3, 7, 1) 
(4, 8, 1) 

Antwort

0

Ich folge nicht ganz, was Sie wollen, aber vielleicht das lil Format mit einfacher zu arbeiten:

In [1122]: M = sparse.coo_matrix(([1,1,1,1,1,1,1,1],([0,0,1,2,2,3,3,4],[0,5,6,4, 
     ...: 8,3,7,8]))) 
In [1123]: M 
Out[1123]: 
<5x9 sparse matrix of type '<class 'numpy.int32'>' 
    with 8 stored elements in COOrdinate format> 
In [1124]: print(M) 
    (0, 0) 1 
    (0, 5) 1 
    (1, 6) 1 
    (2, 4) 1 
    (2, 8) 1 
    (3, 3) 1 
    (3, 7) 1 
    (4, 8) 1 
In [1125]: Ml = M.tolil() 
In [1126]: Ml.data 
Out[1126]: array([list([1, 1]), list([1]), list([1, 1]), list([1, 1]), list([1])], dtype=object) 
In [1127]: Ml.rows 
Out[1127]: array([list([0, 5]), list([6]), list([4, 8]), list([3, 7]), list([8])], dtype=object) 

sind es die Attribute für Reihe organisiert, die zu sein scheint, wie Sie wollen es.

In [1130]: Ml.rows[3] 
Out[1130]: [3, 7] 

In [1135]: for i,(rd) in enumerate(zip(Ml.rows, Ml.data)): 
     ...:  print(' '.join(['%s:%s'%ij for ij in zip(*rd)])) 
     ...:  
0:1 5:1 
6:1 
4:1 8:1 
3:1 7:1 
8:1 

Sie können auch durch die Reihen des csr Format laufen, aber das erfordert ein wenig mehr Mathe mit dem .indptr Attribut.

+0

Genau das habe ich gesucht. Wenn möglich, möchten Sie auch den .indptr-Ansatz auschecken. Danke vielmals ! –

Verwandte Themen