2017-09-20 11 views
2

Je suis nouveau dans la modélisation de sujet/Allocation de Dirichlet latente et j'ai de la difficulté à comprendre comment appliquer le concept à mon jeu de données (ou s'il s'agit de la bonne approche).Présentation de la modélisation LDA/sujet - trop de chevauchement de sujet

J'ai un petit nombre de textes littéraires (romans) et je voudrais extraire quelques sujets généraux en utilisant LDA. J'utilise le module gensim en Python avec certaines fonctionnalités nltk. Pour un test, j'ai divisé mes textes originaux (seulement 6) en 30 morceaux de 1000 mots chacun. Puis j'ai converti les morceaux en matrices de document-terme et ai couru l'algorithme. Voici le code (même si je pense qu'il n'a pas d'importance pour la question):

# chunks is a 30x1000 words matrix 

dictionary = gensim.corpora.dictionary.Dictionary(chunks) 
corpus = [ dictionary.doc2bow(chunk) for chunk in chunks ] 
lda = gensim.models.ldamodel.LdaModel(corpus = corpus, id2word = dictionary, 
    num_topics = 10) 
topics = lda.show_topics(5, 5) 

Toutefois, le résultat est tout à fait différent de tout exemple que j'ai vu que les sujets sont pleins de mots vides de sens qui peuvent être trouvé dans tous documents sources, p.ex. « I », « il », « dit », « comme », ... par exemple:

[(2, '0.009*"I" + 0.007*"\'s" + 0.007*"The" + 0.005*"would" + 0.004*"He"'), 
(8, '0.012*"I" + 0.010*"He" + 0.008*"\'s" + 0.006*"n\'t" + 0.005*"The"'), 
(9, '0.022*"I" + 0.014*"\'s" + 0.009*"``" + 0.007*"\'\'" + 0.007*"like"'), 
(7, '0.010*"\'s" + 0.009*"I" + 0.006*"He" + 0.005*"The" + 0.005*"said"'), 
(1, '0.009*"I" + 0.009*"\'s" + 0.007*"n\'t" + 0.007*"The" + 0.006*"He"')] 

Je ne comprends pas pourquoi cela se produit, ou pourquoi il ne se produit pas avec les exemples que je » J'ai vu. Comment puis-je obtenir le modèle LDA pour trouver des sujets plus spécifiques avec moins de chevauchement? S'agit-il de filtrer les mots les plus courants en premier? Comment puis-je ajuster le nombre de fois que le modèle fonctionne? Le nombre de textes originaux est-il trop petit?

Répondre

5

LDA est extrêmement dépendant des mots utilisés dans un corpus et de la fréquence à laquelle ils apparaissent. Les mots que vous voyez sont tous des mots vides - des mots vides de sens qui sont les mots les plus fréquents dans une langue, par ex. "the", "I", "a", "if", "for", "said", etc. Et puisque ces mots sont les plus fréquents, cela aura un impact négatif sur le modèle.

Je voudrais utiliser le corpus nltk de mots vides pour filtrer ces mots:

from nltk.corpus import stopwords 
stop_words = stopwords.words('english') 

Ensuite, assurez-vous que votre texte ne contient aucun des mots dans la liste stop_words (quelle que soit la méthode avant le traitement que vous utilisez) - un exemple est inférieur

text = text.split() # split words by space and convert to list 
text = [word for word in text if word not in stop_words] 
text = ' '.join(text) # join the words in the text to make it a continuous string again 

Vous pouvez également supprimer la ponctuation et d'autres caractères ("/", "-"), etc.) utilisent alors des expressions régulières:

import re 
remove_punctuation_regex = re.compile(r"[^A-Za-z ]") # regex for all characters that are NOT A-Z, a-z and space " " 
text = re.sub(remove_punctuation_regex, "", text) # sub all non alphabetical characters with empty string "" 

Enfin, vous pouvez également filtrer les mots les plus fréquents ou moins fréquents dans votre corps, que vous pouvez faire à l'aide NLTK:

from nltk import FreqDist 
all_words = text.split() # list of all the words in your corpus 
fdist = FreqDist(all_words) # a frequency distribution of words (word count over the corpus) 
k = 10000 # say you want to see the top 10,000 words 
top_k_words, _ = zip(*fdist.most_common(k)) # unzip the words and word count tuples 
print(top_k_words) # print the words and inspect them to see which ones you want to keep and which ones you want to disregard 

Cela devrait se débarrasser des mots vides et des caractères supplémentaires, mais laisse encore le vaste problème de la modélisation de sujet (que je ne vais pas essayer d'expliquer ici mais laissera quelques conseils et liens).

En supposant que vous connaissiez un peu la modélisation des sujets, commençons. LDA est un sac de mots modèle, ce qui signifie que l'ordre des mots n'a pas d'importance. Le modèle attribue une distribution de sujet (d'un nombre prédéterminé de sujets K) à chaque document, et une distribution de mots à chaque sujet. Un très perspicace high level video explains this here. Si vous voulez voir plus de mathématiques, mais toujours à un niveau accessible, consultez this video. Le plus de documents le mieux, et généralement des documents plus longs (avec plus de mots) aussi bien mieux en utilisant LDA - this paper montre que LDA ne fonctionne pas bien avec des textes courts (moins de ~ 20 mots).K est à vous de choisir, et dépend vraiment de votre corpus de documents (de quelle taille il s'agit, quels sont les différents sujets qu'il couvre, etc.). Habituellement, une bonne valeur de K se situe entre 100 et 300, mais encore une fois cela dépend vraiment de votre corpus. LDA a deux hyperparamètres, alpha et bêta (alpha et eta dans gemsim) - un alpha supérieur signifie que chaque texte sera représenté par plus de sujets (donc naturellement un alpha inférieur signifie que chaque texte sera représenté par moins de sujets). Un ETA élevé signifie que chaque sujet est représenté par plus de mots, et un ETA bas signifie que chaque sujet est représenté par moins de mots - donc avec un ETA bas, vous obtiendrez moins de "chevauchement" entre les sujets.

Il y a beaucoup d'idées que vous pourriez gagner en utilisant LDA

  1. Quels sont les sujets dans un corpus (sujets de nommage ne peut pas importer à votre application, mais si elle le fait cela peut être fait en inspectant les mots dans un sujet que vous avez fait ci-dessus)

  2. Quels sont les mots qui contribuent le plus à un sujet

  3. Quels sont les documents dans le corpus sont plus similaires (en utilisant un similarity metric)

Espérons que cela a aidé. J'étais nouveau à LDA il y a quelques mois mais je me suis rapidement mis au courant en utilisant stackoverflow et youtube!

+0

Si vous pensez que cela répond à votre question @OP, n'ayez pas peur de cliquer sur la coche verte et de la marquer comme la bonne réponse :) Sinon, faites-moi savoir s'il y a un endroit où je peux développer/expliquer meilleur – killerT2333