zoukankan      html  css  js  c++  java
  • 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/

  • 相关阅读:
    浏览器页面呈现过程
    Function与Object
    前端性能优化方案
    CSS引入方式
    浏览器事件
    Js继承的实现方式
    H5页面 绝对定位元素被 软键盘弹出时顶起
    总结angular+ionic项目中的问题
    vue开发学习中遇到的问题以及解决方法
    css重修之书(一):如何用css制作比1px更细的边框
  • 原文地址:https://www.cnblogs.com/xxswkl/p/11091082.html
Copyright © 2011-2022 走看看