将LDA结果从文本的Pandas列矢量化为多列

时间:2018-12-02 19:51:15

标签: python pandas scikit-learn lda

在大熊猫文本列中,我想首先对该列的整个文本训练一个LDA模型,并确定50个主题:

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)

然后,我想创建与每个主题相关的50列,并遍历每一行,并将其属于任何一个主题的概率放入其对应的主题,并为其余主题设置零。 >

例如,如果在第一行上应用经过训练的LDA的结果是:

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

这意味着tweet1属于主题1的概率为0.92,属于主题4的概率为0.42,我想要有50个与主题1,主题2,...,主题50相关的新列,然后是主题1的值为0.92,主题4为0.42,其他所有主题为零:

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

是否有任何Python方法快速完成最后一部分(即填充50列)?

2 个答案:

答案 0 :(得分:0)

有一个很好的端到端教程,涵盖了您使用的工具,熊猫和LDA的需求: https://www.machinelearningplus.com/nlp/topic-modeling-gensim-python/

您要寻找的部分是18.在每个句子中找到主要主题,19.为每个主题找到最具代表性的文档,以及20.跨文档的主题分布。

答案 1 :(得分:0)

我编写了以下代码,它可以正常工作。但不确定这是否是最有效的方法:

首先,我创建50个零列:

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

然后我使用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]