2016-10-27 5 views
2

特定のキーワードがあるため、フラグが立てられた〜30kのユニークなドキュメントを持つデータセットがあります。データセットの主要フィールドには、文書のタイトル、ファイルサイズ、キーワード、抜粋(キーワードを中心に50語)などがあります。これらの〜30k個のユニークなドキュメントのそれぞれに複数のキーワードがあり、各ドキュメントはキーワードごとに1セットのデータセットを持ちます(したがって、各ドキュメントには複数の行があります)。ここでは、生データセット内のキー・フィールドがどのように見えるかのサンプルです:Pyspark - 複数のスパースベクトルの合計(CountVectorizer出力)

Raw Data Example

私の目標は、特定の発生箇所(子供たちはなど、宿題不満)ので、私のためのフラグ文書にモデルを構築することです

キーワードと抜粋のフィールドをベクトル化して、それらを縮約する必要があるので、一意のドキュメントごとに1つの行があります。

私は何をしようとしているのかの例としてキーワードのみを使用しています。トークン化、StopWordsRemover、CountVectorizerを適用し、カウントベクトル化の結果を含む疎行列を出力します。

:私は2つのいずれかをしたい

スパーセベクター(158、{3.0:7:1.0、65:1.0、78:2.0、110:1.0、155})一つのスパースベクトルは、何かのように見えるかもしれません

  1. 、私はDOCIDをGROUPBY各列(1列=つのトークン)をまとめることができ、緻密なベクターに疎ベクトルを変換
  2. を直接与えるためにスパースベクトル(DOCIDによってグルーピング)

横切っ合計しますあなたは私が何を意味しているのか考えています - 下の画像の左側には、 CountVectorizerの出力は左に、私が望む最終的なデータセットです。

CountVectorizer Output & Desired Dataset

答えて

1

私がしようとするだろう:

>>> from pyspark.ml.linalg import SparseVector, DenseVector 
>>> 
>>> df = sc.parallelize([ 
...  (1, SparseVector(158, {7: 1.0, 65: 1.0, 78: 2.0, 110: 1.0, 155: 3.0})), 
...  (1, SparseVector(158, {99: 100.0})), 
...  (2, SparseVector(158, {1: 1.0})), 
... ]).toDF(["docId", "features"]) 
>>> df.rdd.mapValues(lambda v: v.toArray()) \ 
...  .reduceByKey(lambda x, y: x + y) \ 
...  .mapValues(lambda x: DenseVector(x)) \ 
...  .toDF(["docId", "features"]) 
+0

感謝を!私が知る限り、ほとんどの機械学習関数(SVM、ロジスティック回帰など)は密ベクトルを入力正しいものとして受け入れますか?つまり、各トークンの列を作成するために密なベクトルを解析する必要はありませんか? –

+0

ベクトル、(疎または密)。 –