2017-08-23 15 views
1

私は、データフレーム文字列に適合しようとしているデータフレームとボキャブラリファイルがあるシナリオを持っています。私はscikitを使用している疎な行列を生成するcountVectorizerを学ぶ。私は、疎な行列の出力を取得し、それをデータフレームの対応する行のデータフレームとマージする必要があります。スパース行列全体を繰り返し、各行のデータとインデックスを連結します。

コードは: -

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 

は今、私は何を探していますと、スパース行列から行ごとに文字列を作成し、それに対応する文書に追加しています。

例:doc3(「ファームウェアの更新に失敗しました」)の場合、スパース行列から「3:1 7:1」を取得します(つまり、&の列インデックスとその頻度が更新されません) docのデータフレームの行3.

私は以下のようにして、行インデックスに基づいてサブマトリックスを取得し、それをループし、各行の連結文字列を "3: 1 7:1 "に変換し、最後にこの文字列を新しい列としてデータフレームに追加します。

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) 

答えて

0

私は完全にあなたが望むものを、次のではないんだけど、多分lilフォーマットはで動作するように容易になります。

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) 
それの属性は、あなたが望むどのように見えるの行によって編成され

それ。

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 

またcsr形式の行を反復処理することができますが、それは.indptr属性でもう少し数学を必要とします。

+0

これはまさに私が探していたものです。可能であれば、.indptrアプローチもチェックアウトしたいと考えています。どうもありがとう ! –

関連する問題