// Path: src/main/java/vn/vitk/util/TokenNormalizer.java
// public class TokenNormalizer {
// 
// 	static Pattern number = Pattern.compile("^([\\+\\-\\.,]?([0-9]*)?[0-9]+([\\.,]\\d+)*[%°]?)$"); 
// 	static Pattern punctuation = Pattern.compile("^([\\?!\\.:;,\\-\\+\\*\"'\\(\\)\\[\\]\\{\\}]+)$");
// 	static Pattern email = Pattern.compile("^(\\w[\\-\\._\\w]*\\w@\\w[\\-\\._\\w]*\\w\\.\\w{2,3})$");
// 	static Pattern date = Pattern.compile("^(\\d+[\\-\\./]\\d+([\\-\\./]\\d+)?)$|^(năm_)\\d+$");
// 	static Pattern code = Pattern.compile("^(\\d+[\\-\\._/]?[\\w\\W\\-\\._/]+)$|^([\\w\\W\\-\\._/]+\\d+[\\-\\._/\\d]*[\\w\\W]*)$");
// 	static Pattern website = Pattern.compile("^(\\w+\\.\\w+)(/\\w*)*$");
// 	static Pattern xmlTag = Pattern.compile("^</?\\w+>$");
// 	
// 	
// 	private static boolean isNumber(String token) {
// 		return number.matcher(token).matches();
// 	}
// 
// 	private static boolean isPunctuation(String token) {
// 		return punctuation.matcher(token).matches();
// 	}
// 	
// 	private static boolean isEmail(String token) {
// 		return email.matcher(token).matches();
// 	}
// 
// 	private static boolean isDate(String token) {
// 		return date.matcher(token).matches();
// 	}
// 	
// 	private static boolean isCode(String token) {
// 		return code.matcher(token).matches();
// 	}
// 
// 	private static boolean isWebsite(String token) {
// 		return website.matcher(token).matches();
// 	}
// 
// 	private static boolean isTag(String token) {
// 		return xmlTag.matcher(token).matches();
// 	}
// 	
// 	/**
// 	 * Normalizes the token.
// 	 * @param token
// 	 * @return a normalized token.
// 	 */
// 	public static String normalize(String token) {
// 		if (isNumber(token))
// 			return "1000";
// 		if (isPunctuation(token))
// 			return "PUNCT";
// 		if (isEmail(token))
// 			return "EMAIL";
// 		if (isDate(token))
// 			return "DATE";
// 		if (isCode(token))
// 			return "CODE";
// 		if (isWebsite(token))
// 			return "WEBSITE";
// 		if (isTag(token))
// 			return "XMLTAG";
// 		return token;
// 	}
// 	
// }


