title: Mallet topic model example can not compile
body: <p>I want to compile mallet in my Java (instead using the command line), so I include the jar in my project, and cite the code of the example from: <a href="http://mallet.cs.umass.edu/topics-devel.php">http://mallet.cs.umass.edu/topics-devel.php</a>, however, when I run this code, there is error that :</p>
  
  <pre><code>Exception in thread "main" java.lang.NoClassDefFoundError: gnu/trove/TObjectIntHashMap
      at cc.mallet.types.Alphabet.&lt;init&gt;(Alphabet.java:51)
      at cc.mallet.types.Alphabet.&lt;init&gt;(Alphabet.java:70)
      at cc.mallet.pipe.TokenSequence2FeatureSequence.&lt;init&gt;    (TokenSequence2FeatureSequence.java:35)
  at mallet.TopicModel.main(TopicModel.java:25)
  Caused by: java.lang.ClassNotFoundException: gnu.trove.TObjectIntHashMap
  at java.net.URLClassLoader$1.run(Unknown Source)
  at java.net.URLClassLoader$1.run(Unknown Source)
  at java.security.AccessController.doPrivileged(Native Method)
  at java.net.URLClassLoader.findClass(Unknown Source)
  at java.lang.ClassLoader.loadClass(Unknown Source)
  at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
  at java.lang.ClassLoader.loadClass(Unknown Source)
  ... 4 more
  </code></pre>
  
  <p>I am not sure what causes the error. Could anyone help?</p>
  
  <pre><code>package mallet;
  
  import cc.mallet.util.*;
  import cc.mallet.types.*;
  import cc.mallet.pipe.*;
  import cc.mallet.pipe.iterator.*;
  import cc.mallet.topics.*;
  
  import java.util.*;
  import java.util.regex.*;
  import java.io.*;
  
  public class TopicModel {
  
  public static void main(String[] args) throws Exception {
  
      String filePath = "D:/ap.txt";
      // Begin by importing documents from text to feature sequences
      ArrayList&lt;Pipe&gt; pipeList = new ArrayList&lt;Pipe&gt;();
  
      // Pipes: lowercase, tokenize, remove stopwords, map to features
      pipeList.add( new CharSequenceLowercase() );
      pipeList.add( new CharSequence2TokenSequence(Pattern.compile("\\p{L}[\\p{L}\\p{P}]+\\p{L}")) );
      pipeList.add( new TokenSequenceRemoveStopwords(new File("stoplists/en.txt"), "UTF-8", false, false, false) );
      pipeList.add( new TokenSequence2FeatureSequence() );
  
      InstanceList instances = new InstanceList (new SerialPipes(pipeList));
  
      Reader fileReader = new InputStreamReader(new FileInputStream(new File(filePath)), "UTF-8");
      instances.addThruPipe(new CsvIterator (fileReader, Pattern.compile("^(\\S*)[\\s,]*(\\S*)[\\s,]*(.*)$"),
                                             3, 2, 1)); // data, label, name fields
  
      // Create a model with 100 topics, alpha_t = 0.01, beta_w = 0.01
      //  Note that the first parameter is passed as the sum over topics, while
      //  the second is 
      int numTopics = 100;
      ParallelTopicModel model = new ParallelTopicModel(numTopics, 1.0, 0.01);
  
      model.addInstances(instances);
  
      // Use two parallel samplers, which each look at one half the corpus and combine
      //  statistics after every iteration.
      model.setNumThreads(2);
  
      // Run the model for 50 iterations and stop (this is for testing only, 
      //  for real applications, use 1000 to 2000 iterations)
      model.setNumIterations(50);
      model.estimate();
  
      // Show the words and topics in the first instance
  
      // The data alphabet maps word IDs to strings
      Alphabet dataAlphabet = instances.getDataAlphabet();
  
      FeatureSequence tokens = (FeatureSequence) model.getData().get(0).instance.getData();
      LabelSequence topics = model.getData().get(0).topicSequence;
  
      Formatter out = new Formatter(new StringBuilder(), Locale.US);
      for (int position = 0; position &lt; tokens.getLength(); position++) {
          out.format("%s-%d ", dataAlphabet.lookupObject(tokens.getIndexAtPosition(position)), topics.getIndexAtPosition(position));
      }
      System.out.println(out);
  
      // Estimate the topic distribution of the first instance, 
      //  given the current Gibbs state.
      double[] topicDistribution = model.getTopicProbabilities(0);
  
      // Get an array of sorted sets of word ID/count pairs
      ArrayList&lt;TreeSet&lt;IDSorter&gt;&gt; topicSortedWords = model.getSortedWords();
  
      // Show top 5 words in topics with proportions for the first document
      for (int topic = 0; topic &lt; numTopics; topic++) {
          Iterator&lt;IDSorter&gt; iterator = topicSortedWords.get(topic).iterator();
  
          out = new Formatter(new StringBuilder(), Locale.US);
          out.format("%d\t%.3f\t", topic, topicDistribution[topic]);
          int rank = 0;
          while (iterator.hasNext() &amp;&amp; rank &lt; 5) {
              IDSorter idCountPair = iterator.next();
              out.format("%s (%.0f) ", dataAlphabet.lookupObject(idCountPair.getID()), idCountPair.getWeight());
              rank++;
          }
          System.out.println(out);
      }
  
      // Create a new instance with high probability of topic 0
      StringBuilder topicZeroText = new StringBuilder();
      Iterator&lt;IDSorter&gt; iterator = topicSortedWords.get(0).iterator();
  
      int rank = 0;
      while (iterator.hasNext() &amp;&amp; rank &lt; 5) {
          IDSorter idCountPair = iterator.next();
          topicZeroText.append(dataAlphabet.lookupObject(idCountPair.getID()) + " ");
          rank++;
      }
  
      // Create a new instance named "test instance" with empty target and source fields.
      InstanceList testing = new InstanceList(instances.getPipe());
      testing.addThruPipe(new Instance(topicZeroText.toString(), null, "test instance", null));
  
      TopicInferencer inferencer = model.getInferencer();
      double[] testProbabilities = inferencer.getSampledDistribution(testing.get(0), 10, 1, 5);
      System.out.println("0\t" + testProbabilities[0]);
  }
  </code></pre>
  
  <p>}</p>