7

特定のキーワードが含まれているためにフラグが付けられた最大 30,000 の一意のドキュメントを含むデータセットがあります。データセットの主要なフィールドには、ドキュメント タイトル、ファイルサイズ、キーワード、抜粋 (キーワードあたり 50 語) があります。これらの約 30k の一意のドキュメントにはそれぞれ複数のキーワードが含まれており、各ドキュメントにはキーワードごとにデータセット内の 1 つの行があります (したがって、各ドキュメントには複数の行があります)。生データセットのキー フィールドがどのように見えるかのサンプルを次に示します。

生データの例

私の目標は、特定の出来事 (宿題について不平を言う子供など) に対してドキュメントにフラグを付けるモデルを構築することです。そのため、キーワードと抜粋フィールドをベクトル化し、それらを圧縮して、一意のドキュメントごとに 1 行にする必要があります。

私がやろうとしていることの例としてキーワードのみを使用します - Tokenizer、StopWordsRemover、および CountVectorizer を適用すると、カウント ベクトル化の結果を含むスパース マトリックスが出力されます。1 つのスパース ベクトルは次のようになります: sparseVector(158, {7: 1.0, 65: 1.0, 78: 2.0, 110: 1.0, 155: 3.0})

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

  1. 疎なベクトルを密なベクトルに変換し、docID でグループ化し、各列を合計します (1 列 = 1 トークン)。
  2. スパース ベクトル全体を直接合計する (docID によるグループ化)

私が言いたいことを理解してもらうために、下の画像の左側にあるのは、CountVectorizer の出力の目的の密なベクトル表現であり、左側にあるのは、必要な最終的なデータセットです。

CountVectorizer の出力と目的のデータセット

4

1 に答える 1

2

私は試してみます:

>>> 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"])
于 2016-10-27T16:54:35.347 に答える