Trả lời

10

Đối với những gì nó có giá trị, Inc là một bộ phân loại sẽ là khá yếu vì đó là một mô hình sinh sản, và phân loại là một vấn đề phân biệt đối xử. Có một biến thể của LDA được gọi là supervised LDA sử dụng tiêu chí phân biệt đối xử hơn để tạo thành chủ đề (bạn có thể lấy nguồn cho điều này ở nhiều nơi) và cũng có một bài báo với công thức max margin mà tôi không biết trạng thái của nguồn- mã khôn ngoan. Tôi sẽ tránh việc xây dựng LDA được dán nhãn trừ khi bạn chắc chắn đó là những gì bạn muốn, bởi vì nó làm cho một giả định mạnh mẽ về sự tương ứng giữa các chủ đề và các loại trong vấn đề phân loại.

Tuy nhiên, điều đáng nói là không có phương pháp nào trong số này sử dụng mô hình chủ đề trực tiếp để thực hiện phân loại. Thay vào đó, họ lấy tài liệu và thay vì sử dụng các tính năng dựa trên từ, hãy sử dụng hậu tố trên các chủ đề (vectơ do kết quả suy luận cho tài liệu) làm biểu diễn tính năng trước khi đưa nó vào trình phân loại, thường là SVM tuyến tính. Điều này giúp bạn giảm kích thước dựa trên mô hình chủ đề, tiếp theo là một trình phân loại phân biệt đối xử mạnh mẽ, đó có thể là những gì bạn đang theo dõi. Đường ống này có sẵn ở hầu hết các ngôn ngữ sử dụng bộ công cụ phổ biến.

+0

