/** * 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.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 PBFPredicate implements Serializable, Comparable<PBFPredicate> { private static final long serialVersionUID = -8166301199851458202L; private Map<String,PBFRoleset> m_rolesets; private Set<String> s_rolesetIDs; private String s_lemma; public PBFPredicate(Element ePredicate) { init(ePredicate); } private void init(Element ePredicate) { m_rolesets = new HashMap<>(); s_rolesetIDs = new HashSet<>(); setLemma(XmlUtils.getTrimmedAttribute(ePredicate, PBFXml.A_LEMMA)); initRolesets(ePredicate.getElementsByTagName(PBFXml.E_ROLESET)); } private void initRolesets(NodeList list) { int i, size = list.getLength(); for (i=0; i<size; i++) addRoleset((Element)list.item(i)); } private void addRoleset(Element eRoleset) { addRoleset(new PBFRoleset(eRoleset)); } public Collection<PBFRoleset> getRolesets() { return m_rolesets.values(); } /** @return {@code null} if not exist. */ public PBFRoleset getRoleset(String id) { return m_rolesets.get(id); } public Set<String> getRolesetIDSet() { return s_rolesetIDs; } /** @return the specific lemma of this predicate (e.g., "run_out"). */ public String getLemma() { return s_lemma; } public List<PBFRoleset> getRolesetListFromVerbNet(String vncls, boolean polysemousOnly) { List<PBFRoleset> rolesets = new ArrayList<>(); Set<String> set; for (PBFRoleset roleset : m_rolesets.values()) { set = roleset.getVerbNetClasseSet(); if (set.contains(vncls) && (set.size() > 1 || !polysemousOnly)) rolesets.add(roleset); } return rolesets; } /** @param lemma the specific lemma of this predicate (e.g., "run_out"). */ public void setLemma(String lemma) { s_lemma = lemma; } /** @param lemma the specific lemma of this predicate (e.g., "run_out"). */ public boolean isLemma(String lemma) { return s_lemma.equals(lemma); } public void addRoleset(PBFRoleset roleset) { String id = roleset.getID(); s_rolesetIDs.add(id); if (m_rolesets.put(id, roleset) != null) System.err.printf("Duplicated roleset: %s\n", id); } @Override public String toString() { List<PBFRoleset> list = new ArrayList<>(getRolesets()); StringBuilder build = new StringBuilder(); build.append("===== "+s_lemma+" ====="); Collections.sort(list); for (PBFRoleset roleset : list) { build.append(StringConst.NEW_LINE); build.append(roleset.toString()); } return build.toString(); } @Override public int compareTo(PBFPredicate predicate) { return s_lemma.compareTo(predicate.s_lemma); } }