как сохранить ключ или индекс ввода в функцию Spark HashingTF()?

На основе документации Spark для версии 1.4 (https://spark.apache.org/docs/1.4.0/mllib-feature-extraction.html) Я пишу пример TF-IDF для преобразования текстовых документов в векторы значений. В приведенном примере показано, как это можно сделать, но входными данными являются RDD токенов без ключей. Это означает, что мой выходной RDD больше не содержит индекса или ключа для ссылки на исходный документ. Пример такой:

documents = sc.textFile("...").map(lambda line: line.split(" "))

hashingTF = HashingTF()
tf = hashingTF.transform(documents)

Я хотел бы сделать что-то вроде этого:

documents = sc.textFile("...").map(lambda line: (UNIQUE_LINE_KEY, line.split(" ")))

hashingTF = HashingTF()
tf = hashingTF.transform(documents)

и пусть результирующая переменная tf содержит где-то значение UNIQUE_LINE_KEY. Я просто пропустил что-то очевидное? Из примеров видно, что нет хорошего способа связать document RDD с tf RDD.


person gallamine    schedule 01.07.2015    source источник


Ответы (2)


Если вы используете версию Spark после фиксации 85b96372cf0fd055f89fc639f45c1f2cb02a378f (включая 1.4) и используете API HashingTF мл (требуется ввод DataFrame вместо простых RDD), исходные столбцы в его выходных данных. Надеюсь, это поможет!

person Holden    schedule 02.07.2015
comment
Я не уверен, что вы подразумеваете под исходными столбцами в его выводе. - person gallamine; 03.07.2015
comment
Я имею в виду, что выходной кадр данных включает ваш исходный ввод. - person Holden; 03.07.2015
comment
К сожалению, кажется, что IDF() не поддерживает ввод данных :( - person gallamine; 03.07.2015
comment
Есть преобразования из DataFrames в помеченные точки и т. Д., Если это поможет. - person Holden; 03.07.2015

Я также столкнулся с той же проблемой. В примере из документов они рекомендуют вам применять преобразования непосредственно к RDD.

Однако вы можете применять преобразования к самим векторам, и таким образом вы можете сохранить ключи любым способом, который вы выберете.

val input = sc.textFile("...")
val documents = input.map(doc => doc -> doc.split(" ").toSeq)

val hashingTF = new HashingTF()
val tf = documents.mapValues(hashingTF.transform(_))
tf.cache()
val idf = new IDF().fit(tf.values)
val tfidf = tf.mapValues(idf.transform(_))

Обратите внимание, что этот код даст RDD[(String, Vector)] вместо RDD[Vector]

person Avision    schedule 13.06.2016