2017-01-26 11 views
1

私はSparkit-LearnのSparkCountVectorizerSparkTfidfVectorizerを使用して、たくさんのドキュメントをTFIDFマトリックスに変換しています。Sparkit-Learnで奇妙な転置動作

私はTFIDF行列を作成するために取得し、それが正しい寸法(496861の文書189398個の異なるトークンによる)を有する単一のベクターをスライス

>>> tfidf 
<class 'splearn.rdd.SparseRDD'> from PythonRDD[20] at RDD at PythonRDD.scala:48 
>>> tfidf.shape 
(496861, 189398) 

を返す正しい出力(189398個の別個のトークンによって1つのドキュメント):

>>> tfidf.flatMap(lambda x: x.T).take(1) 

>>> tfidf.flatMap(lambda x: x).take(1) 
[<1x189398 sparse matrix of type '<class 'numpy.float64'>' 
     with 49 stored elements in Compressed Sparse Row format>] 

は今、私は、各文書の転置(1によって寸法189398の、すなわち、ベクトル)を取得したいです

しかし、これは私が代わりに得るものです:だから

[<1x7764 sparse matrix of type '<class 'numpy.float64'>' 
     with 77 stored elements in Compressed Sparse Row format>] 

、代わりに189389x1ベクトルの私は1x7764ベクトルを取得します。私は7764を理解しています:私は.repartition()のデータを64個読んだとき、496861(文書の数)を64で割ったものは7763.4です。私が理解できないのは、Sparkit-Learnが1つのケース(lambda x: x)と別のケースのパーティション(lambda x: x.T)でフラットな行で反復する理由です。私は全く混乱している。

私の最終目標は、TFIDF行列をフィルタリングして、特定の列(つまり特定の単語を含むドキュメントのみ)に0以外の値を持つベクトルのみを取得し、非転置1x189389ベクトルのインデックス付けが機能しないようにすることです(私がの後に入れた[0]の数は、私はいつも同じ1x189389ベクトルを返すことに関係しません)。

答えて

1

間違ったものを転記します。 splearn.rdd.SparseRDDはデータのブロックを格納するので、個々のベクトルではなくブロックを転置します。ブロックに7764行と18938列がある場合、転置された行は18938行と7764列を持ち、それらは平坦化されると行ごとに反復されます。

は何が必要です:

(tfidf 
    # Iterate over each block and yield the rows 
    # block-size x 18938 -> 1 x 18938 
    .flatMap(lambda x: x) 
    # Take each row and transpose it 
    # 1 x 18938 -> 1 x 18938 
    .map(lambda x: x.T)) 

または

(tfidf 
    # Iterate over each row in block (generator expression) 
    # and transpose it block-size x 18938 -> block-size x 18938 x 1 
    # 
    # and then flatten (with flatMap) yielding rows 18938 x 1 
    .flatMap(lambda xs: (x.T for x in xs))) 

:私は本当に慣れていないよSparkit-学ぶので、そこにいくつかのよりエレガントな解決策があることができます。