Я провел серию экспериментов по моделированию тем в Spark, варьируя количество тем. Итак, учитывая RDD docsWithFeatures
, я делаю что-то вроде этого:
for (n_topics <- Range(65,301,5) ){
val s = n_topics.toString
val lda = new LDA().setK(n_topics).setMaxIterations(20) // .setAlpha(), .setBeta()
val ldaModel = lda.run(docsWithFeatures)
// now do some eval, save results to file, etc...
Это отлично работает, но я также хочу сравнить результаты, если сначала нормализую свои данные с помощью TF-IDF. Теперь, насколько мне известно, LDA строго ожидает формат набора слов, в котором частоты терминов являются целыми значениями. Но в принципе (и я видел множество примеров этого) математика работает нормально, если мы сначала преобразуем частоты целочисленных членов в значения TF-IDF с плавающей запятой. Мой подход к этому на данный момент следующий (опять же, учитывая мой docsWithFeatures
rdd):
val index_reset = docsWithFeatures.map(_._2).cache()
val idf = new IDF().fit(index_reset)
val tfidf = idf.transform(index_reset).zipWithIndex.map(x => (x._2,x._1))
Затем я могу запустить тот же код, что и в первом блоке, заменив tfidf
на docsWithFeatures
. Это работает без каких-либо сбоев, но мой главный вопрос здесь заключается в том, можно ли это делать. То есть я хочу убедиться, что Spark не делает ничего странного под капотом, например, преобразует значения с плавающей запятой, поступающие из TFIDF, в целые числа или что-то в этом роде.
EMLDAOptimizer
. Вы можете обнаружить, что темы, которые вы получаете от использованияOnlineLDAOptimizer
, выглядят более разумно. См. этот документ: papers.nips.cc/paper/3854- переосмысление-lda-почему-прежние-важности . - person Jason Lenderman   schedule 15.12.2015