2012-05-09 30 views
5

Gần đây, tôi đã thực hiện lấy mẫu Gibbs cho mô hình chủ đề LDA trên Python bằng cách sử dụng gọn gàng, tham chiếu một số mã từ một trang web. Trong mỗi lần lặp của mẫu Gibbs, chúng tôi loại bỏ một (hiện hành) văn bản, lấy mẫu một chủ đề mới cho từ đó theo một phân phối xác suất hậu nghiệm có điều kiện suy ra từ mô hình LDA, và số lượng bản cập nhật word-đề, như sau:Thực hiện mô hình chủ đề bằng Python (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 

Trong đoạn mã trên, chúng ta lấy mẫu mới (đơn) z với hàm scipy đa thức.

Bây giờ, tôi muốn triển khai mô hình Chủ đề chung về tình cảm của this paper. Bây giờ, tôi sẽ cần các cấu trúc sau đây để theo dõi các tính cần thiết:

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 

Và bây giờ đến vấn đề: trong sampler Gibbs này, đối với mỗi từ nhìn thấy trong một tài liệu cả một chủ đề mới và một nhãn tình cảm là bây giờ lấy mẫu từ một hậu nghiệm có điều kiện (trang 4 phương trình 5 của bài báo). Làm thế nào tôi có thể "lấy mẫu 2 giá trị đó" trong Python bây giờ?

Cảm ơn trước ...

Trả lời

2

Hãy thử điều này. Lấy mẫu từ phân phối chung về các chủ đề và nhãn tình cảm chỉ có nghĩa là toàn bộ ma trận T x S sẽ tổng hợp thành 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

Vòng lặp 'for' đầu tiên là gì? có vẻ như tất cả những gì được thực hiện trong 'for' đầu tiên được hoàn tác vào thứ hai. – Netzsooc

Các vấn đề liên quan