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


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


版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011060119/article/details/49902231

Python 数据挖掘与机器学习进阶实训-1

-
  • 1970年01月01日 08:00

LDA模型学习(代码)

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

主题模型TopicModel:LDA编程实现

http://blog.csdn.net/pipisorry/article/details/45771045 LDA的python实现 LDA的c/c++实现
  • pipisorry
  • pipisorry
  • 2015-05-16 20:53:35
  • 8845

Mallet使用遇到的问题

由于做项目的需要,需要使用Mallet来对数据进行分类及对比。 我们使用的Mallet是2.0.7版本的,这个版本是支持SVMLight format的数据的,正好符合我们的需要。 但是,按照ht...
  • ztk3939339
  • ztk3939339
  • 2013-04-25 17:56:05
  • 1472

mallet之命令行工具

谢谢 分享能不能在详细点原文地址:mallet之命令行工具作者:章芝青mallet在目录/bin下面提供的是shell scripts,本文介绍的是在MyEclipse中使用命令行工具运行分类程序。 ...
  • kobe00712
  • kobe00712
  • 2014-10-28 11:23:24
  • 548

MALLET中的话题模型

1.Training
 a
 Topic
ModelParallelTopicModel lda = new ParallelTopicModel(8); lda.addInstances(in...
  • QIBAOYUAN
  • QIBAOYUAN
  • 2011-03-27 20:04:00
  • 2549

mallet在eclipse下安装

mallet是LDA主题模型的一款开源工具,普通的安装(在win7下)直接上官网教程即可,见链接:Getting Started with Topic Modeling and MALLET 为了方便...
  • u014048459
  • u014048459
  • 2014-12-22 21:47:58
  • 644

MALLET预测

public void testPredict() throws Exception { CRF crf = (CRF) FileUtils.readObject(new File("web.m...
  • QIBAOYUAN
  • QIBAOYUAN
  • 2011-03-31 10:33:00
  • 696

MALLET中instance的data

 1.在public Instance pipe(Instance carrier)的构造函数中,打印部分注释为:Swapping order, since data often has a newl...
  • QIBAOYUAN
  • QIBAOYUAN
  • 2011-04-02 20:29:00
  • 868

自然语言处理工具包MALLET教程-中文版安装使用指南

Mallet:自然语言处理工具包   MALLET是基于java的自然语言处理工具箱,包括分档得分类、句类、主题模型、信息抽取等其他机器学习在文本方面的应用,虽然是文本的应用,但是完全可以拿到多媒体方...
  • u012140492
  • u012140492
  • 2016-03-14 22:46:31
  • 2048
收藏助手
不良信息举报
您举报文章:mallet 简析 1
举报原因:
原因补充:

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