package edu.stanford.nlp.semgraph.semgrex.ssurgeon;
import java.io.StringWriter;
import edu.stanford.nlp.ling.IndexedWord;
import edu.stanford.nlp.semgraph.semgrex.SemgrexMatcher;
import edu.stanford.nlp.trees.EnglishGrammaticalRelations;
import edu.stanford.nlp.trees.GrammaticalRelation;
import edu.stanford.nlp.semgraph.SemanticGraph;
import edu.stanford.nlp.semgraph.SemanticGraphEdge;
/**
* This adds a given GrammaticalRelation between
* two named nodes in the graph.
*
* If one already exists, does not add.
*
* TODO: add position (a la Tregex)
* TODO: determine consistent and intuitive arguments
* TODO: figure out a way of ordering edges, so constituents are moved into proper
* place s.t. a vertexList() will return the correct ordering.
* @author yeh1
*
*/
public class AddEdge extends SsurgeonEdit {
public static final String LABEL = "addEdge";
protected String govName; // Name of governor of this reln, in match
protected String depName; // Name of the dependent in this reln, in match
protected GrammaticalRelation relation; // Type of relation to add between these edges
protected double weight;
public AddEdge(String govName, String depName, GrammaticalRelation relation) {
this.govName = govName;
this.depName = depName;
this.relation = relation;
this.weight = 0;
}
public AddEdge(String govName, String depName, GrammaticalRelation relation, double weight) {
this(govName, depName, relation);
this.weight = weight;
}
@Override
public String toEditString() {
StringWriter buf = new StringWriter();
buf.write(LABEL); buf.write("\t");
buf.write(Ssurgeon.GOV_NODENAME_ARG);buf.write(" ");
buf.write(govName); buf.write("\t");
buf.write(Ssurgeon.DEP_NODENAME_ARG);buf.write(" ");
buf.write(depName); buf.write("\t");
buf.write(Ssurgeon.RELN_ARG);buf.write(" ");
buf.write(relation.toString()); buf.write("\t");
buf.write(Ssurgeon.WEIGHT_ARG);buf.write(" ");
buf.write(String.valueOf(weight));
return buf.toString();
}
public static AddEdge createEngAddEdge(String govName, String depName, String engRelnName) {
GrammaticalRelation reln = EnglishGrammaticalRelations.valueOf(engRelnName);
return new AddEdge(govName, depName, reln);
}
public static AddEdge createEngAddEdge(String govName, String depName, String engRelnName, double weight) {
GrammaticalRelation reln = EnglishGrammaticalRelations.valueOf(engRelnName);
return new AddEdge(govName, depName, reln, weight);
}
@Override
public void evaluate(SemanticGraph sg, SemgrexMatcher sm) {
IndexedWord govNode = getNamedNode(govName, sm);
IndexedWord depNode = getNamedNode(depName, sm);
SemanticGraphEdge existingEdge = sg.getEdge(govNode, depNode, relation);
if (existingEdge == null) {
// When adding the edge, check to see if the gov/dep nodes are presently in the graph.
//
if (!sg.containsVertex(govNode))
sg.addVertex(govNode);
if (!sg.containsVertex(depNode))
sg.addVertex(depNode);
sg.addEdge(govNode, depNode, relation, weight,false );
}
}
}