7

मेरे पास कुछ समूहों में पहले से ही मानव वर्गीकृत दस्तावेजों का एक गुच्छा है।दस्तावेज़ वर्गीकरण के लिए पर्यवेक्षित लेटेंट Dirichlet आवंटन?

क्या एलडीए का एक संशोधित संस्करण है जिसका उपयोग मैं मॉडल को प्रशिक्षित करने के लिए कर सकता हूं और उसके बाद अज्ञात दस्तावेज़ों को वर्गीकृत कर सकता हूं?

उत्तर

10

पर स्टैनफोर्ड पार्सर में लेबल झील प्राधिकरण की कोशिश कर सकते हैं। supervised LDA नामक एलडीए का एक रूप है जो विषयों को बनाने के लिए अधिक भेदभावपूर्ण मानदंड का उपयोग करता है (आप विभिन्न स्थानों पर इसके लिए स्रोत प्राप्त कर सकते हैं), और max margin फॉर्मूलेशन के साथ एक पेपर भी है जो मुझे स्रोत- कोड के लिहाज से। मैं लेबल किए गए एलडीए फॉर्मूलेशन से बचूंगा जबतक कि आप सुनिश्चित नहीं हैं कि आप क्या चाहते हैं, क्योंकि यह वर्गीकरण समस्या में विषयों और श्रेणियों के बीच पत्राचार के बारे में एक मजबूत धारणा बनाता है।

हालांकि, यह इंगित करने योग्य है कि इनमें से कोई भी तरीका सीधे वर्गीकरण करने के लिए विषय मॉडल का उपयोग नहीं करता है। इसके बजाए, वे दस्तावेज़ लेते हैं, और शब्द-आधारित सुविधाओं का उपयोग करने के बजाय विषयों पर पोस्टरियोर का उपयोग करते हैं (वेक्टर जो दस्तावेज़ के लिए अनुमान से परिणामस्वरूप होते हैं) वर्गीकरण को खिलाए जाने से पहले इसकी विशेषता प्रतिनिधित्व करते हैं, आमतौर पर एक रैखिक एसवीएम। यह आपको एक विषय मॉडल आधारित आयामी कमी देता है, जिसके बाद एक मजबूत भेदभावपूर्ण वर्गीकरण होता है, जो संभवतः आप के बाद क्या होता है। लोकप्रिय टूलकिट का उपयोग करके अधिकांश पाइपलाइन में यह पाइपलाइन उपलब्ध है।

+0

अन्य, और नया, दृष्टिकोण जो आंशिक रूप से लेबल किए गए एलडीए में दिखने लायक हो सकता है। [लिंक] (http://research.microsoft.com/en-us/um/people/sdumais/kdd2011-pldp-final.pdf) यह आवश्यकता को आराम देता है कि प्रशिक्षण सेट में प्रत्येक दस्तावेज़ में एक लेबल होना चाहिए। – metaforge

3

हाँ आप क्या इसके लायक है, झील प्राधिकरण के रूप में एक वर्गीकारक, क्योंकि यह एक उत्पादक मॉडल है, और वर्गीकरण एक विवेकशील समस्या है काफी कमजोर होने जा रहा है के लिए http://nlp.stanford.edu/software/tmt/tmt-0.4/

+1

धन्यवाद, मैं इसे देख लूंगा! क्या आपको पता है कि एल-एलडीए का सी/सी ++/पायथन कार्यान्वयन है या नहीं? –

+0

क्षमा करें, मैंने शुरुआत में आपका संदेश नहीं देखा था। मुझे सी/पायथन कार्यान्वयन से अवगत नहीं है लेकिन मैंने पहले नहीं देखा है। मुझे पता है कि बायल (एलडीए लेखक) आमतौर पर अपनी व्यक्तिगत वेबसाइट पर अपना कोड (सी/सी ++) प्रकाशित करता है, इसलिए मैं इसे देखता हूं। – Steve

+0

इस दृष्टिकोण के साथ समस्या यह है कि इसे एक विषय के साथ 1-से-1 मैच करने के लिए एक लेबल की आवश्यकता होती है, इसलिए यह बहुत ही सीमित है। – metaforge

3

आप लागू कर सकते हैं झील प्राधिकरण देखरेख PyMC निम्नलिखित चित्रमय मॉडल में अव्यक्त चर जानने के लिए महानगरों नमूना का उपयोग करता है के साथ: sLDA graphical model

प्रशिक्षण कोष 10 फिल्म समीक्षा (5 सकारात्मक और 5 नकारात्मक) के होते हैं साथ प्रत्येक दस्तावेज़ के लिए संबंधित स्टार रेटिंग के साथ। स्टार रेटिंग को प्रतिक्रिया चर के रूप में जाना जाता है जो प्रत्येक दस्तावेज़ से जुड़े ब्याज की मात्रा है। दस्तावेजों और प्रतिक्रिया चर को गुप्त विषयों को खोजने के लिए संयुक्त रूप से मॉडलिंग किया जाता है जो भविष्य में लेबल किए गए दस्तावेज़ों के लिए प्रतिक्रिया चर की भविष्यवाणी करेंगे। अधिक जानकारी के लिए, original paper देखें। निम्नलिखित कोड पर विचार करें:

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() 

प्रशिक्षण आंकड़ों को देखते हुए (मनाया शब्द और प्रतिक्रिया चर), हम साथ-साथ प्रतिक्रिया चर (वाई) की भविष्यवाणी के लिए वैश्विक विषयों (बीटा) और प्रतिगमन गुणांक (ईटीए) सीख सकते हैं प्रत्येक दस्तावेज़ (थेटा) के लिए विषय अनुपात के लिए।

sLDA prediction

: आदेश सीखा बीटा और ईटा दिया Y की भविष्यवाणी करने के लिए, हम एक नया मॉडल है, जहां हम Y का पालन नहीं करते और निम्न परिणाम प्राप्त करने के लिए पहले सीखा बीटा और ईटा का उपयोग परिभाषित कर सकते हैं यहां हमने टेस्ट कॉर्पस के लिए एक सकारात्मक समीक्षा (लगभग 2 दी गई समीक्षा रेटिंग रेंज -2 से 2) की भविष्यवाणी की है: "यह वास्तव में सकारात्मक समीक्षा है, महान फिल्म" जैसा कि बाद में हिस्टोग्राम के मोड द्वारा दिखाया गया है सही। पूर्ण कार्यान्वयन के लिए ipython notebook देखें।

+0

हाय @ वादीम-स्मोल्याकोव, क्या यह बहुराष्ट्रीय बेवकूफ बेयस से अलग है? – laguittemh

+0

हां, एसएलडीए का उद्देश्य वैश्विक विषयों और स्थानीय दस्तावेज़ स्कोर (जैसे मूवी रेटिंग) सीखना है, जबकि बहुराष्ट्रीय नाइव बेयस वर्गीकरण पर अधिक केंद्रित है। दोनों मॉडलों को पर्यवेक्षण की आवश्यकता है (एसएलडीए के लिए स्कोर, और एमएनबी के लिए कक्षा लेबल)। मैंने बर्नौली एनबी के लिए कुछ विश्लेषण किया, जो यहां सहायक हो सकता है: https://github.com/vsmolyakov/experiments_with_python/blob/master/chp01/info_planning.ipynb –