// ================================ FEATURE EXTRACTION ================================
@Override
protected String getField(FtrToken token, SRLState state)
{
DEPNode node = state.getNode(token);
if (node == null) return null;
Matcher m;
if (token.isField(JointFtrXml.F_FORM))
{
return node.form;
}
else if (token.isField(JointFtrXml.F_LEMMA))
{
return node.lemma;
}
else if (token.isField(JointFtrXml.F_POS))
{
return node.pos;
}
else if (token.isField(JointFtrXml.F_DEPREL))
{
return node.getLabel();
}
else if (token.isField(JointFtrXml.F_DISTANCE))
{
return getDistance(node, state);
}
else if ((m = JointFtrXml.P_ARGN.matcher(token.field)).find())
{
return state.getNumberedArgument(Integer.parseInt(m.group(1)));
}
else if ((m = JointFtrXml.P_PATH.matcher(token.field)).find())
{
String type = m.group(1);
int dir = Integer.parseInt(m.group(2));
return getPath(type, dir, state);
}
else if ((m = JointFtrXml.P_SUBCAT.matcher(token.field)).find())
{
String type = m.group(1);
int dir = Integer.parseInt(m.group(2));
return getSubcat(node, type, dir);
}
else if ((m = JointFtrXml.P_FEAT.matcher(token.field)).find())
{
return node.getFeat(m.group(1));
}
else if ((m = JointFtrXml.P_BOOLEAN.matcher(token.field)).find())
{
DEPNode pred = state.getCurrentPredicate();
int field = Integer.parseInt(m.group(1));
switch (field)
{
case 0: return (node.isDependentOf(pred)) ? token.field : null;
case 1: return (pred.isDependentOf(node)) ? token.field : null;
case 2: return (pred.isDependentOf(state.getLowestCommonAncestor())) ? token.field : null;
case 3: return (state.isLowestCommonAncestor(pred)) ? token.field : null;
case 4: return (state.isLowestCommonAncestor(node)) ? token.field : null;
}
}