Cách tiếp cận khác và mới hơn có thể đáng xem xét là LDA được gắn nhãn một phần. [link] (http://research.microsoft.com/en-us/um/people/sdumais/kdd2011-pldp-final.pdf) Nó thư giãn yêu cầu rằng mọi tài liệu trong tập huấn luyện phải có nhãn. – metaforge

3

Có bạn có thể thử LDA đã được gán nhãn trong phân tích cú pháp stanford tại http://nlp.stanford.edu/software/tmt/tmt-0.4/

+1

Cảm ơn, tôi sẽ xem xét điều đó! Bạn có biết nếu có một triển khai C/C++/Python của l-LDA không? –

+0

Rất tiếc, tôi không thấy thông báo của bạn lúc đầu. Tôi không nhận thức được một c/python thực hiện nhưng tôi đã không nhìn trước. Tôi biết Biel (tác giả LDA) thường xuất bản mã của anh ấy (C/C++) trên trang web cá nhân của anh ấy vì vậy tôi sẽ kiểm tra điều đó. – Steve

+0

Vấn đề với cách tiếp cận này là nó đòi hỏi một nhãn để phù hợp 1-to-1 với một chủ đề, do đó, nó là rất hạn chế. – metaforge

3

Bạn có thể thực hiện giám sát LDA với PyMC sử dụng sampler Metropolis để tìm hiểu sự biến tiềm ẩn trong mô hình đồ họa sau: sLDA graphical model

Các corpus đào tạo gồm 10 đánh giá phim (5 tích cực và 5 âm) cùng với xếp hạng sao được liên kết cho mỗi tài liệu. Xếp hạng sao được gọi là biến trả lời là số lượng sở thích được liên kết với từng tài liệu. Các tài liệu và các biến đáp ứng được mô hình cùng nhau để tìm các chủ đề tiềm ẩn sẽ dự đoán tốt nhất các biến trả lời cho các tài liệu không dán nhãn trong tương lai. Để biết thêm thông tin, hãy xem original paper. Xét đoạn mã sau:

import pymc as pm 
import numpy as np 
from sklearn.feature_extraction.text import TfidfVectorizer 

train_corpus = ["exploitative and largely devoid of the depth or sophistication ", 
       "simplistic silly and tedious", 
       "it's so laddish and juvenile only teenage boys could possibly find it funny", 
       "it shows that some studios firmly believe that people have lost the ability to think", 
       "our culture is headed down the toilet with the ferocity of a frozen burrito", 
       "offers that rare combination of entertainment and education", 
       "the film provides some great insight", 
       "this is a film well worth seeing", 
       "a masterpiece four years in the making", 
       "offers a breath of the fresh air of true sophistication"] 
test_corpus = ["this is a really positive review, great film"] 
train_response = np.array([3, 1, 3, 2, 1, 5, 4, 4, 5, 5]) - 3 

#LDA parameters 
num_features = 1000 #vocabulary size 
num_topics = 4  #fixed for LDA 

tfidf = TfidfVectorizer(max_features = num_features, max_df=0.95, min_df=0, stop_words = 'english') 

#generate tf-idf term-document matrix 
A_tfidf_sp = tfidf.fit_transform(train_corpus) #size D x V 

print "number of docs: %d" %A_tfidf_sp.shape[0] 
print "dictionary size: %d" %A_tfidf_sp.shape[1] 

#tf-idf dictionary  
tfidf_dict = tfidf.get_feature_names() 

K = num_topics # number of topics 
V = A_tfidf_sp.shape[1] # number of words 
D = A_tfidf_sp.shape[0] # number of documents 

data = A_tfidf_sp.toarray() 

#Supervised LDA Graphical Model 
Wd = [len(doc) for doc in data]   
alpha = np.ones(K) 
beta = np.ones(V) 

theta = pm.Container([pm.CompletedDirichlet("theta_%s" % i, pm.Dirichlet("ptheta_%s" % i, theta=alpha)) for i in range(D)]) 
phi = pm.Container([pm.CompletedDirichlet("phi_%s" % k, pm.Dirichlet("pphi_%s" % k, theta=beta)) for k in range(K)])  

z = pm.Container([pm.Categorical('z_%s' % d, p = theta[d], size=Wd[d], value=np.random.randint(K, size=Wd[d])) for d in range(D)]) 

@pm.deterministic 
def zbar(z=z):  
    zbar_list = [] 
    for i in range(len(z)): 
     hist, bin_edges = np.histogram(z[i], bins=K) 
     zbar_list.append(hist/float(np.sum(hist)))     
    return pm.Container(zbar_list) 

eta = pm.Container([pm.Normal("eta_%s" % k, mu=0, tau=1.0/10**2) for k in range(K)]) 
y_tau = pm.Gamma("tau", alpha=0.1, beta=0.1) 

@pm.deterministic 
def y_mu(eta=eta, zbar=zbar): 
    y_mu_list = [] 
    for i in range(len(zbar)): 
     y_mu_list.append(np.dot(eta, zbar[i])) 
    return pm.Container(y_mu_list) 

#response likelihood 
y = pm.Container([pm.Normal("y_%s" % d, mu=y_mu[d], tau=y_tau, value=train_response[d], observed=True) for d in range(D)]) 

# cannot use p=phi[z[d][i]] here since phi is an ordinary list while z[d][i] is stochastic 
w = pm.Container([pm.Categorical("w_%i_%i" % (d,i), p = pm.Lambda('phi_z_%i_%i' % (d,i), lambda z=z[d][i], phi=phi: phi[z]), 
        value=data[d][i], observed=True) for d in range(D) for i in range(Wd[d])]) 

model = pm.Model([theta, phi, z, eta, y, w]) 
mcmc = pm.MCMC(model) 
mcmc.sample(iter=1000, burn=100, thin=2) 

#visualize topics  
phi0_samples = np.squeeze(mcmc.trace('phi_0')[:]) 
phi1_samples = np.squeeze(mcmc.trace('phi_1')[:]) 
phi2_samples = np.squeeze(mcmc.trace('phi_2')[:]) 
phi3_samples = np.squeeze(mcmc.trace('phi_3')[:]) 
ax = plt.subplot(221) 
plt.bar(np.arange(V), phi0_samples[-1,:]) 
ax = plt.subplot(222) 
plt.bar(np.arange(V), phi1_samples[-1,:]) 
ax = plt.subplot(223) 
plt.bar(np.arange(V), phi2_samples[-1,:]) 
ax = plt.subplot(224) 
plt.bar(np.arange(V), phi3_samples[-1,:]) 
plt.show() 

Với dữ liệu huấn luyện (lời nói và ứng biến quan sát), chúng ta có thể học hỏi các chủ đề toàn cầu (beta) và hệ số hồi quy (eta) để dự đoán biến phản ứng (Y) ngoài đến tỷ lệ chủ đề cho mỗi tài liệu (theta). Để đưa ra dự đoán của Y cho các phiên bản beta học và eta, chúng ta có thể xác định một mô hình mới mà chúng ta không quan sát Y và sử dụng các phiên bản beta đã học trước đây và eta để có được những kết quả sau:

sLDA prediction

Ở đây, chúng tôi dự đoán đánh giá tích cực (khoảng 2 đánh giá đánh giá cho dải từ -2 đến 2) cho phần thử nghiệm bao gồm một câu: "đây là bài đánh giá thực sự tích cực, phim tuyệt vời" như được hiển thị theo chế độ biểu đồ hậu nghiệm trên đúng. Xem ipython notebook để thực hiện đầy đủ.

+0

Hi @ vadim-smolyakov, là khác với đa thức Naive Bayes? – laguittemh

+0

Có, mục đích của sLDA là đồng thời tìm hiểu các chủ đề toàn cầu và điểm số tài liệu địa phương (ví dụ: đánh giá phim), trong khi Đa quốc gia Naive Bayes tập trung hơn vào phân loại. Cả hai mô hình đều cần giám sát (điểm số cho sLDA và nhãn lớp cho MNB). Tôi đã làm một số phân tích cho Bernoulli NB, có thể hữu ích ở đây: https://github.com/vsmolyakov/experiments_with_python/blob/master/chp01/info_planning.ipynb –