2014-10-14 3 views
1

Скрытое расположение дирихле (LDA) - это генеративная модель, которая создает список тем. Каждая тема представлена ​​распределением по словам. Предположим, что каждая тема представлена ​​ее верхними 40 словами.Темы и скрытое распределение Дирихле

Учитывая новый документ, как определить, какие темы составили этот новый документ, из-за необходимости повторно запускать lda. Другими словами, как я могу использовать оценочные темы для вывода темы нового невидимого документа.

Update:

для оценки мы следующее (я игнорировала гиперпараметры для простоты)

for(int iter=0;iter<1000;iter++){ 
    for(int token=0;token<numTokens;token++){ 
    double[] values=new double[numTopics]; 
    double pz=0.0d; 
    for(int topic=0;topic<numTopics;topic++){ 
     probabilityOfWordGivenTopic= topicCount[topic][word[token]]/numTokenInTopic[topic]; 
     probabilityOfTopicGivenDocument= docCount[doc[token]][topic]/docLength[doc[token]]; 
     pz= probabilityOfWordGivenTopic * probabilityOfTopicGivenDocument; 
     values[topic]=pz; 
     total+=pz; 
    } 
} 
} 

Спасибо.

ответ

2

На этапе вывода вам в основном нужно назначить темы словам новых документов.

Для замеченных слов используйте оценочную модель для определения вероятностей. Взяв ваш пример, поскольку у вас есть 40 тем, вы уже изучили распределение слов-слов (phi-матрица) во время оценки LDA. Теперь, для слова, увиденного во время обучения, скажем w, возьмите вектор w-й колонки этой матрицы, размер которой равен 40. Этот вектор дает вам вероятности членства класса w в каждой теме. Скажем, например, этот вектор равен (.02, .01, .... .004), что означает, что P (w | t_1) =. 02 и т. Д.

В новом документе, где вы видите это слово w, нарисуйте образец из этого дистрибутива и назначьте ему тему. Ясно, что для этого слова w более вероятно, что он будет привязан к его истинному (технически говорящему, оцениваемому) классу тем, изученному в процессе оценки.

Для слов OOV (т. Е. Слов, которые вы не видели во время обучения), одна из распространенных практик - использовать равномерное распределение, то есть в вашем примере использовать вероятность 1/40 для назначения тем для него.

Редактировать

Фрагмент кода извлекается из JGibbsLDA следующим образом:

 for (int m = 0; m < newModel.M; ++m){ 
      for (int n = 0; n < newModel.data.docs[m].length; n++){ 
       // (newz_i = newz[m][n] 
       // sample from p(z_i|z_-1,w) 
       int topic = infSampling(m, n); 
       newModel.z[m].set(n, topic); 
      } 
     }//end foreach new doc 

Основной шаг в выборке логического вывода состоит в назначении вероятностей для слова ш. Обратите внимание, что эта вероятность частично зависит от оценочной вероятностной вероятности (trnModel.nw [w] [k] кода) и отчасти от новых вероятностей присваивания (newModel.nw [_w] [k]). Для слов OOV, trnModel.nw [w] [k] установлено в 1/K. Эта вероятность не зависит от P (w | d). Вместо этого P (w | d) представляет собой только заднюю вероятность, вычисленную после назначения заданий через выборку Gibbs.

// do multinomial sampling via cummulative method 
    for (int k = 0; k < newModel.K; k++){ 
     newModel.p[k] = (trnModel.nw[w][k] + newModel.nw[_w][k] + newModel.beta)/(trnModel.nwsum[k] + newModel.nwsum[k] + Vbeta) * 
       (newModel.nd[m][k] + newModel.alpha)/(newModel.ndsum[m] + Kalpha); 
    } 
+0

но назначить слово к теме вы все еще должны знать, насколько вероятно, эта тема в новом документе, т.е. р (г | г) – DotNet

+0

после назначения вероятностей так, как я уже сказал, что вам нужно recompute theta и phi ... – Debasis

+0

есть публикация, которая обсуждает это более подробно. Спасибо – DotNet

Смежные вопросы