Как передать SparseVectors в `mllib` в pyspark - PullRequest
0 голосов
/ 18 мая 2018

Я использую pyspark 1.6.3 через Zeppelin с python 3.5.

Я пытаюсь реализовать скрытое распределение Дирихле с использованием функций pyspark CountVectorizer и LDA.Во-первых, проблема: вот код, который я использую.Пусть df будет искровым фреймом данных с токенизированным текстом в столбце 'tokenized'

vectors = 'vectors'
cv = CountVectorizer(inputCol = 'tokenized', outputCol = vectors)
model = cv.fit(df)
df = model.transform(df)

corpus = df.select(vectors).rdd.zipWithIndex().map(lambda x: [x[1], x[0]]).cache()
ldaModel = LDA.train(corpus, k=25)

Этот код более или менее взят из pyspark api docs .При вызове LDA я получаю следующую ошибку:

net.razorvine.pickle.PickleException: expected zero arguments for construction of ClassDict (for pyspark.sql.types._create_row)

internet говорит мне, что это связано с несовпадением типов.

Итак, давайте рассмотрим типы для LDA и из CountVectorizer.Из документов Dark вот еще один пример разреженного вектора, входящего в LDA:

>>> from pyspark.mllib.linalg import Vectors, SparseVector
>>> data = [
...     [1, Vectors.dense([0.0, 1.0])],
...     [2, SparseVector(2, {0: 1.0})],
... ]
>>> rdd =  sc.parallelize(data)
>>> model = LDA.train(rdd, k=2, seed=1)

Я реализую это сам, и вот как выглядит rdd:

>> testrdd.take(2)

[[1, DenseVector([0.0, 1.0])], [2, SparseVector(2, {0: 1.0})]]

С другой стороны, если я иду к своему исходному коду и смотрю на corpus rdd с выводом CountVectorizer, я вижу (отредактировано для удаления посторонних битов):

>> corpus.take(3)

[[0, Row(vectors=SparseVector(130593, {0: 30.0, 1: 13.0, ...
 [1, Row(vectors=SparseVector(130593, {0: 52.0, 1: 44.0, ...
 [2, Row(vectors=SparseVector(130593, {0: 14.0, 1: 6.0, ...
]

Таким образом, пример, который я использовал (из документов!), Не создает кортеж (index, SparseVector), но a (index, Row (SparseVector)) ... ... или что-то еще?

Вопросы:

  • Является ли оболочка Row вокруг SparseVector причиной этой ошибки?
  • Если это так, как мне избавиться от объекта Row?Row является свойством df, но я использовал df.rdd для преобразования в rdd;что еще мне нужно сделать?

1 Ответ

0 голосов
/ 18 мая 2018

Это может быть проблема.Просто извлеките vectors из объекта Row.

corpus = df.select(vectors).rdd.zipWithIndex().map(lambda x: [x[1], x[0]['vectors']]).cache()
...