package edu.stanford.nlp.trees;
import edu.stanford.nlp.trees.international.pennchinese.CharacterLevelTagExtender;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
/**
* @author Galen Andrew
*/
public class TreeToBracketProcessor {
private final List evalTypes;
private static final CharacterLevelTagExtender ext = new CharacterLevelTagExtender();
public TreeToBracketProcessor(List evalTypes) {
this.evalTypes = evalTypes;
}
public Collection allBrackets(Tree root) {
boolean words = evalTypes.contains(WordCatConstituent.wordType);
boolean tags = evalTypes.contains(WordCatConstituent.tagType);
boolean cats = evalTypes.contains(WordCatConstituent.catType);
List<WordCatConstituent> brackets = new ArrayList<>();
if (words || cats || tags) {
root = ext.transformTree(root);
for (Tree tree : root) {
if (tree.isPrePreTerminal() && !tree.value().equals("ROOT")) {
if (words) {
brackets.add(new WordCatConstituent(tree, root, WordCatConstituent.wordType));
}
if (tags) {
brackets.add(new WordCatConstituent(tree, root, WordCatConstituent.tagType));
}
} else if (cats && tree.isPhrasal() && !tree.value().equals("ROOT")) {
brackets.add(new WordCatConstituent(tree, root, WordCatConstituent.catType));
}
}
}
return brackets;
}
public static Collection commonWordTagTypeBrackets(Tree root1, Tree root2) {
root1 = ext.transformTree(root1);
root2 = ext.transformTree(root2);
List<Tree> firstPreTerms = new ArrayList<>();
for (Tree tree : root1) {
if (tree.isPrePreTerminal()) {
firstPreTerms.add(tree);
}
}
List<WordCatConstituent> brackets = new ArrayList<>();
for (Tree preTerm : firstPreTerms) {
for (Tree tree : root2) {
if (!tree.isPrePreTerminal()) {
continue;
}
if (Trees.leftEdge(tree, root2) == Trees.leftEdge(preTerm, root1) && Trees.rightEdge(tree, root2) == Trees.rightEdge(preTerm, root1)) {
brackets.add(new WordCatConstituent(preTerm, root1, WordCatConstituent.goodWordTagType));
break;
}
}
}
return brackets;
}
}