2016-02-01 27 views
9

Io ho usato Latent Dirichlet Allocation (sklearn implementazione) per analizzare circa 500 articoli scientifici-abstract e ho ottenuto argomenti contenenti le parole più importanti (in lingua tedesca). Il mio problema è interpretare questi valori associati alle parole più importanti. Ho ipotizzato di ottenere probabilità per tutte le parole per argomento che aggiungono fino a 1, il che non è il caso.Come interpretare i componenti LDA (usando sklearn)?

Come posso interpretare questi valori? Per esempio vorrei essere in grado di dire perché l'argomento # 20 ha parole con valori molto più alti di altri argomenti. Ha la sua altezza assoluta a che fare con la probabilità bayesiana? L'argomento è più comune nel corpus? Non sono ancora in grado di riunire questi valori con la matematica dietro l'ADL.

from sklearn.feature_extraction.text import CountVectorizer 
from sklearn.decomposition import LatentDirichletAllocation 

tf_vectorizer = CountVectorizer(max_df=0.95, min_df=1, top_words=stop_ger, 
           analyzer='word', 
           tokenizer = stemmer_sklearn.stem_ger()) 

tf = tf_vectorizer.fit_transform(texts) 

n_topics = 10 
lda = LatentDirichletAllocation(n_topics=n_topics, max_iter=5, 
           learning_method='online',     
           learning_offset=50., random_state=0) 

lda.fit(tf) 

def print_top_words(model, feature_names, n_top_words): 
    for topic_id, topic in enumerate(model.components_): 
     print('\nTopic Nr.%d:' % int(topic_id + 1)) 
     print(''.join([feature_names[i] + ' ' + str(round(topic[i], 2)) 
       +' | ' for i in topic.argsort()[:-n_top_words - 1:-1]])) 

n_top_words = 4 
tf_feature_names = tf_vectorizer.get_feature_names() 
print_top_words(lda, tf_feature_names, n_top_words) 

Topic Nr.1: demenzforsch 1.31 | fotus 1.21 | umwelteinfluss 1.16 | forschungsergebnis 1.04 | 
Topic Nr.2: fur 1.47 | zwisch 0.94 | uber 0.81 | kontext 0.8 | 
... 
Topic Nr.20: werd 405.12 | fur 399.62 | sozial 212.31 | beitrag 177.95 | 
+1

Hai raggiunto qualche conclusione al riguardo? Sto affrontando lo stesso problema. Hai provato il metodo di punteggio? Sul mio codice restituisce un NaN ... –

+1

Appena trovato [questo isssue] (https://github.com/scikit-learn/scikit-learn/issues/6353) sul github di scikit-learn, questa implementazione sembra essere ancora avere troppi bug per essere utile Probabilmente è meglio usare [gensim] (https://radimrehurek.com/gensim/). –

+0

Grazie per aver condiviso il link gihub! – LSz

risposta

0

Dalla documentazione

components_ parametri variazionali per la distribuzione argomento parola. Dato che il condizionale completo per la distribuzione delle parole argomento è un Dirichlet, i componenti_ [i, j] possono essere visualizzati come pseudocount che rappresenta il numero di volte in cui la parola j è stata assegnata all'argomento i . Può anche essere visualizzato come distribuzione sulle parole per ciascun argomento dopo la normalizzazione: model.components_/ model.components_.sum(axis=1)[:, np.newaxis].

Quindi i valori possono essere visti come una distribuzione se si normalizza sul componente per valutare l'importanza di ciascun termine nell'argomento. AFAIU non è possibile utilizzare lo pseudo-conteggio per confrontare l'importanza di due argomenti nel corpus in quanto sono un fattore di livellamento applicato alla distribuzione di argomento-argomento.