lda模型的python实现

  • LDA(Latent Dirichlet Allocation)是一种文档主题生成模型,最近看了点资料,准备使用python实现一下。至于数学模型相关知识,某度一大堆,这里也给出之前参考过的一个挺详细的文档lda算法漫游指南
  • 这篇博文只讲算法的sampling方法python实现。
  • 完整实现项目开源python-LDA

  • lda模型变量申请及初始化

#
#伪代码
#
输入:文章集合(分词处理后),K(类的个数)
输出:已经随机分派了一次的lda模型
begin
    申请几个统计量:
        p 概率向量 维度:K
        nw 词在类上的分布 维度:M*K 其中M为文章集合的词的总个数
        nwsum 每个类上的词的总数 维度:K
        nd 每篇文章中,各个类的词个数分布 维度:V*K 其中V为文章的总个数
        ndsum 每篇文章中的词的总个数 维度:V
        Z 每个词分派一个类 维度:V*每篇文章词的个数
        theta 文章->类的概率分布 维度:V*K
        phi 类->词的概率分布 维度:K*M

    #初始化随机分配类
    for x in 文章数:
        统计ndsum[文章id][词的个数]
        for y in 每篇文章的词个数:
            给所有词随机分派一个类
            词在此类上的分布数目+1
            此文章中此类的词的个数+1
            此类的总词数 +1

end
#
#实现代码片段,更详细看github项目
#
class LDAModel(object):

    def __init__(self,dpre):

        self.dpre = dpre #获取预处理参数

        #
        #模型参数
        #聚类个数K,迭代次数iter_times,每个类特征词个数top_words_num,超参数α(alpha) β(beta)
        #
        self.K = K
        self.beta = beta
        self.alpha = alpha
        self.iter_times = iter_times
        self.top_words_num = top_words_num
        #
        #文件变量
        #分好词的文件trainfile
        #词对应id文件wordidmapfile
        #文章-主题分布文件thetafile
        #词-主题分布文件phifile
        #每个主题topN词文件topNfile
        #最后分派结果文件tassginfile
        #模型训练选择的参数文件paramfile
        #
        self.wordidmapfile = wordidmapfile
        self.trainfile = trainfile
        self.thetafile = thetafile
        self.phifile = phifile
        self.topNfile = topNfile
        self.tassginfile = tassginfile
        self.paramfile = paramfile
        # p,概率向量 double类型,存储采样的临时变量
        # nw,词word在主题topic上的分布
        # nwsum,每各topic的词的总数
        # nd,每个doc中各个topic的词的总数
        # ndsum,每各doc中词的总数
        self.p = np.zeros(self.K)
        self.nw = np.zeros((self.dpre.words_count,self.K),dtype="int")
        self.nwsum = np.zeros(self.K,dtype="int")
        self.nd = np.zeros((self.dpre.docs_count,self.K),dtype="int")
        self.ndsum = np.zeros(dpre.docs_count,dtype="int")
        self.Z = np.array([ [0 for y in xrange(dpre.docs[x].length)] for x in xrange(dpre.docs_count)])        # M*doc.size(),文档中词的主题分布

        #随机先分配类型
        for x in xrange(len(self.Z)):
            self.ndsum[x] = self.dpre.docs[x].length
            for y in xrange(self.dpre.docs[x].length):
                topic = random.randint(0,self.K-1)
                self.Z[x][y] = topic
                self.nw[self.dpre.docs[x].words[y]][topic] += 1
                self.nd[x][topic] += 1
                self.nwsum[topic] += 1

        self.theta = np.array([ [0.0 for y in xrange(self.K)] for x in xrange(self.dpre.docs_count) ])
        self.phi = np.array([ [ 0.0 for y in xrange(self.dpre.words_count) ] for x in xrange(self.K)]) 
  • sampling抽样过程

#
#伪代码
#
输入:初始化后的lda_model,迭代次数iter_times,超参数α、β,聚类个数K
输出:theta(文章对应类的分布概率),phi(类对应词的分布概率),tassgin(文章中每个词的分派类结果),twords(每个类topN个高频词)
begin
    for i in 迭代次数:
        for m in 文章个数:
            for v in 文章中词:
                取topic = Z[m][v]
                令nw[v][topic]、nwsum[topic]、nd[m][topic]的统计量均-1
                计算概率p[] #p[]为此词属于每个topic的概率
                for k in (1,类的个数-1):
                    p[k] += p[k-1]
                再随机分派一次,记录被分派的新的topic
                令nw[v][new_topic]、nwsum[new_topic]、nd[m][new_topic]的统计量均+1

    #迭代完成后
    输出模型
end
#代码片段
    def sampling(self,i,j):

        topic = self.Z[i][j]
        word = self.dpre.docs[i].words[j]
        self.nw[word][topic] -= 1
        self.nd[i][topic] -= 1
        self.nwsum[topic] -= 1
        self.ndsum[i] -= 1

        Vbeta = self.dpre.words_count * self.beta
        Kalpha = self.K * self.alpha
        self.p = (self.nw[word] + self.beta)/(self.nwsum + Vbeta) *                  (self.nd[i] + self.alpha) / (self.ndsum[i] + Kalpha)
        for k in xrange(1,self.K):
            self.p[k] += self.p[k-1]

        u = random.uniform(0,self.p[self.K-1])
        for topic in xrange(self.K):
            if self.p[topic]>u:
                break

        self.nw[word][topic] +=1
        self.nwsum[topic] +=1
        self.nd[i][topic] +=1
        self.ndsum[i] +=1

        return topic


