edu.stanford.nlp.trees.TreeFunctions Maven / Gradle / Ivy
package edu.stanford.nlp.trees;
import edu.stanford.nlp.ling.CategoryWordTagFactory;
import edu.stanford.nlp.ling.CoreLabel;
import edu.stanford.nlp.ling.StringLabel;
import edu.stanford.nlp.ling.StringLabelFactory;
import java.util.function.Function;
import java.io.IOException;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* This is a utility class which vends tree transformers to translate
* trees from one factory type to trees of another. For example,
* StringLabel trees need to be made into CategoryWordTag trees before
* they can be head-percolated. Enter
* LabeledTreeToCategoryWordTagTreeFunction.
*
* @author Dan Klein
* @version 1.0
* @since 1.0
*/
public class TreeFunctions {
private TreeFunctions() {
}
private static class LabeledTreeToStringLabeledTreeFunction implements Function {
protected TreeFactory tf = new LabeledScoredTreeFactory();
public Tree helper(Tree t) {
if (t == null) {
return null;
}
if (t.isLeaf()) {
return tf.newLeaf(new StringLabel(t.label().value()));
}
if (t.isPreTerminal()) {
return tf.newTreeNode(new StringLabel(t.label().value()), Collections.singletonList(helper(t.children()[0])));
}
int numKids = t.numChildren();
List children = new ArrayList<>(numKids);
for (int k = 0; k < numKids; k++) {
children.add(helper(t.children()[k]));
}
return tf.newTreeNode(new StringLabel(t.label().value()), children);
}
public Tree apply(Tree t) {
return helper(t);
}
} // end static class
/**
* Return an Function that maps from Label-labeled trees (any
* implementing class) to LabeledScored trees with a StringLabel
* label.
*
* @return The Function object
*/
public static Function getLabeledTreeToStringLabeledTreeFunction() {
return new LabeledTreeToStringLabeledTreeFunction();
}
private static class LabeledTreeToCategoryWordTagTreeFunction implements Function {
protected TreeFactory tf =
new LabeledScoredTreeFactory(new CategoryWordTagFactory());
public Tree helper(Tree t) {
if (t == null) {
return null;
} else if (t.isLeaf()) {
return tf.newLeaf(t.label().value());
} else if (t.isPreTerminal()) {
return tf.newTreeNode(t.label().value(), Collections.singletonList(helper(t.children()[0])));
} else {
int numKids = t.numChildren();
List children = new ArrayList<>(numKids);
for (int k = 0; k < numKids; k++) {
children.add(helper(t.children()[k]));
}
return tf.newTreeNode(t.label().value(), children);
}
}
public Tree apply(Tree o) {
return helper(o);
}
} // end static class
/**
* Return a Function that maps from StringLabel labeled trees to
* LabeledScoredTrees with a CategoryWordTag label.
*
* @return The Function object
*/
public static Function getLabeledTreeToCategoryWordTagTreeFunction() {
return new LabeledTreeToCategoryWordTagTreeFunction();
}
/**
* This function recursively goes through the tree and builds a new
* copy with CoreLabels containing the toString() of the original label.
*/
private static class LabeledToDescriptiveCoreLabelTreeFunction
implements Function {
protected TreeFactory tf =
new LabeledScoredTreeFactory(CoreLabel.factory());
public Tree apply(Tree t) {
if (t == null) {
return null;
} else if (t.isLeaf()) {
return tf.newLeaf(t.label().toString());
} else if (t.isPreTerminal()) {
return tf.newTreeNode(t.label().toString(),
Collections.singletonList(apply(t.children()[0])));
} else {
int numKids = t.numChildren();
List children = new ArrayList<>(numKids);
for (int k = 0; k < numKids; k++) {
children.add(apply(t.children()[k]));
}
return tf.newTreeNode(t.label().toString(), children);
}
}
}
/**
* Returns a function which takes a tree with any label class
* where the labels might have an interesting description, such
* as a CategoryWordTag which goes "cat [T/W]", and returns a new
* tree with CoreLabels which contain the toString() of each of
* the input labels.
*/
public static Function
getLabeledToDescriptiveCoreLabelTreeFunction() {
return new LabeledToDescriptiveCoreLabelTreeFunction();
}
/**
* This method just tests the functionality of the included transformers.
*/
public static void main(String[] args) {
//TreeFactory tf = new LabeledScoredTreeFactory();
Tree stringyTree = null;
try {
stringyTree = (new PennTreeReader(new StringReader("(S (VP (VBZ Try) (NP (DT this))) (. .))"), new LabeledScoredTreeFactory(new StringLabelFactory()))).readTree();
} catch (IOException e) {
// do nothing
}
System.out.println(stringyTree);
Function a = getLabeledTreeToCategoryWordTagTreeFunction();
Tree adaptyTree = a.apply(stringyTree);
System.out.println(adaptyTree);
adaptyTree.percolateHeads(new CollinsHeadFinder());
System.out.println(adaptyTree);
Function b = getLabeledTreeToStringLabeledTreeFunction();
Tree stringLabelTree = b.apply(adaptyTree);
System.out.println(stringLabelTree);
}
}