3 votes

Vectoriser les résultats LDA d'une colonne de texte Pandas vers des colonnes multiples

Ayant une grande colonne pandas de texte, je veux d'abord entraîner un modèle LDA sur l'ensemble du texte de cette colonne et identifier 50 sujets :

doc_clean = df['tweet_tokenized'].tolist()
dictionary = corpora.Dictionary(doc_clean)
doc_term_matrix = [dictionary.doc2bow(doc) for doc in doc_clean]
lda = LdaMulticore(doc_term_matrix, id2word=dictionary, num_topics=50)

Ensuite, je veux créer 50 colonnes associées à chaque sujet, et itérer à travers chaque ligne et mettre sa probabilité d'appartenir à l'un des sujets à son ou ses sujets correspondants et mettre des zéros pour le reste des sujets.

Par exemple, si les résultats de l'application du LDA entraîné sur la première ligne sont :

new_doc = dictionary.doc2bow(tweet1)
results = lda(new_doc)
results:
        [(1, 0.92), (4,0.42)]

Sachant que le tweet1 appartient au thème 1 avec une probabilité de 0,92 et au thème 4 avec une probabilité de 0,42, je veux avoir 50 nouvelles colonnes associées au thème 1, au thème 2, ..., au thème 50, et donc les valeurs pour le thème 1 soient 0,92 et le thème 4 soient 0,42 et des zéros pour tous les autres thèmes :

         topic1  topic2  topic3  topic4 topic5 ... topic50
tweet1   0.92    0       0       0.42   0      ... 0

Existe-t-il un moyen pythonique de réaliser rapidement la dernière partie (c'est-à-dire le remplissage de 50 colonnes) ?

0voto

Prayson Daniel Points 938

Il existe un bon tutoriel de bout en bout couvrant vos besoins avec les outils que vous utilisez, pandas et LDA : https://www.machinelearningplus.com/nlp/topic-modeling-gensim-python/

La pièce que vous recherchez est le 18. Trouver le sujet dominant dans chaque phrase, 19. Trouver le document le plus représentatif pour chaque sujet, et 20. La distribution des sujets dans les documents.

0voto

msmazh Points 167

J'ai écrit le code suivant et il fonctionne correctement. Mais je ne suis pas sûr qu'il s'agisse de la méthode la plus efficace :

Je crée d'abord 50 colonnes de zéros :

for i in range(50):
    col_name = 'tweet_topic_'+str(i)
    df[col_name] = 0

Puis j'itère à travers elle en utilisant iterrows() :

for row_index, row in df.iterrows():
    row = row.copy()
    new_doc = dictionary.doc2bow(row['tweet_tokenized'])
    lda_result = lda[new_doc]
    for tpc in lda_result:
        col_name = 'tweet_topic_'+(str(tpc[0]).strip())
        print(row_index,col_name, tpc[1])
        df.loc[row_index,col_name] = tpc[1]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X