Удалить наименее используемое слово из документа в Spark - PullRequest
0 голосов
/ 30 мая 2018

У меня есть датафрейм, как показано ниже

  private val sample = Seq(
    (1, "A B C D E"),
    (1, "B C D"),
    (1, "B C D E"),
    (1, "B C D F"),
    (1, "A B C"),
    (1, "B C E F G")
  )

Я хочу удалить наименее используемые слова из фрейма данных.Для этого я использовал tf-idf для вычисления наименее используемого слова.

// Create the Tokenizer step
val tokenizer = new Tokenizer()
  .setInputCol("regexTransformedColumn")
  .setOutputCol("words")

// Create TF
val hashingTF = new HashingTF()
  .setInputCol(tokenizer.getOutputCol)
  .setOutputCol("rawFeatures")

// Create TF IDF
val idf = new IDF().setInputCol("rawFeatures").setOutputCol("features")

// Create the pipeline
val pipeline = new Pipeline()
  .setStages(Array(tokenizer, hashingTF, idf))

val lrModel = pipeline.fit(regexTransformedLabel)

val lrOutput = lrModel.transform(regexTransformedLabel)

Я получаю вывод, как показано ниже

+---------+---------------+---------------------------------------------------------------+------------------------------------------------------------------------------------------------------------+
|clusterId|words          |rawFeatures                                                    |features                                                                                                    |
+---------+---------------+---------------------------------------------------------------+------------------------------------------------------------------------------------------------------------+
|1        |[a, b, c, d, e]|(262144,[17222,27526,28698,30913,227410],[1.0,1.0,1.0,1.0,1.0])|(262144,[17222,27526,28698,30913,227410],[0.5596157879354227,0.3364722366212129,0.0,0.0,0.8472978603872037])|
|1        |[b, c, d]      |(262144,[27526,28698,30913],[1.0,1.0,1.0])                     |(262144,[27526,28698,30913],[0.3364722366212129,0.0,0.0])                                                   |
|1        |[b, c, d, e]   |(262144,[17222,27526,28698,30913],[1.0,1.0,1.0,1.0])           |(262144,[17222,27526,28698,30913],[0.5596157879354227,0.3364722366212129,0.0,0.0])                          |
|1        |[b, c, d, f]   |(262144,[24152,27526,28698,30913],[1.0,1.0,1.0,1.0])           |(262144,[24152,27526,28698,30913],[0.8472978603872037,0.3364722366212129,0.0,0.0])                          |
|1        |[a, b, c]      |(262144,[28698,30913,227410],[1.0,1.0,1.0])                    |(262144,[28698,30913,227410],[0.0,0.0,0.8472978603872037])                                                  |
|1        |[b, c, e, f, g]|(262144,[17222,24152,28698,30913,51505],[1.0,1.0,1.0,1.0,1.0]) |(262144,[17222,24152,28698,30913,51505],[0.5596157879354227,0.8472978603872037,0.0,0.0,1.252762968495368])  |
+---------+---------------+---------------------------------------------------------------+------------------------------------------------------------------------------------------------------------+

Но как я могу получить слова из преобразованных функций, чтобы я мог удалить наименее используемые слова.

Я передам максимальное количество функций, чтобы удалить слова с функцией tf-idf больше, чем максимальное количество функций.Если я даю максимальные характеристики как 0,6, A (0,8) и G (1,2) должны быть удалены из фрейма данных.Но я не мог преобразовать функции в слова, чтобы я мог удалить наименее используемые слова.

1 Ответ

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

Используя ваш пример, я бы использовал CountVectorizer & CountVecorizerModel.* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *} * * * * * * * * '* ”] * * *1004* *

В этом примере vocabulary является локальным, поэтому, если вы хотите запустить его в кластере, возможно, лучше сделать его широковещательной переменной.

// Create the Tokenizer step
val tokenizer = new Tokenizer()
  .setInputCol("regexTransformedColumn")
  .setOutputCol("words")

// Create CountVecoritzer for label vocab
val countVectorizer = new CountVectorizer()
  .setInputCol(tokenizer.getOutputCol)
  .setOutputCol("rawFeatures")
  .setMinDF(1)

// Combine into count vectorizer pipeline
val cvPipeline = new Pipeline()
  .setStages(Array(tokenizer, countVectorizer))

// Create pipeline for token & count vectorizer (TF)
val pipelineModel = cvPipeline.fit(regexTransformedLabel)

// Extract vocabulary
val vocabulary = pipelineModel.stages.last.asInstanceOf[CountVectorizerModel].vocabulary

// Transform the dataset to TF dataset
val termFrequencyData = pipelineModel.transform(regexTransformedLabel)

// Create IDF
val idf = new IDF().setInputCol(countVectorizer.getOutputCol).setOutputCol("features")

// Fit the IDF on the TF data
val lrModel = idf.fit(termFrequencyData)

// Tranform the TF Data into TF/IDF data
val lrOutput = lrModel.transform(termFrequencyData)


def removeLeastUsed(treshold: Double) = udf((features: SparseVector) => {
  (features.indices zip features.values) filter(_._2 < treshold) map {
    case (index, _) => vocabulary(index)
  }
})


lrOutput
 .select(
    'regexTransformedColumn, 
    'features,
    removeLeastUsed(0.6)('features).as("mostUsedWords")
  )  
  .show(false)

Вывод:

+----------------------+----------------------------------------------------------------------------------+-------------+
|regexTransformedColumn|features                                                                          |mostUsedWords|
+----------------------+----------------------------------------------------------------------------------+-------------+
|A B C D E             |(7,[0,1,2,3,4],[0.0,0.0,0.3364722366212129,0.5596157879354227,0.8472978603872037])|[c, b, d, e] |
|B C D                 |(7,[0,1,2],[0.0,0.0,0.3364722366212129])                                          |[c, b, d]    |
|B C D E               |(7,[0,1,2,3],[0.0,0.0,0.3364722366212129,0.5596157879354227])                     |[c, b, d, e] |
|B C D F               |(7,[0,1,2,5],[0.0,0.0,0.3364722366212129,0.8472978603872037])                     |[c, b, d]    |
|A B C                 |(7,[0,1,4],[0.0,0.0,0.8472978603872037])                                          |[c, b]       |
|B C E F G             |(7,[0,1,3,5,6],[0.0,0.0,0.5596157879354227,0.8472978603872037,1.252762968495368]) |[c, b, e]    |
+----------------------+----------------------------------------------------------------------------------+-------------+
...