Провеждах серия от експерименти за моделиране на теми в 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- rethinking-lda-why-priors-matter . - person Jason Lenderman   schedule 15.12.2015