001    package edu.upenn.cis.propbank_shen;
002    
003    import java.util.LinkedList;
004    import java.util.List;
005    import java.util.Iterator;
006    
007    import org.w3c.dom.Node;
008    import org.w3c.dom.NamedNodeMap;
009    import org.w3c.dom.Attr;
010    
011    /**
012       A representation of a RoleSet as defined in the propbank lexical guidelines,
013       frameset.dtd.
014    
015       <p>
016    
017       A roleset defines a sort of coarse grained sense for a verb. When we
018       understand a verb as an object which relates things 
019       (such as in "John gave Mary a Penny", "gave" is relating John, Mary, and "a
020       Penny".), we'll quickly come to see that verbs may relate different kinds 
021       of things.  For example, the verb "call" may be used to relate either 
022       a caller with an object and a label (in the labelling sense of call) or 
023       a caller with a thing being summoned and a place being summoned to. (in the
024       summon sense of call (eg "John called Mary over").
025    
026       <p>
027       
028       We then view each of these things 
029       <ul>
030       <li> (caller, object, label) 
031       <li> (caller, thing summoned, destination) 
032       </ul>
033       as a roleset.  RoleSet objects provide a handle on these coarse grained 
034       senses.
035       @author Scott Cotton
036       
037     */
038    
039    public class RoleSet {
040    
041        /** the identifier of the roleset */
042        protected String id;    
043    
044        /** the name of the roleset, optional, can be null */
045        protected String name;
046        /** the node from which a roleset is constructed */
047        protected Node node;
048        /** the set of roles associated with the roleset */
049        protected List roles;
050        /** the set of examples associated with the roleset */
051        protected List examples;
052        /** the VerbNet classes to which this roleset belongs */
053        protected String vnclasses[];    
054        /**
055           construct a RoleSet object from a roleset node in a frameset 
056           xml document.
057        */
058        public RoleSet(Node n)  throws CorruptDataException
059        {
060            name = null;
061            vnclasses = new String[0];
062            node = n;
063            NamedNodeMap attrs = n.getAttributes();
064            int len = attrs.getLength();
065            String anm;
066            for(int i=0; i<len; i++) {
067                Attr attr = (Attr) attrs.item(i);
068                anm = attr.getNodeName();
069                if (anm.equals("id")) {
070                    id = (String) attr.getNodeValue();
071                } else if(anm.equals("vncls")) {
072                    vnclasses = ((String) attr.getNodeValue()).split(" ");
073                } else if (anm.equals("name")) {
074                    name = (String) attr.getNodeValue();
075                }
076            }
077            // parse the roles
078            roles = new LinkedList();
079            Node rn = node.getFirstChild();
080            while(rn != null) {
081                if (rn.getNodeName().equals("roles")) {
082                    Node nc = rn.getFirstChild();
083                    while (nc != null) {
084                        if (nc.getNodeName().equals("role")) {
085                            roles.add(new Role(nc)); 
086                        }
087                        nc = nc.getNextSibling();
088                    }
089                }
090                rn = rn.getNextSibling();
091            }
092            // parse the examples
093            examples = new LinkedList();
094            Node ne = node.getFirstChild();
095            while(ne != null) {
096                if (ne.getNodeName().equals("example")) {
097                    examples.add(new Example(ne));
098                }
099                ne = ne.getNextSibling();
100            }
101        }
102    
103        /**
104           create a RoleSet object from the id, where the id is in the form
105           &lt;verb&gt;.NN, such as "go.01".
106           
107           @param id the roleset identifier
108         */
109        public static RoleSet ofId(String id) throws CorruptDataException
110        {
111            int i = id.indexOf('.');
112            if (i == -1) {
113                throw new CorruptDataException("invalid roleset id: " + id);
114            }
115            String verb = id.substring(0, i);
116            FrameSet fs = new FrameSet(verb);
117            List l = fs.getPredicates();
118            Iterator p = l.iterator();
119            while (p.hasNext()) {
120                Predicate pred = (Predicate) p.next();
121                Iterator ri = pred.getRoleSets().iterator();
122                while(ri.hasNext()) {
123                    RoleSet rs = (RoleSet) ri.next();
124                    if (rs.getId().equals(id)) {
125                        return rs;
126                    }
127                }
128            }
129            System.err.println("no roleset found with id" + id);
130            return null;
131        }
132            
133        /** return the identifier associated with the roleset */
134        public String getId() 
135        {
136            return id;
137        }
138    
139        /** return the name of this roleset, or null if there is none specified. */
140        public String getName() 
141        {
142            return name;
143        }
144        /** return true iff this roleset has an associated name */
145        public boolean hasName()
146        {
147            return name != null;
148        }
149    
150        /** return the verbnet class ids associated with this roleset */
151        public String[] getVNClasses()
152        {
153            return vnclasses;
154        }
155    
156        /** return the list of roles associated with the roleset 
157         @see edu.upenn.cis.propbank_shen.Role 
158        */
159        public List getRoles() 
160        {
161            return roles;
162        }
163    
164        /**
165           return a list of the Example objects associated with this roleset
166           @see edu.upenn.cis.propbank_shen.Example
167         */
168        public List getExamples()
169        {
170            return examples;
171        }
172    
173        /**
174           A simple unit test
175         */
176        public static void main(String args[]) 
177            throws CorruptDataException
178        {
179            if (args.length < 1) {
180                System.err.println("sorry, please give me a roleset id (eg go.01)");
181                System.exit(1);
182            }
183            RoleSet rs = RoleSet.ofId(args[0]);
184            if (rs.hasName()) {
185                System.out.println("roleset " + args[0] + ", name is " + rs.getName());
186            }
187            String vnclasses[] = rs.getVNClasses();
188            for (int j=0; j<vnclasses.length; j++) {
189                System.out.println("\tverbnet class " + vnclasses[j]);
190            }
191            List l = rs.getRoles();
192            Iterator ri = l.iterator();
193            while(ri.hasNext()) {
194                Role r = (Role) ri.next();
195                ArgLabel al = r.getArgLabel();
196                String d = r.getDescription();
197                if (r.hasModLabel()) {
198                    ModLabel ml = r.getModLabel();
199                    System.out.println(al.toString() + "-" + ml.toString() + ": " + d);
200                } else {
201                    System.out.println(al.toString() + ": " + d);
202                }
203            }
204            Iterator ei = rs.getExamples().iterator();
205            while(ei.hasNext()) {
206                Example e = (Example) ei.next();
207                System.out.println(e.getText());
208            }
209        }
210    }