LDA主题模型代码实现流程

LDA主题模型的原理,推导过程比较复杂,可以参考此链接,讲的比较详细:http://www.52nlp.cn/lda-math-mcmc-%E5%92%8C-gibbs-sampling1

 

本文主要是通过阅读别人实现的LAD主题模型代码,总结的一个实现流程,供别人想实现LAD时可作参考,如若有何错误,麻烦请指出:

LDA代码流程:
(1) 先对文档切词,然后对每个词语赋ID编号0~(n-1),计算共有n个词,m个文档
(2) 参数,变量设置:
    K 主题数
    beta  β
    alpha  α
    iter_times 迭代次数
    top_words_num  每个主题特征词个数
    p,概率向量,double类型,存储采样的临时变量,长度为主题数
    nw,词word在主题上的分布数,长度为[n][K]
    nwsum,每个主题的词的总数,长度为[K]
    nd,每个文档中各个主题的词的总数,长度为[m][K]
    ndsum,每个文档中词的总数,长度为[m]
    Z,文档中各个词的所属主题,长度为[m][各个文档的词个数]
    theta,长度为[m][K] 文章-主题分布
    phi,长度为[K][n] 词-主题分布
(3) 初始化
    先为各个文档里的单词随机分配主题
    for i to 文档数:
        ndsum[i] = 文档i的单词数
        for j to 文档i的单词数:
             随机主题topic
             Z[i][j] = topic
             nw[词的ID编号][topic] += 1
             nd[i][topic] += 1
             nwsum[topic] += 1
(4) 开始迭代
    迭代iter_times次:
        for i to 文档数:
            for j to 文档i的单词数:                
                topic = self.Z[i][j] 取出文档i中第j的单词的主题
                取出文档i中第j的单词的ID编号id,假设去除这个词后的主题分布
                nw[id][topic] -= 1
                nd[i][topic] -= 1
                nwsum[topic] -= 1
                ndsum[i] -= 1

                #计算每个主题的概率分布
                Vbeta = 单词数 * self.beta
                Kalpha = K * self.alpha
                p = (nw[id] + beta)/(nwsum + Vbeta)*(nd[i] + alpha) / (ndsum[i] + Kalpha)
                for k to K:
                    p[k] += p[k-1]

                随机一个概率u in (0,p[K-1])
                #如果转移概率大于u,则转移.
                for topic to K:
                    if p[k]>u:
                    break

                #确定文档i中的第j个单词的主题为topic,重新赋值
                nw[id][topic] +=1
                nwsum[topic] +=1
                nd[i][topic] +=1
                ndsum[i] +=1
(5) 计算文章-主题分布,计算词-主题分布
    for i to m:   #这文档各个主题的单词数除以这文档总的单词数
        theta[i] = (nd[i]+alpha)/(ndsum[i]+K * alpha)
    for i to K:   #这主题各个的单词的数量除以这主题总的单词数
        phi[i] = (nw.T[i]+beta)/(nwsum[i]+ n * beta)
(6) 取各个主题的前top_words_num个特征词
    循环phi,取每一行的前top_words_num的最大值的下标,将下表反编码成词语输出.

  • 8
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿也可以很哲学

让我尝下打赏的味道吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值