import java.util.ArrayList;
import java.util.List;
import vn.vitk.util.TokenNormalizer;
		public String extract(Configuration configuration) {
			int n = configuration.getQueue().size();
			if (n < 2) {
				return "tq1:NULL";
			}
			Integer q1 = configuration.getQueue().toArray(new Integer[n])[1];
			return "tq1:" + configuration.getSentence().getTag(q1);
		}
	}
	
	class Queue01Tags implements Extractor {
		@Override
		public String extract(Configuration configuration) {
			Integer q0 = configuration.getQueue().peek();
			String tq0 = configuration.getSentence().getTag(q0);
			int n = configuration.getQueue().size();
			if (n < 2) {
				return "tq0+tq1:" + tq0 + "+NULL";
			}
			Integer q1 = configuration.getQueue().toArray(new Integer[n])[1];
			String tq1 = configuration.getSentence().getTag(q1);
			return "tq0+tq1:" + tq0 + '+' + tq1;
		}
	}
	
	class Stack0Token implements Extractor {
		@Override
		public String extract(Configuration configuration) {
			Integer s0 = configuration.getStack().peek();
			String token = configuration.getSentence().getToken(s0); 
// Path: src/main/java/vn/vitk/util/TokenNormalizer.java
// public class TokenNormalizer {
// 
// 	static Pattern number = Pattern.compile("^([\\+\\-\\.,]?([0-9]*)?[0-9]+([\\.,]\\d+)*[%°]?)$"); 
// 	static Pattern punctuation = Pattern.compile("^([\\?!\\.:;,\\-\\+\\*\"'\\(\\)\\[\\]\\{\\}]+)$");
// 	static Pattern email = Pattern.compile("^(\\w[\\-\\._\\w]*\\w@\\w[\\-\\._\\w]*\\w\\.\\w{2,3})$");
// 	static Pattern date = Pattern.compile("^(\\d+[\\-\\./]\\d+([\\-\\./]\\d+)?)$|^(năm_)\\d+$");
// 	static Pattern code = Pattern.compile("^(\\d+[\\-\\._/]?[\\w\\W\\-\\._/]+)$|^([\\w\\W\\-\\._/]+\\d+[\\-\\._/\\d]*[\\w\\W]*)$");
// 	static Pattern website = Pattern.compile("^(\\w+\\.\\w+)(/\\w*)*$");
// 	static Pattern xmlTag = Pattern.compile("^</?\\w+>$");
// 	
// 	
// 	private static boolean isNumber(String token) {
// 		return number.matcher(token).matches();
// 	}
// 
// 	private static boolean isPunctuation(String token) {
// 		return punctuation.matcher(token).matches();
// 	}
// 	
// 	private static boolean isEmail(String token) {
// 		return email.matcher(token).matches();
// 	}
// 
// 	private static boolean isDate(String token) {
// 		return date.matcher(token).matches();
// 	}
// 	
// 	private static boolean isCode(String token) {
// 		return code.matcher(token).matches();
// 	}
// 
// 	private static boolean isWebsite(String token) {
// 		return website.matcher(token).matches();
// 	}
// 
// 	private static boolean isTag(String token) {
// 		return xmlTag.matcher(token).matches();
// 	}
// 	
// 	/**
// 	 * Normalizes the token.
// 	 * @param token
// 	 * @return a normalized token.
// 	 */
// 	public static String normalize(String token) {
// 		if (isNumber(token))
// 			return "1000";
// 		if (isPunctuation(token))
// 			return "PUNCT";
// 		if (isEmail(token))
// 			return "EMAIL";
// 		if (isDate(token))
// 			return "DATE";
// 		if (isCode(token))
// 			return "CODE";
// 		if (isWebsite(token))
// 			return "WEBSITE";
// 		if (isTag(token))
// 			return "XMLTAG";
// 		return token;
// 	}
// 	
// }


// Path: src/main/java/vn/vitk/dep/FeatureExtractor.java
import java.util.ArrayList;
import java.util.List;
import vn.vitk.util.TokenNormalizer;

		public String extract(Configuration configuration) {
			int n = configuration.getQueue().size();
			if (n < 2) {
				return "tq1:NULL";
			}
			Integer q1 = configuration.getQueue().toArray(new Integer[n])[1];
			return "tq1:" + configuration.getSentence().getTag(q1);
		}
	}
	
	class Queue01Tags implements Extractor {
		@Override
		public String extract(Configuration configuration) {
			Integer q0 = configuration.getQueue().peek();
			String tq0 = configuration.getSentence().getTag(q0);
			int n = configuration.getQueue().size();
			if (n < 2) {
				return "tq0+tq1:" + tq0 + "+NULL";
			}
			Integer q1 = configuration.getQueue().toArray(new Integer[n])[1];
			String tq1 = configuration.getSentence().getTag(q1);
			return "tq0+tq1:" + tq0 + '+' + tq1;
		}
	}
	
	class Stack0Token implements Extractor {
		@Override
		public String extract(Configuration configuration) {
			Integer s0 = configuration.getStack().peek();
			String token = configuration.getSentence().getToken(s0); 
			return "ws0:" + TokenNormalizer.normalize(token);