Pour ce que ça vaut, LDA comme un classificateur va être assez faible, parce que c'est un modèle génératif, et la classification est un discriminant problème. Il y a une variante de la LDA appelé supervisé LDA qui utilise une plus discriminatoire critère pour former les sujets (vous pouvez obtenir la source, en plusieurs endroits), et il y a aussi un papier avec un max de marge formulation que je ne connais pas l'état de la source-code-sage. Je voudrais éviter de la Étiquetés LDA formulation, sauf si vous êtes certain de ce que vous voulez, parce qu'il fait une hypothèse forte sur la correspondance entre les rubriques et catégories dans la classification problème.
Cependant, il est important de souligner qu'aucune de ces méthodes utilisent la rubrique modèle directement à procéder à la classification. Au lieu de cela, ils prennent des documents, et au lieu de l'aide de word-fonctions à base de l'utilisation de la face postérieure de plus de thèmes (le vecteur que les résultats de l'inférence pour le document) que sa fonction de représentation avant de le donner à un classificateur, généralement un SVM Linéaire. Cela devient un thème, une modèle en fonction de réduction de dimensionnalité, suivie par une forte classificateur discriminant, ce qui est probablement ce que vous êtes après. Ce pipeline est disponible
dans la plupart des langues, utilisant les boîtes à outils.
De l'autre, et plus récentes, approche qui pourrait être utile dans la recherche est Partiellement Étiquetées LDA. lien Il détend l'exigence que tous les documents dans l'ensemble de la formation doit avoir une étiquette.
Merci, je vais jeter un oeil à ça! Savez-vous si il y a un C/C++/Python de mise en œuvre de la l-LDA? Désolé, je n'ai pas vu votre message initial. Je ne suis pas au courant de c/ python mise en œuvre, mais je n'ai pas regardé avant. Je sais Bienne (LDA auteur) publie son code (C/C++) sur son site internet personnel, donc je voudrais vérifier. Le problème avec cette approche est qu'elle nécessite un label pour le match 1 à 1 avec un sujet, de sorte qu'il est très restrictive.
Vous pouvez mettre en œuvre supervisé LDA avec PyMC qui utilise Métropole sampler pour apprendre les variables latentes du modèle graphique suivant:
La formation corpus est composé de 10 critiques de films (5 positifs et 5 négatifs) ainsi que des étoiles pour chaque document. Le classement est connu comme une variable de réponse, qui est une quantité d'intérêt associé à chaque document. Les documents et les variables de réponse sont modélisés en commun afin de trouver les sujets cachés qui permettent le mieux de prédire la réponse des variables pour un avenir sans étiquette documents. Pour plus d'informations, consultez la papier original.
Considérons le code suivant:
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()
Donné les données d'apprentissage (observé des mots et des variables de réponse), nous pouvons apprendre le mondial sujets (beta) et des coefficients de régression (eta) pour la prédiction de la variable de réponse (Y) en outre, à la rubrique des proportions pour chaque document (thêta).
Afin de faire des prédictions de Y étant donné la appris bêta et l'eta, nous pouvons définir un nouveau modèle où nous n'observons pas Y et l'utilisation des acquis antérieurs de la bêta et de la lta pour obtenir le résultat suivant:
Ici, nous avons prédit un bilan positif (environ 2 compte tenu de l'examen de notation plage de -2 à 2) pour le corpus de test consistant en une phrase: "c'est vraiment une critique positive, grand film", comme indiqué par le mode de la partie postérieure de l'histogramme sur la droite.
Voir ipython notebook pour une mise en œuvre complète.
Salut @vadim-smolyakov, est-ce différent de Naive Bayes Multinomial ? Oui, le but de sLDA est simultanément apprendre des matières globales et locales document score (par exemple, note le film), tandis que les Naive Bayes Multinomial se concentre plus sur la classification. Les deux modèles ont besoin de supervision (note pour sLDA, et la classe de l'étiquette de la BMN). J'ai fait une analyse de Bernoulli NB, qui peut-être utile ici: github.com/vsmolyakov/experiments_with_python/blob/master/chp01/... comment peut-on modifier le code si l'axe n'est pas numérique mais le texte / l'étiquette?
Pour ce que ça vaut, LDA comme un classificateur va être assez faible, parce que c'est un modèle génératif, et la classification est un discriminant problème. Il y a une variante de la LDA appelé supervisé LDA qui utilise une plus discriminatoire critère pour former les sujets (vous pouvez obtenir la source, en plusieurs endroits), et il y a aussi un papier avec un max de marge formulation que je ne connais pas l'état de la source-code-sage. Je voudrais éviter de la Étiquetés LDA formulation, sauf si vous êtes certain de ce que vous voulez, parce qu'il fait une hypothèse forte sur la correspondance entre les rubriques et catégories dans la classification problème.
Cependant, il est important de souligner qu'aucune de ces méthodes utilisent la rubrique modèle directement à procéder à la classification. Au lieu de cela, ils prennent des documents, et au lieu de l'aide de word-fonctions à base de l'utilisation de la face postérieure de plus de thèmes (le vecteur que les résultats de l'inférence pour le document) que sa fonction de représentation avant de le donner à un classificateur, généralement un SVM Linéaire. Cela devient un thème, une modèle en fonction de réduction de dimensionnalité, suivie par une forte classificateur discriminant, ce qui est probablement ce que vous êtes après. Ce pipeline est disponible
dans la plupart des langues, utilisant les boîtes à outils.
OriginalL'auteur Ben Allison
Oui, vous pouvez essayer de la Étiquetés LDA dans le stanford parser à
http://nlp.stanford.edu/software/tmt/tmt-0.4/
Désolé, je n'ai pas vu votre message initial. Je ne suis pas au courant de c/ python mise en œuvre, mais je n'ai pas regardé avant. Je sais Bienne (LDA auteur) publie son code (C/C++) sur son site internet personnel, donc je voudrais vérifier.
Le problème avec cette approche est qu'elle nécessite un label pour le match 1 à 1 avec un sujet, de sorte qu'il est très restrictive.
OriginalL'auteur Steve
Vous pouvez mettre en œuvre supervisé LDA avec PyMC qui utilise Métropole sampler pour apprendre les variables latentes du modèle graphique suivant:
La formation corpus est composé de 10 critiques de films (5 positifs et 5 négatifs) ainsi que des étoiles pour chaque document. Le classement est connu comme une variable de réponse, qui est une quantité d'intérêt associé à chaque document. Les documents et les variables de réponse sont modélisés en commun afin de trouver les sujets cachés qui permettent le mieux de prédire la réponse des variables pour un avenir sans étiquette documents. Pour plus d'informations, consultez la papier original.
Considérons le code suivant:
Donné les données d'apprentissage (observé des mots et des variables de réponse), nous pouvons apprendre le mondial sujets (beta) et des coefficients de régression (eta) pour la prédiction de la variable de réponse (Y) en outre, à la rubrique des proportions pour chaque document (thêta).
Afin de faire des prédictions de Y étant donné la appris bêta et l'eta, nous pouvons définir un nouveau modèle où nous n'observons pas Y et l'utilisation des acquis antérieurs de la bêta et de la lta pour obtenir le résultat suivant:
Ici, nous avons prédit un bilan positif (environ 2 compte tenu de l'examen de notation plage de -2 à 2) pour le corpus de test consistant en une phrase: "c'est vraiment une critique positive, grand film", comme indiqué par le mode de la partie postérieure de l'histogramme sur la droite.
Voir ipython notebook pour une mise en œuvre complète.
Oui, le but de sLDA est simultanément apprendre des matières globales et locales document score (par exemple, note le film), tandis que les Naive Bayes Multinomial se concentre plus sur la classification. Les deux modèles ont besoin de supervision (note pour sLDA, et la classe de l'étiquette de la BMN). J'ai fait une analyse de Bernoulli NB, qui peut-être utile ici: github.com/vsmolyakov/experiments_with_python/blob/master/chp01/...
comment peut-on modifier le code si l'axe n'est pas numérique mais le texte / l'étiquette?
OriginalL'auteur Vadim Smolyakov