/** * Copyright 2014, Emory University * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package edu.emory.clir.clearnlp.lexicon.propbank.frameset; import java.io.Serializable; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import edu.emory.clir.clearnlp.lexicon.propbank.PBLib; import edu.emory.clir.clearnlp.lexicon.verbnet.VNLib; import edu.emory.clir.clearnlp.util.StringUtils; import edu.emory.clir.clearnlp.util.XmlUtils; import edu.emory.clir.clearnlp.util.constant.StringConst; /** * @since 3.0.0 * @author Jinho D. Choi ({@code jinho.choi@emory.edu}) */ public class PBFRoleset implements Serializable, Comparable<PBFRoleset> { private static final long serialVersionUID = 5776067696903134630L; private Map<String,PBFRole> m_roles; private Set<String> s_vncls; private String s_name; private String s_id; public PBFRoleset(Element eRoleset) { init(eRoleset); } private void init(Element eRoleset) { s_vncls = new HashSet<>(); m_roles = new HashMap<>(); setID(XmlUtils.getTrimmedAttribute(eRoleset, PBFXml.A_ID)); setName(XmlUtils.getTrimmedAttribute(eRoleset, PBFXml.A_NAME)); addVerbNetClasses(XmlUtils.getTrimmedAttribute(eRoleset, PBFXml.A_VNCLS)); initRoles(eRoleset.getElementsByTagName(PBFXml.E_ROLE)); } private void addVerbNetClasses(String classes) { if (!classes.equals(StringConst.EMPTY) && !classes.equals(StringConst.HYPHEN)) { for (String vncls : classes.split(StringConst.SPACE)) addVerbNetClass(vncls); } } private void initRoles(NodeList list) { int i, size = list.getLength(); for (i=0; i<size; i++) initRole((Element)list.item(i)); } private void initRole(Element eRole) { addRole(new PBFRole(eRole)); } public Set<String> getVerbNetClasseSet() { return s_vncls; } public Collection<PBFRole> getRoles() { return m_roles.values(); } /** @param argNumber e.g., {@code "0"}, {@code "2"}. */ public PBFRole getRole(String argNumber) { return m_roles.get(argNumber); } public String getFunctionTag(String argNumber) { PBFRole role = getRole(argNumber); return (role != null) ? role.getFunctionTag() : StringConst.EMPTY; } public String getID() { return s_id; } public String getName() { return s_name; } public void addVerbNetClass(String vncls) { if (vncls.length() > 1) s_vncls.add(VNLib.stripVerbNetClassName(vncls)); } public void addRole(PBFRole role) { if (!isValidAnnotation(role)) { if (!PBLib.isLightVerbRoleset(s_id)) System.err.println("Invalid argument: "+s_id+" - "+role.getArgKey()); } else { m_roles.put(role.getArgumentNumber(), role); // for (String vncls : role.getVNClasseSet()) // { // if (!s_vncls.contains(vncls)) // System.err.printf("VerbNet class mismatch: %s - %s (%s ^ %s)\n", s_id, role.getArgKey(), vncls, s_vncls.toString()); // } } } private boolean isValidAnnotation(PBFRole role) { String n = role.getArgumentNumber(); if (n.length() != 1) return false; if (StringUtils.containsDigitOnly(n)) return true; if (role.isArgumentNumber("A")) return true; if (role.isArgumentNumber("M") && !role.isFunctionTag(StringConst.EMPTY)) return true; return false; } public void setID(String id) { s_id = id; } public void setName(String name) { s_name = name; } public boolean isValidArgumentNumber(String number) { return m_roles.containsKey(number); } public boolean isValidArgument(String label) { // TODO: to be removed if (PBLib.isLightVerbRoleset(s_id)) return true; String n = PBLib.getNumber(label); return (n != null) ? m_roles.containsKey(n) : true; } @Override public String toString() { List<PBFRole> list = new ArrayList<>(getRoles()); StringBuilder build = new StringBuilder(); Collections.sort(list); build.append(s_id); build.append(": "); build.append(s_name); for (String vncls : s_vncls) { build.append(", "); build.append(vncls); } build.append(StringConst.NEW_LINE); for (PBFRole role : list) { build.append(role.toString()); build.append(StringConst.NEW_LINE); } return build.toString(); } @Override public int compareTo(PBFRoleset roleset) { return s_id.compareTo(roleset.s_id); } }