LDA之主题模型代码实现流程

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的最大值的下标,将下表反编码成词语输出.

 

 

本文内容来源于: LDA主题模型代码实现流程

LDA主题模型的原理,推导过程比较复杂,可以参考此链接

 

posted @ 2018-04-01 17:54  寒杰士  阅读(2435)  评论(0编辑  收藏  举报