zoukankan      html  css  js  c++  java
  • LDA主题模型

    1、什么是LDA主题模型?

      LDA主题模型是一种无监督的贝叶斯模型;

      是一种主题模型,它可以将文档集中的每个文档的主题按照概率给出,同时他是一种无监督学习算法,在训练时不需要手工标注的数据集,仅仅需要文档集和主题的数量K即可。此外LDA的每一个主题均可以找到一些词语来描述它。

      是一种典型的词袋模型,即它认为每一篇文档是由一组词构成的集合,词与词之间没有顺序以及先后的关系。一篇文档可以包含多个主题,文档中的每个词都由一个主题生成。

      贝叶斯模型:

       P(A|B) = P(B|A)*P(A)/P(B)

      标准版解释:

      以一篇文章的词,来解释LDA

      一篇文章的每个词都是以一定概率选择了某个主题,并从这个主题中以一定概率选择某个词语而组成的

      P(单词|文档) = P(单词|主题)*P(主题|文档)

    2、怎么生成LDA主题模型

      对于语料库中的每篇文档,LDA定义了如下生成过程:
      1、对于每一篇文档,从主题分布中抽取一个主题;

      2、从上述被抽到的主题所对应的单词分布中抽取一个单词;

      3、重复上述过程直至遍历文档中的每一个单词

      更详细的解释:

      w代表单词、d代表文档、t代表主题、大写代表总集合、小写代表个体

      D中每个文档d看作一个单词序列<w1,w2,....,wn>,wi表示第i个单词;

      D中涉及的所有不同单词组成一个词汇表大集合V,LDA以文档集合D作为输入、希望训练处两个结果向量(假设形成k个topic,V中一共m个词):
      

      对每个D中的文档d,对应到不同topic的概率θd<pt1,...,ptk>,其中,pti表示d对应T中第i个topic的概率。计算方法很直观,就是pti= nti/n,其中nti表示d中对应第i个topic的词的数目,n是d中所有词的总数。

      对于每个T中的topic,生成不同单词的概率φt<pw1,pw2,....,pwm>,其中,pwi表示t生成V中第i个单词的概率。计算方法同样很直观,pwi = Nwi/N,其中Nwi表示对应到topic的V中第i个单词的数目,N表示所有对应到topic的单词总数。

      LDA的核心公式如下:

      P(w|d) = P(w|t)*P(t|d)

      直观的看这个公式,就是以Topic作为中间层,可以通过当前的θd和φt,计算出文档d中出现单词w的概率。其中p(t|d)利用θd计算得到,p(w|t)利用φt计算得到。

    LDA参数的选取:

    1、经验值:aphla选择为 50/k,k为主题topic个数,beta一般选为0.01

    2、aphla使用贝叶斯估计,EM算法估计

    LDA模型应用:分析希拉里的邮件,看看希拉里平时都在聊一些什么东西

    首先,导入一些依赖库

    import numpy as np 
    import pandas as pd 
    import re 
    import numpy as np
    import pandas as pd
    import re
    
    # 数据预处理
    df = pd.read_csv('../email.csv')
    # 删除是Nan的字符
    df[['Id','Body']].dropna()
    
    def clean_email_text(text):
        text = text.replace('
    '," ")
        text = re.sub('-','',text)
        #text = re.sub()
    
        pure_text = ''
        for letter in text:
            # 只留下字母和空格
            if letter.isalpha() or letter == '':
                pure_text +=text
        text = ' '.join(word for word in text if len(word)>1)
        return text
    #建立新的一个colum
    docs =  df['ExtractedBodyText']
    docs = docs.apply(lambda s:clean_email_text(s))
    
    #把所有的邮件内容拿出来
    doclist = docs.values
    # LDA模型构建
    # 需要把文档转化为tokens模式
    # 引入库
    from gensim import corpora,models,similarities
    import gensim
    
    stoplist = ['the','....']
    
    #分词,英文根据空白处分割即可,中文可使用结巴分词
    texts = [[word for word in doc.lower().split() if word not in stoplist] for doc in doclist]
    
    #建立语料库
    dictionary = corpora.Dictionary(texts)
    corpus = [dictionary.doc2bow(text) for text in texts]
    
    #构建模型
    lda = gensim.models.ldamodel.LdaModel(corpus=corpus,id2word=dictionary,num_topics=20
                                    )
    #输出10号主题的关键词
    lda.print_topic(10,topn=5)
    #新文本预测,属于那个主题
    lda.get_document_topics(bow=corpus[0])
  • 相关阅读:
    spring boot redis 使用代码配置 redis的连接信息
    mysql Last_SQL_Error
    mysql relay log
    idea插件开发
    全网唯一正常能用的centos7 安装mysql5.7.35 22 33 25
    LVM逻辑卷管理器
    git提交代码
    数据中心统一网络实战:FCoE部署指南
    详解HBA、NIC与CNA的区别
    存储网络 – 了解FCoE的八个技术细节
  • 原文地址:https://www.cnblogs.com/lxw003/p/8551602.html
Copyright © 2011-2022 走看看