private void setVocabStatByTrueClusters(TFIDF dist, MatchData data) {
        // use the match data to reconstruct the true clusters
        Map<String,HashSet<Token>> tokensById = new HashMap<String,HashSet<Token>>();
        for (int i=0; i<data.numSources(); i++) {
            String src = data.getSource(i); 
            for (int j=0; j<data.numInstances(src); j++) {
                MatchData.Instance inst = data.getInstance(src,j);
                // increment the id-specific set of tokens
                String id = inst.getId();
                dist.prepare(inst.unwrap());
                Token[] toks = dist.getTokens();
                if (tokensById.get(id)==null) tokensById.put(id,new HashSet<Token>());
                //System.out.println("src: "+src+" instance: "+inst);
                for (int k=0; k<toks.length; k++) {
                    //System.out.println(" - token: "+toks[k]);
                    tokensById.get(id).add(toks[k]);
                }
            }
        }
        // count the df in each true cluster
        Map<Token,Integer> dfMap = new HashMap<Token,Integer>();
        for (Iterator it=tokensById.keySet().iterator(); it.hasNext(); ) {
            String docId = (String)it.next();
            for (Iterator jt = tokensById.get(docId).iterator(); jt.hasNext(); ) {
                Token t = (Token)jt.next();
                if (dfMap.get(t)==null) dfMap.put(t,new Integer(0));
                dfMap.put(t, new Integer(dfMap.get(t).intValue()+1));
            }
        }
        // transfer the df's to the distance
        for (Iterator it=dfMap.keySet().iterator(); it.hasNext(); ) {
            Token t = (Token)it.next();
            int df = dfMap.get(t).intValue();
            dist.setDocumentFrequency(t, df);
            //if (df>1) System.out.println("set df " +t + " => "+df);
        }
        //System.out.println("set Ndocs => " + dfMap.keySet().size());
        dist.setCollectionSize( dfMap.keySet().size() );
        System.out.println("** DFs set by true clusters **");
    }