2016-09-02 2 views
0

So erhalten Sie ein vocabArray aus einem LDA-Modell (org.apache.spark.ml.clustering.LDA). Ich bekomme gerade vocabSize, die Anzahl der gescannten Wörter zurückgibt.So konvertieren Sie den Themenindex zu Themenwörtern in LDA

Idealerweise brauche ich das Array der tatsächlichen Wörter aus dem Modell und dann basierend auf terminindices Ich möchte die Wörter in einem Eimer sehen.

Ich muss dies in Scala tun. Jeder Vorschlag wird hilfreich sein.

Dinge, die ich versucht habe bis jetzt, meine topicIndices ist ein Datenrahmen

topicIndices: org.apache.spark.sql.DataFrame = [topic: int, termIndices: array<int>, termWeights: array<double>] 

Ich versuche, die Themen wie diese

val topics = topicIndices.map { case (terms, termWeights) => 
     terms.zip(termWeights).map { case (term, weight) => (vocabArray(term.toInt), weight) } 
    } 

Aber es führt den folgenden Fehler

> 

val topics = topicIndices.map { case (terms, termWeights) => 
     terms.zip(termWeights).map { case (term, weight) => (vocabArray(term.toInt), weight) } 
    } <console>:96: error: constructor cannot be instantiated to expected type; found : (T1, T2) required: org.apache.spark.sql.Row 
     val topics = topicIndices.map { case (terms, termWeights) => 
              ^<console>:97: error: not found: value terms 
      terms.zip(termWeights).map { case (term, weight) => (vocabArray(term.toInt), weight) } 
      ^
zu holen
+0

Sie verwenden die Funken Schale? – eliasah

+0

Ich benutze Databricks Notebook für dieses Experiment. – Nabs

+0

Das Problem ist in alten mllib LDA-Beschreibungsopics verwenden, um Array über Themen zurückzugeben. Jedes Thema war (Begriffsindizes, Begriffsgewichte im Thema). In ml wird LDA-Beschreibungoptiken zurückgegeben [topic: int, termIndices: array , termWeights: array ]. Früher war es einfach, das Schlüsselwertpaar zu kartieren, irgendwelche Ideen, wie wir in diesem neueren Modell abbilden sollten. – Nabs

Antwort

2

Das Problem wurde gelöst. Hier ist das fehlende Stück. Sobald Sie das df von den Beschreibungsoptiken erhalten, ist hier der Code, der helfen kann, die entsprechenden Wörter zu erhalten. (Hinweis: Dieser Code funktioniert für ml-Bibliothek für LDA)

val topicDF = model.describeTopics(maxTermsPerTopic = 10) 
for ((row) <- topicDF) { 
     val topicNumber = row.get(0) 
     val topicTerms = row.get(1) 
     println ("Topic: "+ topicNumber) 
} 

import scala.collection.mutable.WrappedArray 

val vocab = vectorizer.vocabulary 

for ((row) <- topicDF) { 
    val topicNumber = row.get(0) 
    //val terms = row.get(1) 
    val terms:WrappedArray[Int] = row.get(1).asInstanceOf[WrappedArray[Int]] 
    for ((termIdx) <- 0 until 4) { 
     println("Topic:" + topicNumber + " Word:" + vocab(termIdx)) 
    } 
} 

topicDF.printSchema 
import org.apache.spark.sql.Row 

topicDF.collect().foreach { r => 
       r match { 
         case _: Row => ("Topic:" + r) 
         case unknow => println("Something Else") 
     } 
} 

topicDF.collect().foreach { r => { 
         println("Topic:" + r(0)) 
         val terms:WrappedArray[Int] = r(1).asInstanceOf[WrappedArray[Int]] 
         terms.foreach { 
           t => { 
             println("Term:" + vocab(t)) 
           } 
         } 
       } 
     } 
Verwandte Themen