package edu.fudan.nlp.parser.dep; import java.io.Serializable; import java.util.ArrayList; import java.util.List; /** * 依存句法树 * @author xpqiu * */ public class DependencyTree implements Serializable { private static final long serialVersionUID = -4766669720074872942L; public String word; public String pos; /** * 原句中的顺序id */ public int id; private int size=1; /** * 依赖关系类型 */ public String relation; public List<DependencyTree> leftChilds; public List<DependencyTree> rightChilds; /** * 父节点 */ private DependencyTree parent = null; public DependencyTree(int id) { this(id, null, null,null); } public DependencyTree(int id, String word) { this(id, word, null,null); } //change public DependencyTree(int id,String word,String pos ) { this(id, word, pos,null); } //add public DependencyTree(int id, String word, String pos,String depClass) { this.word = word; this.pos = pos; this.id = id; this.relation = depClass; leftChilds = new ArrayList<DependencyTree>(); rightChilds = new ArrayList<DependencyTree>(); } public String getDepClass(){ return this.relation; } public void setDepClass(String depClass){ this.relation = depClass; } public void addLeftChild(DependencyTree ch) { int id = ch.id; int i=0; for(;i<leftChilds.size();i++){ int cid = leftChilds.get(i).id; if(cid>id) break; } leftChilds.add(i, ch); ch.setParent(this); updatesize(ch.size); } public void addRightChild(DependencyTree ch) { rightChilds.add(ch); ch.setParent(this); updatesize(ch.size); } /** * 更新树大小 * @param size */ private void updatesize(int size) { this.size+=size; if(parent!=null){ parent.updatesize(size); } } /** * 设置父节点 * @param tree */ private void setParent(DependencyTree tree) { parent = tree; } public DependencyTree getParent(){ return parent; } public String toString() { StringBuffer sb = new StringBuffer(); for (int i = 0; i < leftChilds.size(); i++) { sb.append(leftChilds.get(i).toString()); } sb.append(id).append(" "); sb.append(word); sb.append(" "); sb.append(pos); sb.append(" "); if(parent!=null) sb.append(parent.id); else sb.append(-1); sb.append(" "); if(relation!=null) sb.append(relation); else sb.append("核心词"); sb.append("\n"); for (int i = 0; i < rightChilds.size(); i++) { sb.append(rightChilds.get(i).toString()); } return sb.toString(); } public String toBracketString() { StringBuffer sb = new StringBuffer(); sb.append("["); sb.append(id); // if (word != null) { // sb.append("["); // sb.append(word); // sb.append("]"); // } sb.append(" "); for (int i = 0; i < leftChilds.size(); i++) { sb.append(leftChilds.get(i)); } sb.append("-"); for (int i = 0; i < rightChilds.size(); i++) { sb.append(rightChilds.get(i)); } sb.append("]"); return sb.toString(); } public int[] toHeadsArray() { int[] heads = new int[size]; toArrays(this,heads); return heads; } public static void toArrays(DependencyTree dt, int[] heads) { for(int i = 0; i < dt.leftChilds.size(); i++) { DependencyTree ch = dt.leftChilds.get(i); heads[ch.id] = dt.id; toArrays(ch, heads); } for(int i = 0; i < dt.rightChilds.size(); i++) { DependencyTree ch = dt.rightChilds.get(i); heads[ch.id] = dt.id; toArrays(ch, heads); } } public int size() { return size; } public List<DependencyTree> getAllChild(){ List<DependencyTree> childs = new ArrayList<DependencyTree>(); childs.addAll(leftChilds); childs.addAll(rightChilds); return childs; } public boolean contain(DependencyTree dt) { if(this.equals(dt)) return true; for(DependencyTree ch: leftChilds) { if(ch.contain(dt)) return true; } for(DependencyTree ch: rightChilds) { if(ch.contain(dt)) return true; } return false; } /** * * @return */ public ArrayList<List<String>> toList() { ArrayList<List<String>> lists = new ArrayList<List<String>>(size); for(int i=0;i<size;i++){ lists.add(null); } toList(lists); return lists; } private void toList(ArrayList<List<String>> lists) { ArrayList<String> e = new ArrayList<String>(); e.add(word); e.add(pos); if(parent==null){ e.add(String.valueOf(-1)); e.add("Root"); } else{ e.add(String.valueOf(parent.id)); e.add(relation); } lists.set(id, e); for (int i = 0; i < leftChilds.size(); i++) { leftChilds.get(i).toList(lists); } for (int i = 0; i < rightChilds.size(); i++) { rightChilds.get(i).toList(lists); } } public String[] getWords() { String[] words = new String[size]; getWords(words); return words; } private void getWords(String[] words) { words[id] = word; for (int i = 0; i < leftChilds.size(); i++) { leftChilds.get(i).getWords(words); } for (int i = 0; i < rightChilds.size(); i++) { rightChilds.get(i).getWords(words); } } }