LDA提取信息
文本主题模型提取
如下程序将句子主题提取后,将权重值存入dataframe.
#!/usr/bin/python # -*- coding:utf-8 -*- import pandas as pd import numpy as np import matplotlib as mpl import math import warnings import jieba from gensim import corpora, models, similarities # 参数说明: # doc_topics: 可用np.array(doc_topics) # 对其进行查看, # 它里面存储的是每个句子对应的list, list中分别是句子中部分词的标号和权重值, # x:表示的是单个句子在dataframe的index # num_show_topic:LdaMulticore提取的主题的个数 # col:是列名 def getlda(doc_topics, x, num_show_topic, col): # topic是doc_topics中list的内容变成了二阶张量的形式 topic = np.array(doc_topics[x]) # topic[:,1]中是某个句子中部分词的权重值 # argsort函数返回的是数组值从小到大的索引值,即np.argsort(topic[:,1])中是list中所有的权重值由小到大排序后的索引 # topic_id中是topic按权重值排序后生成的二维张量 topic_id=topic[np.argsort(topic[:,1])] # 如果该句子主题个数不够LdaMulticore提取的个数,则对缺少的部分补0 if topic_id.shape[0]<num_show_topic: settopici=set(topic_id[:,0]) settopicadd=set([x for x in range(num_show_topic)])-settopici# 补上没出现的topic dfall=pd.concat([pd.DataFrame({0:list(settopicadd),1:[0 for x in range(len(settopicadd))]}),pd.DataFrame(topic_id)],axis=0) # 否则说明该句子中的主题个数与LdaMulticore中规定的一致, else: dfall=pd.DataFrame(topic_id) # print(dfall) # 对第一列进行排序,即按主题进行排序 共num_show_topic个主题 dfall.sort_values(0,inplace=True) # 将dfall中的权重值列转化为dataframe,变为1行num_show_topic列 df =pd.DataFrame([dfall[1].values]) df=df.astype(np.float32) # 生成num_show_topic个列 L = range(num_show_topic) df.columns = [col + 'lda' + str(i) for i in L] # 将最终生成的1行num_show_topic列的dataframe返回 return df def fenge(x): x = x.split('|') # print('x中不同元素共有:', len(set(x))) return x df = pd.DataFrame({ 'user_id': [113401,378358,434838,577061], 'taglist': [ '4707|70|3498|4707|2099|1832|1911', '751|2207|1100|2099|1832|1911|70|2254|171', '877|3242|5628|70|2684|691|70|4228|631|70', '2431|3242|3242|1823|4020|3242|70|620|2168' ] }) # r的数据类型是series,key是df的index,values是分割‘|’后返回的list r = df['taglist'].map(lambda x: fenge(x)) # testdata是list,每个元素也是list testdata = list(r) # dictionary中是将testdata中所有不同的标记tokens都取了出来放在一个list中 dictionary = corpora.Dictionary(testdata) # corpus中存放的是testdata中每个元素在dictionary中的编号与出现次数 # corpus中的数据形式是[[(0, 1), (1, 1), (2, 1)], [(0, 1), (1, 1), (2, 1), (5, 1), (6, 1)],....... corpus = [dictionary.doc2bow(text) for text in testdata] # 输出tfidf是TfidfModel(num_docs=4,num_nnz=31),其中num_docs表示的是处理了4个语句,num_nnz表示的是4个语句中共有31个不同的词 tfidf = models.TfidfModel(corpus) # 此处计算得出语料库corpus中所有句子的tf-idf值,这儿放其他的语料库可能也行 corpus_tfidf = tfidf[corpus] # LdaMulticore()参数解析官网链接:https://radimrehurek.com/gensim/models/ldamulticore.html # 参数解释:corpus_tfidf:要训练的语料库 # num_topics:指定从要训练的语料库中要提取的主题数量 # id2word:与语料库对应的字典 # chunksize:每次训练的词的数量 # passes:训练中通过语料库的次数,即训练的次数 # minimum_probability:设置阈值,低于该阈值的主题将被舍弃掉 # workers:设置进程数,即用于并行化的工作进程的数量 # decay:一个介于(0.5,1)之间的数字,以表示在检查每个新文档时忘记前面lambda值的百分比 # https://radimrehurek.com/gensim/models/ldamulticore.html lda = models.LdaMulticore(corpus_tfidf, num_topics=60, id2word=dictionary,chunksize=2000, passes=1, random_state=0, minimum_probability=0.005, workers=11) # print('lda is:', lda) # lda is: LdaModel(num_terms=23, num_topics=60, decay=0.5, chunksize=2000) # 保存模型 # lda.save('./model/' + 'lad.model') # 留给test集合用 # doc_topics直接输出看不到内部的值 doc_topics = lda.get_document_topics(corpus_tfidf) print(np.array(doc_topics)) # # 显示文档主题doc_topics有3种方法: # doc_topic = [i for i in lda[corpus_tfidf]] ##法1 # print(doc_topic) # # for doc_topic in lda.get_document_topics(corpus_tfidf): ##法2 # print(doc_topic) # print(np.array(doc_topics)) ##法3 item = 'taglist' # 列名 # [print(cols) for cols in df.reset_index()['index'].apply(lambda x: getlda(doc_topics, x, 60, item))] # df.reset_index()['index'].apply(lambda x: getlda(doc_topics, x, 60, item)) # 是series类型,其中每个values都是返回的dataframe,1行num_show_topic列 dfjoin = pd.concat([cols for cols in df.reset_index()['index'].apply(lambda x: getlda(doc_topics, x, 60, item))], ignore_index=True) print(dfjoin.shape) #(4, 60)
https://blog.csdn.net/sinat_26917383/article/details/71436563#gensimdoc2bow_209
https://radimrehurek.com/gensim/models/ldamulticore.html
https://blog.csdn.net/appleyuchi/article/details/78055371
https://blog.csdn.net/qq_23926575/article/details/79429689
https://radimrehurek.com/gensim/tut1.html#from-strings-to-vectors
http://www.pianshen.com/article/6714154086/