如何将主题列表(从gensim lda get_document_topics())更改为数据帧格式

2024-06-26 00:13:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用gensim.models.ldamodel.ldamodel()进行了一些主题建模,我想标记我的数据,以可视化我的发现

这就是我目前的情况:

我的当前数据帧包含以下列:

['text']['date']['gender']['tokens']['topics']['main_topic']
    

文本只是纯文本数据,日期为形式(yyyy mm dd),性别为二进制,女性为1,标记为预处理后的文本,主题来源于:

df['topics'] = LDA_model.get_document_topics(corpus)

主要的主题与第二个答案相比有一点变化,如下图所示:

df['main_topic'] = [int(str(sorted(LDA_model[i],reverse=True,key=lambda x: x[1])[0][0]).zfill(3)) for i in corpus]

最后,前10行主题和主要主题如下所示(注意num_topics=30):

    topics  main_topic
[(0, 0.051341455), (1, 0.21204428), (2, 0.1145254), (4, 0.055585753), (11, 0.20260869), (29, 0.25616828)]   29
[(0, 0.052005265), (1, 0.21128647), (2, 0.08015486), (3, 0.11465485), (29, 0.4478401)]  29
[(0, 0.05355798), (1, 0.1394092), (2, 0.10734849), (4, 0.32699445), (29, 0.273105)] 4
[(0, 0.053568278), (1, 0.22299954), (2, 0.22616898), (11, 0.0959242), (29, 0.2897638)]  29
[(0, 0.05404401), (1, 0.4482777), (4, 0.141311), (29, 0.24849494)]  1
[(0, 0.054245334), (1, 0.18933308), (2, 0.14567153), (4, 0.11169399), (23, 0.05768766), (29, 0.35825193)]   29
[(0, 0.05449035), (2, 0.114870586), (4, 0.13284092), (11, 0.075592585), (23, 0.13247918), (24, 0.06598773), (29, 0.32016253)]   29
[(0, 0.055871632), (1, 0.23100668), (4, 0.06832383), (29, 0.4730603)]   29
[(0, 0.057746172), (1, 0.057121024), (2, 0.07247137), (3, 0.26388222), (13, 0.07291462), (29, 0.34331965)]  29
[(0, 0.057841185), (1, 0.19891246), (2, 0.09586754), (29, 0.5344914)]   29

现在我想要的是:

我想要30个新专栏:“主题0,主题1,主题2,…,主题29”。对于第一行,我想使用df['topics'],并将值保存在新列中,以便:

第1行的主题0=0.0513414,第1行的主题1=0.21204,第1行的主题2=0.11452,第1行的主题3=0,依此类推

但是我不知道怎么做。有人能帮忙吗


Tags: 数据标记文本df主题topicmodelmain
1条回答
网友
1楼 · 发布于 2024-06-26 00:13:47

我想出来了。如果有人希望实现同样的目标:

LDA_model = gensim.models.ldamodel.LdaModel()
dir(gensim.models.ldamodel.LdaModel)

df['topics'] = LDA_model.get_document_topics(corpus)

sf = pd.DataFrame(data=df['topics'])
af = pd.DataFrame()

for i in range(30):
    af[str(i)]=[]

frames = [sf,af]
af = pd.concat(frames).fillna(0)

for i in range(6301):
    for j in range(len(df['topics'][i])):
        af[str(df['topics'][i][j][0])].loc[i] = df['topics'][i][j][1]

请注意,30是我的num_topics6301是我的df['topics']行数

现在数据帧af看起来像这样[限制为5行和5列

    topics  0   1   2   3
0   [(1, 0.055395175), (5, 0.0647138), (7, 0.13507782), (9, 0.055264555), (13, 0.19258575), (21, 0.05181323), (27, 0.07139948)] 0.0 0.05539517477154732 0.0 0.0
1   [(0, 0.052290276), (6, 0.064590134), (13, 0.24019116), (16, 0.07827738), (27, 0.0994899)]   0.05229027569293976 0.0 0.0 0.0
2   [(6, 0.054943837), (7, 0.07324204), (10, 0.052613333), (12, 0.12482096), (27, 0.19818054), (29, 0.06280263)]    0.0 0.0 0.0 0.0
3   [(4, 0.12759669), (8, 0.06937062), (10, 0.2261674), (16, 0.066699274), (24, 0.06150386), (27, 0.096883684)] 0.0 0.0 0.0 0.0
4   [(2, 0.09043305), (8, 0.15643781), (10, 0.13145259), (16, 0.064689845), (17, 0.05019963), (24, 0.09253424), (28, 0.10176642)]   0.0 0.0 0.09043305367231369 0.0

相关问题 更多 >