2012-05-09 13 views
5

के साथ विषय मॉडल को कार्यान्वित करना हाल ही में, मैंने साइट से कुछ कोड संदर्भ के रूप में, पायथन पर एलडीए विषय मॉडल के लिए गिब्स नमूनाकरण लागू किया। गिब्स नमूनाकरण के प्रत्येक पुनरावृत्ति में, हम एक (वर्तमान) शब्द को हटाते हैं, एलडीए मॉडल से अनुमानित एक सशर्त सशर्त संभाव्यता वितरण के अनुसार उस शब्द के लिए एक नया विषय नमूना देते हैं, और निम्नानुसार शब्द-विषय गणना अपडेट करते हैं:पाइथन (numpy)

for m, doc in enumerate(docs): #m: doc id 
    for n, t in enumerate(doc): #n: id of word inside document, t: id of the word globally 
    # discount counts for word t with associated topic z 
    z = z_m_n[m][n] 
    n_m_z[m][z] -= 1 
    n_z_t[z, t] -= 1 
    n_z[z] -= 1 
    n_m[m] -= 1 

    # sample new topic for multinomial     
    p_z_left = (n_z_t[:, t] + beta)/(n_z + V * beta) 
    p_z_right = (n_m_z[m] + alpha)/(n_m[m] + alpha * K) 
    p_z = p_z_left * p_z_right 
    p_z /= numpy.sum(p_z) 
    new_z = numpy.random.multinomial(1, p_z).argmax() 

    # set z as the new topic and increment counts 
    z_m_n[m][n] = new_z 
    n_m_z[m][new_z] += 1 
    n_z_t[new_z, t] += 1 
    n_z[new_z] += 1 
    n_m[m] += 1 

उपर्युक्त कोड में, हम multinomial scipy फ़ंक्शन के साथ एक नया (एकल) ज़ेड नमूना देते हैं।

अब, मैं this paper के संयुक्त भाव विषय मॉडल को कार्यान्वित करना चाहता हूं। अब, मैं जरूरत मायने रखता है का ट्रैक रखने के लिए निम्नलिखित संरचनाओं की आवश्यकता होगी:

3D matrix containing # occurrences for a word for each topic, for each sentiment 
3D matrix containing # occurrences for a topic, for each sentiment, for each document 
2D matrix containing # occurrences for a topic, for each sentiment 
2D matrix containing # occurrences for a sentiment for each document 

और अब समस्या आता है: प्रत्येक शब्द एक दस्तावेज दोनों एक नया विषय है और एक भावना लेबल में देखा के लिए, इस गिब्स नमूना में अब एक सशर्त पोस्टरियर (कागज के पेज 4 समीकरण 5) से नमूना है। अब मैं पाइथन में "उन 2 मानों का नमूना कैसे लगा सकता हूं"?

अग्रिम धन्यवाद ...

उत्तर

2

इसे आजमाएं। विषयों और भावना लेबल पर एक संयुक्त वितरण से नमूना सिर्फ मतलब है कि पूरे टी एक्स एस मैट्रिक्स को 1.

docs=[[0,1],[0,0],[1,0,1]] 
D=len(docs) 
z_d_n=[[0 for _ in xrange(len(d))] for d in docs] 
l_d_n=[[0 for _ in xrange(len(d))] for d in docs] 

V=2 
T=2 
S=2 
n_m_j_k=numpy.zeros((V,T,S)) 
n_j_k_d=numpy.zeros((T,S,D)) 
n_j_k=numpy.zeros((T,S)) 
n_k_d=numpy.zeros((S,D)) 
n_d=numpy.zeros((D)) 

beta=.1 
alpha=.1 
gamma=.1 

for d, doc in enumerate(docs): #d: doc id 
    for n, m in enumerate(doc): #i: index of the word inside document, m: id of the word in the vocabulary 
     # j is the topic 
     j = z_d_n[d][n] 
     # k is the sentiment 
     k = l_d_n[d][n] 
     n_m_j_k[m][j][k] += 1 
     n_j_k_d[j][k][d] += 1 
     n_j_k[j][k] += 1 
     n_k_d[k][d] += 1 
     n_d[d] += 1 

for d, doc in enumerate(docs): #d: doc id 
    for n, m in enumerate(doc): #i: index of the word inside document, m: id of the word in the vocabulary 
     # j is the topic 
     j = z_d_n[d][n] 
     # k is the sentiment 
     k = l_d_n[d][n] 
     n_m_j_k[m][j][k] -= 1 
     n_j_k_d[j][k][d] -= 1 
     n_j_k[j][k] -= 1 
     n_k_d[k][d] -= 1 
     n_d[d] -= 1 

     # sample a new topic and sentiment label jointly 
     # T is the number of topics 
     # S is the number of sentiments 
     p_left = (n_m_j_k[m] + beta)/(n_j_k + V * beta) # T x S array 
     p_mid = (n_j_k_d[:,:,d] + alpha)/numpy.tile(n_k_d[:,d] + T * alpha, (T,1)) 
     p_right = numpy.tile(n_k_d[:,d] + gamma,(T,1))/numpy.tile(n_d[d] + S * gamma,(T,S)) 
     p = p_left * p_mid * p_right 
     p /= numpy.sum(p) 
     new_jk = numpy.random.multinomial(1, numpy.reshape(p, (T*S))).argmax() 
     j=new_jk/T 
     k=new_jk%T 

     z_d_n[d][n]=j 
     l_d_n[d][n]=k 
     n_m_j_k[m][j][k] += 1 
     n_j_k[j][k] += 1 
     n_k_d[k][d] += 1 
     n_d[d] += 1 
+0

क्या पहले 'for' पाश करता है योग करना चाहिए? ऐसा लगता है कि पहले 'के लिए' जो कुछ किया जाता है वह दूसरे पर पूर्ववत होता है। – Netzsooc