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是文档中单词所属类别的标号。


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


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

相关文章推荐

Windows CE SDHC驱动简析(1)-驱动架构(基于WinCE5.0 SMDK2410 BSP的SDHC驱动)

Windows CE的SD卡驱动包括总线驱动(bus driver),主控制器驱动(host controller driver)和客户端驱动(client driver). 总线驱动是客户端驱动和...

Android Camera 的架构简单简析1

Android Camera 架构简析1最近整体看了一下Android Camera 部分代码,从Framework的Camera 应用框架到 Hardware的Camera HAL 再到 Kerne...

uboot源码分析(1)uboot 命令解析流程简析

uboot 命令解析流程简析       uboot正常启动后,会调用main_loop(void)函数,进入main_loop()之后,如果在规定的时间(CONFIG_BOOTDELAY)内,没有...
  • sfrysh
  • sfrysh
  • 2011-10-27 11:00
  • 3923

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

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

Firefox OS 架构简析——(1)

Mozilla B2G现在它已经成长为 Firefox OS,是时候去看看的它的架构了。 本文脱胎自 B2G 官方 Wiki 页面,略过了其中代码示例的部分。为了方便理解,在部分描述时会跟当下流...

MVC1,MVC2简析

一般来说,可以把系统粗略的分为三个层次,视图层,简称为View,它负责数据的输出和输入;业务层,简称为Model,它代表程序的实际业务;控制层,简称为Controller,处理界面的相应并调用业务层进...

linux4.3.2 块设备驱动简析-1

通过xilinx的zynq的相关资源探究块设备驱动的实现原理和特性

(1)RIL简析(高通)——RIL如何启动及初始化

Android设置了RIL层,是上层framework与Modem沟通的桥梁。高通使用qcril作为其vendor-RIL,与modem之间使用QMI机制通讯。 分3篇分析下面的问题: RI...

<2>Android Camera 架构简析1

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

mapreduce系列(1)---入门案例深入分析以及切片源码简析

自定义一个mapreduce程序: FlowBean.java(实现hadoop的序列化)package lltj;import org.apache.hadoop.io.WritableCompa...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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