mallet 简析 1

原创 2015年11月18日 09:12:25

    

         最近一直在学习LDA 看来blei的C代码和matlab代码,matlab 的速度真是慢的不行,找到了MALLET ,想看详细分析,可惜网上大都是mallet的使用,自己就按照自己的理解把其过程简要的写出来。mallet 网址: http://mallet.cs.umass.edu/topics.php

          数据下载网址: http://www.nsf.gov/awardsearch/download.jsp

          其中topic-modeling-tool (http://code.google.com/p/topic-modeling-tool/ )是实现LDA过程的一个界面程序,配置好环境之后,运行界面如下:

    1、 在TopicModelingTool.java  的 m.invoke(null, passeArgs) 处将要处理的文档整合为mallet文件,文档的处理在自己没有选择stopword文件的时候去掉默认的stopword。 并对单词进行编号。

    2、在vectors2Topics.java 的 403 行的  training = InstanceList.load (new File(inputFile.value)); 读入数据,每篇文档以【word   wordid 】的方式。

           数据读入之后开始新建模型,初始化模型在该类别的422行: topicModel = new ParallelTopicModel (numTopics.value, alpha.value, beta.value);   初始化在parallelTopicModel.java 的118行,传入的参数为:numtopic 、sum-alpha、 beta.。 [初始化alpha=50,将此值赋给alphasum, 然后alpha = alpahsum / numtopics]

          初始化模型的过程:              
        this.data = new ArrayList<TopicAssignment>();
        this.topicAlphabet = topicAlphabet;
        this.numTopics = topicAlphabet.size();

        if (Integer.bitCount(numTopics) == 1) {
            // exact power of 2
            topicMask = numTopics - 1;
            topicBits = Integer.bitCount(topicMask);
        }
        else {
            // otherwise add an extra bit
            topicMask = Integer.highestOneBit(numTopics) * 2 - 1;
            topicBits = Integer.bitCount(topicMask);
        }


        this.alphaSum = alphaSum;
        this.alpha = new double[numTopics];
        Arrays.fill(alpha, alphaSum / numTopics);
        this.beta = beta;
        
        tokensPerTopic = new int[numTopics];
        
        formatter = NumberFormat.getInstance();
        formatter.setMaximumFractionDigits(5);

        logger.info("Mallet LDA: " + numTopics + " topics, " + topicBits + " topic bits, " +
                    Integer.toBinaryString(topicMask) + " topic mask");
   

      topicMask、topicBits 以及模型的alpha、alphasum、 beta 、tokensPerTopic (每个topic中单词个数)

3、将训练集加入到模型中开始训练:该java代码的427行。跳转到ParallelTopicModel.java 的 217 行。随机的为每个文档中的单词初始化一个topic ,并更新topic-counts,

          public void addInstances (InstanceList training) {

        alphabet = training.getDataAlphabet();        //   模型的单词集合
        numTypes = alphabet.size();               //  V
        
        betaSum = beta * numTypes;                 // V*beta

        Randoms random = null;
        if (randomSeed == -1) {
            random = new Randoms();
        }
        else {
            random = new Randoms(randomSeed);
        }

        for (Instance instance : training) {
            FeatureSequence tokens = (FeatureSequence) instance.getData();//文档中的单词以及标号
            LabelSequence topicSequence =
                new LabelSequence(topicAlphabet, new int[ tokens.size() ]); //初始的时候全都归到topic0中
            
            int[] topics = topicSequence.getFeatures();
            for (int position = 0; position < topics.length; position++) {

                int topic = random.nextInt(numTopics);   //此处也是随机的赋予了一个标号
                topics[position] = topic;
                
            }

            TopicAssignment t = new TopicAssignment(instance, topicSequence);
            data.add(t);
        }
        
        buildInitialTypeTopicCounts();
        initializeHistograms();
    }


4、开始采样: Vectors2Topics  的line 453 :  topicModel.estimate();

      estimate()方法在  ParallelTopicModel  只有一个线程举例:

      line 746:

        runnables[0] = new WorkerRunnable(numTopics, alpha, alphaSum, beta,   random, data,  typeTopicCounts, tokensPerTopic,  offset, docsPerThread); 

     将参数传入模型中。
    Line  862 

      runnables[0].run();  

     WoekerRunnable.java  line 275: 针对每个文档采样,其中tokenSequence 是 文档中的单词序列,topicSequence是文档中单词所属类别的标号。


要去上课了,晚上回来再继续写采样部分。


版权声明:本文为博主原创文章,未经博主允许不得转载。

LDA模型学习(代码)

为了把LDA算法用于文本聚类,我真的是绞尽脑汁。除了去看让我头大的概率论、随机过程、高数这些基础的数学知识,还到网上找已经实现的源代码。      最先让我看到署光的是Mallet,我研究了大概...

展讯android智能机平台FDL1,FDL2,SPL文件下载问题简析

首先,开启下吐槽模式。兄弟我的生活压力这么大,上班被老板喷,下班被老婆喷,不让我在这里对着网络喷,释放下压力,生活还有什么意义? 新年过去了,一年一度的两会又召开了。我们这帮民工又要开始上钟了。 富人...

MTK IMS框架简析(1)——代码架构及模块初始化

1.前言随着4G技术的诞生和国内运营商网络的全面升级,以往流量贵上网慢的问题不再有,而类似微信这类即时通讯软件也得到快速的普及,互联网行业的发展还延伸到金融/零售等线上线下的各行各业,短短几年内国内I...

<2>Android Camera 架构简析1

转载来自:http://rnmichelle.blog.51cto.com/2729211/491743 Android Camera 架构简析1 1.   前言 最近整体看了一下Andro...

DUKPT算法简析-1

神马是DUKPT?简单来说,DUKPT(Derived Unique Key Per Transaction)是被ANSI定义的一套密钥管理体系和算法,用于解决金融支付领域的信息安全传输中的密钥管理问...

LCD设备驱动 --- 帧缓冲(简析1)

帧缓冲(framebuffer)是Linux系统为显示设备提供的一个接口,它将显示缓冲区抽象,屏蔽图像硬件的底层差异,允许上层应用程序在图形模式下直接对显示缓冲区进行读写操作。帧缓冲设备为标准字符设备...

PowerPC汇编指令集简析-(1)

在了解PowerPC汇编指令前,需要先看下编程所用的寄存器模型,PowerPC系统结构为大多数运算指令都定义了Register-Register的操作,这些操作的源操作数从寄存器取得,或作为嵌入指令操...
  • JuanA1
  • JuanA1
  • 2011年09月25日 14:33
  • 14608

MTK IMS框架简析(1)——代码架构及模块初始化

1.前言 随着4G技术的诞生和国内运营商网络的全面升级,以往流量贵上网慢的问题不再有,而类似微信这类即时通讯软件也得到快速的普及,互联网行业的发展还延伸到金融/零售等线上线下的各行各业,短短几年内国...

S3C2440驱动简析——DM9000网卡驱动(1)

继续分析内核自带的驱动源码,这次目标直指DM9000网卡驱动,2000行的驱动代码~~我们不能被表象所吓倒(虽然比起之前的驱动难度的确更大),根据之前掌握的知识和对网卡硬件的学习,我们还是要有信心去征...

sam 百度面经中的问题简析 (1)

昨天工作室的大前端SA
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:mallet 简析 1
举报原因:
原因补充:

(最多只允许输入30个字)