001package org.cleartk.clearnlp; 002 003import java.util.List; 004 005import org.apache.uima.jcas.JCas; 006import org.apache.uima.jcas.cas.FSArray; 007import org.apache.uima.jcas.tcas.Annotation; 008import org.cleartk.syntax.dependency.type.DependencyNode; 009import org.cleartk.syntax.dependency.type.DependencyRelation; 010import org.cleartk.syntax.dependency.type.TopDependencyNode; 011import org.cleartk.token.type.Sentence; 012import org.cleartk.token.type.Token; 013import org.apache.uima.fit.util.FSCollectionFactory; 014import org.apache.uima.fit.util.JCasUtil; 015 016import com.google.common.annotations.Beta; 017import com.google.common.collect.Lists; 018 019/** 020 * Defines common set of dependency graph data type operations used to convert and query ClearTK dependency types 021 * such as {@link TopDependencyNode}, {@link DependencyNode} and {@link DependencyRelation} 022 * 023 * 024 * @author Lee Becker 025 * 026 */ 027@Beta 028public class CleartkDependencyOps implements DependencyOps<DependencyNode, Token, TopDependencyNode, Sentence, DependencyRelation> { 029 030 @Override 031 public TopDependencyNode selectRootNode(JCas jCas, Annotation coveringAnnotation) { 032 List<TopDependencyNode> nodes = JCasUtil.selectCovered(jCas, TopDependencyNode.class, coveringAnnotation); 033 if (nodes.size() != 1) { 034 throw new IllegalArgumentException("Expected 1 root node, found " + nodes.size()); 035 } 036 return nodes.get(0); 037 } 038 039 @Override 040 public List<DependencyNode> selectNodes(JCas jCas, Annotation coveringAnnotation) { 041 List<DependencyNode> result = Lists.newArrayList(); 042 for (DependencyNode node : JCasUtil.selectCovered(jCas, DependencyNode.class, coveringAnnotation)) { 043 if (!(node instanceof TopDependencyNode)) { 044 result.add(node); 045 } 046 } 047 return result; 048 } 049 050 @Override 051 public List<DependencyRelation> getHeadRelations(JCas jCas, DependencyNode node) { 052 return Lists.newArrayList(JCasUtil.select(node.getHeadRelations(), DependencyRelation.class)); 053 } 054 055 @Override 056 public DependencyNode getHead(JCas jCas, DependencyRelation relation) { 057 return relation.getHead(); 058 } 059 060 @Override 061 public String getLabel(JCas jCas, DependencyRelation relation) { 062 return relation.getRelation(); 063 } 064 065 @Override 066 public TopDependencyNode createRootNode(JCas jCas, Sentence sentence) { 067 return new TopDependencyNode(jCas, sentence.getBegin(), sentence.getEnd()); 068 } 069 070 @Override 071 public DependencyNode createNode(JCas jCas, Token token) { 072 return new DependencyNode(jCas, token.getBegin(), token.getEnd()); 073 } 074 075 @Override 076 public DependencyRelation createRelation(JCas jCas, DependencyNode head, DependencyNode child, String relation) { 077 DependencyRelation rel = new DependencyRelation(jCas); 078 rel.setChild(child); 079 rel.setHead(head); 080 rel.setRelation(relation); 081 return rel; 082 } 083 084 @Override 085 public void setHeadRelations( 086 JCas jCas, 087 DependencyNode node, 088 List<DependencyRelation> headRelations) { 089 node.setHeadRelations(new FSArray(jCas, headRelations.size())); 090 FSCollectionFactory.fillArrayFS(node.getHeadRelations(), headRelations); 091 } 092 093 @Override 094 public void setChildRelations( 095 JCas jCas, 096 DependencyNode node, 097 List<DependencyRelation> childRelations) { 098 node.setChildRelations(new FSArray(jCas, childRelations.size())); 099 FSCollectionFactory.fillArrayFS(node.getChildRelations(), childRelations); 100 } 101 102}