/**
* 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.constant.StringConst;
/**
* @since 3.0.0
* @author Jinho D. Choi ({@code jinho.choi@emory.edu})
*/
public class PBFFrameset implements Serializable
{
private static final long serialVersionUID = 8504121075121864972L;
private Map<String,PBFPredicate> m_predicates;
private String s_lemma;
/** @param lemma the base lemma (e.g., "run", but not "run_out"). */
public PBFFrameset(Element eFrameset, String lemma)
{
init(eFrameset, lemma);
}
public void init(Element eFrameset, String lemma)
{
m_predicates = new HashMap<>();
setLemma(lemma);
initPredicates(eFrameset.getElementsByTagName(PBFXml.E_PREDICATE));
}
private void initPredicates(NodeList list)
{
int i, size = list.getLength();
for (i=0; i<size; i++)
initPredicate((Element)list.item(i));
}
private void initPredicate(Element element)
{
addPredicate(new PBFPredicate(element));
}
/** @param lemma the specific lemma of the predicate (e.g., "run_out"). */
public PBFPredicate getPredicate(String lemma)
{
return m_predicates.get(lemma);
}
public PBFRoleset getRoleset(String rolesetID)
{
PBFRoleset roleset;
for (PBFPredicate predicate : m_predicates.values())
{
roleset = predicate.getRoleset(rolesetID);
if (roleset != null)
return roleset;
}
return null;
}
/** @return the only roleset ID if this predicate is monosemous. */
public String getMonosemousRolesetID()
{
if (m_predicates.isEmpty() || m_predicates.size() > 1) return null;
PBFPredicate predicate = getPredicates().iterator().next();
Set<String> set = predicate.getRolesetIDSet();
return (set.size() > 1) ? null : set.iterator().next();
}
public Set<String> getRolesetIDSet()
{
Set<String> set = new HashSet<>();
for (PBFPredicate predicate : getPredicates())
set.addAll(predicate.getRolesetIDSet());
return set;
}
public Collection<PBFPredicate> getPredicates()
{
return m_predicates.values();
}
public List<PBFRoleset> getRolesets()
{
List<PBFRoleset> rolesets = new ArrayList<>();
for (PBFPredicate predicate : getPredicates())
rolesets.addAll(predicate.getRolesets());
return rolesets;
}
/** @return the base lemma (e.g., "run", but not "run_out"). */
public String getLemma()
{
return s_lemma;
}
/** @param lemma the base lemma (e.g., "run", but not "run_out"). */
public void setLemma(String lemma)
{
s_lemma = lemma;
}
public List<PBFRoleset> getRolesetListFromVerbNet(String vncls, boolean polysemousOnly)
{
List<PBFRoleset> list = new ArrayList<>();
for (PBFPredicate predicate : m_predicates.values())
list.addAll(predicate.getRolesetListFromVerbNet(vncls, polysemousOnly));
return list;
}
public void addPredicate(PBFPredicate predicate)
{
if (m_predicates.put(predicate.getLemma(), predicate) != null)
System.err.printf("Duplicated predicate: %s\n", predicate.getLemma());
}
public String toString()
{
List<PBFPredicate> list = new ArrayList<>(getPredicates());
StringBuilder build = new StringBuilder();
Collections.sort(list);
for (PBFPredicate predicate : list)
{
build.append(StringConst.NEW_LINE);
build.append(predicate.toString());
}
return build.toString().trim();
}
}