docs: public ArrayList<String> getFeatures() {
  		if (isFinalState())
  			return null;
  		ArrayList<String> featurelist = new ArrayList<String>();
  
  		int rightFocus = leftFocus + 1;
  
  //		ISparseVector vec = new HashSparseVector();
  		//所有的联合feature
  		featurelist.add(combinedFeature("+0+1", POS, new int[]{0, 1}));
  		featurelist.add(combinedFeature("-1+0+1", POS, new int[]{-1, 0, 1}));
  		featurelist.add(combinedFeature("+0+1+2", POS, new int[]{0, 1, 2}));
  		featurelist.add(combinedFeature("+1+2+3", POS, new int[]{1, 2, 3}));
  		featurelist.add(combinedFeature("-2+3+4", POS, new int[]{2, 3, 4}));
  		featurelist.add(combinedFeature("+0+1", LEX, new int[]{0, 1}));
  		featurelist.add(combinedFeature("-1+0+1", LEX, new int[]{-1, 0, 1}));
  		featurelist.add(combinedFeature("+0+1+2", LEX, new int[]{0, 1, 2}));
  
  		// 设定上下文窗口大小
  		int l = 2;
  		int r = 4;
  		for (int i = 0; i <= l; i++) {
  			// 特征前缀
  			String posFeature = "-" + String.valueOf(i) + POS;
  			String lexFeature = "-" + String.valueOf(i) + LEX;
  
  			String lcLexFeature = "-" + String.valueOf(i)
  					+ CH_L_LEX;
  			String lcPosFeature = "-" + String.valueOf(i)
  					+ CH_L_POS;
  			String rcLexFeature = "-" + String.valueOf(i)
  					+ CH_R_LEX;
  			String rcPosFeature = "-" + String.valueOf(i)
  					+ CH_R_POS;
  			String lcDepFeature = "-" + String.valueOf(i)
  					+ CH_L_DEP;			
  			String rcDepFeature = "-" + String.valueOf(i)
  					+ CH_R_DEP;
  
  			if (leftFocus - i < 0) {
  				featurelist.add(lexFeature + START + String.valueOf(i - leftFocus));
  				featurelist.add(posFeature + START + String.valueOf(i - leftFocus));
  			} else {
  				featurelist.add(lexFeature + sent.words[trees.get(leftFocus - i).id]);
  				featurelist.add(posFeature + sent.tags[trees.get(leftFocus - i).id]);
  
  				if (trees.get(leftFocus - i).leftChilds.size() != 0) {
  					for (int j = 0; j < trees.get(leftFocus - i).leftChilds
  							.size(); j++) {
  						int leftChildIndex = trees.get(leftFocus - i).leftChilds
  								.get(j).id;
  						featurelist.add(lcLexFeature
  								+ sent.words[leftChildIndex]);
  						featurelist.add(lcPosFeature
  								+ sent.tags[leftChildIndex]);
  						featurelist.add(lcDepFeature
  								+ sent.getDepClass(leftChildIndex));
  					}
  				}else{
  					featurelist.add(lcLexFeature + NULL);
  					featurelist.add(lcPosFeature + NULL);
  				}
  
  				if (trees.get(leftFocus - i).rightChilds.size() != 0) {
  					for (int j = 0; j < trees.get(leftFocus - i).rightChilds
  							.size(); j++) {
  						int rightChildIndex = trees.get(leftFocus - i).rightChilds
  								.get(j).id;
  						featurelist.add(rcLexFeature
  								+ sent.words[rightChildIndex]);
  						featurelist.add(rcPosFeature
  								+ sent.tags[rightChildIndex]);
  						featurelist.add(rcDepFeature
  								+ sent.getDepClass(rightChildIndex));
  					}
  				}else{
  					featurelist.add(rcLexFeature + NULL);
  					featurelist.add(rcPosFeature + NULL);
  				}
  			}
  		}
  
  		for (int i = 0; i <= r; i++) {
  			String posFeature = "+" + String.valueOf(i) + POS;
  			String lexFeature = "+" + String.valueOf(i) + LEX;
  
  			String lcLexFeature = "+" + String.valueOf(i)
  					+ CH_L_LEX;
  			String rcLexFeature = "+" + String.valueOf(i)
  					+ CH_R_LEX;
  			String lcPosFeature = "+" + String.valueOf(i)
  					+ CH_L_POS;			
  			String rcPosFeature = "+" + String.valueOf(i)
  					+ CH_R_POS;
  			String lcDepFeature = "+" + String.valueOf(i)
  					+ CH_L_DEP;			
  			String rcDepFeature = "+" + String.valueOf(i)
  					+ CH_R_DEP;
  
  			if (rightFocus + i >= trees.size()) {
  				featurelist.add(lexFeature+ END+ String.valueOf(rightFocus + i- trees.size() + 3));
  				featurelist.add(posFeature+ END+ String.valueOf(rightFocus + i- trees.size() + 3));
  			} else {
  				featurelist.add(lexFeature+ sent.words[trees.get(rightFocus + i).id]);
  				featurelist.add(posFeature+ sent.tags[trees.get(rightFocus + i).id]);
  
  				if (trees.get(rightFocus + i).leftChilds.size() != 0) {
  					for (int j = 0; j < trees.get(rightFocus + i).leftChilds
  							.size(); j++) {
  						int leftChildIndex = trees.get(rightFocus + i).leftChilds
  								.get(j).id;
  						featurelist.add(lcLexFeature+ sent.words[leftChildIndex]);
  						featurelist.add(lcPosFeature+ sent.tags[leftChildIndex]);
  						featurelist.add(lcDepFeature+ sent.getDepClass(leftChildIndex));
  					}
  				}else{
  					featurelist.add(lcLexFeature + NULL);
  					featurelist.add(lcPosFeature + NULL);
  				}
  
  				if (trees.get(rightFocus + i).rightChilds.size() != 0) {
  					for (int j = 0; j < trees.get(rightFocus + i).rightChilds
  							.size(); j++) {
  						int rightChildIndex = trees.get(rightFocus + i).rightChilds
  								.get(j).id;
  						featurelist.add(rcLexFeature+ sent.words[rightChildIndex]);
  						featurelist.add(rcPosFeature+ sent.tags[rightChildIndex]);
  						featurelist.add(rcDepFeature+ sent.getDepClass(rightChildIndex));
  					}
  				}else{
  					featurelist.add(rcLexFeature + NULL);
  					featurelist.add(rcPosFeature + NULL);
  				}
  			}
  		}
  		
  		
  		return featurelist;
  	}