public DecisionTreeBuilder(List<Map<String, Object>> ds) {
        sourceDataSet = ds; sourceParams = new HashMap<String, ArrayList<String>>();
        HashMap<String, ArrayList<String>> paramsDn = new HashMap<String, ArrayList<String>>();

        for(Map<String, Object> sourceData : sourceDataSet) {
            for(Map.Entry<String, Object> e : sourceData.entrySet()) {
                String key = e.getKey(); Object value = e.getValue();
                if(!key.equals("direction")
                        && !key.equals("partOfSpeech1")
                        && !key.equals("partOfSpeech2")) {
                    if(!paramsDn.containsKey(key)) paramsDn.put(key, new ArrayList<String>());
                    paramsDn.get(key).add((String) value);
                }
            }
        }

        for(Map.Entry<String, ArrayList<String>> e : paramsDn.entrySet()) {
            String key = e.getKey(); ArrayList<String> value = e.getValue();
            Set<String> unique = new HashSet<String>(value);

            if(unique.size() > 1) {
                sourceParams.put(key, new ArrayList<String>(unique));
            }
        }
    }