2017-02-05 20 views
4

Я пытаюсь написать прогрму в Spark для выполнения выделения скрытого распределения Дирихле (LDA). Эта документация Spark page представляет собой хороший пример для создания LDA на образцах данных. Ниже программаСкрытое распределение Дирихле (LDA) в Spark

from pyspark.mllib.clustering import LDA, LDAModel 
from pyspark.mllib.linalg import Vectors 

# Load and parse the data 
data = sc.textFile("data/mllib/sample_lda_data.txt") 
parsedData = data.map(lambda line: Vectors.dense([float(x) for x in line.strip().split(' ')])) 
# Index documents with unique IDs 
corpus = parsedData.zipWithIndex().map(lambda x: [x[1], x[0]]).cache() 

# Cluster the documents into three topics using LDA 
ldaModel = LDA.train(corpus, k=3) 

# Output topics. Each is a distribution over words (matching word count vectors) 
print("Learned topics (as distributions over vocab of " + str(ldaModel.vocabSize()) 
     + " words):") 
topics = ldaModel.topicsMatrix() 
for topic in range(3): 
    print("Topic " + str(topic) + ":") 
    for word in range(0, ldaModel.vocabSize()): 
     print(" " + str(topics[word][topic])) 

# Save and load model 
ldaModel.save(sc, "target/org/apache/spark/PythonLatentDirichletAllocationExample/LDAModel") 
sameModel = LDAModel\ 
    .load(sc, "target/org/apache/spark/PythonLatentDirichletAllocationExample/LDAModel") 

Входной образец (sample_lda_data.txt) используется как ниже

1 2 6 0 2 3 1 1 0 0 3 
1 3 0 1 3 0 0 2 0 0 1 
1 4 1 0 0 4 9 0 1 2 0 
2 1 0 3 0 0 5 0 2 3 9 
3 1 1 9 3 0 2 0 0 1 3 
4 2 0 3 4 5 1 1 1 4 0 
2 1 0 3 0 0 5 0 2 2 9 
1 1 1 9 2 1 2 0 0 1 3 
4 4 0 3 4 2 1 3 0 0 0 
2 8 2 0 3 0 2 0 2 7 2 
1 1 1 9 0 2 2 0 0 3 3 
4 1 0 0 4 5 1 3 0 1 0 

Как изменить программу для запуска в файле на текстовых данных, содержащих текстовые данные вместо цифр ? Пусть образец файла содержит следующий текст.

Скрытое распределение Дирихле (LDA) - это тема, которая представляет тем из коллекции текстовых документов. LDA можно рассматривать как алгоритм кластеризации следующим образом:

Темы соответствуют центрам кластеров, а документы соответствуют примерам (строкам) в наборе данных. Темы и документы существуют в пространстве объектов , где векторы объектов являются векторами подсчета слов (сумка слов). Вместо того, чтобы оценивать кластеризацию с использованием традиционного расстояния , LDA использует функцию, основанную на статистической модели формирования документов .

ответ

4

После выполнения некоторых исследований я пытаюсь ответить на этот вопрос. Ниже приведен пример кода для выполнения LDA в текстовом документе с реальными текстовыми данными с использованием Spark.

from pyspark.sql import SQLContext, Row 
from pyspark.ml.feature import CountVectorizer 
from pyspark.mllib.clustering import LDA, LDAModel 
from pyspark.mllib.linalg import Vector, Vectors 

path = "sample_text_LDA.txt" 

data = sc.textFile(path).zipWithIndex().map(lambda (words,idd): Row(idd= idd, words = words.split(" "))) 
docDF = spark.createDataFrame(data) 
Vector = CountVectorizer(inputCol="words", outputCol="vectors") 
model = Vector.fit(docDF) 
result = model.transform(docDF) 

corpus = result.select("idd", "vectors").rdd.map(lambda (x,y): [x,Vectors.fromML(y)]).cache() 

# Cluster the documents into three topics using LDA 
ldaModel = LDA.train(corpus, k=3,maxIterations=100,optimizer='online') 
topics = ldaModel.topicsMatrix() 
vocabArray = model.vocabulary 

wordNumbers = 10 # number of words per topic 
topicIndices = sc.parallelize(ldaModel.describeTopics(maxTermsPerTopic = wordNumbers)) 

def topic_render(topic): # specify vector id of words to actual words 
    terms = topic[0] 
    result = [] 
    for i in range(wordNumbers): 
     term = vocabArray[terms[i]] 
     result.append(term) 
    return result 

topics_final = topicIndices.map(lambda topic: topic_render(topic)).collect() 

for topic in range(len(topics_final)): 
    print ("Topic" + str(topic) + ":") 
    for term in topics_final[topic]: 
     print (term) 
    print ('\n') 

Темы, извлеченная на текстовых данных, как указано в вопросе, как показано ниже:

enter image description here

+0

Как я могу напечатать значение вероятности для каждого члена? – CodeIK

+0

Это поможет, если вы суммируете изменения, внесенные вами из исходного кода LDA из искровых документов. – javadba