Extrait de la matrice document-sujet du modèle Lda de Pyspark

j'ai formé avec succès un modèle LDA en spark, via L'API Python:

from pyspark.mllib.clustering import LDA
model=LDA.train(corpus,k=10)

cela fonctionne tout à fait bien, mais j'ai maintenant besoin de la document - matrice des sujets pour le modèle LDA, mais pour autant que je sache tout ce que je peux obtenir est le mot-sujet, à l'aide de model.topicsMatrix().

Existe-t-il un moyen d'obtenir la matrice document-sujet à partir du modèle LDA, et si ce n'est pas le cas, Existe-t-il une méthode alternative (autre que la mise en œuvre de Lda à partir de zéro) dans Spark pour exécuter une LDA modèle qui me donnera le résultat dont j'ai besoin?

EDIT:

après avoir un peu fouillé, j'ai trouvé la documentation pour Distributedlamodel dans L'api Java, qui a un topicDistributions() je pense que c'est exactement ce dont j'ai besoin ici (mais je suis sûr à 100% si le LDAModel de Pyspark est en fait un Ldamodel distribué sous le capot...).

dans tous les cas, je suis capable d'appeler indirectement cette méthode comme ça, sans aucun échec apparent:

In [127]: model.call('topicDistributions')
Out[127]: MapPartitionsRDD[3156] at mapPartitions at PythonMLLibAPI.scala:1480

mais si je en fait, regardez les résultats, tout ce que j'obtiens c'est une chaîne me disant que le résultat est en fait un Scala tuple (je pense):

In [128]: model.call('topicDistributions').take(5)
Out[128]:
[{u'__class__': u'scala.Tuple2'},
 {u'__class__': u'scala.Tuple2'},
 {u'__class__': u'scala.Tuple2'},
 {u'__class__': u'scala.Tuple2'},
 {u'__class__': u'scala.Tuple2'}]

Peut-être que ce est généralement la bonne approche, mais est-il moyen d'obtenir les résultats réels?

14
demandé sur moustachio 2015-10-12 05:37:27

3 réponses

après des recherches approfondies, ce n'est certainement pas possible via L'api Python sur la version actuelle de Spark (1.5.1). Mais à Scala, c'est assez simple (compte tenu D'un RDD documents pour s'entraîner):

import org.apache.spark.mllib.clustering.{LDA, DistributedLDAModel}

// first generate RDD of documents...

val numTopics = 10
val lda = new LDA().setK(numTopics).setMaxIterations(10)
val ldaModel = lda.run(documents)

# then convert to distributed LDA model
val distLDAModel = ldaModel.asInstanceOf[DistributedLDAModel]

puis obtenir le document thème distributions est aussi simple que:

distLDAModel.topicDistributions
5
répondu moustachio 2015-11-02 16:13:29

ce qui suit étend la réponse ci-dessus pour PySpark et Spark 2.0.

j'espère que vous m'excuserez de poster ceci comme une réponse plutôt que comme un commentaire, mais je manque de rep en ce moment.

je suppose que vous avez un modèle Lda formé à partir d'un corpus comme ceci:

lda = LDA(k=NUM_TOPICS, optimizer="em")
ldaModel = lda.fit(corpus) # Where corpus is a dataframe with 'features'.

pour convertir un document en une distribution par sujet, nous créons une base de données de L'ID du document et un vecteur (sparse est mieux) des mots.

documents = spark.createDataFrame([
    [123myNumericId, Vectors.sparse(len(words_in_our_corpus), {index_of_word:count}],
    [2, Vectors.sparse(len(words_in_our_corpus), {index_of_word:count, another:1.0}],
], schema=["id", "features"]
transformed = ldaModel.transform(documents)
dist = transformed.take(1)
# dist[0]['topicDistribution'] is now a dense vector of our topics.
4
répondu Joseph Catrambone 2017-01-06 22:02:38

à partir de Spark 2.0 vous pouvez utiliser transform() comme méthode de pyspark.ml.clustering.DistributedLDAModel. Je viens d'essayer cela sur les 20 newsgroups ensemble de données de scikit-apprendre et il fonctionne. Voir le retour de l' vectors qui est une distribution sur des sujets pour un document.

>>> test_results = ldaModel.transform(wordVecs)
Row(filename='/home/jovyan/work/data/20news_home/20news-bydate-test/rec.autos/103343', target=7, text='I am a little confused on all of the models of the 88-89 bonnevilles.\nI have heard of the LE SE LSE SSE SSEI. Could someone tell me the\ndifferences are far as features or performance. I am also curious to\nknow what the book value is for prefereably the 89 model. And how much\nless than book value can you usually get them for. In other words how\nmuch are they in demand this time of year. I have heard that the mid-spring\nearly summer is the best time to buy.', tokens=['little', 'confused', 'models', 'bonnevilles', 'someone', 'differences', 'features', 'performance', 'curious', 'prefereably', 'usually', 'demand', 'spring', 'summer'], vectors=SparseVector(10977, {28: 1.0, 29: 1.0, 152: 1.0, 301: 1.0, 496: 1.0, 552: 1.0, 571: 1.0, 839: 1.0, 1114: 1.0, 1281: 1.0, 1288: 1.0, 1624: 1.0}), topicDistribution=DenseVector([0.0462, 0.0538, 0.045, 0.0473, 0.0545, 0.0487, 0.0529, 0.0535, 0.0467, 0.0549, 0.051, 0.0466, 0.045, 0.0487, 0.0482, 0.0509, 0.054, 0.0472, 0.0547, 0.0501]))
3
répondu Evan Zamir 2016-07-29 17:11:19