此实现为最基础的LDA模型实现,聚类个数K,和超参数的设置要靠人工输入,自动计算的版本会在以后研究。

时间: 2024-10-16 20:45:04

lda模型的python实现的相关文章

Python:电商产品评论数据情感分析,jieba分词,LDA模型

本节涉及自然语言处理(NLP),具体涉及文本数据采集.预处理.分词.去停用词.词频分析.LDA主题模型 代码部分 1 # -*- coding: utf-8 -*- 2 """ 3 Created on Mon Oct 1 12:13:11 2018 4 5 @author: Luove 6 """ 7 8 import os 9 import pandas as pd 10 import jieba 11 from gensim import

LSI和LDA模型初试验

从文本到向量 import csv # 出于试验目的,只读取前5条评论 with open('comments.csv', 'r', newline='') as f: comments_reader = csv.reader(f, dialect='excel') corpus = [comment[1] for comment in comments_reader][1:6] for i, comment in enumerate(corpus): print(i + 1, comment)

计算LDA模型困惑度

http://www.52nlp.cn/lda-math-lda-%E6%96%87%E6%9C%AC%E5%BB%BA%E6%A8%A1 LDA主题模型评估方法--Perplexity http://www.52nlp.cn/lda-math-lda-%E6%96%87%E6%9C%AC%E5%BB%BA%E6%A8%A1 LDA-math-LDA 文本建模 http://www.iyunv.com/thread-59890-1-1.html 用python计算lda语言模型的困惑度并作图 h

Django模型学习 --python的web开发

django是一个比较老牌而且功能也很强大的框架,虽然它有很多缺点,但还是决定先从这个框架入手学习.本系列是一个简单的学习笔记,供以后参考. 网站的后台原来是用PHP的CodeIgniter框架写的,数据库只有4个表,涉及最基本的产品的增删查改和切图等操作.现在换用django后,所有后台包括模板都得重写.虽然看起来工作量很大,但实际做起来也就花三天学了下django,然后再用三天把所有后台重写(不包括部署到蛋疼的SAE的繁琐过程),可见django的开发效率是如此之高. 1. 引言 1.1 简

Django模型开发 --python数据库连接

在Django中,视图负责处理一些业务逻辑,然后返回响应结果.在当代Web应用中,业务逻辑经常牵涉到与数据库的交互,在后台连接数据库服务器,从中取出一些数据,然后在Web页面用漂亮的格式展示这些数据.这个网站也可能会向访问者提供修改数据库数据的方法. 在这一篇博文中,我们将以MySQL数据库为例,先看看不使用Django模型的数据库查询方法,然后开始学习Django的模型. 1. 不使用模型的数据库查询方法 假如我们不采用Django的模型,如何从数据库中获取数据呢?通常的做法就是在视图(Vie

邮件发送模型及其Python应用实例

SMTP(Simple Mail Transfer Protocol) 制定: First:RFC 788 in 1981 Last:RFC 5321 in 2008 端口: TCP 25(SMTP), TCP 465/587(SMTP_SSL) 功能: 用户客户端: 发送消息:SMTP 接收和管理消息:POP3.IMAP 邮件服务器: 发送和接收消息:SMTP 说明: SMTP仅定义了消息传输格式(如消息发送者参数),而非消息内容(如消息头和消息体). 邮件发送模型 流程描述: (1)    

编写检测深度模型测试程序python

参考:https://blog.csdn.net/haoji007/article/details/81035565?utm_source=blogxgwz9 首先从网上下载imagenet训练好的模型,模型下载地址 http://dl.caffe.berkeleyvision.org/bvlc_googlenet.caffemodel 可以把模型放入/caffe-master/models/bvlc_googlenet/目录下 bvlc_googlenet目录就是官方提供的googlenet模

生产线平衡问题——知识点、Leapms模型及python应用

本文要点:(一)简述了基础工业工程中生产线平衡的知识 (二)用Leapms建模语言进行算例建模与求解 (三)用python画出先决关系图 (一)基础工业工程中生产线平衡简要知识点     流水生产的特点: 工作的专业化程度高 生产按节拍进行 工艺过程是封闭的 生产对象在工序间单向移动 工作地之间有传送装置连结    生产线平衡的概念:生产线平衡就是对生产的全部工序进行均衡化,调整作业负荷,以使各作业时间尽可能相近的技术手段与方法.    单品种流水线平衡方法 绘制装配生产线的流程图(紧前关系图)

动手实践用LDA模型计算两篇英文文档相似度

知道原理的同学这部分可以略过直接看实践部分 什么是TD-IDF? 构造文档模型 我们这里使用空间向量模型来数据化文档内容:向量空间模型中将文档表达为一个矢量. 用特征向量(T1,W1:T2,W2:T3, W3:…:Tn,Wn)表示文档. Ti是词条项,Wi是Ti在文档中的重要程度, 即将文档看作是由一组相互独立的词条组构成,把T1,T2 …,Tn看成一个n 维坐标系中的坐标轴,对于每一词条,根据其重要程度赋以一定的权值Wi,作为对应坐标轴的坐标值. 权重Wi用词频表示,词频分为绝对词频和相对词频