2017-04-03 6 views
0

私はDocID、WordID、および頻度(count)を以下のように含むデータセットを持っています。 最初の3つの数字は、1.文書数、2.語彙の単語の数、そしてコレクションの単語の総数を表します。私が何をしたいかファイルを読み込んで行をベクトルとして表現する

189 
1430 
12300 
1 2 1 
1 39 1 
1 42 3 
1 77 1 
1 95 1 
1 96 1 
2 105 1 
2 108 1 
3 133 3 

は、(最初​​の3行を無視する)データを読み取るドキュメントごとの単語を組み合わせて、最終的にwordIDの周波数を含むベクターとして各文書を表すためです。

val data = Array(
    Vectors.sparse(vocab_size, Seq((2, 1.0), (39, 1.0), (42, 3.0), (77, 1.0), (95, 1.0), (96, 1.0))), 
    Vectors.sparse(vocab_size, Seq((105, 1.0), (108, 1.0))), 
    Vectors.sparse(vocab_size, Seq((133, 3.0)))) 

問題は、私はないだということである:文献1、2及び3の表現がされる上記データセットに基づい

は( vocab_sizeは、データの第2行によって抽出することができることに留意されたいです)ファイル .txt.gzをRDDとして読み込み、上記のように疎ベクトルの配列を作成する方法を確かめてください。私は実際にPCAトランスに data配列を渡したいと思います。 ( groupByKey方法はメモリに各ドキュメントのすべてのキーをロードすること

sc.textFile("path/to/file").flatMap(r => r.split(' ') match { 
    case Array(doc, word, freq) => Some((doc.toInt, (word.toInt, freq.toDouble))) 
    case _ => None 
}).groupByKey().mapValues(a => Vectors.sparse(vocab_size, a.toSeq)) 

注意、あなたが代わりにその変種reduceByKeyまたはaggregateByKeyのいずれかを使用する場合があります。このような

+1

'textFiles'で読み込み、' map'で解析します。参照してください:http://stackoverflow.com/questions/42761912/how-to-read-gz-compressed-file-by-pyspark –

+0

問題は、基本的に文書ごとの単語を結合し、その表現を疎ベクトルに入れる方法です。 –

答えて

1

何かがトリックを行う必要があります私は持っているだろうが、あなたがおそらくそれらを一緒にマージする何かを持っているにもかかわらず、あなたがあなたの疎ベクトルにある方法を知らない。

+0

'sc.textFiles'を' sc.textFile'に、 'freq.toDouble'を' count.toDouble'に(あるいはその逆に)変更する必要があります。これらのタイプミスを訂正すると、次のようなエラーが発生します。 'Main.scala:46:代替メソッドで疎結合されたメソッド値:' –

+0

'Vectors'オブジェクトはどこから取得しましたか? 'scala.collection'にも、apache-sparkにもありません。それがどのように使用できるかを理解するのに役立ちます。 –

+0

私の以前の観察を無視してください。問題は、 'Array [Vector]'の形式ではないということです。私が実際にしたいのは(あなたのコードの出力が 'data'に格納されているとすれば) ' val dataRDD = sc.parallelize(data) 'なら、 ' val mat:RowMatrix = new RowMatrix(dataRDD) '最後にPCAを実行します: ' val pc:Matrix = mat.computePrincipalComponents(4) ' –

関連する問題