Воспроизводимая модель LDA в Scikit-Learn - PullRequest
0 голосов
/ 21 мая 2018

Я использую LDA для моделирования тем.

из sklearn.decomposition import LatentDirichletAllocation

Используя набор из 10 файлов, я сделал модель.Теперь я пытаюсь сгруппировать его в 3.

Аналогично приведенному ниже:

'' '

import numpy as np  
data = []
a1 = " a word in groupa doca"
a2 = " a word in groupa docb"
a3 = "a word in groupb docc"
a4 = "a word in groupc docd"
a5 ="a word in groupc doce"
data = [a1,a2,a3,a4,a5]
del a1,a2,a3,a4,a5

NO_DOCUMENTS = len(data)
print(NO_DOCUMENTS)


from sklearn.decomposition import LatentDirichletAllocation
from sklearn.feature_extraction.text import CountVectorizer

NUM_TOPICS = 2

vectorizer = CountVectorizer(min_df=0.001, max_df=0.99998, 
                         stop_words='english', lowercase=True, 
                         token_pattern='[a-zA-Z\-][a-zA-Z\-]{2,}')
data_vectorized = vectorizer.fit_transform(data)

# Build a Latent Dirichlet Allocation Model
lda_model = LatentDirichletAllocation(n_topics=NUM_TOPICS, 
   max_iter=10, learning_method='online')
lda_Z = lda_model.fit_transform(data_vectorized)

vocab = vectorizer.get_feature_names()  
text = "The economy is working better than ever"
x = lda_model.transform(vectorizer.transform([text]))[0]
print(x, x.sum())

for iDocIndex,text in enumerate(data):            
    x = list(lda_model.transform(vectorizer.transform([text]))[0])
    maxIndex = x.index(max(x))            
    if TOPICWISEDOCUMENTS[maxIndex]:
        TOPICWISEDOCUMENTS[maxIndex].append(iDocIndex) 
    else:
        TOPICWISEDOCUMENTS[maxIndex] = [iDocIndex]    



 print(TOPICWISEDOCUMENTS)

' ''


Всякий раз, когда я запускаю систему, я получаю другой кластер даже для одного и того же набора входных данных.

В качестве альтернативы, LDA не воспроизводится.

Как сделать его воспроизводимым ..?

Ответы [ 2 ]

0 голосов
/ 24 мая 2018
lda_model = LatentDirichletAllocation(n_topics=NUM_TOPICS, 
                                      max_iter=10,  
                                      learning_method='online'
                                      random_state = 42) 

Работал ... !!!

Большое спасибо

Кроме того, я пытался это сделать

import numpy as np
np.random.seed(42)

Но это не эффективно.

Спасибо за разрешение

0 голосов
/ 21 мая 2018

Для воспроизводимости в scikit, установите random_state параметр в любом месте, которое вы видите в вашем коде.

В вашем случае его LatentDirichletAllocation(...)

Используйте это:

lda_model = LatentDirichletAllocation(n_topics=NUM_TOPICS, 
                                      max_iter=10,  
                                      learning_method='online'
                                      random_state = 42)

Проверьте эту ссылку:

Если вы хотите сделать весь сценарий воспроизводимым и не хотите искать, куда поместить random_state, вы можете установить глобальное случайное начальное число.

import numpy as np
np.random.seed(42)

Смотрите это: http://scikit -learn.org / стабильный / faq.html # как-делать-я-множество-а-случайное состояние-в-в-всего-исполнение

...