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)
View Code

 

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/

posted on 2019-06-26 17:11  吃我一枪  阅读(281)  评论(0编辑  收藏  举报

导航