code: protected boolean trainCorpus(List<List<Acronym>> corpus, List<Map<String, String>> trueLabels){
  		boolean converge = false;
  		
  		// Unsupervised
  		trueLabels = null;
  
  		initModelParamsAndCounters();
  
  		int n = corpus.size();
  
  		int c = 1;
  		Double change; 
  
  		LOG.debug("Training abbreviations...");
  		while(!converge){
  
  			for (int i = 0; i < n; i++) {
  				List<Acronym> docAcronyms = corpus.get(i);
  				Map<String, String> docTrueLabels = null;
  				if(trueLabels != null)
  					docTrueLabels = trueLabels.get(i);
  				int m = docAcronyms.size();
  				for (int j = 0; j < m; j++) {
  					Acronym currAcronym = docAcronyms.get(j);
  					if(trueLabels != null)
  						expectationStep(currAcronym, docTrueLabels.get(currAcronym._shortForm));
  					else
  						expectationStep(currAcronym, null);
  				}
  			}
  
  			change = maximizationStep();
  			LOG.debug("step {}...",c);
  
  			c++;
  			if(c > MAX_ITERATIONS){
  				System.out.println("\n\tTraining stopped after "+(c-1)+" iterations with final change: "+change);
  				converge = true;
  			}
  			if(change.compareTo(CHANGE_THRESHOLD) < 0){
  				LOG.debug("Training converged in "+(c-1)+" iterations.");
  				converge = true;
  			}
  		}
  		saveModelParams();
  		return true;
  	}
docs: Gets training examples separated by documents