@Override
		public Counter<String> extractFeatures(String instance) {
			int tagSpPosition, posSpPosition;
			tagSpPosition = instance.lastIndexOf(PREVIOUSTAGSEPERATOR);
			String previousTag = instance.substring(tagSpPosition + 1);
			instance = instance.substring(0, tagSpPosition);
			posSpPosition = instance.lastIndexOf(POSITIONSEPERATOR);
			// int wordPostion = Integer.parseInt(instance
			// .substring(posSpPosition + 1));
			instance = instance.substring(0, posSpPosition);
			Counter<String> features = new Counter<String>();
			// suffix
			char[] characters = instance.toCharArray();
			List<String> charList = new ArrayList<String>();
			for (int i = 0; i < characters.length; i++) {
				charList.add(String.valueOf(characters[i]));
			}
			BoundedList<String> boundedString = new BoundedList<String>(
					charList, "<S>");

			// Suffix
			for (int i = 1; i < 5; i++) {
				String str = "SUFFIX-";
				for (int j = characters.length - i; j < characters.length; j++) {
					str += boundedString.get(j);
				}
				features.incrementCount(str, 1.0);
			}

			// Previous tag
			// features.incrementCount("PRE-" + previousTag, 1.0);
			// Capitalization
			if (instance.length() > 0) {
				String positionString = null; // = previousTag;
				if (caredTags.contains(previousTag))
					positionString = previousTag;
				// wordPostion > 0 ? "@MIDDLE" : "@START";
				if (Character.isUpperCase(instance.charAt(0))) {
					features.incrementCount("CAP-" + positionString, 1.0);
				} else if (Character.isLowerCase(instance.charAt(0))) {
					features.incrementCount("UNCAP-" + positionString, 1.0);
				}
			}
			// Digits and other
			features.incrementCount(extractStyle(characters), 1.0);

			// -
			// features.incrementCount(boundedString.contains('-') ? "Hyphen"
			// : "NonHyphen", 1.0);
			return features;
		}