Как правильно объединить числовые функции с текстом (сумкой слов) в Spark?

Мой вопрос похож на этот, но для Spark, и оригинальный вопрос не имеет удовлетворительного ответа.

Я использую модель Spark 2.2 LinearSVC с данными твита в качестве входных данных: текст твита (который был предварительно обработан) как hash-tfidf, а также его месяц следующим образом:

val hashingTF = new HashingTF().setInputCol("text").setOutputCol("hash-tf")
  .setNumFeatures(30000) 
val idf = new IDF().setInputCol("hash-tf").setOutputCol("hash-tfidf")
  .setMinDocFreq(10)
val monthIndexer = new StringIndexer().setInputCol("month")
  .setOutputCol("month-idx")
val va = new VectorAssembler().setInputCols(Array("month-idx",  "hash-tfidf"))
  .setOutputCol("features")

Если есть 30000 слов, не будут ли они забивать месяц? Или VectorAssembler достаточно умен, чтобы справиться с этим. (И если возможно, как я могу получить лучшие функции этой модели?)

1 ответ

Решение

VectorAssembler просто объединит все данные в один вектор, он ничего не делает с весами или чем-то еще.

Поскольку вектор из 30000 слов очень редок, весьма вероятно, что более плотные объекты (месяцы) будут оказывать большее влияние на результат, поэтому эти объекты, скорее всего, не будут "заболочены", как вы выразились. Вы можете обучить модель и проверить вес функций, чтобы подтвердить это. Просто используйте предоставленный coefficients метод LinearSVCModel чтобы увидеть, насколько особенности влияют на итоговую сумму:

val model = new LinearSVC().fit(trainingData)
val coeffs = model.coefficients

Особенности с более высокими коэффициентами будут иметь большее влияние на конечный результат.

Если веса, приведенные к месяцам, слишком малы / высоки, их можно установить с помощью setWeightCol() метод.

Другие вопросы по тегам