package edu.stanford.nlp.trees;
import edu.stanford.nlp.ling.Label;
import edu.stanford.nlp.util.XMLUtils;
/**
* An individual dependency between a head and a dependent.
* The head and dependent are represented as a Label.
* For example, these can be a
* Word or a WordTag. If one wishes the dependencies to preserve positions
* in a sentence, then each can be a NamedConstituent.
*
* @author Christopher Manning
* @author Spence Green
*
*/
public class NamedDependency extends UnnamedDependency {
private static final long serialVersionUID = -1635646451505721133L;
private final Object name;
public NamedDependency(String regent, String dependent, Object name) {
super(regent, dependent);
this.name = name;
}
public NamedDependency(Label regent, Label dependent, Object name) {
super(regent, dependent);
this.name = name;
}
@Override
public Object name() {
return name;
}
@Override
public int hashCode() {
return regentText.hashCode() ^ dependentText.hashCode() ^ name.hashCode();
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
} else if ( !(o instanceof NamedDependency)) {
return false;
}
NamedDependency d = (NamedDependency) o;
return equalsIgnoreName(o) && name.equals(d.name);
}
@Override
public String toString() {
return String.format("%s --%s--> %s", regentText, name.toString(), dependentText);
}
/**
* Provide different printing options via a String keyword.
* The recognized options are currently "xml", and "predicate".
* Otherwise the default toString() is used.
*/
@Override
public String toString(String format) {
switch (format) {
case "xml":
return " <dep>\n <governor>" + XMLUtils.escapeXML(governor().value()) + "</governor>\n <dependent>" + XMLUtils.escapeXML(dependent().value()) + "</dependent>\n </dep>";
case "predicate":
return "dep(" + governor() + "," + dependent() + "," + name() + ")";
default:
return toString();
}
}
@Override
public DependencyFactory dependencyFactory() {
return DependencyFactoryHolder.df;
}
public static DependencyFactory factory() {
return DependencyFactoryHolder.df;
}
// extra class guarantees correct lazy loading (Bloch p.194)
private static class DependencyFactoryHolder {
private static final DependencyFactory df = new NamedDependencyFactory();
}
/**
* A <code>DependencyFactory</code> acts as a factory for creating objects
* of class <code>Dependency</code>
*/
private static class NamedDependencyFactory implements DependencyFactory {
/**
* Create a new <code>Dependency</code>.
*/
public Dependency<Label, Label, Object> newDependency(Label regent, Label dependent) {
return newDependency(regent, dependent, null);
}
/**
* Create a new <code>Dependency</code>.
*/
public Dependency<Label, Label, Object> newDependency(Label regent, Label dependent, Object name) {
return new NamedDependency(regent, dependent, name);
}
}
}